新闻中心

FreeBSD & Jail

 Jail 命令在FreeBSD 4.0中首次出现。用于“监禁”进程以及其衍生的子进程。而且jail和FreeBSD本身的secure_level合并使用可以显著限制(jail中的)root的能力。
假设某一个应用程序在系统中运行,一段时间之后该应用程序被发现包含有致命的安全漏洞,在通常的系统中,这个应用程序可能已经形成了可利用的漏洞,甚至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/{lib,libexec,local/sbin,local/bin,local/etc,etc,var/run,var/log} 
然后将上面列出的,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里面的所在位置以及运行所需的参数。

香港云主机