介绍
mod_evasive Apache模块(以前称为mod_dosevasive)有助于防御DoS,DDoS(分布式拒绝服务)和对Apache Web服务器的强力攻击。 它可以在攻击期间提供回避行动,并通过电子邮件和系统日志工具报告滥用行为。 该模块通过创建IP地址和URI的内部动态表以及拒绝任何以下任何单个IP地址来工作:
- 每秒请求相同的页面多于几次
- 每秒在同一个孩子上发出超过50个并发请求
- 在临时列入黑名单时发出任何请求
如果满足任何上述条件,则发送403响应,并记录IP地址。 可选地,可以向服务器所有者发送电子邮件通知,或者可以运行系统命令以阻止IP地址。
在本教程中,我们将讨论如何在服务器上安装,配置和使用mod_evasive。
先决条件
开始使用本教程之前,您应该具有以下内容:
- CentOS 7 64位Droplet(也适用于CentOS 6)
- 具有sudo权限的非root用户。 要设置这种类型的用户,按照与CentOS 7初始服务器设置教程。 所有命令将作为此用户运行。
- Apache Web服务器上运行的Droplet。 安装Apache,请遵循的第1步 在CentOS如何安装Linux操作系统,Apache,MySQL和PHP(LAMP)的文章。
第1步 - 安装mod_evasive
在本节中,我们将安装mod_evasive函数所需的软件包,最后安装mod_evasive。
首先,我们需要在服务器上安装EPEL(企业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
现在,让我们保护EPEL使用yum的插件protectbase基础包。
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上,行应该如下所示:
LoadModule evasive20_module modules/mod_evasive24.so
在CentOS 6上,行应该如下:
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 111.111.111.111
例如,如果您要发送mod_evasive提醒说, sammy@example.com ,编辑文件:
sudo nano /etc/httpd/conf.d/mod_evasive.conf
取消对DOSEmailNotify
通过删除线#
在该行的前面,并更改电子邮件地址到你:
DOSEmailNotify sammy@example.com
注:mod_evasive用途/bin/mail
发送电子邮件警报。 你需要有一台邮件服务器安装并正常工作,请参考本教程关于如何建立一个简单的邮件服务器,以便电子邮件通知工作信息。
你可能需要设置的另一个参数是DOSWhitelist
。 使用此选项,可信客户端的IP地址可以添加到白名单,以确保它们从不被拒绝。 白名单的目的是保护软件,脚本,本地搜索bot或其他自动化工具不被拒绝从服务器请求大量数据。
要将IP地址列入白名单,例如111.111.111.111,请向配置文件中添加一个条目,如下所示:
DOSWhitelist 111.111.111.111
如果需要,通配符可以在IP地址的最多3个字节上使用。
要将来自不同IP范围的多个IP地址列入白名单,您可以在配置文件中添加单独的DOSWhitelist行,如下所示:
DOSWhitelist 111.111.111.111
DOSWhitelist 222.222.222.222
DOSPageCount
和DOSSiteCount
是建议改为较温和的值以避免客户不必要得到阻止其他两个参数。
DOSPageCount
是用于通过IP地址为每页间隔(通常设定为1秒)相同的页面请求的数量的上限。 一旦超过该间隔的阈值,客户端的IP地址将被添加到阻止列表。 默认值设置为2相当低,您可以将其更改为更高的值,比如20,通过编辑以下/etc/httpd/conf.d/mod_evasive.conf
:
DOSPageCount 20
DOSSiteCount
是由每个站点的时间间隔(默认为1秒)的IP地址总数为同一网站要求的限制。 要将其更改为较大的值,例如100秒:
DOSSiteCount 100
还有一些其他参数可以更改以实现更好的性能。
一个是DOSBlockingPeriod
,这是时间,一个客户(的IP地址)将被阻塞,如果它们被添加到阻止列表量(以秒为单位)。 在此期间,来自客户端的所有后续请求将导致403(禁止)错误和计时器重置(默认为10秒)。
例如,如果要将阻止时间增加到300秒:
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配置并更改目录如下:
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
找到以下行:
for(0..100) {
更换100 200:
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服务器拒绝访问。 mod_evasive也会在IP地址被阻止时记录到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缓解解决方案。