策略二:限制Apache服务的运行环境
Apache服务器需要绑定到80端口上来监听请求,而root是唯一有这种权限的用户,随着攻击手段和强度的增加,服务器受到相当大的威胁,一旦缓冲区溢出漏洞被利用,就可以控制整个系统。为了进一步提高系统安全性,Linux内核引入chroot机制,chroot是内核中的一个系统调用,软件可以通过调用函数库的chroot 函数,来更改某个进程所能见到的根目录。
chroot机制是将某软件运行限制在指定目录中,保证该软件只能对该目录及其子目录的文件有所动作,从而保证整个服务器的安全。在这种情况下,即使出现黑客或者不法用户通过该软件破坏或侵入系统,Linux系统所受的损坏也仅限于该设定的根目录,而不会影响到系统的其他部分。
将软件chroot化的一个问题是该软件运行时需要的所有程序、配置文件和库文件都必须事先安装到chroot目录中,通常称这个目录为chroot“监牢”。如果在“监牢”中运行httpd,那么用户根本看不到Linux文件系统中那个真正的目录,从而保证了Linux系统的安全。
在使用该技术的时候,一般情况下需要事先创建目录,并将守护进程的可执行文件httpd复制到其中。同时,由于httpd需要几个库文件,所以需要把httpd程序依赖的几个lib文件同时也拷贝到同一个目录下,因此手工完成这一工作是非常麻烦的。幸运的是,用户可以通过使用开源的jail软件包来帮助简化chroot“监牢”建立的过程,具体步骤如下所示:
Jail官方网站是:。首先将其下载,然后执行如下命令进行源代码包的编译和安装:
#tar xzvf jail_1.9a.tar.gz
#cd jail/src
#make
jail软件包提供了几个Perl脚本作为其核心命令,包括mkjailenv、addjailuser和addjailsw,他们位于解压后的目录jail/bin中。这几个命令的基本用途如下所示:
mkjailenv:用于创建chroot“监牢”目录,并且从真实文件系统中拷贝基本的软件环境。 addjailsw:用于从真实文件系统中拷贝二进制可执行文件及其相关的其它文件(包括库文件、辅助性文件和设备文件)到该“监牢”中。 addjailuser:创建新的chroot“监牢”用户。采用jail创建监牢的步骤如下所示;
(1)首先需要停止目前运行的httpd服务,然后建立chroot目录,命令如下所示。该命令将chroot目录建立在路径/root/chroot/httpd下:
# service httpd stop
# mkjailenv /root/chroot/httpd
kjailenv
A component of Jail (version 1.9 for linux)
~assman/jail/
Juan M. Casillas <assman@gsyc.inf.uc3m.es>
Making chrooted environment into /root/chroot/httpd
Doing preinstall()
Doing special_devices()
Doing gen_template_password()
Doing postinstall()
Done.
(2)为“监牢”添加httpd程序,命令如下:
# ./addjailsw /root/chroot/httpd/ -P /usr/sbin/httpd
addjailsw
A component of Jail (version 1.9 for linux)
~assman/jail/
Juan M. Casillas <assman@gsyc.inf.uc3m.es>
Guessing /usr/sbin/httpd args(0)
Warning: can't create /proc/mounts from the /proc filesystem
Done.
在上述过程中,用户不需要在意那些警告信息,因为jail会调用ldd检查httpd用到的库文件。而几乎所有基于共享库的二进制可执行文件都需要上述的几个库文件。
(3)然后,将httpd的相关文件拷贝到“监牢”的相关目录中,命令如下所示:
# mkdir -p /root/chroot/httpd/etc
# cp –a /etc/httpd /root/chroot/httpd/etc/
。。。。。。
添加后的目录结构如下所示:
# ll
总计 56
drwxr-xr-x 2 root root 4096 03-23 13:44 dev
drwxr-xr-x 3 root root 4096 03-23 13:46 etc
drwxr-xr-x 2 root root 4096 03-23 13:46 lib
drwxr-xr-x 2 root root 4096 03-23 13:46 selinux
drwsrwxrwx 2 root root 4096 03-23 13:46 tmp
drwxr-xr-x 4 root root 4096 03-23 13:46 usr
drwxr-xr-x 3 root root 4096 03-23 13:46 var
(4)重新启动httpd,并使用ps命令检查httpd进程,发现该进程已经运行在监牢中,如下所示:
# ps -aux | grep httpd
Warning: bad syntax, perhaps a bogus '-'? See /usr/share/doc/procps-3.2.7/FAQ
root 3546 0.6 0.3 3828 1712 pts/2 S 13:57 0:00 /usr/sbin/nss_pcache off /etc/httpd/alias
root 3550 14.2 3.6 49388 17788 ? Rsl 13:57 0:00 /root/chroot/httpd/httpd
apache 3559 0.2 1.4 49388 6888 ? S 13:57 0:00 /root/chroot/httpd/httpd
apache 3560 0.2 1.4 49388 6888 ? S 13:57 0:00 /root/chroot/httpd/httpd
apache 3561 0.2 1.4 49388 6888 ? S 13:57 0:00 /root/chroot/httpd/httpd
apache 3562 0.2 1.4 49388 6888 ? S 13:57 0:00 /root/chroot/httpd/httpd
apache 3563 0.2 1.4 49388 6888 ? S 13:57 0:00 /root/chroot/httpd/httpd
apache 3564 0.2 1.4 49388 6888 ? S 13:57 0:00 /root/chroot/httpd/httpd
apache 3565 0.2 1.4 49388 6888 ? S 13:57 0:00 /root/chroot/httpd/httpd
apache 3566 0.2 1.4 49388 6888 ? S 13:57 0:00 /root/chroot/httpd/httpd
r oot 3568 0.0 0.1 4124 668 pts/2 R+ 13:57 0:00 grep httpd