如何防止不需要的模块加载以保护Kubernetes集群?

幸好我们谈论的是Linux,因此你可以做许多事来帮助确保部署的安全性。

你可以执行的一项很关键的任务是防止不需要的内核模块加载到容器中。你会惊讶于启动时众多模块加载,其中许多模块是你在容器中不需要使用的。

那么如何阻止它们加载呢?下面介绍方法。

你需要什么?

我将使用基于最新Ubuntu Server映像的容器来演示,将通过Multipass工具来进行这番操作。想进一步了解如何安装和使用Multipass,请参阅这篇教程:《如何使用启动虚拟机的新工具Multipass?》(https://www.techrepublic.com/article/multipass-is-a-new-tool-for-launching-virtual-machines/)。

如果你未使用Multipass,无论在使用哪种容器技术,只要容器基于Linux的,仍可以解决这个问题。

如何部署和访问Ubuntu容器?

不妨先使用Multipass部署一个新容器。我们将使用以下命令部署Ubuntu Daily 20.04:

multipass launch daily:20.04 

一旦容器启动,系统会为你显示该部署的随机生成的名称。如果你未留意到该名称,可以使用以下命令来查看:

multipass list 

鉴于容器业已部署,使用以下命令访问其外壳:

multipass shell NAME 

其中NAME是容器的随机生成的名称。

如何卸载模块并列入黑名单?

我们要做的是将不希望加载到容器中的模块列入黑名单。为此,你要先知道哪些模块在加载。想列出所有目前已加载的模块,请执行以下命令:

lsmod 

你会看到目前加载到内核中的每个模块(图A)。

如何防止不需要的模块加载以保护Kubernetes集群?

图A. Ubuntu 20.04中目前已加载的模块

仔细浏览该列表,会找到你不想要加载到容器内核中的所有模块。鉴于容器通常有很特定的用途,因此可能有好多容器可以列入黑名单。

在我们将不想要启动时加载的模块实际列入黑名单之前,我们先要卸载模块。为什么?这是容器,不是虚拟机或标准操作系统,因此你无法重新启动。这就是为什么我们需要手动卸载模块。

想手动卸载运行中的模块,请执行以下命令:

sudo modprobe -r MODULENAME 

其中MODULENAME是模块的名称。

如果你执行lsmod命令,应该会看到模块不再被加载到内核中。

一旦你做好了列表后,使用以下命令打开黑名单文件进行编辑:

sudo nano /etc/modprobe.d/blacklist.conf 

在该文件中,你将添加希望以以下形式防止加载的所有模块:

blacklist MODULENAME 

其中MODULENAME是模块的名称。举例来说,你想要防止软盘内核模块加载。为此,该条目将是:

blacklist floppy 

注意:你要小心,别将对操作系统运行而言至关重要的模块或容器依赖的模块列入黑名单。因此,将模块列入黑名单之前,确保大致了解该模块的功能。

至此,你已手动删除了不想加载的所有内核模块,并创建了一份黑名单,防止它们被加载。你应该能够停止和启动容器,看到那些已列入黑名单的模块不再加载。

然而,如果你发现模块仍在加载,意味着映像仍在使用不含有你所作更改的initramfs的旧副本。使用以下命令重建initramfs:

sudo update-initramfs -u 

下次你停止并启动容器时,会发现已列入黑名单的模块肯定不会加载。

并非一应俱全

对于Kubernetes容器来说,这不是一应俱全的安全措施。然而,你在开发依赖Linux容器的应用程序和服务时,应考虑这一点。你不希望多余的、有时不安全的模块在容器上运行。