如何在CentOS7上使用mod evasiveforApache防御DoS和DDoS
介绍
mod_evasive Apache 模块(以前称为 mod_dosevasive)有助于防止对 Apache Web 服务器的 DoS、DDoS(分布式拒绝服务)和暴力攻击。 它可以在攻击期间提供规避措施,并通过电子邮件和系统日志工具报告滥用行为。 该模块通过创建 IP 地址和 URI 的内部动态表以及拒绝来自以下任何一项的任何单个 IP 地址来工作:
- 每秒多次请求同一页面
- 每秒对同一个子节点发出超过 50 个并发请求
- 在临时列入黑名单时提出任何请求
如果满足上述任一条件,则会发送 403 响应并记录 IP 地址。 或者,可以向服务器所有者发送电子邮件通知,或者可以运行系统命令来阻止 IP 地址。
在本教程中,我们将讨论如何在您的服务器上安装、配置和使用 mod_evasive。
先决条件
在开始学习本教程之前,您应该具备以下条件:
- CentOS 7 64 位 Droplet(也适用于 CentOS 6)
- 具有 sudo 权限的非 root 用户。 要设置此类型的用户,请按照 使用 CentOS 7 的初始服务器设置教程进行操作。 所有命令都将以该用户身份运行。
- 在 Droplet 上运行的 Apache Web 服务器。 要安装 Apache,请按照 如何在 CentOS 上安装 Linux、Apache、MySQL、PHP (LAMP) 堆栈的第 1 步操作。
第 1 步 — 安装 mod_evasive
在本节中,我们将安装 mod_evasive 运行所需的包,最后安装 mod_evasive。
首先,我们需要在服务器上安装 EPEL (Extra Packages for Enterprise Linux) yum 存储库。 EPEL 是一个 Fedora 特别兴趣小组,它为企业 Linux 创建、维护和管理一组高质量的开源附加软件包。 运行以下命令在您的服务器上安装和启用 EPEL 存储库:
在 CentOS 7 上:
sudo rpm -ivh http://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-5.noarch.rpm
在 CentOS 6 上:
sudo rpm -ivh http://download.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
让我们使用以下命令验证 EPEL 存储库是否已启用:
sudo yum repolist
如果启用,您将在输出中看到以下 repo:
epel/x86_64 Extra Packages for Enterprise Linux 7 - x86_64
现在,让我们使用 yum 插件 protectbase 保护基础包免受 EPEL 影响。
sudo yum install yum-plugin-protectbase.noarch -y
protectbase 插件的目的是保护某些 yum 存储库免受来自其他存储库的更新。 即使未受保护的存储库具有更高版本,受保护存储库中的软件包也不会被未受保护存储库中的软件包更新或覆盖。
现在我们准备安装 mod_evasive 模块。 运行以下命令来安装它:
sudo yum install mod_evasive -y
第 2 步 — 验证安装
现在 mod_evasive 已安装,让我们验证配置文件是否已安装以及模块是否正在加载。
在安装过程中,添加了 mod_evasive 配置文件 /etc/httpd/conf.d/mod_evasive.conf
。 要验证此运行:
sudo ls -al /etc/httpd/conf.d/mod_evasive.conf
输出应类似于:
-rw-r--r-- 1 root root 3473 Jul 21 01:41 /etc/httpd/conf.d/mod_evasive.conf
默认情况下,以下 LoadModule
行将添加到配置文件 mod_evasive.conf
的顶部。 打开文件并添加该行(如果它尚不存在)。 这一行告诉 Apache Web 服务器加载和使用 mod_evasive 模块。
在 CentOS 7 上,该行应如下所示:
/etc/httpd/conf.d/mod_evasive.conf
LoadModule evasive20_module modules/mod_evasive24.so
在 CentOS 6 上,该行应如下所示:
/etc/httpd/conf.d/mod_evasive.conf
LoadModule evasive20_module modules/mod_evasive20.so
让我们列出为 Apache Web 服务器加载的模块并查找 mod_evasive:
sudo httpd -M | grep evasive
输出应显示:
evasive20_module (shared)
第三步——配置 mod_evasive
现在安装已经完成并验证了,让我们看看模块的配置。 mod_evasive 可以通过 mod_evasive.conf
配置文件轻松自定义。 我们将在本教程中讨论一些配置参数。 有关所有参数的信息,请参阅配置文件——它包含每个参数的描述。
您需要更改的配置选项之一是 DOSEmailNotify
。 这是一个非常有用的指令。 如果设置了此值,则每当 IP 地址被列入黑名单时,都会向指定的电子邮件地址发送一封电子邮件。 电子邮件正文将显示 mod_evasive HTTP Blacklisted 111.111.111.111
例如,如果您想发送 mod_evasive 警报说 sammy@example.com,请编辑文件:
sudo nano /etc/httpd/conf.d/mod_evasive.conf
通过删除行前的 #
取消注释 DOSEmailNotify
行,并将电子邮件地址更改为您的:
/etc/httpd/conf.d/mod_evasive.conf
DOSEmailNotify sammy@example.com
注意: mod_evasive 使用 /bin/mail
发送电子邮件警报。 您需要安装并运行邮件服务器,请参阅 本教程 了解有关如何设置简单邮件服务器以使电子邮件通知正常工作的信息。
您可能要设置的另一个参数是 DOSWhitelist
。 使用此选项,可以将受信任客户端的 IP 地址添加到白名单中,以确保它们永远不会被拒绝。 白名单的目的是保护软件、脚本、本地搜索机器人或其他自动化工具不因向服务器请求大量数据而被拒绝。
要将 IP 地址列入白名单,例如 111.111.111.111,请在配置文件中添加如下条目:
/etc/httpd/conf.d/mod_evasive.conf
DOSWhitelist 111.111.111.111
如有必要,最多可以在 IP 地址的最后 3 个八位字节上使用通配符。
要将来自不同 IP 范围的多个 IP 地址列入白名单,您可以在配置文件中添加单独的 DOSWhitelist 行,如下所示:
/etc/httpd/conf.d/mod_evasive.conf
DOSWhitelist 111.111.111.111 DOSWhitelist 222.222.222.222
DOSPageCount
和 DOSSiteCount
是另外两个参数,建议将其更改为不太激进的值,以避免客户端被不必要地阻塞。
DOSPageCount
是一个IP地址每页间隔(通常设置为一秒)对同一页的请求数限制。 一旦超过该间隔的阈值,客户端的 IP 地址将被添加到阻止列表中。 默认值设置得很低,为 2。 您可以通过在 /etc/httpd/conf.d/mod_evasive.conf
中编辑以下内容将其更改为更高的值,例如 20:
/etc/httpd/conf.d/mod_evasive.conf
DOSPageCount 20
DOSSiteCount
是每个站点间隔(默认为 1 秒)按 IP 地址对同一站点的请求总数的限制。 要将其更改为更大的值,例如 100 秒:
/etc/httpd/conf.d/mod_evasive.conf
DOSSiteCount 100
您可以更改一些其他参数以获得更好的性能。
一个是 DOSBlockingPeriod
,这是一个客户端(IP 地址)被添加到阻止列表时将被阻止的时间量(以秒为单位)。 在此期间,来自客户端的所有后续请求将导致 403(禁止)错误并重置计时器(默认为 10 秒)。
例如,如果您想将阻塞时间增加到 300 秒:
/etc/httpd/conf.d/mod_evasive.conf
DOSBlockingPeriod 300
另一个是DOSLogDir
,指的是mod_evasive使用的临时目录。 默认情况下 /tmp
将用于锁定机制,如果您的系统对 shell 用户开放,这会带来一些安全问题。 如果您有非特权 shell 用户,您将希望创建一个仅对运行 Apache 的用户(通常为 apache)可写的目录,然后在您的 mod_evasive.conf 文件中设置此参数。
例如,要将 mod_evasive 使用的目录设置为 /var/log/mod_evasive
,请使用以下命令创建目录:
sudo mkdir /var/log/mod_evasive
然后将所有权设置为 apache
用户:
sudo chown -R apache:apache /var/log/mod_evasive
现在编辑 mod_evasive 配置并更改目录如下:
/etc/httpd/conf.d/mod_evasive.conf
DOSLogDir "/var/log/mod_evasive"
另一个参数是 DOSSystemCommand
。 如果设置了值,则只要 IP 地址被列入黑名单,就会执行指定的命令。 使用此参数,您可以将 mod_evasive 与安装在服务器上的防火墙或 shell 脚本集成,并在防火墙中阻止 mod_evasive 列入黑名单的 IP 地址。
第 4 步 — 加载 mod_evasive 模块
一旦我们在配置文件中进行了更改,我们需要重新启动 Apache Web 服务器以使其生效。 运行以下命令以重新启动 Apache。
在 CentOS 7 上:
sudo systemctl restart httpd.service
在 CentOS6 上:
sudo service httpd restart
注意: 请注意 mod_evasive 似乎与 FrontPage 服务器扩展冲突。 您可能还想检查您的 Apache Web 服务器设置以确保 mod_evasive 能够正常运行。 建议的 Apache 调整是为 MaxRequestsPerChild
设置一个非常高的值,但不是无限制的(零值表示无限制),并启用 KeepAlive
和 KeepAliveTimeout
设置合理的时间。
第 5 步 — 测试 mod_evasive
让我们做一个简短的测试,看看模块是否正常工作。 我们将使用由 mod_evasive 开发人员编写的 perl 脚本 test.pl。 要执行脚本,我们需要首先在服务器上安装 perl
包,使用:
sudo yum install -y perl
测试脚本与 mod_evasive 一起安装在以下位置:
/usr/share/doc/mod_evasive-1.10.1/test.pl
默认情况下,测试脚本连续 100 次从您的 Apache Web 服务器请求同一页面以触发 mod_evasive。 在上一节中,我们修改了 mod_evasive 以更容忍每秒对同一页面的请求。 我们需要将脚本更改为连续 200 个请求而不是 100 个,以确保触发 mod_evasive 的所有通知方法。
编辑/usr/share/doc/mod_evasive-1.10.1/test.pl
:
sudo nano /usr/share/doc/mod_evasive-1.10.1/test.pl
找到以下行:
/usr/share/doc/mod_evasive-1.10.1/test.pl
for(0..100) {
将 100 替换为 200:
/usr/share/doc/mod_evasive-1.10.1/test.pl
for(0..200) {
保存并退出。
要执行脚本,请运行:
sudo perl /usr/share/doc/mod_evasive-1.10.1/test.pl
您应该看到类似于以下内容的输出:
HTTP/1.1 403 Forbidden HTTP/1.1 403 Forbidden HTTP/1.1 403 Forbidden HTTP/1.1 403 Forbidden HTTP/1.1 403 Forbidden ...
该脚本向您的 Web 服务器发出 100 个请求。 403 响应代码表示访问被 Web 服务器拒绝。 当 IP 地址被阻止时,mod_evasive 还会记录到 syslog。 使用以下命令检查日志文件:
sudo tailf /var/log/messages
它应该显示类似于以下内容的行:
Jul 29 00:11:18 servername mod_evasive[18290]: Blacklisting address 127.0.0.1: possible DoS attack.
表示 IP 地址被 mod_evasive 阻止。
如果您已将 mod_evasive 配置为在 IP 被阻止时发送电子邮件警报,您的收件箱中将收到一封包含以下内容的电子邮件:
mod_evasive HTTP Blacklisted 127.0.0.1
结论
mod_evasive 擅长抵御单服务器、脚本攻击以及分布式攻击。 但是,它仅对服务器的总带宽和处理器容量用于处理和响应无效请求有用。 出于这个原因,最好将此模块与您的服务器防火墙集成以提供最大程度的保护。 如果没有一个非常好的基础设施和防火墙,一个沉重的 DDoS 可能仍然会让你离线。 如果攻击非常严重且持续存在,您可能需要转向基于硬件的 DDoS 缓解解决方案。