批准ServerRoot目录
在典型操作中,Apache服务器是由root用户启动的,并且通过用户指令转变为用户定义的操作。正如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子目录,因为根永远不能在那里执行任何文件,不应该在那里创建任何文件。
如果你允许非根用户修改根不能执行或者写入的任何文件,那么,你的系统的根就会被攻破。例如,有人会替换httpd二进制代码,这样,当你下一次启动机器的时候,它就会执行任意代码。如果这个记录目录是允许非根用户写入的,有人就会用其它系统文件取代这个记录文件。然后,根就能够使用任何数据覆盖那个文件。如果那些记录文件本身是允许非根用户写入的,有人就会用虚假的数据覆盖那个记录本身。
服务器端包含(SSI)
第一个风险是服务器工作量的增加。所有具有SSI功能的文件都必须由Apache服务器解析,无论这些文件是否包含任何SSI指令。虽然这个工作量增加的很少,但是,在一个共享服务器环境中,这个工作量将变得非常大。
一般来说,SSI文件能够产生与CGI脚本相同的风险。使用“exec cmd”指令,具有SSI功能的文件能够在用户的允许之下执行任何CGI脚本或者程序。组Apache服务器可根据httpd.conf文件中的设置运行。这应该为服务器管理员提供一个休息的机会。
在利用SSI文件提供的好处的同时,有许多提高SSI文件安全的方法。
要限制一个难以驾驭的SSI文件引起的损失,服务器管理员可以按照CGI总则部门介绍的方法启用suexec程序。
让有.html或者.htm扩展名的文件具有SSI功能是危险的。特别是在共享的、通讯量大服务器环境更是如此。具有SSI功能的文件应该有一个单独的扩展名,如.shtml。这有助于把工作量保持在较低的水平,使风险管理更加容易。
另一个解决方案是关闭从SSI页运行脚本和程序的能力。要做到这一点,在选项指令中用“IncludesNOEXEC”取代“Includes”。注意,用户也许仍然可以使用 <--#include virtual="..." --> 执行CGI脚本,如果这些脚本在一个ScriptAlias指令指定的目录中的话。
非脚本别名的CGI
应该仅在如下条件下才允许用户使用任何目录中的CGI脚本:
1.你信任你的用户不会编写这种脚本,故意或无意地让你的系统遭受攻击。
2.你认为你的网站安全在其它方面如此的脆弱,以至于多一个漏洞也没有关系。
3.你没有用户,而且没有人访问你的服务器。
脚本别名的CGI
把CGI限制在特定的目录中可让管理员控制进入目录的内容。这必然比“非脚本别名的CGI”更安全,但是,这仅限于拥有这些目录写入权限的用户是可信赖的,或者管理员愿意测试每一个新的CGI脚本/程序,查找其中的漏洞。
大多数网站选择这个选项,不选择“非脚本别名的CGI”方法。
通用CGI
你要永远记住,你必须相信CGI脚本/程序的作者,或者相信你自己有能力发现CGI中潜在的安全漏洞,无论这些漏洞是有意的或是无心的。
所有CGI脚本将作为同一用户运行,因此,这些脚本有可能相互冲突(意外的或故意的)。例如,用户A憎恨用户 B,于是他编写一个脚本破坏用户B的 CGI数据库。一个能够用来允许脚本以不同用户身份运行的程序是 suEXEC。它包含在Apache 1.2版中,可以使用Apache服务器代码调用。另一个常用的方法是使用CGIWrap。
其它动态内容资源
嵌入的脚本选项以服务器本身的身份运行。这些选项作为服务器本身的一部分运行,如mod_php、mod_perl、mod_tcl和mod_python等。因此,这些引擎执行这些脚本能够让服务器用户访问任何内容。有些脚本引擎可能提供一些限制措施,但是,最好是安全一些,不要这样做。
保护系统设置
要保证系统安全,你要阻止用户设置.htaccess文件,因为这个文件能够覆盖你设置的安全功能。下面是实现这个目的的一种方法。
在服务器设置文件中输入:
<Directory />
AllowOverride None
</Directory>
除了特别启用的之外,这个设置将阻止在所有的目录中使用.htaccess文件。
设定默认保护服务器文件
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>和<Directory>的交互作用;例如,即使<Directory/>拒绝访问,一个<Location/>指令也许改变它。
同时,必须谨慎地使用“UserDir”指令;对于root来说,把它设定成类似“./”的样子将有相同的作用,与上面的第一个例子相同。如果你在使用Apache 1.3或更高版本,我们强烈建议你在服务器设置文件中增加下面一行:
UserDir disabled root