介绍

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

复制

如果启用,您将在输出中看到以下存储库:

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 已安装,让我们验证是否已安装配置文件以及是否正在加载模块。

在安装过程中,/etc/httpd/conf.d/mod_evasive.conf添加了 mod_evasive 配置文件。要验证此运行:

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)

第 3 步 – 配置 mod_evasive

现在安装完成并验证,让我们看看模块的配置。mod_evasive 可以通过 mod_evasive.conf配置文件轻松定制。我们将在本教程中讨论一些配置参数。有关所有参数的信息,请参阅配置文件——它包含每个参数的描述。

您需要更改的配置选项之一是 DOSEmailNotify. 这是一个非常有用的指令。如果设置了此值,则每当 IP 地址被列入黑名单时,都会向指定的电子邮件地址发送一封电子邮件。电子邮件正文将显示 mod_evasive HTTP Blacklisted <span class="highlight">111.111.111.111</span>

例如,如果你想发送 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

复制

DOSPageCountDOSSiteCount其他两个参数建议更改为不太激进的值,以避免客户端被不必要地阻塞。

DOSPageCount是 IP 地址每页间隔(通常设置为一秒)对同一页的请求数的限制。一旦超过该间隔的阈值,客户端的 IP 地址将被添加到阻止列表中。默认值设置得非常低,为 2。您可以通过在 中编辑以下内容将其更改为更高的值,例如 20 /etc/httpd/conf.d/mod_evasive.conf

/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

让我们做一个简短的测试,看看模块是否工作正常。我们将使用Perl脚本test.pl 通过mod_evasive开发人员编写的。要执行脚本,我们需要首先 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 也会记录到系统日志。使用以下命令检查日志文件:

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 缓解解决方案。

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

评论(1)