我们不能盲目地应用策略并期望带来某些价值,而是应该首先定义明确的安全目标。Smack 的简单性实际上限定了可实现的目标的范围,我们将力求实现以下目标:
使用提供 Web 和 ssh 服务的隔离的文件系统创建容器。
容器应该是独立的,以保护彼此的安全。容器 vs1 不能读取另一个容器 vs2 的文件或中断它的任务。
主机的关键文件不受容器的影响。
外部能够访问容器中的 Web 服务器和 ssh 服务器。
一般设置
在本文中,我们将进行两个实验:首先设置由 SELinux 保护的容器,然后设置由 Smack 保护的容器。这两个实验演示了大部分初级设置。
您可以使用真实的机器来完成这两个实验,但是使用虚拟机更加方便。要使用 qemu 或 kvm,可以通过 qemu-img create vm.img 10G 创建一个硬盘。
使用命令 kvm -hda vm.img -cdrom cdrom.iso -boot d -m 512M 从 CDROM 引导虚拟机。要获得 CDROM 映像,可以从 Fedoraproject.org/get-fedora 下载 Fedora 10 for i386 的安装 DVD。用下载获得的文件的名称替换上一命令中的 cdrom.iso。安装过程基本可以使用默认值,但一定不要选择 office and productivity,而是选择 software development。此外,还需要使用 yum 包管理器安装 bridge-utils、debootstrap 和 ncurses-devel rpms。
现在需要编译一个定制内核。下载内核源代码 rpm 并对其使用补丁 enable-netns.patch(参见 下载 小节)以提供网络名称空间(在 2.6.29 中为上游(upstream),但在 Fedora 10 中不是),然后更改配置并完成编译和安装。这需要作为根用户用以下指令来实现:
yumdownloader --source kernel
rpm -i kernel*
cd rpmbuild
rpmbuild -bc SPECS/kernel-*
cd BUILD/kernel-2.6.27/linux-2.6*
patch -p1 < ~/enable-netns.patch
make menuconfig
make && make modules_install && make install
对于这两个实验,在 make menuconfig 步骤中都需要选择 Network Namespaces(在 Networking support -> Networking options 菜单下)。对于 Smack 实验,还需要进入 Security options 菜单,取消选定 SELinux,并选择下一个选项 Smack。您还需要将 /boot/grub/grub.conf 中的 default 引导项改为 0 而不是 1。
现在我们试试 liblxc。“LXC:Linux 容器工具” 详细描述了 liblxc 的基本用法,因此这里不再细谈。仅需使用 container_setup.sh 脚本(参见 下载 小节)设置网桥(bridge),容器网络设备将在此进行对话。它还会清除防火墙(默认情况下不处理网桥),并且在进行 Smack 实验时设置 Smack 策略(我们稍后将在文件 /etc/smackaccesses 中创建)。每次重新引导之后必须运行 container_setup.sh,或者设置为在引导时自动运行它(如果知道怎么做的话)。
现在已经准备好虚拟机!我们来试试 liblxc。可以从 lxc.sf.net 通过 cvs 下载最新的源代码,并按照以下方法编译它:
cvs -d:pserver:anonymous@lxc.cvs.sourceforge.net:/cvsroot/lxc login
cvs -z3 -d:pserver:anonymous@lxc.cvs.sourceforge.net:/cvsroot/lxc co -P lxc
cd lxc
./bootstrap && ./configure && make && make install
现在,如果您查看 README 文档的话,将发现有好几个入口点可以选择。容器是非常轻量级的,因为它们与系统共享许多资源 —— 包括文件系统。但我们的目标是提供一些简单的隔离,因此将使用脚本 lxc-debian 为每个容器创建完整的 debian chroot 映像。首先创建一个名为 vsplain 的容器:
mkdir /vsplain
cd /vsplain
lxc-debian create
container name: vsplain
hostname: vsplain
IP 10.0.2.20
gateway: 10.0.2.2
这个容器的配置存储在 /usr/local/var/lxc/vsplain 目录下。如果查找名为 cgroup 的文件,将会看到一些以 devices. 开头的行。这些是设备白名单 cgroup 的指令,它协调由容器执行的设备创建、读和写。
使用命令 lxc-start -n vsplain 启动这个容器。这时将出现登录提示。通过不需要密码的根用户名登录到容器。最后,当容器运行时,则需要执行下面的命令:
apt-get install openssh-server
apt-get install apache
现在可以使用 ssh 技术安全地从 kvm 主机转移到容器,并使用 vsplain 和主机的 ip 地址(分别是 10.0.2.20 和 10.0.2.15)查看它的 Web 页面。您随时可以通过命令 lxc-stop -n vsplain 从 kvm 主机的根终端关闭容器。
在这里,通过从这个模板克隆两个新的虚拟机可以节省一些时间。关闭 vm 并执行:
cp vm.img selinux.img
cp vm.img smack.img