科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网安全频道网络安全使用Mod_Security和Mod_evasive模块保护Apache

使用Mod_Security和Mod_evasive模块保护Apache

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

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

来源:51CTO 2015年2月27日

关键字: mod_security mod_evasive Web服务器安全 DDoS攻击 入侵防护

  • 评论
  • 分享微博
  • 分享邮件

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

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=$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

添加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地址被列入黑名单,并被防火墙阻拦。要是没有这些工具,模拟攻击势必会很快击 垮服务器,导致服务器在攻击持续时段内无法使用。

要是你打算使用(或者过去用过)这些工具,我们很高兴。我们总是期盼你也使用这些工具,欢迎留言交流。

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章