有关设置Web服务器中安全性问题的一些提示和技巧。其中一些建议是笼统的,其他一些是针对Apache的。
Apache HTTP Server在安全性方面有良好记录,并且开发人员社区高度关注安全性问题。但是,不可避免的是,某些问题(无论大小)都会在发布后在软件中发现。因此,保持对软件更新的了解至关重要。如果您直接从Apache获得HTTP Server的版本,我们强烈建议您订阅Apache HTTP Server公告列表,在其中可以随时了解新版本和安全更新。大多数第三方Apache软件发行商都可以提供类似的服务。
当然,大多数情况下,Web服务器受到威胁,并不是因为HTTP Server代码中的问题。而是来自附加代码,CGI脚本或基础操作系统的问题。因此,您必须始终注意系统上所有软件的问题和更新。
所有网络服务器都可能遭受拒绝服务攻击,这些攻击试图通过占用服务器资源来阻止对客户端的响应。不可能完全阻止此类攻击,但是您可以做某些事情来减轻它们造成的问题。
最有效的反DoS工具通常是防火墙或其他操作系统配置。例如,大多数防火墙可以配置为限制来自任何单个IP地址或网络的同时连接数,从而防止一系列简单的攻击。当然,这对抵抗分布式拒绝服务攻击(DDoS)没有帮助。
还有一些Apache HTTP Server配置设置可以帮助缓解问题:
RequestReadTimeout
指令允许限制客户端发送请求所花费的时间。TimeOut
在遭受DoS攻击的站点上,该指令应降低。将其设置为低至几秒钟可能是合适的。正如TimeOut
当前用于几种不同操作的方法一样,将其设置为较低的值会导致长期运行的CGI脚本出现问题。KeepAliveTimeout
遭受DoS攻击的站点上,该指令也可能降低。有些站点甚至通过完全关闭了keepalive
KeepAlive
,这当然在性能上还有其他缺点。LimitRequestBody
,
LimitRequestFields
,
LimitRequestFieldSize
,
LimitRequestLine
,并
LimitXMLRequestBody
应仔细配置为通过客户端输入触发限制资源消耗。AcceptFilter
指令将请求处理的一部分卸载到操作系统上。在Apache httpd中,默认情况下此功能是活动的,但可能需要重新配置内核。MaxRequestWorkers
指令以允许服务器处理最大数量的同时连接而不会耗尽资源。另请参阅性能调整文档。event
mpm使用异步处理来避免将线程专用于每个连接。由于OpenSSL库的性质,
event
mpm当前与mod_ssl
和其他输入过滤器不兼容
。在这些情况下,它会退回到worker
MPM 的行为
。在典型操作中,Apache由root用户启动,并且切换到User
指令定义的用户以提供匹配。与root用户执行的任何命令一样,您必须注意防止非root用户修改它。文件本身不仅必须只能由root用户写入,而且目录以及所有目录的父目录也必须可以写入。例如,如果您选择将ServerRoot放置在 /usr/local/apache
其中,则建议您使用以下命令以根用户身份创建该目录:
mkdir /usr/local/apache
cd /usr/local/apache
mkdir bin conf logs
chown 0 . bin conf logs
chgrp 0 . bin conf logs
chmod 755 . bin conf logs
假设/
,/usr
以及
/usr/local
只为root修改。安装
httpd
可执行文件时,应确保其受到类似的保护:
cp httpd /usr/local/apache/bin
chown 0 /usr/local/apache/bin/httpd
chgrp 0 /usr/local/apache/bin/httpd
chmod 511 /usr/local/apache/bin/httpd
您可以创建一个htdocs子目录,该目录可被其他用户修改-因为root永远不会在其中执行任何文件,因此不应在其中创建文件。
如果您允许非root用户修改root执行或写入的任何文件,那么您将对root入侵打开系统。例如,有人可以替换httpd
二进制文件,以便下次启动它时,它将执行一些任意代码。如果日志目录是可写的(非root用户),则有人可以用指向其他系统文件的符号链接替换日志文件,然后root可以用任意数据覆盖该文件。如果日志文件本身是可写的(非root用户),则有人可能会用伪造的数据覆盖日志本身。
服务器端包含(SSI)为服务器管理员带来了一些潜在的安全风险。
第一个风险是服务器负载增加。所有启用SSI的文件都必须由Apache解析,无论文件中是否包含任何SSI指令。尽管此负载增加很小,但在共享服务器环境中,它可能变得很重要。
通常,SSI文件还具有与CGI脚本关联的相同风险。使用exec cmd
元素,启用SSI的文件可以在用户和Apache的运行组许可下执行任何CGI脚本或程序,如中所述
httpd.conf
。
有一些方法可以增强SSI文件的安全性,同时仍然可以利用它们提供的好处。
为了隔离任性的SSI文件可能造成的损坏,服务器管理员可以按照CGI常规部分中的说明启用suexec。
为具有.html
或.htm
扩展名的文件启用SSI 可能很危险。在共享或高流量的服务器环境中尤其如此。启用了SSI的文件应具有单独的扩展名,例如常规.shtml
。这有助于将服务器负载保持在最低水平,并简化风险管理。
另一个解决方案是禁用从SSI页面运行脚本和程序的功能。为此,请在指令中替换Includes
为。请注意,如果这些脚本位于指令指定的目录中,则用户仍可以执行CGI脚本。IncludesNOEXEC
Options
<--#include virtual="..." -->
ScriptAlias
首先,您始终必须记住,您必须信任CGI脚本/程序的编写者,或者必须能够发现CGI中潜在的安全漏洞,无论这些漏洞是有意还是无意的。CGI脚本可以在Web服务器用户的许可下在系统上运行基本上任意的命令,因此,如果不仔细检查它们,可能会非常危险。
所有CGI脚本都将以同一用户身份运行,因此它们有可能(偶然或故意)与其他脚本发生冲突,例如,用户A讨厌用户B,因此他编写了一个脚本来丢弃用户B的CGI数据库。suEXEC是一个可用于允许脚本以不同用户身份运行的程序,它 自1.2起包含在Apache中,并从Apache服务器代码中的特殊钩子调用。另一种流行的方法是使用 CGIWrap。
仅在以下情况下才应考虑允许用户在任何目录中执行CGI脚本:
将CGI限制为特殊目录,使管理员可以控制进入这些目录的内容。这比非脚本别名的CGI不可避免地更安全,但是只有在对目录具有写访问权限的用户受信任或者管理员愿意测试每个新的CGI脚本/程序中是否存在潜在的安全漏洞时,这种安全性才会提高。
大多数站点在非脚本别名CGI方法上选择此选项。
其运行服务器本身的一部分嵌入脚本选项,例如mod_php
,mod_perl
,mod_tcl
,和mod_python
,在服务器本身的身份运行(参见User
由这些发动机可能执行的指令),因此脚本可以访问任何服务器用户可以。某些脚本引擎可能会提供限制,但最好还是不要假设。
当设置动态内容,如mod_php
,
mod_perl
或mod_python
,许多安全方面的考虑走出的范围httpd
本身,你需要从这些模块查阅文档。例如,PHP使您可以设置安全模式,默认情况下通常会禁用该模式。另一个示例是Suhosin,这是一个用于提高安全性的PHP插件。有关这些的更多信息,请查阅每个项目文档。
在Apache级别上, 可以将名为mod_security的模块视为HTTP防火墙,并且只要对其进行了足够精细的配置,就可以帮助您增强动态内容的安全性。
要运行一个非常紧凑的系统,您将希望阻止用户设置.htaccess
可以覆盖您已配置的安全功能的文件。这是一种方法。
在服务器配置文件中,放入
<Directory "/"> AllowOverride None </Directory>
这样可以防止.htaccess
在所有目录中使用文件(除非特别启用了这些文件)。
请注意,此设置是自Apache 2.3.9起的默认设置。
偶尔会被误解的Apache的一个方面是默认访问的功能。也就是说,除非您采取措施对其进行更改,否则服务器如果可以通过常规的URL映射规则找到其到达文件的方式,则可以将其提供给客户端。
例如,考虑以下示例:
# cd /; ln -s / public_html
Accessing http://localhost/~root/
这将允许客户端遍历整个文件系统。要解决此问题,请将以下块添加到服务器的配置中:
<Directory "/"> Require all denied </Directory>
这将禁止默认访问文件系统位置。添加适当的Directory
块以仅在您希望的区域访问。例如,
<Directory "/usr/users/*/public_html"> Require all granted </Directory> <Directory "/usr/local/httpd"> Require all granted </Directory>
特别注意Location
和Directory
指令的交互;例如,即使<Directory "/">
拒绝访问,一条
<Location "/">
指令也可能会覆盖它。
也要警惕使用该UserDir
指令玩游戏;将其设置为类似于./
root的效果与上面的第一个示例相同。强烈建议您在服务器配置文件中包括以下行:
UserDir disabled root
为了及时了解服务器上实际发生的情况,您必须检查Log Files。即使日志文件仅报告已发生的事件,它们也可以使您了解对服务器进行的攻击,并允许您检查是否存在必要的安全级别。
几个例子:
grep -c "/jsp/source.jsp?/jsp/ /jsp/source.jsp??" access_log
grep "client denied" error_log | tail -n 10
第一个示例将列出尝试利用Apache Tomcat Source.JSP格式错误的请求信息泄露漏洞的攻击数量 ,第二个示例将列出最后十个被拒绝的客户端,例如:
[Thu Jul 11 17:18:39 2002] [error] [client foo.example.com] client denied
by server configuration: /usr/local/apache/htdocs/.htpasswd
如您所见,日志文件仅报告已经发生的事情,因此,如果客户端能够访问该.htpasswd
文件,您将看到类似以下内容:
foo.example.com - - [12/Jul/2002:01:59:13 +0200] "GET /.htpasswd HTTP/1.1"
在您的访问日志中。这意味着您可能在服务器配置文件中注释了以下内容:
<Files ".ht*"> Require all denied </Files>
配置部分的合并很复杂,有时是特定于指令的。创建有关如何合并指令的依赖项时,请始终测试您的更改。
对于没有实现任何合并逻辑的模块(例如)
mod_access_compat
,后面部分中的行为取决于后面部分中是否具有该模块的任何指令。配置将被继承,直到进行更改为止,此时配置将被替换而不是合并。