用mod_chroot在OpenSUSE上启动Apache2
本篇介绍了如何在OpenSUSE 11.2系统中为Apache2安装mod_chroot模块。使用mod_chroot模块,可以让Apache2运行在安全的chroot环境下,从而让你的服务器在面对系统漏洞攻击和利用Web应用程序入侵时更具抵抗力。
准备工作
假定你电脑上装有OpenSUSE11.2系统,并且Apache2在此环境中可以正常工作。本教程使用的系统环境为:OpenSUSE 11.2 x86_64 [ISPConfig 2]。另外你还需要在/srv/www路径下建立1个或者多个站点。
1. 安装mod_chroot
OpenSUSE11.2中没有mod_chroot包,因此我们必须要自己生成一个。首先要安装一些准备内容,如下代码所示:
yast2 -i libgcc glibc-devel gcc flex lynx compat-readline4 db-devel wget gcc-c++ make vim
yast2 -i apache2-devel
2. 接下来按照以下命令来生成mod_chroot:
cd /tmp
wget http://core.segfault.pl/~hobbit/mod_chroot/dist/mod_chroot-0.5.tar.gz
tar xvfz mod_chroot-0.5.tar.gz
cd mod_chroot-0.5
apxs2 -cia mod_chroot.c
3. 然后重启Apache:
/etc/init.d/apache2 restart
配置Apache
设定/srv/www为chroot jail的存储路径。OpenSUSE系统中的Apache使用/var/run/http2.pid路径下的PID文件;当apache服务器chroot到/srv/www目录,/var/run/httpd2.pid会被理解为 /srv/www/var/run/httpd2.pid。用以下命令来创建目录:
mkdir -p /srv/www/var/run
chown -R root:www /srv/www/var/run
现在我们必须先告诉Apache,使用/srv/www目录作为chroot目录。首先打开/etc/apache2/httpd.conf,在该文件的Include/etc/apache2/sysconfig.d/loadmodule.conf 行下面添加一行:ChrootDir /srv/www;在字段下面的Options None注释掉,添加一行:Options +FollowSymLinks。步骤如下所示:
//打开httpd.conf
vi /etc/apache2/httpd.conf
//打开httpd.conf 文件后,文件内容如下:
[...]
# generated from APACHE_MODULES in /etc/sysconfig/apache2
Include /etc/apache2/sysconfig.d/loadmodule.conf
ChrootDir /srv/www
[...]
# forbid access to the entire filesystem by default
#Options None
Options +FollowSymLinks
AllowOverride None
Order deny,allow
Deny from all
[...]
接下来要告诉vhost:文档目录被修改了(举个例子来说,将DocumentRoot/srv/www改为DocumentRoot/).我们也可以通过修改每个vhost的DocumentRoot指示,更简单的方式是创建一个文件符号链接。
创建符号链接两种方式
第一种方式:改变文档根目录(DocumentRoot)
我们假设我们有一个使用/srv/www做为vhost的文档根目录。我们必须打开vhost的配置文件,然后将文档根目录由/srv/www改为/。于是,目录/srv/www/web1/web就会被理解为/web1/web等。如果你想使用这种方法,那么你必须更改所有vhost的文档根目录。
第二种方式:创建一个系统文件符号链接
这种方式很简单,因为你只需要修改一次,而且不需要修改vhos所有的t配置文件。你只需要在/srv/www/srv/www 和 /srv/www之间建立一个符号链接。
mkdir -p /srv/www/srv
cd /srv/www/srv
ln -s ../ www
最后,停止Apache,在/var/run/httpd2.pid 和 /srv/www/var/run/httpd2.pid之间建立一个符号链接后在再启动Apache,命令如下所示:
/etc/init.d/apache2 stop
ln -sf /srv/www/var/run/httpd2.pid /var/run/httpd2.pid
/etc/init.d/apache2 start
这样就完成了,你可以和之前一样浏览网页,只要你浏览的页面是静态的html文件或者使用mod_php·应该都没有问题了。
如果你使用CGI,比如suPHP,Ruby,etc.,那么你必须复制解释器(e.g. /usr/bin/perl, /usr/sbin/suphp, etc.)和解释器需要的库文件到chroot jail中。你可以使用Idd命令找到解释器需要的所有库文件。
ldd /usr/sbin/suphp
server2:/var/www/web1/log# ldd /usr/sbin/suphp
linux-gate.so.1 => (0xffffe000)
libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0xb7e34000)
libm.so.6 => /lib/tls/i686/cmov/libm.so.6 (0xb7e0f000)
libgcc_s.so.1 => /lib/libgcc_s.so.1 (0xb7e03000)
libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0xb7cd2000)
/lib/ld-linux.so.2 (0xb7f23000)
server2:/var/www/web1/log#
如果你拷贝了所有需要的文件后,网页还不能打开的话,你该查看下Apache 日志。日志常常会告诉我们浏览器哪里出错了。同时,你也可以阅读http://core.segfault.pl/~hobbit/mod_chroot/caveats.html 上面的FAQ。