在Debian 8(Jessie)上使用mod_unixd扫描Apache 2.4

本指南介绍了如何在Debian Jessie系统上使用Apache 2.4设置mod_unixd。 使用mod_unixd,您可以在安全的chroot环境中运行Apache,并使您的服务器不易受到尝试利用Apache或安装的Web应用程序中的漏洞的入侵尝试的攻击。 mod_unixd模块是用于旧apache 2.2中的mod_chroot模块的替代品。

1初步说明

我假设你有一个运行的Debian 8系统与一个工作的Apache,例如本教程中所示: Debian 8 Jessie LAMP服务器教程与Apache 2,PHP 5和MariaDB 。 除此之外,我假设您在/ var / www目录中设置了一个或多个网站(例如,如果您使用ISPConfig)。

我在这里使用的服务器的IP地址为192.168.1.100 ,主机名为server1.example.com 。 请在教程中将这些值替换为服务器的IP地址和主机名。

2配置Apache

在Apache 2.4中提供Chroot功能的apache模块mod_unixd是Apache核心模块的一部分,并在Debian 8上静态编译为Apache二进制文件,因此我们无需安装其他软件即可使用。

我想使用/ var / www目录作为包含chroot jail的目录。 Debian的Apache使用PID文件/var/run/apache2.pid ; 当Apache被chroot到/ var / www时, /var/ run / apache2.pid转换为/var/www/var/run/apache2.pid 。 因此,我们现在创建该目录:

mkdir -p /var/www/var/run
chown -R root:root /var/www/var/run

现在我们必须告诉Apache我们要使用/ var / www作为我们的chroot目录。 我们打开/etc/apache2/apache2.conf ,并在PidFile行下方添加一个ChrootDir行:

nano /etc/apache2/apache2.conf
[...]
#
# PidFile: The file in which the server should record its process
# identification number when it starts.
# This needs to be set in /etc/apache2/envvars
#
PidFile ${APACHE_PID_FILE}
ChrootDir /var/www
[...]

接下来,我们必须告诉我们的vhosts文档根已经改变了(例如, DocumentRoot / var / www现在转换为DocumentRoot / )。 我们可以通过在文件系统中创建符号链接来更改每个虚拟机的DocumentRoot指令,或者更容易。

2.1第一种方法:更改DocumentRoot

假设我们有一个带有DocumentRoot / var / www的虚拟主机。 我们现在必须打开该vhost的vhost配置,并将DocumentRoot / var / www更改为DocumentRoot / 。 因此, DocumentRoot / var / www / web1 / web现在将转换为DocumentRoot / web1 / web ,等等。 如果要使用此方法,则必须为每个虚拟主机更改DocumentRoot

2.2第二种方法:在文件系统中创建一个符号链接

这种方法更容易,因为您只需执行一次,就不必修改任何虚拟机配置。 我们创建一个从/ var / www / var / www指向/ var / www的符号链接:

mkdir -p /var/www/var
cd /var/www/var
ln -s ../../ www

最后,我们必须停止Apache,从/var/run/apache2.pid创建一个符号链接到/var/www/var/run/apache2.pid ,然后重新启动:

service apache2 stop
ln -s /var/www/var/run/apache2.pid /var/run/apache2.pid
service apache2 start

而已。 您现在可以像以前一样调用您的网页,只要它们是静态HTML文件或使用mod_php,就可以毫无问题地提供它们。

我将使用phpinfo()页面来测试这个。 在默认网站的文档根目录中打开一个包含nano的新info.php文件:

nano /var/www/html/info.php

并添加以下内容:

<php
phpinfo();

保存文件并在浏览器中打开您的服务器或IP地址的主机名,其次是/info.php。 例:

http://192.168.1.100/info.php

当PHP正常工作时,现在应该显示以下页面:

到目前为止这么好,但是我们如何知道Apache是​​否真的是chroot? 我们尝试访问chroot以外的文件,我将在这里使用/ etc / hosts。

nano /var/www/html/testchroot.php

与此内容:

<?php
$var = file_get_contents('/etc/hosts');
echo 'The content of /etc/hosts is: <br />' . $var;

并在浏览器中打开测试文件的URL。 结果是:

您可以看到,/ etc / hosts文件的内容不能再从这个PHP脚本中访问。

删除测试文件,如果你不再需要它们了:

rm /var/www/html/testchroot.php
rm /var/www/html/info.php

如果您正在使用CGI,例如Perl,Ruby等,则必须将解释器(例如/ usr / bin / perl等)复制到chroot jail以及解释器所需的所有库。 您可以使用ldd命令找到所需的库,例如

ldd /usr/bin/perl
root@server1:/var/www/html# ldd /usr/bin/perl
linux-vdso.so.1 (0x00007ffe951f4000)
libperl.so.5.20 => /usr/lib/x86_64-linux-gnu/libperl.so.5.20 (0x00007f1dafe54000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f1dafc50000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f1daf94f000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f1daf732000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f1daf387000)
libcrypt.so.1 => /lib/x86_64-linux-gnu/libcrypt.so.1 (0x00007f1daf150000)
/lib64/ld-linux-x86-64.so.2 (0x00007f1db0214000)
root@server1:/var/www/html#

或使用监狱工具来建立监狱环境。 如果您已经复制了所有必需的文件,但页面仍然不起作用,则应该查看Apache错误日志/var/log/apache2/error.log 。 通常它告诉你问题在哪里。

3链接

赞(52) 打赏
未经允许不得转载:优客志 » 系统运维
分享到:

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏