如何在 Apache 中抵御暴力破解和 DDoS 攻击

发布于 2024-09-07 22:22:29 字数 9245 浏览 34 评论 0

对于那些需要在因特网上提供服务或托管主机的人来说,保证您的系统在面对攻击时的安全是一个重要的事情。

mod_security(一个开源的用于 Web 应用入侵检测及防护的引擎,可以无缝地集成到 Web 服务器)和 mod_evasive 是两个在服务器端对抗暴力破解和(D)DoS 攻击的非常重要的工具。

mod_evasive,如它的名字一样,在受攻击时提供避实就虚的功能,它像一个雨伞一样保护 Web 服务器免受那些威胁。

安装 mod_security 和 mod_evasive 来保护 Apache

在这篇文章中我们将讨论如何安装、配置以及在 RHEL/CentOS6、7 和 Fedora 21-15 上将它们整合到 Apache。另外,我们会模拟攻击以便验证服务器做出了正确的反应。

以上以您的系统中安装有 LAMP 服务器为基础,所以,如果您没有安装,请先阅读下面链接的文章再开始阅读本文。

(LCTT 译注:本文有修改。原文为了在 RHEL/CentOS 7 或 Fedora 21 中使用同样的工具,而删除了它们自带的 firewalld,使用了旧式的 iptables。译者以为这样并不恰当,因此,译文中做了相应删节,并增加了 firewalld 的相应脚本。)

步骤 1: 安装 mod_security 和 mod_evasive

另外,在安装 LAMP 后,您还需要在 RHEL/CentOS 7/6 中 开启 EPEL 仓库 来安装这两个包。Fedora 用户不需要开启这个仓库,因为 epel 已经是 Fedora 项目的一部分了。

# yum update && yum install mod_security mod_evasive

当安装结束后,您会在/etc/httpd/conf.d 下找到这两个工具的配置文件。

# ls -l /etc/httpd/conf.d

mod_security + mod_evasive 配置文件

现在,为了整合这两个模块到 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)'

验证 mod_security + mod_evasive 模块

接下来重启 Apache 并且核实它已加载了 mod_evasive 和 mod_security:

# service httpd restart         [在 RHEL/CentOS 6 和 Fedora 20-18 上]
# systemctl restart httpd       [在 RHEL/CentOS 7 和 Fedora 21 上]

# httpd -M | grep -Ei '(evasive|security)'     [输出已加载的静态模块和动态模块列表]

检查 mod_security + mod_evasive 模块已加载

步骤 2: 安装一个核心规则集并且配置 mod_security

简单来说,一个核心规则集(即 CRS)为 web 服务器提供特定状况下如何反应的指令。mod_security 的开发者们提供了一个免费的 CRS,叫做 OWASP([开放 Web 应用安全项目])ModSecurity CRS,可以从下面的地址下载和安装。

下载 OWASP CRS 到为之创建的目录

# mkdir /etc/httpd/crs-tecmint
# cd /etc/httpd/crs-tecmint
# wget https://github.com/SpiderLabs/owasp-modsecurity-crs/tarball/master

下载 mod_security 核心规则

解压 CRS 文件并修改文件夹名称

# tar xzf master
# mv SpiderLabs-owasp-modsecurity-crs-ebe8790 owasp-modsecurity-crs

解压 mod_security 核心规则

现在,是时候配置 mod_security 了

将示例的规则文件(owasp-modsecurity-crs/modsecuritycrs10_setup.conf.example)拷贝为同名的配置文件。

# cp modsecurity_crs_10_setup.conf.example modsecurity_crs_10_setup.conf

并通过将下面的几行插入到 web 服务器的主配置文件/etc/httpd/conf/httpd.conf 来告诉 Apache 将这个文件和该模块放在一起使用。如果您选择解压打包文件到另一个文件夹,那么您需要修改 Include 的路径:

<IfModule security2_module>
    Include crs-tecmint/owasp-modsecurity-crs/modsecurity_crs_10_setup.conf
    Include crs-tecmint/owasp-modsecurity-crs/base_rules/*.conf
</IfModule>

最后,建议您在/etc/httpd/modsecurity.d 目录下创建自己的配置文件,在那里我们可以用我们自定义的文件夹(接下来的示例中,我们会将其命名为 tecmint.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 目录的更完整的解释。

步骤 3: 配置 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,他的源 IP 地址将会在 DOSBlockingPeriod 期间内被加入黑名单。在 DOSBlockingPeriod 期间,任何从这个 IP 地址发起的请求将会遭遇一个 403 禁止错误。

尽可能的试验这些值,以使您的 web 服务器有能力处理特定大小的负载。

一个小警告 : 如果这些值设置的不合适,则您会蒙受阻挡合法用户的风险。

您也许还会用到以下其它有用的指令:

DOSEmailNotify

如果您运行有一个邮件服务器,您可以通过 Apache 发送警告消息。注意,如果 SELinux 已开启,您需要授权 apache 用户 SELinux 的权限来发送 email。您可以通过下面的命令来授予权限:

# setsebool -P httpd_can_sendmail 1

接下来,将这个指令和其他指令一起加入到 mod_evasive.conf 文件。

DOSEmailNotify you@yourdomain.com

如果这个指令设置了合适的值,并且您的邮件服务器在正常的运行,则当一个 IP 地址被加入黑名单时,会有一封邮件被发送到相应的地址。

DOSSystemCommand

它需要一个有效的系统命令作为参数,

DOSSystemCommand </command>

这个指令指定当一个 IP 地址被加入黑名单时执行的命令。它通常结合 shell 脚本来使用,比如在脚本中添加一条防火墙规则来阻挡某个 IP 进一步的连接。

写一个 shell 脚本在防火墙阶段处理 IP 黑名单

当一个 IP 地址被加入黑名单,我们需要阻挡它进一步的连接。我们需要下面的 shell 脚本来执行这个任务。在/usr/local/bin 下创建一个叫做 scripts-tecmint 的文件夹(或其他的名字),以及一个叫做 ban_ip.sh 的文件。

用于 iptables 防火墙

#!/bin/sh
# 由 mod_evasive 检测出,将被阻挡的 IP 地址
IP=$1
# iptables 的完整路径
IPTABLES="/sbin/iptables"
# mod_evasive 锁文件夹
mod_evasive_LOGDIR=/var/log/mod_evasive
# 添加下面的防火墙规则 (阻止所有从$IP 流入的流量)
$IPTABLES -I INPUT -s $IP -j DROP
# 为了未来的检测,移除锁文件
rm -f "$mod_evasive_LOGDIR"/dos-"$IP"

用于 firewalld 防火墙

#!/bin/sh
# 由 mod_evasive 检测出,将被阻挡的 IP 地址
IP=$1
# firewalld-cmd 的完整路径
FIREWALL_CMD="/usr/bin/firewall-cmd"
# mod_evasive 锁文件夹
mod_evasive_LOGDIR=/var/log/mod_evasive
# 添加下面的防火墙规则 (阻止所有从$IP 流入的流量)
$FIREWALL_CMD --zone=drop --add-source $IP
# 为了未来的检测,移除锁文件
rm -f "$mod_evasive_LOGDIR"/dos-"$IP"

我们的 DOSSystemCommand 指令应该是这样的:

DOSSystemCommand "sudo /usr/local/bin/scripts-tecmint/ban_ip.sh %s"

上面一行的%s 代表了由 mod_evasive 检测到的攻击 IP 地址。

将 apache 用户添加到 sudoers 文件

请注意,如果您不给予 apache 用户以无需终端和密码的方式运行我们脚本(关键就是这个脚本)的权限,则这一切都不起作用。通常,您只需要以 root 权限键入 visudo 来存取/etc/sudoers 文件,接下来添加下面的两行即可:

apache ALL=NOPASSWD: /usr/local/bin/scripts-tecmint/ban_ip.sh
Defaults:apache !requiretty

添加 Apache 用户到 Sudoers

重要 : 在默认的安全策略下您只能在终端中运行 sudo。由于这个时候我们需要在没有 tty 的时候运行 sudo,我们必须像下图中那样注释掉下面这一行:

#Defaults requiretty

为 Sudo 禁用 tty

最后,重启 web 服务器:

# service httpd restart         [在 RHEL/CentOS 6 和 Fedora 20-18 上]
# systemctl restart httpd       [在 RHEL/CentOS 7 和 Fedora 21 上]

步骤 4: 在 Apache 上模拟 DDoS 攻击

有许多工具可以在您的服务器上模拟外部的攻击。您可以 google 下“tools for simulating DDoS attacks”来找一找相关的工具。

注意,您(也只有您)将负责您模拟所造成的结果。请不要考虑向不在您自己网络中的服务器发起模拟攻击。

假如您想对一个由别人托管的 VPS 做这些事情,您需要向您的托管商发送适当的警告或就那样的流量通过他们的网络获得允许。Tecmint.com 不会为您的行为负责!

另外,仅从一个主机发起一个 DoS 攻击的模拟无法代表真实的攻击。为了模拟真实的攻击,您需要使用许多客户端在同一时间将您的服务器作为目标。

我们的测试环境由一个 CentOS 7 服务器[IP 192.168.0.17]和一个 Windows 组成,在 Windows[IP 192.168.0.103]上我们发起攻击:

确认主机 IP 地址

请播放下面的视频(YT 视频,请自备梯子: https://www.youtube.com/-U_mdet06Jk ),并跟从列出的步骤来模拟一个 DoS 攻击:

然后攻击者的 IP 将被防火墙阻挡:

阻挡攻击者的 IP 地址

结论

在开启 mod_security 和 mod_evasive 的情况下,模拟攻击会导致 CPU 和 RAM 用量在源 IP 地址被加入黑名单之前出现短暂几秒的使用峰值。如果没有这些模块,模拟攻击绝对会很快将服务器击溃,并使服务器在攻击期间无法提供服务。

我们很高兴听见您打算使用(或已经使用过)这些工具。我们期望得到您的反馈,所以,请在留言处留下您的评价和问题,谢谢!

参考链接

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

文章
评论
26 人气
更多

推荐作者

迷鸟归林

文章 0 评论 0

alipaysp_h2Vbo4sv6k

文章 0 评论 0

清风无影

文章 0 评论 0

mnbvcxz

文章 0 评论 0

听不够的曲调

文章 0 评论 0

秋叶绚丽

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文