用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·应该都没有问题了。 

用mod_chroot在OpenSUSE上启动Apache2

如果你使用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。

相关推荐