使用 Mod_Security 和 Mod_evasive 模块保护 Apache 免受暴力破解或 DDoS 攻击
对于从事托管业务的人,或者如果您托管自己的服务器并将其暴露在互联网上,保护您的系统免受攻击必须是首要任务。
mod_security(用于与 Web 服务器无缝集成的 Web 应用程序的开源入侵检测和预防引擎)和mod_evasive是两个非常重要的工具,可用于保护 Web 服务器免受暴力攻击或 (D)DoS 攻击。
mod_evasive,顾名思义,在受到攻击时提供规避能力,充当保护网络服务器免受此类威胁的保护伞。
在本文中,我们将讨论如何在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 用户无需启用任何存储库,因为 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 的开发公司提供了一个名为OWASP(开放 Web 应用程序安全项目)的免费CRS ModSecurity CRS,您可以按如下方式下载和安装。
1.将OWASP CRS下载到为此目的创建的目录中。
# mkdir /etc/httpd/crs-example # cd /etc/httpd/crs-example # 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-example/owasp-modsecurity-crs/crs-setup.conf Include crs-example/owasp-modsecurity-crs/rules/*.conf </IfModule>
最后,建议我们在/etc/httpd/modsecurity.d目录中创建自己的配置文件,我们将在其中放置自定义指令(在下面的示例中,我们将其命名为example.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
mod_evasive使用/etc/httpd/conf.d/mod_evasive.conf中的指令进行配置。由于在软件包升级期间没有要更新的规则,因此与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 服务器能够处理所需的流量数量和类型。
只有一个小小的警告:如果这些值没有正确设置,您将面临最终阻止合法访问者的风险。
您可能还想考虑其他有用的指令:
DOSEmailNotify
如果您的邮件服务器已启动并正在运行,则可以通过 Apache 发送警告消息。请注意,如果 SELinux 设置为强制执行,则需要授予 apache 用户 SELinux 发送电子邮件的权限。您可以通过运行
# setsebool -P httpd_can_sendmail 1
接下来,将此指令与其余指令一起添加到mod_evasive.conf文件中:
DOSEmailNotify you@yourdomain.com
如果设置了此值并且您的邮件服务器正常运行,则每当 IP 地址被列入黑名单时,都会向指定的地址发送电子邮件。
DOS系统命令
这需要一个有效的系统命令作为参数,
DOSSystemCommand </command>
此指令指定当 IP 地址被列入黑名单时要执行的命令。它通常与添加防火墙规则的 shell 脚本一起使用,以阻止来自该 IP 地址的进一步连接。
编写一个 shell 脚本来处理防火墙级别的 IP 黑名单
当某个 IP 地址被列入黑名单时,我们需要阻止来自该 IP 地址的未来连接。我们将使用以下 shell 脚本执行此任务。在/usr/local/bin中创建一个名为scripts-example(或您选择的任何名称)的目录,并在该目录中创建一个名为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-example/ban_ip.sh %s"
在上行中,%s代表mod_evasive检测到的违规 IP 。
将 apache 用户添加到 sudoers 文件
请注意,除非您授予用户apache权限,允许其在没有终端和密码的情况下运行我们的脚本(并且只能运行该脚本!),否则所有这些都将无法正常工作。像往常一样,您只需以 root 身份键入visudo即可访问/etc/sudoers文件,然后添加以下两行,如下图所示:
apache ALL=NOPASSWD: /usr/local/bin/scripts-example/ban_ip.sh Defaults:apache !requiretty
重要提示:作为默认安全策略,您只能在终端中运行sudo 。由于在这种情况下,我们需要在没有tty 的情况下使用sudo,因此我们必须注释掉下图中突出显示的行:
#Defaults requiretty
最后,重新启动网络服务器:
# systemctl restart httpd
步骤4:模拟Apache上的DDoS攻击
有几种工具可用于模拟对服务器的外部攻击。您只需谷歌搜索“模拟 DDoS 攻击的工具”即可找到其中几种。
请注意,只有您自己才能对模拟结果负责。千万不要想在不属于您自己网络的服务器上发起模拟攻击。
如果您想要对由其他人托管的 VPS 执行相同操作,则需要适当警告您的托管提供商或请求允许此类流量洪流通过其网络。Example.com绝不对您的行为负责!
此外,仅从一台主机发起模拟 DoS 攻击并不代表真实攻击。要模拟此类攻击,您需要同时从多个客户端攻击您的服务器。
我们的测试环境由一台CentOS 7服务器 [ IP 192.168.0.17 ] 和一台我们将从其发起攻击的 Windows 主机 [IP 192.168.0.103 ]组成:
请播放下面的视频并按照指示的顺序概述的步骤模拟简单的 DoS 攻击:
然后,iptables 会阻止有问题的 IP:
结论
启用mod_security和mod_evasive后,模拟攻击会导致CPU和RAM出现短暂的使用高峰,持续时间只有几秒钟,之后源 IP 会被列入黑名单并被防火墙阻止。如果没有这些工具,模拟攻击肯定会很快使服务器瘫痪,并在攻击期间使其无法使用。
如果您计划使用(或曾经使用过)这些工具,我们非常乐意听取您的意见。我们始终期待收到您的来信,因此,如果您有任何意见和问题,请随时使用下面的表格留下您的意见和问题。