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

我们对 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

现在需要创建一个能够安全启动容器的脚本。这意味着它能将自己的进程标签设置为 vs1,并通过 dropmacadmin 打包容器的 /sbin/init。如下所示:

cat >> /vs1/vs1.sh << EOF

#!/bin/sh

cp /bin/dropmacadmin /vs1/rootfs.vs1/bin/

attr -S -s SMACK64 -V vs1 /vs1/rootfs.vs1/bin/dropmacadmin

echo vs1 > /proc/self/attr/current

lxc-start -n vs1 /bin/dropmacadmin /sbin/init

EOF

chmod u+x /vs1/vs1.sh

再做一件事情就可以让 vs1 在其即将装载的 tmpfs 文件系统上执行写操作:

sed -i 's/defaults/defaults,smackfsroot=vs1,smackfsdef=vs1/' \

/vs1/rootfs.vs1/etc/fstab

这导致在 /dev/shm 上装载 tmpfs 文件系统,以带上 vs1 标签,从而让 vs1 可以对它执行写操作。否则,vs1 init 脚本将不能在设置网络时创建需要使用的 /dev/shm/network 目录。类似地,如果希望使用基于 ram 的 /tmp,使用相同的选项即可。

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

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