Apache本身相当安全,而且Apache集团很擅长快速修复大部分安全问题。但是,在现实世界中当你开始使用Apache,并且在其上使用真实的Web应用,Apache的安全就开始变得相当复杂。
实际上,在观察Apache的所有配置方式以及错误配置的方式时,加强Apache安全甚至了解所有加强安全的正确方法都变得令人畏惧。我们已经编写了一个应该在任何Apache服务器上进行以便正确加固服务器的措施列表,这些措施被看作是最重要的安全基础。这个列表绝不是全面或者完整的,可能根据服务器的用途而有所不同。幸运的是,有大量的自动化脚本、工具和文档可以帮助你建立一个恰当的Apache安全配置。这些可以在本章结尾处找到。
禁用不需要的模块
安装Apache时需要考虑的最重要的问题之一是Web服务器需要什么类型的功能。例如,将要运行的是PHP脚本还是Perl脚本?“服务器端包含”是否用于Web服务器上运行的应用?一旦能够创建所需功能的列表,就可以启用相关的模块。你可以使用httpd读取所有启用模块的一个列表:
# httpd -l Compiled-in modules: http_core.c mod_env.c mod_log_config.c mod_mime.c mod_negotiation.c mod_status.c mod_include.c mod_autoindex.c mod_dir.c mod_cgi.c mod_asis.c mod_imap.c mod_actions.c mod_userdir.c mod_alias.c mod_access.c mod_auth.c mod_so.c mod_setenvif.c mod_perl.c
为了禁用模块,要在编译之前使用配置脚本,并且传入所有应该禁用的模块。
·对于Apache 1.x./configure--disable-module=userdir
·对于Apache 2.x./configure--disable-userdir
注意 这个方法用于删除Apache的内建模块,不适用于动态模块。
表3-2中显示的模块可能是安全风险,建议在Apache配置中将其删除。
表3-2 可能成为安全风险的Apache模块,应该考虑删除
实施ModSecurity
ModSecurity是Ivan Ristic编写的一个Apache模块,是一个Web应用防火墙。它具有很强的灵活性,被认为是帮助Apache免遭应用和Web平台攻击的最佳项目之一。ModSecurity的一些功能如下:
·请求过滤
·防逃避技术
·HTTP过滤规则
·全面审计日志
·HTTPS拦截
·Chroot功能
·掩盖Web服务器标识
Apache Chrooting
安全的标准规则之一是实施纵深防御。当攻击者闯入一个Web服务器,首先做的一件事就是企图访问系统上的文件,如/etc/passwd,或者通过本地攻击来提升权限。为了避免这类攻击,创建了一种将Apache服务器放进一个包含环境(“监狱式”环境)的方法,这种方法称作Chrooting。试试这种方法,Apache在其自包含的文件系统内以有限的特权运行。如果攻击者获得文件系统的访问权,他们将被困在这个监狱式环境中,无法访问实际的文件系统。我们在这里要研究两种Apache Chrooting方法。
外部Chrooting
这种类型的Chrooting从一个除了基本外壳(Shell)之外不包含任何东西的文件系统入手。所有进程和所需的相关文件需要复制到这个环境中以便运行。这对于Apache来说是一种真正的控制方法,如果攻击者闯入外壳,他就无处可去。建立和配置这种监狱式环境的方法很复杂并且需要研究,取决于必须和Web应用一起运行的软件。建立这种环境的更多内容,请参见本章结尾处的“参考与延伸阅读”。
内部Chrooting
内部Chrooting与外部Chrooting的不同之处在于,内部Chrooting从Apache进程的内部建立。Apache启动并且正常初始化,然后为该进程创建一个Chroot。默认情况下,Apache不支持这种Chroot方法。但是,人们已经创建了使Apache支持这种方法的第三方附加软件:
·ModSecurity通过SecChrootDir配置支持一种Chroot环境。只需要将该值设置为你希望Apache被监禁的目录。
·ModChroot是一个与ModSecurity chroot工作方式相同的Apache模块,只要设置合适的ChrootDir就可以了。
·Arjan De Vet的Apache chroot(2)补丁是对Apache的修补,启用内部Chrooting支持。
实施SuExec
SuExec是一种执行包装器,可以使用默认Apache Web用户之外其他用户的特权运行CGI脚本。正确使用这一方法能帮助实现最小特权原则,这是建立Web服务器“纵深防御”的重要元素。我们来看看SuExec提供最小特权的一个实例。
多宿主环境使每个虚拟主机网站能够上传和部署自己的脚本。如果不使用SuExec,任何漏洞,甚至是一个恶意的网站管理员都可以访问任何其他网站部署在该服务器上的内容。这是一个大问题,特别是如果你已经测试了网站并且采取了所有预防措施来加固代码安全,创建了好的安全Web配置,却发现网站因为其他虚拟网站的安全问题以及攻击者通过你不能控制的路由获得访问权而遭到入侵。现在你已经了解SuExec的重要性了。安装和配置SuExec有时候是个复杂而令人沮丧的过程。SuExec的配置非常严格,许多设置必须正确。我们建议使用Apache文档来完成这个过程,这可以在本章结尾的“参考与延伸阅读”中找到。
文档根限制
要确认Apache不能访问文档根之外的任何内容,这是一个重要的配置。这种类型的限制相当简单,可以用httpd.conf中的以下配置完成:
<Directory/> order deny,allow deny from all </Directory> <Directory /www/htdocs> order allow,deny allow from all </Directory>
使用CIS的Apache Benchmark
手工排查和尝试加强Apache安全是沉闷的工作;幸运的是有互联网中心(CIS)的Apache Benchmark。他们制作了一个文档说明如何正确加固Apache,还生成一个工具检查配置并解释是否满足某些安全要求。下面简单说明使用这个工具检查Apache配置。
首先,从他们的网站下载该产品,将其解压到工作目录。运行benchmark.pl脚本并且指向你的httpd.conf文件:
./benchmark2.pl -c /etc/apache2/apache2.conf -o result.html #=========[ CIS Apache Benchmark Scoring Tool 2.10 ]==========# Score an Apache configuration file with the CIS Apache Benchmark. Version: 2.10 Copyright 2003-2005, CISecurity. All rights reserved. #=============================================================# CIS Apache Benchmark requires answers to the following questions: Press enter to continue. Questions --------------------------------------------- - Location of the Apache server binary [] /usr/sbin/apache2 - Has the Operating System been hardened according to any and all applicable OS system security benchmark guidance? [yes|no] - Created three dedicated web groups? [yes|no] - Downloaded the Apache source and MD5 Checksums from httpd.apache .org? [yes|no] - Verified the Apache MD5 Checksums? [yes|no] - Applied the current distribution patches? [yes|no] - Compiled and installed Apache distribution? [yes|no] - Is the webmaster@localhost address a valid email alias? [yes|no] - Are fake CGI scripts used? [yes|no] - Have you implemented any basic authentication access controls? [yes|no] - Updated the default apachectl start script's code to send alerts to the appropriate personnel? [yes|no]
Benchmark询问一系列问题,对你的配置运行安全检查脚本,制作一个报告,指出需要修复的问题。接着你可以查询内含的Benchmark文档,了解每个问题的解决方法。