如何在 CentOS 7 上使用针对 Apache 的 mod_evasive 防范 DoS 和 DDoS

介绍

mod_evasive Apache 模块,以前被称为 mod_dosevasive,有助于防止对 Apache Web 服务器的 DoS、DDoS (分布式拒绝服务) 和暴力攻击。它可以在攻击期间提供逃避行动,并通过电子邮件和 syslog 设施报告滥用行为。

  • 每秒要求同一页面超过几次
  • 每秒对同一个孩子提出超过50次并发请求
  • 在临时黑名单中提出任何请求

如果上述任何条件都满足,则发送403响应并记录IP地址,可选择向服务器所有者发送电子邮件通知,也可以运行系统命令来阻止IP地址。

在本教程中,我们将讨论如何在您的服务器上安装,配置和使用mod_evasive。

前提条件

在您开始使用本教程之前,您应该有以下内容:

步骤 1 – 安装 mod_evasive

在本节中,我们将安装 mod_evasive 功能所需的包,并最终安装 mod_evasive。

首先,我们需要在服务器上安装 EPEL (Extra Packages for Enterprise Linux) yum 存储库。EPEL 是一个 Fedora Special Interest Group,它创建、维护和管理一组高质量的企业 Linux 的开源附加软件包。

百分之七:

1sudo rpm -ivh http://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-5.noarch.rpm

百分之六:

1sudo rpm -ivh http://download.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm

让我们验证使用 EPEL repo 是否已启用:

1sudo yum repolist

如果启用,您将看到输出中列出的下列 Repo:

1epel/x86_64 Extra Packages for Enterprise Linux 7 - x86_64

现在,让我们使用 yum 插件 protectbase来保护基础包免受 EPEL 的侵害。

1sudo yum install yum-plugin-protectbase.noarch -y

**protectbase 插件的目的是保护某些 yum 存储库免受来自其他存储库的更新。

现在我们已经准备好安装 mod_evasive 模块,运行以下命令来安装它:

1sudo yum install mod_evasive -y

步骤 2 – 检查安装

现在mod_evasive已安装,让我们验证配置文件已安装,并且模块正在加载。

在安装过程中,添加了 mod_evasive 配置文件 /etc/httpd/conf.d/mod_evasive.conf

1sudo ls -al /etc/httpd/conf.d/mod_evasive.conf

产量应该类似于:

1-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上,该行应该如下:

1[label /etc/httpd/conf.d/mod_evasive.conf]
2LoadModule evasive20_module modules/mod_evasive24.so

在CentOS 6上,线条应该如下:

1[label /etc/httpd/conf.d/mod_evasive.conf]
2LoadModule evasive20_module modules/mod_evasive20.so

让我们列出为Apache Web 服务器加载的模块,并寻找mod_evasive:

1sudo httpd -M | grep evasive

结果应该显示:

1evasive20_module (shared)

步骤 3 – 配置 mod_evasive

现在安装完成并验证了,让我们看看模块的配置。mod_evasive可以通过mod_evasive.conf配置文件轻松定制。我们将在本教程中讨论一些配置参数。

您需要更改的配置选项之一是DOSEmailNotify。这是一个非常有用的指令. 如果设置了这个值,每当 IP 地址被黑名单时,都会发送电子邮件到指定的电子邮件地址。

例如,如果您要发送 mod_evasive 警告,例如: [email protected],请编辑该文件:

1sudo nano /etc/httpd/conf.d/mod_evasive.conf

通过在行前删除#删除DOSEmailNotify行,并将电子邮件地址更改为您的:

1[label /etc/httpd/conf.d/mod_evasive.conf]
2DOSEmailNotify [email protected]

<$>[注] 注: mod_evasive 使用 /bin/mail 发送电子邮件警报. 您需要安装和工作邮件服务器,请参阅 本教程 有关如何设置简单邮件服务器以便电子邮件通知工作的信息。

您可能想要设置的另一个参数是DOSWhitelist。使用此选项,可以将受信任客户端的IP地址添加到白名单中,以确保它们永远不会被拒绝。

若要将 IP 地址列为白列表,例如 111.111.111.111,请在配置文件中添加这样的条目:

1[label /etc/httpd/conf.d/mod_evasive.conf]
2DOSWhitelist	111.111.111.111

假如有必要,Wildcards 可以用于 IP 地址的最后 3 个字节。

若要列出来自不同 IP 范围的多个 IP 地址,您可以在配置文件中添加单独的 DOSWhitelist 行,如下所示:

1[label /etc/httpd/conf.d/mod_evasive.conf]
2DOSWhitelist	111.111.111.111
3DOSWhitelist	222.222.222.222

DOSPageCountDOSSiteCount是另外两个参数,建议将其更改为更少侵略性的值,以避免客户端被不必要地阻止。

「DOSPageCount」是 IP 地址每页间隔(通常设置为 1 秒)对相同页面的请求数量的限制。一旦超过该间隔的门槛,客户端的 IP 地址将被添加到被阻止的列表中。

1[label /etc/httpd/conf.d/mod_evasive.conf]
2DOSPageCount 20

DOSSiteCount是对相同网站的请求总数的限制,每个网站间隔的IP地址(默认为1秒)。

1[label /etc/httpd/conf.d/mod_evasive.conf]
2DOSSiteCount 100

有几个其他参数,您可以更改以获得更好的性能。

一个是DOSBlockingPeriod,即如果客户端(IP 地址)被添加到被阻止的列表中,客户端将被阻止的时间量(在秒钟内),在此期间,客户端的所有后续请求都会导致 403 (禁止) 错误,并将计时器重新设置(默认为 10 秒)。

例如,如果要将封锁期延长到 300 秒:

1[label /etc/httpd/conf.d/mod_evasive.conf]
2DOSBlockingPeriod	 300

另一个是DOSLogDir,它指的是mod_evasive使用的临时目录。默认情况下,/tmp将用于锁定机制,如果您的系统对壳用户开放,则会出现一些安全问题。如果您有非特权壳用户,您将想要创建一个只能写给Apache用户运行为(通常是 apache)的目录,然后在mod_evasive.conf文件中设置此参数。

例如,若要将 mod_evasive 使用的目录设置为 `/var/log/mod_evasive',请使用下列方法创建目录:

1sudo mkdir /var/log/mod_evasive

然后将所有权设置为apache用户:

1sudo chown -R apache:apache /var/log/mod_evasive

现在,编辑mod_evasive配置并如下更改目录:

1[label /etc/httpd/conf.d/mod_evasive.conf]
2DOSLogDir           "/var/log/mod_evasive"

另一个参数是DOSSystemCommand。如果设置一个值,指定的命令将在 IP 地址被黑名单时执行. 使用此参数,您可以将 mod_evasive 集成到您服务器上安装的防火墙或壳脚本中,并在防火墙中阻止 mod_evasive 黑名单中的 IP 地址。

步骤 4 — 加载 mod_evasive 模块

一旦我们对配置文件进行了更改,我们需要重新启动 Apache 网页服务器,以便它们生效。

百分之七:

1sudo systemctl restart httpd.service

关于CentOS6:

1sudo service httpd restart

<$>[注意] 注意: 请注意,mod_evasive 似乎与 FrontPage 服务器扩展相冲突。 您可能还想检查您的 Apache 网页服务器设置,以确保mod_evasive 能够正常工作。 建议的 Apache 调整要为MaxRequestsPerChild具有非常高的值,但不无限制(0 值意味着无限制),并且要在KeepAliveTimeout设置中启用KeepAlive 相当长时间。

步骤 5 – 测试 mod_evasive

让我们做一个简短的测试,看看模块是否正常工作。我们将使用由 mod_evasive 开发人员编写的 perl 脚本 test.pl。 要执行脚本,我们需要先在服务器上安装 perl 包,使用:

1sudo yum install -y perl

测试脚本与mod_evasive在以下位置安装:

1/usr/share/doc/mod_evasive-1.10.1/test.pl

默认情况下,测试脚本会从您的 Apache 网页服务器请求相同的页面 100 次,以触发 mod_evasive. 在最后一节中,我们修改了 mod_evasive 以更宽容的每秒请求到相同的页面. 我们需要更改脚本为 200 次请求,而不是 100 次,以确保我们触发所有 mod_evasive 的通知方法。

编辑 /usr/share/doc/mod_evasive-1.10.1/test.pl:

1sudo nano /usr/share/doc/mod_evasive-1.10.1/test.pl

找下面的线条:

1[label /usr/share/doc/mod_evasive-1.10.1/test.pl]
2for(0..100) {

用100取代200:

1[label /usr/share/doc/mod_evasive-1.10.1/test.pl]
2for(0..200) {

保存和退出。

要执行脚本,运行:

1sudo perl /usr/share/doc/mod_evasive-1.10.1/test.pl

你应该看到类似的输出:

1HTTP/1.1 403 Forbidden
2HTTP/1.1 403 Forbidden
3HTTP/1.1 403 Forbidden
4HTTP/1.1 403 Forbidden
5HTTP/1.1 403 Forbidden
6...

该脚本会向您的 Web 服务器发送 100 个请求,403 响应代码表示访问被 Web 服务器拒绝,mod_evasive 也会在 IP 地址被阻止时登录到 syslog。

1sudo tailf /var/log/messages

它应该显示一个类似的线:

1Jul 29 00:11:18 servername mod_evasive[18290]: Blacklisting address 127.0.0.1: possible DoS attack.

显示 IP 地址被 mod_evasive 阻止。

如果您已配置 mod_evasive 以在 IP 被阻止时发送电子邮件警报,则您的收件箱中将有以下内容的电子邮件:

1mod_evasive HTTP Blacklisted 127.0.0.1

结论

mod_evasive 很擅长抵御单个服务器、脚本攻击和分布式攻击,但它只在服务器的总带宽和处理能力方面有用,以处理和响应无效请求。因此,将此模块与服务器防火墙集成,以获得最大程度的保护。如果没有真正好的基础设施和防火墙,严重的 DDoS 仍然会让你离线。如果攻击非常严重和持久,你可能需要转向基于硬件的 DDoS 缓解解决方案。

Published At
Categories with 技术
comments powered by Disqus