对于从事主机托管行业的人士来说,或者如果你托管自己的服务器,并将服务器暴露在互联网面前,那么保护系统远离攻击者肯定是重中之重。
mod_security和mod_evasive是两种非常重要的工具,它们可以用来保护Web服务器远离蛮力攻击或分布式拒绝服务(DDoS)攻击。mod_security是一种面向Web应用程序的开源入侵检测和预防引擎,它与Web服务器无缝地整合起来。
顾名思义,mod_evasive提供了规避功能;另外在遭到攻击时,还能充当保护伞,保护Web服务器远离这种威胁。
安装Mod_Security和Mod_Evasive来保护Apache
我们在本文中将讨论如何在RHEL/CentOS 6和7以及Fedora 21-15上安装、配置这两个模块,并让它们与Apache协同运行。此外,我们会模拟攻击,以便证实服务器作出相应的反应。
本文假设你已在系统上安装了LAMP服务器。要是还没有安装,请在开始下一步之前参阅这篇文章《在RHEL/CentOS 7中安装LAMP架构》:http://www.tecmint.com/install-lamp-in-centos-7/。
如果你在运行RHEL/CentOS 7或Fedora 21,还需要将iptables设置为默认防火墙前端,而不是将firewalld设置为默认防火墙前端。我们这么做是为了在RHEL/CentOS 7/6和dora 21中都使用同一个工具。
第一步:将Iptables防火墙安装到RHEL/CentOS 7和Fedora 21上
想开始入手,先停止并禁用firewalld:
# systemctl stop firewalld
# systemctl disable firewalld
禁用Firewalld服务
然后,在启用iptables之前,安装iptables-services程序包:
# yum update && yum install iptables-services
# systemctl enable iptables
# systemctl start iptables
# systemctl status iptables
安装Iptables防火墙#p#
第二步:安装Mod_Security和Mod_evasive
除了已经部署到位的LAMP架构外,你还要启用RHEL/CentOS 7/6中的EPEL软件库,那样才能安装这两个程序包。Fedora用户不需要启用任何软件库,因为epel早已是Fedora项目的一部分。
# yum update && yum install mod_security mod_evasive
安装完毕后,你可以在/etc/httpd/conf.d中找到这两个工具的配置文件。
# ls -l /etc/httpd/conf.d
mod_security和mod_evasive的配置
现在,为了将这两个模块与Apache整合起来,并且在Apache启动时让它装入这两个模块,就要确保下面几行分别出现在mod_evasive.conf和mod_security.conf的顶层部分:
LoadModule evasive20_module modules/mod_evasive24.so
LoadModule security2_module modules/mod_security2.so
请注意:modules/mod_security2.so和modules/mod_evasive24.so是相对路径,从/etc/httpd目录到模块的源文件。你可以列出/etc/httpd/modules目录的内容对此加以证实(需要的话,还可以更改):
# cd /etc/httpd/modules
# pwd
# ls -l | grep -Ei '(evasive|security)'
证实mod_security和mod_evasive模块
然后重启Apache,证实它装入了mod_evasive和mod_security:
# service httpd restart [On RHEL/CentOS 6 and Fedora 20-18]
# systemctl restart httpd [On RHEL/CentOS 7 and Fedora 21]
[Dump a list of loaded Static and Shared Modules]
# httpd -M | grep -Ei '(evasive|security)'
检查已装入的mod_security和mod_evasive模块#p#
第三步:安装核心规则集和配置Mod_Security
简单地说,核心规则集(又叫CRS)为Web服务器提供了在某些情况下如何运行的指令。开发mod_security的公司提供了一套免费的CRS,名为OWASP(开放式Web应用安全项目)ModSecurity CRS,可以下载并安装,具体如下所示。
1. 将OWASP CRS下载到一个专门为此而建立的目录。
# mkdir /etc/httpd/crs-tecmint
# cd /etc/httpd/crs-tecmint
# wget https://github.com/SpiderLabs/owasp-modsecurity-crs/tarball/master
下载mod_security核心规则
2. 解压CRS文件,将目录名称改成便于我们使用的一个名称。
# tar xzf master
# mv SpiderLabs-owasp-modsecurity-crs-ebe8790 owasp-modsecurity-crs
抽取mod_security核心规则
3. 现在可以配置mod_security了。将拥有规则的样本文件(owasp-modsecurity-crs/modsecurity_crs_10_setup.conf.example)拷贝到没有.example扩展名的另一个文件中。
# cp modsecurity_crs_10_setup.conf.example modsecurity_crs_10_setup.conf
并告诉Apache使用这个文件以及模块,为此只要在Web服务器的主配置文件/etc/httpd/conf/httpd.conf文件中插入下面几行。如果你选择在另一个目录中解压tarball,就需要编辑Include指令后面的路径:
Include crs-tecmint/owasp-modsecurity-crs/modsecurity_crs_10_setup.conf
Include crs-tecmint/owasp-modsecurity-crs/base_rules/*.conf
最后,我们建议:应该在/etc/httpd/modsecurity.d目录里面创建自己的配置文件,我们将把定制的指令放在该文件(我们在下面的例子将文件命名为tecmint.conf)里面,而不是直接改动CRS文件。这么一来,新版本发布后,更容易升级CRS。
SecRuleEngine On
SecRequestBodyAccess On
SecResponseBodyAccess On
SecResponseBodyMimeType text/plain text/html text/xml application/octet-stream
SecDataDir /tmp
你可以参阅SpiderLabs的ModSecurity GitHub软件库(https://github.com/SpiderLabs/ModSecurity/wiki/Reference-Manual#Configuration_Directives),了解mod_security配置指令的完整的解释性指南。#p#
第四步:配置Mod_Evasive
mod_evasive使用/etc/httpd/conf.d/mod_evasive.conf中的指令来配置。与mod_security不同,由于在程序包升级期间没有规则要更新,我们不需要单独的文件来添加定制的指令。
默认的mod_evasive.conf文件启用了下列指令(请注意该文件添加了大量注释,于是我们去除了注释,重点突出下列配置指令):
DOSHashTableSize 3097
DOSPageCount 2
DOSSiteCount 50
DOSPageInterval 1
DOSSiteInterval 1
DOSBlockingPeriod 10
指令解释:
•DOSHashTableSize:该指令指定了用来根据每个IP地址跟踪活动的哈希表的大小。增加这个值可以更快速地查询客户机在过去访问过的网站,但要是该值设得过高,可能会影响总体性能。
•DOSPageCount:访客在DOSPageInterval间隔期间内对某个特定URI(比如,Apache服务的任何文件)提出的合法的相同请求数量。
•DOSSiteCount:类似于DOSPageCount,不过是指在DOSSiteInterval间隔期间内对整个网站能提出多少整体请求。
•DOSBlockingPeriod:如果访客超过了DOSSPageCount或DOSSiteCount设置的限值,其源IP地址在DOSBlockingPeriod时间段内将被列入黑名单。在DOSBlockingPeriod期间,来自该IP地址的任何请求将遇到403禁止错误。
可以随意尝试这些值,以便你的Web服务器能够处理所需要的流量数量和类型。
只是有一个小地方需要注意:要是这些值没有设置好,有可能最后阻拦合法访客。
你可能还应该考虑其他有用的指令:
DOSEmailNotify
如果你已经在运行一台邮件服务器,可以通过Apache发送警告信息。请注意:如果SELinux被设置成执行,你需要为apache用户授予SELinux许可权限,以便发送电子邮件。为此,你可以运行下面这个命令:
# setsebool -P httpd_can_sendmail 1
下一步,将该指令连同其他指令一并添加到mod_evasive.conf文件中:
DOSEmailNotify you@yourdomain.com
如果该值已设置好,而且你的邮件服务器正常运行,一旦某个IP地址被列入黑名单,电子邮件就会被发送到指定的地址。
DOSSystemCommand
这需要有效的系统命令作为变量,
DOSSystemCommand
该指令指定了IP地址被列入黑名单后所执行的命令。它常常与添加防火墙规则以阻止今后从该IP地址来进行连接的外壳脚本结合使用。
编写在防火墙层面处理IP黑名单机制的外壳脚本
某个IP地址被列入黑名单后,我们就要阻止今后来自它的连接。我们要使用执行这项任务的下列外壳脚本。在/usr/local/bin中创建一个名为scripts-tecmint的目录(名称可以随意取),并在该目录中创建一个名为ban_ip.sh的文件。
#!/bin/sh
# IP that will be blocked, as detected by mod_evasive
IP=$1
# Full path to iptables
IPTABLES="/sbin/iptables"
# mod_evasive lock directory
MOD_EVASIVE_LOGDIR=/var/log/mod_evasive
# Add the following firewall rule (block all traffic coming from $IP)
$IPTABLES -I INPUT -s $IP -j DROP
# Remove lock file for future checks
rm -f "$MOD_EVASIVE_LOGDIR"/dos-"$IP"
我们的DOSSystemCommand指令应该如下所示:
DOSSystemCommand "sudo /usr/local/bin/scripts-tecmint/ban_ip.sh %s"
在上面这行中,%s代表被mod_evasive检测出来的冒犯性的IP。
将apache用户添加到sudoers文件
请注意:除非你为用户apache授予无需终端和密码即可运行脚本(只有这个脚本!)的权限,否则这一切根本不管用。如往常一样,你只要键入visudo作为根用户,即可访问/etc/sudoers文件,然后添加下面两行,如下图所示:
apache ALL=NOPASSWD: /usr/local/bin/scripts-tecmint/ban_ip.sh
Defaults:apache !requiretty
添加Apache用户到Sudoers
重要提示:作为一项默认的安全策略,你只能在终端中运行sudo。由于在这里我们需要使用不带tty的sudo,我们只好注释掉下图中高亮显示的那一行:
#Defaults requiretty
为Sudo禁用tty
最后,重启Web服务器:
# service httpd restart [On RHEL/CentOS 6 and Fedora 20-18]
# systemctl restart httpd [On RHEL/CentOS 7 and Fedora 21]
#p#
第五步:在Apache上模拟DDoS攻击
你可以使用几个工具在自己的服务器上模拟外部攻击。只要在谷歌搜索引擎上输入“tools for simulating ddos attacks”,即可找到其中的几个工具。
请注意:你要对模拟的结果完全负责。想对不在自己的网络上托管运行的服务器发动模拟攻击,劝你莫动这个念头。
如果你想对别人托管的虚拟专用服务器(VPS)进行同样的模拟攻击,就需要以适当的方式提醒主机托管提供商,或者获得许可,以便这种洪水流量可以通过其网络来传输。我们Tecmint.com绝对不对你的行为负责!
此外,只从一个主机发动模拟的拒绝服务攻击并不代表是现实的攻击。想模拟这种攻击,你就需要同时从几个客户机向你的服务器发动攻击。
我们的测试环境包括一台CentOS 7服务器 [IP 192.168.0.17]和一个Windows主机[IP 192.168.0.103],我们将从该主机发动攻击:
证实主机的IP地址
请播放下列视频,按照概述的步骤来操作,以模拟简单的拒绝服务攻击:
然后,冒犯性的IP地址被iptables阻拦:
被阻拦的攻击IP地址
结束语
mod_security和mod_evasive被启用后,模拟的攻击导致处理器和内存暂时出现使用高峰,不过只持续了几秒,随后源IP地址被列入黑名单,并被防火墙阻拦。要是没有这些工具,模拟攻击势必会很快击 垮服务器,导致服务器在攻击持续时段内无法使用。
要是你打算使用(或者过去用过)这些工具,我们很高兴。我们总是期盼你也使用这些工具,欢迎留言交流。
原文地址:http://www.tecmint.com/protect-apache-using-mod_security-and-mod_evasive-on-rhel-centos-fedora/