安全

  |  手机版

收藏网站

投稿QQ:1745232315

IT专家网,汇聚专业声音 解析IT潮流 IT专家网,汇聚专业声音 解析IT潮流

网络

专家视点在现场环球瞭望
IT专家网 > 安全

使用Mod_Security和Mod_evasive模块保护Apache

作者:ZDNet出处:论坛2015-02-28 08:09

  对于从事主机托管行业的人士来说,或者如果你托管自己的服务器,并将服务器暴露在互联网面前,那么保护系统远离攻击者肯定是重中之重。

  mod_security和mod_evasive是两种非常重要的工具,它们可以用来保护Web服务器远离蛮力攻击或分布式拒绝服务(DDoS)攻击。mod_security是一种面向Web应用程序的开源入侵检测和预防引擎,它与Web服务器无缝地整合起来。

  顾名思义,mod_evasive提供了规避功能;另外在遭到攻击时,还能充当保护伞,保护Web服务器远离这种威胁。

安装Mod_Security和Mod_Evasive来保护Apache

  安装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

Iptables防火墙

  禁用Firewalld服务

  然后,在启用iptables之前,安装iptables-services程序包:

  # yum update && yum install iptables-services

  # systemctl enable iptables

  # systemctl start iptables

  # systemctl status iptables

使用Mod_Security和Mod_evasive模块保护Apache

  安装Iptables防火墙

  第二步:安装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的配置

  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模块

  证实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模块

  检查已装入的mod_security和mod_evasive模块

  第三步:安装核心规则集和配置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核心规则

  下载mod_security核心规则

  2. 解压CRS文件,将目录名称改成便于我们使用的一个名称。

  # tar xzf master

  # mv SpiderLabs-owasp-modsecurity-crs-ebe8790 owasp-modsecurity-crs

抽取mod_security核心规则

  抽取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配置指令的完整的解释性指南。

  第四步:配置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=

  # 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

  添加Apache用户到Sudoers

  重要提示:作为一项默认的安全策略,你只能在终端中运行sudo。由于在这里我们需要使用不带tty的sudo,我们只好注释掉下图中高亮显示的那一行:

  #Defaults requiretty

为Sudo禁用tty

  为Sudo禁用tty

  最后,重启Web服务器:

  # service httpd restart [On RHEL/CentOS 6 and Fedora 20-18]

  # systemctl restart httpd [On RHEL/CentOS 7 and Fedora 21]

  第五步:在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地址

  请播放下列视频,按照概述的步骤来操作,以模拟简单的拒绝服务攻击:

  然后,冒犯性的IP地址被iptables阻拦:

被阻拦的攻击IP地址

  被阻拦的攻击IP地址

  结束语

  mod_security和mod_evasive被启用后,模拟的攻击导致处理器和内存暂时出现使用高峰,不过只持续了几秒,随后源IP地址被列入黑名单,并被防火墙阻拦。要是没有这些工具,模拟攻击势必会很快击 垮服务器,导致服务器在攻击持续时段内无法使用。

相关文章

关键词:mod_security mod_evasive, Web服务器安全, DDoS攻击, 入侵防护,网络安全

责任编辑:容心

网警备案