Web服务器安全策略

随着网络技术的普及、应用和Web技术的不断完善,Web服务已经成为互联网上颇为重要的服务形式之一。原有的客户/服务器模式正在逐渐被浏览器/服务器模式所取代。
  本文将重点介绍Web面临的主要威胁,并结合在Linux中使用较多的Apache服务器,介绍进行Web服务器安全配置的技巧。 

Web服务器面临的安全隐患
  为了保护Web服务器不被恶意***和破坏,第一步就是要了解和识别它所面临的安全风险。
以前,Web站点仅仅提供静态的页面,因此安全风险很少。恶意破坏者进入这类Web站点的惟一方法是获得非法的访问权限。
  近年来,大部分Web服务器不再提供静态的HTML页面,它们提供动态的内容,许多Web站点与颇有价值的客户服务或电子商务活动应用结合在一起(这也是风险所在,通常不注意的)。
  ◆ HTTP拒绝服务。***者通过某些手段使服务器拒绝对HTTP应答。这使得Apache对系统资源(CPU时间和内存)需求的剧增,最终造成系统变慢甚至完全瘫痪。
  ◆ 缓冲区溢出。***者利用CGI程序编写的一些缺陷使程序偏离正常的流程。程序使用静态分配的内存保存请求数据,***者就可以发送一个超长请求使缓冲区溢出。比如一些Perl编写的处理用户请求的网关脚本。一旦缓冲区溢出,***者可以执行其恶意指令。
  ◆ ***者获得root权限。如果Apache以root权限运行,系统上一些程序的逻辑缺陷或缓冲区溢出的手  段,会让***者很容易在本地获得Linux服务器上管理员权限root。在一些远程的情况下,***者会利用一些以root身份执行的有缺陷的系统守护进程来取得root权限,或利用有缺陷的服务进程漏洞来取得普通用户权限,用以远程登录服务器,进而控制整个系统。
  合理的网络配置能够保护Apache服务器免遭多种***。

配置一个安全Apache服务器
1、勤打补丁
  在www.apache.org上最新的changelog中都写着:bug fix、security bug fix的字样。所以,Linux网管员要经常关注相关网站的缺陷修正和升级,及时升级系统或添加补丁。使用最高和最新安全版本对于加强Apache Web服务器的安全是至关重要的。
2、隐藏Apache的版本号
  通常,软件的漏洞信息和特定版本是相关的,因此,版本号对***来说是最有价值的。
默认情况下,系统会把Apache版本系统模块都显示出来(http返回头)。如果列举目录的话,会显示域名信息(文件列表正文)去除Apache版本号:修改配置文件:/etc/httpd.conf.找到关键字ServerSignature,将其设定为:
   ServerSignature Off
   ServerTokens Prod
  然后重新启动Apache服务器。
3.建立一个安全的目录结构结构
  Apache服务器包括四个主要目录:
  (1)ServerRoot:保存配置文件(conf子目录)二进制文件和其他服务器配置文件。
  (2)DocumentRoot:保存Web站点的内容,包括HTML文件和图片等。
  (3)ScripAlias:保存CGI脚本。
  (4)Customlog和Errorlog:保存访问日志和错误日志。
  建议设定这样一个目录结构,以上四个主要目录相互独立并且不存在父子逻辑关系。
  小提示:ServerRoot目录应该被配置为只能由root用户访问;DocumentRoot应该能够被管理Web站点内容的用户访问和被Apache服务器使用Apache用户和Apache用户组访问;ScriptAlias目录应该只能被CGI开发人员和Apache用户访问;只有root用户访问日志目录
  下面是笔者使用的目录结构快照,如图1所示。


  这样的目录结构是比较安全的,因为目录之间是独立的,某个目录的权限错误不会影响其他目录。
4、为Apache使用专门的用户和组
  按照最小特权原则,需要给Apache分配一个合适的权限,让其能够完成Web服务。
  

  小提示:最小特权原则是系统安全中最基本的原则之一,它限制了使用者对系统及数据进行存取所需要的最小权限,既保证了用户能够完成所操作的任务,同时也确保非法用户或异常操作所造成的损失最小。
  必须保证Apache使用一个专门的用户和用户组,不要使用系统预定义的账号,比如nobody用户和nogroup用户组。
  因为只有root用户可以运行Apache,DocumentRoot应该能够被管理Web站点内容的用户访问和Apache服务器使用Apache用户和Apache用户组访问。所以,如果希望“cao”用户在Web站点发布内容,并且可以以httpd身份运行Apache服务器,通常可以这样:
    groupadd webteam
    usermod -G webteam cao
    chown -R httpd.webteam /www/html
    chmod -R 2570 /www/htdocs
  只有root用户访问日志目录,这个目录的推荐权限:
    chown -R root.root /etc/logs
    chmod -R 700 /etc/logs
5Web目录的访问策略
  对于可以访问的Web目录,要使用相对保守的途径进行访问,不要让用户察看任何目录索引列表。
  (1)设定禁止使用目录索引文件
  Apache服务器在接收到用户对一个目录的访问时,会查找Directorylndex指令指定的目录索引文件。默认情况下该文件是index.html。如果该文件不存在,那么Apache会创建动态列表为用户显示该目录的内容。通常这样的设置会暴露Web站点结构,因此需要修改配置文件禁止显示动态目录索引。
修改配置文件httpd.conf:
    
    Options -Indexes FollowSymLinks
    
  Options指令通知Apache禁止使用目录索引。FollowSymLinks表示不允许使用符号链接。
  (2)禁止默认访问
  一个好的安全策略是禁止默认访问的存在。首先禁止默认访问,只对指定目录开启访问权限,如果允许访问/var/www/html目录,使用如下设定:
    
    Order deny,allow
    Allow from all
    
  (3)禁止用户重载
  为了禁止用户对目录配置文件(.htaccess)进行重载(修改),可以这样设定:
    
    AllowOverride None
    
6Apache服务器访问控制策略
  Apache的access.conf文件负责设置文件的访问权限,可以实现互联网域名和IP地址的访问控制。它包含一些指令,控制允许什么用户访问Apache目录。应该把deny from all设为初始化指令,再使用allow from指令打开访问权限。如果允许192.168.1.1到192.168.1.254的主机访问,可以这样设定:
   
   order deny,allow
   deny from all
   allow from pair 192.168.1.0/255.255.255.0
   
7、记录所有情况
  一个优秀的Linux网络管理员会密切记录服务器日志系统,这些日志可以记录异常访问的线索。Apache可以记录所有的访问请求,同样,错误的请求也会记录。
    CustomLog /logs/access.log common    #记录对Web站点的每个进入请求#
    ErrorLog /logs/error.log     #记录产生错误状态的请求#
小提示:这里推荐使用一个优秀的日志分析工具Wusage(www.boutell.com)进行例行分析和监视日志文件。
8Apache服务器的密码保护
  .htaccess文件是Apache服务器上的一个设置文件。它是一个文本文件,可以使用文本编辑器进行编写。.htaccess文件提供了针对目录改变配置的方法,即通过在一个特定的文档目录中放置一个包含一个或多个指令的文件(.htaccess文件),以作用于此目录及其所有子目录。
  .htaccess的功能包括设置网页密码、设置发生错误时出现的文件、改变首页的文件名(如index.html)、禁止读取文件名、重新导向文件、加上MIME类别、禁止列目录下的文件等。通过.htaccess来保护网站更为方便和安全,因为利用.htaccess文件实现密码保护是很难破解的。
9.减少CGISSI风险
  CGI脚本的漏洞已经成为Web服务器的首要安全隐患,通常是程序编写CGI程序中产生了许多的后门和漏洞。控制CGI脚本的漏洞除了在编写时需要注意对输人数据的合法性检查、对系统调用的谨慎使用等因素外,首先使用CGI程序所有者的UID来运行这些程序,是一个好方法。这些CGI程序即使存在某些漏洞,那么其危害也仅限于该UID所能够访问的文件当中。也就是说,这样只能伤害用户的文件,而不会对整个系统带来致命的影响。
  通过安装和使用suEXEC的应用程序,可以为Apache服务器提供CGI程序的控制支持(从Apache l.3版以后,suEXEC已经作为Apache服务器的一部分),可以把suEXEC看作一个包装器,在Apache接到对CGI程序的调用请求后,它将这个调用请求交给suEXEC来负责完成具体的调用,并且从这里获得返回的结果。
  suEXEC能解决一些安全问题,但也会降低服务性能,因为它只能运行在CGI版本的PHP上,而CGI版本比模块版本运行速度慢。原因是模块版本使用了线程,而使用CGI版本的是进程。在不同线程之间的环境转换和访问公用的存储区域显然要比在不同的进程之间要快得多。
  建议在对安全性能要求比较高时使用suEXEC,为此您还要以牺牲速度为代价。另外可以尝试另外一个软件CGIWrap,它的安全性能高于suEXEC。官方网址为:ftp://ftp.cc.umr.edu/pub/cgi/cgiwrap
  减少SSI脚本的风险:如果用exec等SSI命令运行外部程序,也会存在类似CGI脚本程序的危险,除了内部调试程序时都应当可以使用Option命令禁止使用。
   
   Options IncludesNOEXEC
   
10、让Apache服务器在监牢中运行
  所谓“监牢”是指通过chroot机制来更改某个软件运行时所能看到的根目录,即将某软件运行限制在指定目录中,保证该软件只能对该目录及其子目录的文件有所动作,从而保证整个服务器的安全。这样即使被破坏或侵入,所受的损伤也不大。
  将软件chroot化的一个问题是该软件运行时需要的所有程序、配置文件和库文件都必须事先安装到chroot目录中,通常称这个目录为chroot jail(chroot“监牢”)。如果要在“监牢”中运行Apache,而事实上根本看不到文件系统中那个真正的目录,就需要事先创建目录,并将httpd复制到其中。同时,httpd需要库文件,可以使用ldd(Library Dependency Display缩写)命令查看,ldd作用是显示一个可执行程序必须使用的共享库。这意味着还需要在“监牢”中创建lib目录,并将库文件复制到其中。手工完成这一工作是非常麻烦的,此时可以用jail软件包来帮助简化chroot“监牢”建立的过程。Jail官方网站是:http://www.jmcresearch.com/,最新版本为1.9a。
11、使用SSL加固Apache
  使用具有SSL(安全套接字协议层)功能的Web服务器,可以提高网站的安全性能。SSL协议工作在Linux TCP/IP协议和HTTP协议之间,其关系如图2所示。


  SSL使用加密方法来保护Web服务器和浏览器之间的信息流。SSL不仅用于加密在互联网上传递的数据流,而且还提供双方身份验证。这样,您就可以安全地在线购物而不必担心别人窃取您信用卡的信息。这种特性使得SSL适用于那些交换重要信息的地方,像电子商务和基于Web的邮件。
S  SL使用公共密钥加密技术,服务器在连接结束时给客户端发送公用密钥用来加密信息,而加密的信息只有服务器用它自己持有的专用密钥才能解开。客户端用公用密钥加密数据,并且发送给服务端自己的密钥,以惟一确定自己,防止在系统两端之间有人冒充服务端或客户端进行欺骗。加密的HTTP连接用443端口号代替80端口号,以区别于普通的不加密的HTTP。客户端使用加密HTTP连接时会自动使用443端口而不是80端口,这使得服务端更容易作出相应的响应。SSL运行结构见图3。


  Apache服务器使用SSL时通常有两种选择,即主服务器或虚拟Web站点。
12Apache服务器防范DoS
  Apache服务器对拒绝***的防范主要通过软件Apache DoS Evasive Maneuvers Module 来实现。它是一款mod_access的替代软件,可以对抗DoS***。该软件可以快速拒绝来自相同地址对同一URL的重复请求,通过内部一张各子进程的哈希表查询来实现。软件下载链接:http://online  securityfocus.com/data/tools/dospatch.tar.gz。软件安装的配置可以察看Linux中文主页http://www.linux.gov.cn/Apache性能和安全指南,过程很简单,限于篇幅这里就不介绍了。
  同时可以使用Linux系统强大的命令手段Apache服务器防范Dos***。
    netstat -an | grep -i “服务器ip地址:80” | awk '{print $6}' | sort | uniq -c | sort -n
  这个命令会自动统计TCP连接各个状态的数量,如果SYN_RECV很高的话,就不能排除有基于TCP协议的拒绝服务***的可能。这样的话,您需要打开tcp_syncookies
    echo 1 > /proc/sys/net/ipv4/tcp_syncookies
  如果没有 /proc/sys/net/ipv4/tcp_syncookies,说明您的内核不支持syncookies,需要重新编译内核,同时降低syn重试次数。
    echo “1” > /proc/sys/net/ipv4/tcp_syn_retries 
    echo “1” > /proc/sys/net/ipv4/tcp_synack_retries
  同时加大syn_backlog,以保证用户的访问:
    echo “2048” > /proc/sys/net/ipv4/tcp_max_syn_backlog
13、其他安全工具
  使用TCP_wrappersAIDE可以为您的系统提供额外的保护。使用TCP_wrappers可以进一部控制访问权限。AIDE是一个数据完整性检测工具,可以帮助系统管理员监视系统是否被改动过,您可以在AIDE的配置文件中编制特定的策略,监视Web服务器的配置文件、数据和CGI文件是否被修改。
  实际上,大部分Web站点被破坏者恶意***是因为应用程序或脚本中的漏洞。Web安全专家认为,运行在Web服务器上的脚本或应用程序是最大的危险因素。因为CGI脚本通常负责产生动态内容,它们经常导致大部分的损害。对于大部分Web服务器来说,首先应该考虑如何为加强安全配置。
  编辑提示:下期将以Linux下应用的FTP服务器—WuFTPVsftpdProFTP为例,介绍FTP服务的安全策略。