网站服务器安全是个大话题;说到什么是加固某一台网站服务器的最佳工具和技术,不同的人自有不同的偏好和观点。就Apache网站服务器而言,即便不是所有专家,至少也是绝大多数专家一致认为,mod_security和mod_evasive是两个非常重要的模块,可以保护Apache网站服务器远离常见的威胁。
我们在本文中将探讨如何安装及配置mod_security和mod_evasive,假设Apache HTTP网站服务器已经搭建并运行起来。我们将执行演示性质的压力测试,看看该网站服务器在遇到拒绝服务(DOS)攻击时会有怎样的反应,并且演示它如何借助这些模块来反击。我们在本教程中将使用CentOS平台。
安装mod_security和mod_evasive
要是你还没有启用CentOS/RHEL服务器中的EPEL软件库,就需要先启用该软件库,之后再安装这些软件包。
# yum install mod_security # yum install mod_evasive
安装完成后,你会在/etc/httpd/conf.d里面找到主配置文件:
现在,你需要确保Apache启动时装入这两个模块。在mod_security.conf和mod_evasive.conf中分别寻找下列行(如果没有这些行,就添加上去):
LoadModule security2_module modules/mod_security2.so LoadModule evasive20_module modules/mod_evasive20.so
在上述两行:
•LoadModule指令告诉Apache链接对象文件(*.so),将它添加到活动模块列表。
•security2_module和evasive20_module是模块的名称。
•modules/mod_security2.so和modules/mod_evasive20.so是从/etc/httpd目录到模块源文件的相对路径。只要检查/etc/httpd/modules目录的内容,就能核实路径(必要的话,还可以更改路径)。
现在重启Apache网站服务器:
# service httpd restart
#p#
配置mod_security
为了使用mod_security,必须先安装核心规则集(CRS)。基本上而言,CRS为网站服务器提供了一套规则,这套规则明确了在某些情形下服务器有怎样的行为。Trustwave的SpiderLabs(开发mod_security的公司)提供了开放式Web应用安全项目(OWASP)ModSecurity CRS,详见https://www.owasp.org/index.php/Category:OWASP_ModSecurity_Core_Rule_Set_Project。
如果想下载并安装最新的OWASP CRS,可以使用下面这些命令。
# mkdir /etc/httpd/crs # cd /etc/httpd/crs # wget https://github.com/SpiderLabs/owasp-modsecurity-crs/tarball/master # tar xzf master # mv SpiderLabs-owasp-modsecurity-crs-ebe8790 owasp-modsecurity-crs
现在,浏览到已安装的OWASP CRS目录。
# cd /etc/httpd/crs/owasp-modsecurity-crs
在OWASP CRS目录里面,你会找到附有规则的示例文件(modsecurity_crs_10_setup.conf.example)。
我们将该文件的内容拷贝到一个新文件中,为了方便起见,新文件名为modsecurity_crs_10_setup.conf。
# cp modsecurity_crs_10_setup.conf.example modsecurity_crs_10_setup.conf
为了告诉Apache就mod_security模块使用这个文件,将下面几行插入到/etc/httpd/conf/httpd.conf文件中。具体路径可能不一样,取决于你将CRS打包文件解压缩在何处。
<IfModule security2_module>
Include crs/owasp-modsecurity-crs/modsecurity_crs_10_setup.conf
Include crs/owasp-modsecurity-crs/base_rules/*.conf
</IfModule>
最后但并非最不重要的是,我们将在modsecurity.d目录里面创建自己的配置文件,我们会将所选择的指令加入到该配件文件中。在本例中,我们将这个配置文件命名为xmodulo.conf。强烈建议你别直接编辑CRS文件,而是把所有必要的指令都放在这个配置文件中。这样一来,更新的CRS发布后,就比较容易升级。
# vi /etc/httpd/modsecurity.d/xmodulo.conf
<IfModule mod_security2.c>
SecRuleEngine On
SecRequestBodyAccess On
SecResponseBodyAccess On
SecResponseBodyMimeType text/plain text/html text/xml application/octet-stream
SecDataDir /tmp
</IfModule>
•SecRuleEngine On:使用OWASP CRS检测并阻止恶意攻击。
•SecRequestBodyAccess On:启用对传送数据的请求主体(比如POST参数)进行检查的功能。
•SecResponseBodyAccess On:缓冲响应主体(前提是响应MIMI类型符合用SecResponseBodyMimeType配置的列表)。
•SecResponseBodyMimeType text/plain text/html text/xml application/octet-stream:配置认为哪些MIME类型用于响应主体缓冲。如果你对MIME类型不熟悉,或者对它们的名称或用法没有把握,可以检查互联网编号分配机构(IANA)网站。
•SecDataDir /tmp:存储持久性数据(比如IP地址数据和会话数据等数据)的路径。这里的持久性意味着不存储在内存中,而是存储在硬盘上的任何数据。
你可以访问SpiderLabs的ModSecurity GitHub软件库:https://github.com/SpiderLabs/ModSecurity/wiki/Reference-Manual#Configuration_Directives,参阅配置指令的完整指南。
别忘了重启Apache,让变更生效。#p#
配置mod_evasive
mod_evasive模块读取来自/etc/httpd/conf.d/mod_evasive.conf的配置。与mod_security不一样,我们不需要独立的配置文件,因为在系统或软件包升级过程中没有规则需要更新。
默认的mod_evasive.conf文件已启用了下列指令:
<IfModule mod_evasive20.c>
DOSHashTableSize 3097
DOSPageCount 2
DOSSiteCount 50
DOSPageInterval 1
DOSSiteInterval 1
DOSBlockingPeriod 10
</IfModule>
•DOSHashTableSize:用来跟踪每个IP地址活动的哈希表的大小。加大这个数值可以加快查询客户机过去所访问的网站的速度,但要是该值设得过高,可能会影响整体性能。
•DOSPageCount:访客在DOSPageInterval间隔时间内可以向某个URI(比如Apache加载的文件)发出的相同请求的数量。
•DOSSiteCount:类似DOSPageCount,不过是指在DOSSiteInterval间隔时间内可以向网站发出总共多少个请求。
•DOSBlockingPeriod:如果访客超过了DOSSPageCount或DOSSiteCount设定的限制,他或她在DOSBlockingPeriod时间段时被列入黑名单。在这个间隔时间内,来自他/她的任何请求将返回403 Forbidden出错信息。
你可能需要根据自己的网站服务器需要处理的流量大小和类型来更改这些值。请注意:如果这些值没有合理设置,最后可能会阻止正当的访客。
下面是用于mod_evasive的其他实用指令:
1. DOSEmailNotify:只要IP地址被列入黑名单,就发送电子邮件到指定的地址。它需要一个有效的电子邮件地址作为变量。如果SELinux状态被设成enforcing(执行),你就需要为用户apache可授予发送电子邮件的SELinux权限。也就是说,以root用户的身份来运行该命令。
# setsebool -P httpd_can_sendmail 1
然后,将该指令添加到mod_evasive.conf文件中:
DOSEmailNotify you@yourdomain.com
2. DOSSystemCommand:只要IP地址被列入黑名单,就执行自定义系统命令。它可能适用于添加防火墙规则,完全阻止不正当的IP地址:
DOSSystemCommand <command>
我们将使用该指令,通过下列脚本(/etc/httpd/scripts/ban_ip.sh)来添加防火墙规则:
#!/bin/sh
# 不正当的IP被mod_evasive检测出来
IP=$1
# 用户apache通过sudo执行的iptables二进制文件的路径
IPTABLES="/sbin/iptables"
# mod_evasive锁定目录
MOD_EVASIVE_LOGDIR=/tmp
# 添加下列防火墙规则(阻止IP)
$IPTABLES -I INPUT -s $IP -j DROP
# 2小时后,通过‘at’命令解除阻止不正当的IP;参阅“man at”,即可了解进一步的细节
echo "$IPTABLES -D INPUT -s $IP -j DROP" | at now + 2 hours
# 删除锁定文件,以便将来核查
rm -f "$MOD_EVASIVE_LOGDIR"/dos-"$IP"
我们的DOSSystemCommand指令然后显示如下:
DOSSystemCommand "sudo /etc/httpd/scripts/ban_ip.sh %s"
别忘了更新sudo权限,以便以apache用户的身份运行脚本:
# vi /etc/sudoers apache ALL=NOPASSWD: /usr/local/bin/scripts/ban_ip.sh Defaults:apache !requiretty
#p#
模拟DoS攻击
我们将使用三款工具对我们的Apache网站服务器进行压力测试,该服务器运行在CentOS 6.5平台上,配备512 MB内存和AMD速龙II X2 250处理器,分别在启用和禁用mod_security和mod_evasive的情况下进行测试,检查该网站服务器在每一种情况下表现如何。
确保你只在自己的测试服务器中执行下列步骤,别针对外部的生产网站执行下列步骤。
在下面几个例子中,将http://centos.gabrielcanepa.com.ar/index.php换成你自己的域和所选择的文件。
基于Linux的工具
1. Apache bench:Apache服务器基准测试工具。
# ab -n1000 -c1000 http://centos.gabrielcanepa.com.ar/index.php
•-n:为基准测试会话而执行的请求数量。
•-c:每次执行的多个请求数量。
2. test.pl:mod_evasive模块随带的Perl脚本。
#!/usr/bin/perl
# test.pl:测试mod_dosevasive功效的小脚本
use IO::Socket;
use strict;
for(0..100) {
my($response);
my($SOCKET) = new IO::Socket::INET( Proto => "tcp",
PeerAddr=> "192.168.0.16:80");
if (! defined $SOCKET) { die $!; }
print $SOCKET "GET /?$_ HTTP/1.0\n\n";
$response = <$SOCKET>;
print $response;
close($SOCKET);
}
基于Windows的工具
1. Low Orbit Ion Cannon(LOIC):这是一款网络压力测试工具。为了生成工作负载,请按照下面屏幕截图中显示的顺序,其他的别去改动。
压力测试结果
mod_security和mod_evasive启用后(三款工具同时运行),处理器和内存使用率达到最高峰,分别是60%和50%,这种情形只持续了2秒,之后源IP被列入黑名单,被防火墙阻止,攻击随告停止。
另一方面,如果禁用mod_security和mod_evasive,上述三款工具很快就击倒了服务器(而且在攻击持续时段一直保持这个状态);当然,不正当的IP地址并没有被列入黑名单。
结束语
我们可以看出,如果配置得当,mod_security和mod_evasive是加固Apache网站服务器,防范几种威胁的两个重要工具,应当考虑部署在暴露在互联网上的环境中。
原文地址:http://xmodulo.com/2014/09/harden-apache-web-server-mod_security-mod_evasive-centos.html