一些在建立一个WEB服务器时的安全方面的提示和建议。一部分是通用的,其它则仅限于Apache服务器
--------------------------------------------------------------------------------
ServerRoot 目录的许可权限
在典型的启动下,Apache 由 root 用户启动,然后它转到由User命令定义的用户,以提供点击服务。作为 root 可以执行任何指令这一情况,你必须当心它不被任何非 root 用户更改。不仅文件本身只能被 root 改写,而且其子目录,以及所有子目录的根目录也要如此。例如,如果你选择将 ServerRoot 放置于 /usr/local/apache,那么我们建议你以 root 身份创建这个目录,采用类似以下的命令:
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 compromises。例如,有人可以替换 httpd 可执行文件,当你下次启动它时,她将执行一些任意的代码;如果 logs 子目录(对于非 root 用户)是可写的,也许有人将它替换成为指向其它系统文件的链接,如此 root 可能用任意的代码覆盖原文件;如果日志文件本身是可写的,也许有人会用伪造的数据改写它。
--------------------------------------------------------------------------------
Server Side Includes
Server side includes (SSI) 可以如此设置,以致用户可以在服务器上执行任意的程序。这一点本身就回让系统管理员不寒而栗。
一个解决的办法是禁用这一部分的 SSI。为此,你可以在 Options 指令中使用 IncludesNOEXEC 选项。
--------------------------------------------------------------------------------
Non Script Aliased CGI
只有在以下的情况下,才可以允许用户在任何目录使用 CGI 脚本语言:
你信任你的用户不会故意或无意使用脚本让你的系统遭受攻击;
你认为你的网站安全是如此的脆弱,这样也不会造成更大的漏洞;
你没有用户,而且没有人访问你的网站。
--------------------------------------------------------------------------------
Script Alias'ed CGI
限制 CGI 仅在特定的目录内执行,让管理员可以控制进入目录的内容。这显然比 non script aliased CGI 更安全,但仅限于对可以信任的目录,用户有写的权利 或管理员愿意测试每一个新的 CGI 脚本/程序,并寻找安全漏洞。
Most sites choose this option over the non script aliased CGI approach.
--------------------------------------------------------------------------------
CGI in general
永远记住你必须相信 CGI 脚本/程序的作者或你自己有能力发现 CGI 中的潜在安全漏洞,不管它们是有意的或是无心的。
所有的 CGI 脚本将作为同一用户运行,所以有和其它脚本冲突(有意的或无心的)的潜在可能性。例如,用户 A 憎恨用户 B,所以他写了一个脚本破坏用户 B 的 CGI 的数据文件。一个能让脚本作为另一个用户运行的程序是 suEXEC,它包含在 Apache 1.2 中,在Apache服务器代码中通过特殊的 hooks 调用。另一个常用的方法是用 CGIWrap。
--------------------------------------------------------------------------------
阻止用户修改系统配置...
为使服务器更稳定的运行,你也许希望阻止用户修改 .htaccess 文件从而更改你的系统安全方面的设置。以下是一种方法...
在服务器设置文件中,加上
<Directory />
AllowOverride None
Options None
Allow from all
</Directory>
然后为特定目录设置
这将阻止所有的这些命名的之外的overrides,includes 和 accesses。
--------------------------------------------------------------------------------
设定默认为保护服务器文件
一个经常被误解的 Apache 的理念是默认存取(权限)。就是说,除非你采取措施更改它们,如果服务器可以通过正常的 URL 找到一个文件,它将可以将文件提供给客户。
例如,考虑以下例子:
# cd /; ln -s / public_html
Accessing http://localhost/~root/
这将允许客户浏览整个的文件系统。为了解决这个问题,在服务器设置文件中增加以下小节:
<Directory />
Order Deny,Allow
Deny from all
</Directory>
这将禁止默认的可以访问文件系统的设置。增加类似 <Directory> 小节以允许仅仅访问你希望的区域。例如,
<Directory /usr/users/*/public_html>
Order Deny,Allow
Allow from all
</Directory>
<Directory /usr/local/httpd>
Order Deny,Allow
Allow from all
</Directory>
特别注意以下两个指令 <Location> and <Directory> 的交互作用;例如,即使 <Directory /> 拒绝访问,一个 <Location /> 指令也许改变它。
同时,必须机警地和 UserDir 指令打交道;将它设定成类似 "./" 将有相同的作用,对于 root ,像上面的第一个例子。如果你使用 Apache 1.3 或更高版本,我们强烈建议你在服务器设置文件中增加以下行:
UserDir disabled root
--------------------------------------------------------------------------------
请填写问题报告,给 Apache Group 发送任何其它有用的安全技巧。如果你确信你自己在 Apache 源码中发现了一个安全漏洞,请让我们知道.