受 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
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