datouniao 2015-06-16
对于那些需要在因特网上提供服务或托管主机的人来说,保证您的系统在面对攻击时的安全是一个重要的事情。
mod_security(一个开源的用于Web应用入侵检测及防护的引擎,可以无缝地集成到Web服务器)和mod_evasive是两个在服务器端对抗暴力破解和(D)Dos攻击的非常重要的工具。
mod_evasive,如它的名字一样,在受攻击时提供避实就虚的功能,它像一个雨伞一样保护Web服务器免受那些威胁。
安装mod_security和mod_evasive来保护Apache
在这篇文章中我们将讨论如何安装、配置以及在RHEL/CentOS6、7和Fedora 21-15上将它们整合到Apache。另外,我们会模拟攻击以便验证服务器做出了正确的反应。
以上以您的系统中安装有LAMP服务器为基础,所以,如果您没有安装,请先阅读下面链接的文章再开始阅读本文。
(LCTT 译注:本文有修改。原文为了在RHEL/CentOS 7或Fedora 21中使用同样的工具,而删除了它们自带的 firewalld,使用了旧式的iptables。译者以为这样并不恰当,因此,译文中做了相应删节,并增加了firewalld的相应脚本。)
另外,在安装LAMP后,您还需要在RHEL/CentOS 7/6中开启EPEL仓库来安装这两个包。Fedora用户不需要开启这个仓库,因为epel已经是Fedora项目的一部分了。
<span class="com"># yum update && yum install mod_security mod_evasive</span>
当安装结束后,您会在/etc/httpd/conf.d下找到这两个工具的配置文件。
<span class="com"># ls -l /etc/httpd/conf.d</span>
mod_security + mod_evasive 配置文件
现在,为了整合这两个模块到Apache,并在启动时加载它们。请确保下面几行出现在mod_evasive.conf和mod_security.conf的顶层部分,它们分别为:
<span class="typ">LoadModule</span><span class="pln"> evasive20_module modules</span><span class="pun">/</span><span class="pln">mod_evasive24</span><span class="pun">.</span><span class="pln">so</span>
<span class="typ">LoadModule</span><span class="pln"> security2_module modules</span><span class="pun">/</span><span class="pln">mod_security2</span><span class="pun">.</span><span class="pln">so</span>
请注意modules/mod_security2.so和modules/mod_evasive24.so都是从/etc/httpd到模块源文件的相对路径。您可以通过列出/etc/httpd/modules的内容来验证(如果需要的话,修改它):
<span class="com"># cd /etc/httpd/modules</span>
<span class="com"># pwd</span>
<span class="com"># ls -l | grep -Ei '(evasive|security)'</span>
验证mod_security + mod_evasive模块
接下来重启Apache并且核实它已加载了mod_evasive和mod_security:
<span class="com"># service httpd restart [在RHEL/CentOS 6和Fedora 20-18上]</span>
<span class="com"># systemctl restart httpd [在RHEL/CentOS 7和Fedora 21上]</span>
<span class="com"># httpd -M | grep -Ei '(evasive|security)' [输出已加载的静态模块和动态模块列表]</span>
检查mod_security + mod_evasive模块已加载
简单来说,一个核心规则集(即CRS)为web服务器提供特定状况下如何反应的指令。mod_security的开发者们提供了一个免费的CRS,叫做OWASP([开放Web应用安全项目])ModSecurity CRS,可以从下面的地址下载和安装。
<span class="com"># mkdir /etc/httpd/crs-tecmint</span>
<span class="com"># cd /etc/httpd/crs-tecmint</span>
<span class="com"># wget https://github.com/SpiderLabs/owasp-modsecurity-crs/tarball/master</span>
下载mod_security核心规则
<span class="com"># tar xzf master</span>
<span class="com"># mv SpiderLabs-owasp-modsecurity-crs-ebe8790 owasp-modsecurity-crs</span>
解压mod_security核心规则
将示例的规则文件(owasp-modsecurity-crs/modsecuritycrs10_setup.conf.example)拷贝为同名的配置文件。
<span class="com"># cp modsecurity_crs_10_setup.conf.example modsecurity_crs_10_setup.conf</span>
并通过将下面的几行插入到web服务器的主配置文件/etc/httpd/conf/httpd.conf来告诉Apache将这个文件和该模块放在一起使用。如果您选择解压打包文件到另一个文件夹,那么您需要修改Include的路径:
<span class="tag"><IfModule</span><span class="atn">security2_module</span><span class="tag">></span>
<span class="pln">Include crs-tecmint/owasp-modsecurity-crs/modsecurity_crs_10_setup.conf</span>
<span class="pln">Include crs-tecmint/owasp-modsecurity-crs/base_rules/*.conf</span>
<span class="tag"></IfModule></span>
最后,建议您在/etc/httpd/modsecurity.d目录下创建自己的配置文件,在那里我们可以用我们自定义的文件夹(接下来的示例中,我们会将其命名为tecmint.conf)而无需修改CRS文件的目录。这样做能够在CRS发布新版本时更加容易的升级。
<span class="tag"><IfModule</span><span class="atn">mod_security2</span><span class="pln">.</span><span class="atn">c</span><span class="tag">></span>
<span class="pln">SecRuleEngine On</span>
<span class="pln">SecRequestBodyAccess On</span>
<span class="pln">SecResponseBodyAccess On </span>
<span class="pln">SecResponseBodyMimeType text/plain text/html text/xml application/octet-stream </span>
<span class="pln">SecDataDir /tmp</span>
<span class="tag"></IfModule></span>
您可以在SpiderLabs的ModSecurity GitHub仓库中参考关于mod_security目录的更完整的解释。
mod_evasive被配置为使用/etc/httpd/conf.d/mod_evasive.conf中的指令。与mod_security不同,由于在包升级时没有规则来更新,因此我们不需要独立的文件来添加自定义指令。
默认的mod_evasive.conf开启了下列的目录(注意这个文件被详细的注释了,因此我们剔掉了注释以重点显示配置指令):
<span class="tag"><IfModule</span><span class="atn">mod_evasive24</span><span class="pln">.</span><span class="atn">c</span><span class="tag">></span>
<span class="pln">DOSHashTableSize 3097</span>
<span class="pln">DOSPageCount 2</span>
<span class="pln">DOSSiteCount 50</span>
<span class="pln">DOSPageInterval 1</span>
<span class="pln">DOSSiteInterval 1</span>
<span class="pln">DOSBlockingPeriod 10</span>
<span class="tag"></IfModule></span>
这些指令的解释:
尽可能的试验这些值,以使您的web服务器有能力处理特定大小的负载。
一个小警告: 如果这些值设置的不合适,则您会蒙受阻挡合法用户的风险。
您也许还会用到以下其它有用的指令:
如果您运行有一个邮件服务器,您可以通过Apache发送警告消息。注意,如果SELinux已开启,您需要授权apache用户SELinux的权限来发送email。您可以通过下面的命令来授予权限:
<span class="com"># setsebool -P httpd_can_sendmail 1</span>
接下来,将这个指令和其他指令一起加入到mod_evasive.conf文件。
<span class="typ">DOSEmailNotify</span><span class="pln"> you@yourdomain</span><span class="pun">.</span><span class="pln">com</span>
如果这个指令设置了合适的值,并且您的邮件服务器在正常的运行,则当一个IP地址被加入黑名单时,会有一封邮件被发送到相应的地址。
它需要一个有效的系统命令作为参数,
<span class="typ">DOSSystemCommand</span><span class="pun"></</span><span class="pln">command</span><span class="pun">></span>
这个指令指定当一个IP地址被加入黑名单时执行的命令。它通常结合shell脚本来使用,比如在脚本中添加一条防火墙规则来阻挡某个IP进一步的连接。
当一个IP地址被加入黑名单,我们需要阻挡它进一步的连接。我们需要下面的shell脚本来执行这个任务。在/usr/local/bin下创建一个叫做scripts-tecmint的文件夹(或其他的名字),以及一个叫做ban_ip.sh的文件。
用于iptables防火墙
<span class="com">#!/bin/sh</span>
<span class="com"># 由mod_evasive检测出,将被阻挡的IP地址</span>
<span class="pln">IP</span><span class="pun">=</span><span class="pln">$1</span>
<span class="com"># iptables的完整路径</span>
<span class="pln">IPTABLES</span><span class="pun">=</span><span class="str">"/sbin/iptables"</span>
<span class="com"># mod_evasive锁文件夹</span>
<span class="pln">mod_evasive_LOGDIR</span><span class="pun">=</span><span class="str">/var/</span><span class="pln">log</span><span class="pun">/</span><span class="pln">mod_evasive</span>
<span class="com"># 添加下面的防火墙规则 (阻止所有从$IP流入的流量)</span>
<span class="pln">$IPTABLES </span><span class="pun">-</span><span class="pln">I INPUT </span><span class="pun">-</span><span class="pln">s $IP </span><span class="pun">-</span><span class="pln">j DROP</span>
<span class="com"># 为了未来的检测,移除锁文件</span>
<span class="pln">rm </span><span class="pun">-</span><span class="pln">f </span><span class="str">"$mod_evasive_LOGDIR"</span><span class="pun">/</span><span class="pln">dos</span><span class="pun">-</span><span class="str">"$IP"</span>
用于firewalld防火墙
<span class="com">#!/bin/sh</span>
<span class="com"># 由mod_evasive检测出,将被阻挡的IP地址</span>
<span class="pln">IP</span><span class="pun">=</span><span class="pln">$1</span>
<span class="com"># firewalld-cmd的完整路径</span>
<span class="pln">FIREWALL_CMD</span><span class="pun">=</span><span class="str">"/usr/bin/firewall-cmd"</span>
<span class="com"># mod_evasive锁文件夹</span>
<span class="pln">mod_evasive_LOGDIR</span><span class="pun">=</span><span class="str">/var/</span><span class="pln">log</span><span class="pun">/</span><span class="pln">mod_evasive</span>
<span class="com"># 添加下面的防火墙规则 (阻止所有从$IP流入的流量)</span>
<span class="pln">$FIREWALL_CMD </span><span class="pun">--</span><span class="pln">zone</span><span class="pun">=</span><span class="pln">drop </span><span class="pun">--</span><span class="pln">add</span><span class="pun">-</span><span class="pln">source $IP</span>
<span class="com"># 为了未来的检测,移除锁文件</span>
<span class="pln">rm </span><span class="pun">-</span><span class="pln">f </span><span class="str">"$mod_evasive_LOGDIR"</span><span class="pun">/</span><span class="pln">dos</span><span class="pun">-</span><span class="str">"$IP"</span>
我们的DOSSystemCommand指令应该是这样的:
<span class="typ">DOSSystemCommand</span><span class="str">"sudo /usr/local/bin/scripts-tecmint/ban_ip.sh %s"</span>
上面一行的%s代表了由mod_evasive检测到的攻击IP地址。
请注意,如果您不给予apache用户以无需终端和密码的方式运行我们脚本(关键就是这个脚本)的权限,则这一切都不起作用。通常,您只需要以root权限键入visudo来存取/etc/sudoers文件,接下来添加下面的两行即可:
<span class="pln">apache ALL</span><span class="pun">=</span><span class="pln">NOPASSWD</span><span class="pun">:</span><span class="str">/usr/</span><span class="kwd">local</span><span class="pun">/</span><span class="pln">bin</span><span class="pun">/</span><span class="pln">scripts</span><span class="pun">-</span><span class="pln">tecmint</span><span class="pun">/</span><span class="pln">ban_ip</span><span class="pun">.</span><span class="pln">sh</span>
<span class="typ">Defaults</span><span class="pun">:</span><span class="pln">apache </span><span class="pun">!</span><span class="pln">requiretty</span>
添加Apache用户到Sudoers
重要: 在默认的安全策略下您只能在终端中运行sudo。由于这个时候我们需要在没有tty的时候运行sudo,我们必须像下图中那样注释掉下面这一行:
<span class="com">#Defaults requiretty</span>
为Sudo禁用tty
最后,重启web服务器:
<span class="com"># service httpd restart [在RHEL/CentOS 6和Fedora 20-18上]</span>
<span class="com"># systemctl restart httpd [在RHEL/CentOS 7和Fedora 21上]</span>
有许多工具可以在您的服务器上模拟外部的攻击。您可以google下“tools for simulating ddos attacks”来找一找相关的工具。
注意,您(也只有您)将负责您模拟所造成的结果。请不要考虑向不在您自己网络中的服务器发起模拟攻击。
假如您想对一个由别人托管的VPS做这些事情,您需要向您的托管商发送适当的警告或就那样的流量通过他们的网络获得允许。Tecmint.com不会为您的行为负责!
另外,仅从一个主机发起一个Dos攻击的模拟无法代表真实的攻击。为了模拟真实的攻击,您需要使用许多客户端在同一时间将您的服务器作为目标。
我们的测试环境由一个CentOS 7服务器[IP 192.168.0.17]和一个Windows组成,在Windows[IP 192.168.0.103]上我们发起攻击:
确认主机IP地址
请播放下面的视频(YT 视频,请自备梯子: https://www.youtube.com/-U_mdet06Jk ),并跟从列出的步骤来模拟一个Dos攻击:
然后攻击者的IP将被防火墙阻挡:
阻挡攻击者的IP地址
在开启mod_security和mod_evasive的情况下,模拟攻击会导致CPU和RAM用量在源IP地址被加入黑名单之前出现短暂几秒的使用峰值。如果没有这些模块,模拟攻击绝对会很快将服务器击溃,并使服务器在攻击期间无法提供服务。
我们很高兴听见您打算使用(或已经使用过)这些工具。我们期望得到您的反馈,所以,请在留言处留下您的评价和问题,谢谢!
via: http://www.tecmint.com/protect-apache-using-mod\_security-and-mod\_evasive-on-rhel-centos-fedora/
作者:Gabriel Cánepa 译者:wwy-hust 校对:wxy