如何使用Mod_Security和Mod_evasive模块保护Apache 提升DDOS防御力
对于从事主机业务的人来说,如果你正在托管自己的服务器并将它们暴露在互联网上,保护你的系统免受攻击者的攻击必须是一个高度优先考虑的问题。
mod_security(web应用的开源入侵检测和预防引擎,与web服务器无缝集成)和mod_evasive是两个非常重要的工具,可以用来保护web服务器免受暴力或DDoS攻击。
mod_evasive,顾名思义,在受到攻击时提供回避能力,作为保护伞,使web服务器免受此类威胁。
在本文中,我们将讨论如何在RHEL/CentOS 8和7以及Fedora上与Apache一起安装、配置并将其投入使用。此外,我们将模拟攻击,以验证服务器是否做出相应的反应。这假设你的系统上已经安装了LAMP服务器。
如果你运行的是RHEL/CentOS 8/7或Fedora,你还需要将iptables设置为默认的防火墙前端,而不是firewalld。我们这样做是为了在RHEL/CentOS 8/7和Fedora中使用相同的工具。
步骤1:在RHEL / CentOS 8/7和Fedora上安装Iptables防火墙
首先,停止并禁用firewalld:
# systemctl stop firewalld
# systemctl disable firewalld
然后在启用iptables之前安装iptables-services软件包:
# yum update && yum install iptables-services
# systemctl enable iptables
# systemctl start iptables
# systemctl status iptables
步骤2:安装Mod_Security和Mod_evasive
除了已经安装了LAMP之外,你还需要启用RHEL/CentOS 8/7中的EPEL存储库来安装这两个软件包。Fedora用户不需要启用任何repo,因为epel已经是Fedora项目的一部分。
# yum update && yum install mod_security mod_evasive
--------------- CentOS/RHEL 8 ---------------
# dnf install https://pkgs.dyn.su/el8/base/x86_64/raven-release-1.0-1.el8.noarch.rpm
# dnf --enablerepo=raven-extras install mod_evasive
安装完成后,您将在/etc/httpd/conf.d中找到这两个工具的配置文件。
# ls -l /etc/httpd/conf.d
现在,为了将这两个模块与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)'
然后重新启动Apache并验证它是否加载了mod_evasive和mod_security:
# systemctl restart httpd
转储已加载的静态模块和共享模块的列表。
# httpd -M | grep -Ei '(evasive|security)'
步骤3:安装核心规则集和配置Mod_Security
简单地说,核心规则集(CRS)为web服务器提供了在特定条件下如何行为的指令。mod_security的开发公司提供了一个免费的CRS,叫做OWASP (Open Web Application Security Project) ModSecurity CRS,可以下载安装如下。
1.将OWASP CRS下载到为此目的创建的目录中。
# mkdir /etc/httpd/crs-tecmint
# cd /etc/httpd/crs-tecmint
# wget -c https://github.com/SpiderLabs/owasp-modsecurity-crs/archive/v3.2.0.tar.gz -O master
2.为了方便起见,解压缩CRS文件并更改目录的名称。
# tar xzf master
# mv owasp-modsecurity-crs-3.2.0 owasp-modsecurity-crs
3.现在该配置mod_security。将带有规则的示例文件(owasp-modsecurity-crs / modsecurity_crs_10_setup.conf.example)复制到另一个没有.example扩展名的文件中:
# cd owasp-modsecurity-crs/
# cp crs-setup.conf.example crs-setup.conf
并通过在Web服务器的主配置文件/etc/httpd/conf/httpd.conf文件中插入以下几行,告诉Apache将其与模块一起使用。如果选择将tarball解压缩到另一个目录,则需要按照Include指令编辑路径:
<IfModule security2_module>
Include crs-tecmint/owasp-modsecurity-crs/crs-setup.conf
Include crs-tecmint/owasp-modsecurity-crs/rules/*.conf
</IfModule>
最后,建议我们在/etc/httpd/modsecurity.d目录中创建我们自己的配置文件,在该目录中放置我们的自定义指令(在以下示例中将其命名为tecmint.conf),而不是直接修改CRS文件。 随着新版本的发布,这样做将使CRS的升级更加容易。
<IfModule mod_security2.c>
SecRuleEngine On
SecRequestBodyAccess On
SecResponseBodyAccess On
SecResponseBodyMimeType text/plain text/html text/xml application/octet-stream
SecDataDir /tmp
</IfModule>
您可以参考SpiderLabs的ModSecurity GitHub存储库以获取有关mod_security配置指令的完整说明指南。
步骤4:配置Mod_Evasive
使用/etc/httpd/conf.d/mod_evasive.conf中的指令配置mod_evasive。由于在软件包升级期间没有更新规则,因此与mod_security相比,我们不需要单独的文件来添加自定义指令。
默认的mod_evasive.conf文件启用了以下指令(请注意,该文件已被大量注释,因此我们删除了注释以突出显示下面的配置指令):
<IfModule mod_evasive24.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时间内,其源IP地址将被列入黑名单。在DOSBlockingPeriod期间,来自该IP地址的任何请求都将遇到403 Forbidden错误。
随时尝试使用这些值,以便您的Web服务器将能够处理所需的流量和类型。
请注意,如果未正确设置这些值,则可能会导致最终阻止合法访问者。
您可能还需要考虑其他有用的指令:
DOSEmail通知
如果已启动并运行邮件服务器,则可以通过Apache发送警告消息。请注意,如果SELinux设置为强制执行,则需要授予apache用户SELinux发送电子邮件的权限。您可以通过运行
# setsebool -P httpd_can_sendmail 1
接下来,将此指令与其余其他指令一起添加到mod_evasive.conf文件中:
DOSEmailNotify you@yourdomain.com
如果设置了此值,并且您的邮件服务器正常工作,那么只要IP地址被列入黑名单,就会将电子邮件发送到指定的地址。
DOS系统命令
这需要一个有效的系统命令作为参数,
DOSSystemCommand </command>
该伪指令指定了将IP地址列入黑名单时要执行的命令。它通常与添加了防火墙规则的外壳程序脚本结合使用,以阻止来自该IP地址的其他连接。
编写一个用于在防火墙级别处理IP黑名单的Shell脚本
当IP地址被列入黑名单时,我们需要阻止以后的连接。我们将使用下面的Shell脚本执行此工作。在/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作为root来访问/ etc / sudoers文件,然后添加以下两行,如下图所示:
apache ALL=NOPASSWD: /usr/local/bin/scripts-tecmint/ban_ip.sh
Defaults:apache !requiretty
重要信息:作为默认安全策略,您只能在终端中运行sudo。由于在这种情况下,我们需要使用不带tty的sudo,因此必须注释掉下图中突出显示的行:
#Defaults requiretty
最后,重新启动Web服务器:
# systemctl restart httpd
至此,配置就已经全部完成,您可以自行测试,在启用mod_security和mod_evasive的情况下,模拟攻击使CPU和RAM在源IP被列入黑名单并被防火墙阻止之前,仅在几秒钟内尝试一个临时使用高峰。如果没有这些工具,模拟肯定会很快击垮服务器,并使其在攻击期间无法使用。