FreeBSD & Jail
FreeBSD & Jail,FreeBSD & Jail
假设某一个应用程序在系统中运行,一段时间之后该应用程序被发现包含有致命的安全漏洞,在通常的系统中,这个应用程序可能已经形成了可利用的漏洞,甚至cracker们已经成功地攻破这一应用并且成为root,控制了系统;但假如该应用程序在jail内运行,即使cracker们已经攻破系统,也无法访问到jail之外系统的其他部分。因为在Jail内,尽管应用程序可以自由活动,却无法获得更多权限,也无法访问Jail外的任何资源。通过实施Jail,在系统管理上面可以做到防范未知漏洞,避免某些不安全应用程序对整个系统的安全构成威胁。 jail通常有两类应用方向: 一、对应用程序的活动能力进行限制。 比如ftp服务器,DNS服务器,这样一些东西,比如wu-ftpd,bind这样一些隔三岔五就会爆出漏洞的“著名”软件放到jail里面会让人更加放心。 二、受控制的主机。 某些时候,需要对外提供有shell的管理性访问,比如作为某公司A,其合作单位B有某项目需要在A的机器上获得shell乃至root权限,这就需要提供受控制的主机,用户可以在jail里面控制几乎所有他需要的资源(除了jail不允许他访问的部分)。 第一类应用并不是非常复杂,实际上这类应用实现方法相对简单,只要在Linux下面玩过chroot就没有什么大问题;第二类应用则有很多有趣的特性,而jail最吸引人的部分也是这些很有趣的特性。 下面从最简单的部分开始: 第一类:限制应用程序活动能力 首先按照通常习惯的方式安装好你想要jail的应用程序,下面我们将会使用pure-ftpd(我不是很熟悉它,只不过顺手拿过来而已,据说还算好用)作为例子。 这个ftpd的安装位置,默认为:/usr/local/sbin;/usr/local/bin;在/etc下面还有一些相关的文件,整个结构感觉不是特别干净,不过它运行需要的东西并不很多,包括 /usr/local/sbin/pure-ftpd , /etc/xxx /etc/xxxx 这样一些文件。 接下来先用ldd看看/usr/local/sbin/pure-ftpd需要的那些运行库: tester# cd /usr/local/sbin tester# ldd pure-ftpd pure-ftpd: libcrypt.so.2 => /usr/lib/libcrypt.so.2 (0x2807b000) libpam.so.1 => /usr/lib/libpam.so.1 (0x28094000) libc.so.4 => /usr/lib/libc.so.4 (0x2809d000) 这样我们的工作任务清单上面就多出来这样一些东西了: /usr/lib/...... 使用ldd我们还可以获得其他一些需要放入jail的程序的运行库位置,信息搜集完成之后,我们开始建立jail目录树(这里我们假定jail环境构造在/jail内,当然你也可以选择你喜欢的位置): tester# mkdir -p /jail/usr/ 然后将上面列出的,libcrypt.so.2 等这些文件都复制到对应位置。当然还有我们FreeBSD下非常重要的一个文件ld-elf.so.1,尽管ldd没有给出提示,也还需要复制过去,否则应用程序也跑不起来。这样我们就获得了一个很干净(最小化)的应用程序运行环境jail命令的格式是: jail path hostname ip-number command 下面开始在jail里面运行它: tester# jail /jail jailed.host.name $JAILED_IP_ADDR /usr/local/sbin/pure-ftpd [options] 这里,/jail是你的jail环境的位置,也就是被jail之后,应用程序“以为”自己所在的“/”的位置;jailed.host.name是你打算提供给这个jail环境的主机名,某些情况下,应用程序需要知道这个变量;$JAILED_IP_ADDR是你打算提供ftp服务(如果是其他应用软件,那就是其他服务咯,比如web服务)的那个IP地址,至于/usr/local/sbin/pure-ftpd [options] 则是你打算运行的那个应用程序在jail里面的所在位置以及运行所需的参数。 然后用ps 查看一下进程状态: tester# ps -axf |grep pureftpd 95 ?? IsJ 0:00.92 pure-ftpd (SERVER) (pure-ftpd) 可以看到所有这些pure-ftpd的进程都有一个J,标志这这一程序正在jail下面运行。 这时候可能会有一些管理用的程序无法正常工作,因为这些管理用程序无法找到他们需要访问的那些文件,只要找到这些应用程序需要调用的文件(比如日志文件)的位置,然后制造一个soft link就可以了,通常这些管理程序都可以继续正常运行。 到此为止,一个针对应用程序的jail构造完成。 第二类,构造受控制的主机 在这种情况下面,我们首先需要构造一个当前版本操作系统的完整镜像(下面这个脚本是从FreeBSD 4.6r的man page里面来的,实际上4.5以及之前的man page在构造jail目录树脚本上面都有一定的问题,4.6才纠正过来): tester# cat >>/root/mkjail.sh jailhome=/data/jail cd /usr/src mkdir -p $jailhome make world DESTDIR=$jailhome cd etc make distribution DESTDIR=$jailhome -DNO_MAKEDEV_RUN cd $jailhome/dev sh MAKEDEV jail cd $jailhome ln -sf dev/null kernel ^D tester# sh /root/mkjail.sh 最后在/data/jail下面获得一个完整的根据当前源码树编译得来的jail目录树。 接下来: /* tester# mkdir $jailhome/stand tester# cp /stand/sysinstall $jailhome/stand tester# jail $jailhome jailed.system