使用 SELinux 和 Smack 增强轻量级容器(4)

受 Smack 保护的容器

在启用 Smack 时重新编译内核。您必须能够进入 /root/rpmbuild/BUILD/kernel*/linux* 目录的 make menuconfig,然后转到 security 菜单禁用 SELinux 并启用 Smack。接下来仅需重复步骤 make && make modules_install && make install。

此外,也要停止用户空间对 SELinux 的配置。这可以在 SELinux 管理 GUI 上实现,或编辑 /etc/selinux/config 并设置 SELINUX=disabled。要在引导时安装 Smack 策略还需要几个步骤:

mkdir /smack

cd /usr/src

wget

tar xf smack-util-0.1.tar; cd smack-util-0.1

make && cp smackload /bin

实际的 Smack 策略类似于清单 1:

清单 1. smackaccesses

vs1 _ rwa

_ vs1 rwa

vs2 _ rwa

_ vs2 rwa

_ host rwax

host _ rwax

应该将它复制到一个名为 /etc/smackaccesses 的文件中。下次运行 /bin/container_setup.sh 时会将这个文件加载到 smackload。

这个策略十分简单。默认情况下,任何标签都可以读取标记有 _ 的数据。我们为容器不能访问的主机的私有数据定义一个新标签 host;并且将这个标签应用到 container_setup.sh 脚本中的 cgroups 文件系统。其他敏感文件,比如 /etc/shadow,应该使用这个标签。

我们对 vs1 和 vs2 进行定义以标记容器。默认情况下,它们能够访问自己的数据。我们添加一个规则使它们可以写 _,从而允许发送网络包。由于 vs1 不能访问 vs2 数据(反之亦然),因此容器之间是彼此独立的。

如前所述,由 CAP_MAC_ADMIN 和 CAP_MAC_OVERRIDE 功能决定定义或绕过 Smack 规则的能力。因此,容器不应该具有这些能力。这可以通过 helper 程序 dropmacadmin.c 来实现(参见 下载 小节)。必须静态地编译它,因为来自主机的容器有不同的版本:

gcc -o dropmacadmin dropmacadmin.c -static

cp dropmacadmin /bin/

创建一个称为 vs1 的新容器:

mkdir /vs1; cd /vs1

lxc-debian create

container name: vs1

hostname: vs1

address: 10.0.2.21

router: 10.0.2.2

arch: 2 (i386)

使用标签 vs1 标记 vs1 文件系统中的所有文件:

for f in `find /vs1/rootfs.vs1`; do

attr -S -s SMACK64 -V vs1 $f

done

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/b55a634bdb11da5774507863276a5ec3.html