我在 AWS 上有许多 EC2 服务器,它们在负载均衡器 (ELB) 后面运行 Apache。时不时地,一些 IP 地址会滥用 EC2 服务器上托管的 API,并导致拒绝服务。我无法访问负载均衡器,因此我需要在服务器级别阻止访问。
我更改了 apache 访问日志以根据负载均衡器提供的 X-Forwarded-For 标头显示 IP(否则它仅显示负载均衡器的 IP),因此我可以识别这些 IP 并阻止它们(再次通过指定 X-Forwarded-For)类似以下内容:
<Directory api_dir>
SetEnvIF X-FORWARDED-FOR "1.1.1.1" DenyIP
Order allow,deny
allow from all
deny from env=DenyIP
</Directory>
然而,这仍然意味着我需要手动处理每次攻击,并且我的服务器因此遭受一些停机。
推荐的自动阻止重复 HTTP 调用攻击的方法是什么,不是基于 IP,而是基于来自负载均衡器的 Forwarded-For 标头。
答案1
你可以这样做mod_evasive结合mod_rpaf。
前者允许您通过 IP 地址进行限制(例如,为了阻止 DOS 攻击),后者允许您将 X-FORWARDED-FOR 地址显示为 IP,如在以下回答的评论中所述:这个问题。
(如果 mod_rpaf 对您不起作用,您就必须破解 mod_evasive 的源代码。)
答案2
我写了一个扩展博客文章关于如何使用 Apache 2.4 执行此操作操作系统安全评估中心(基于 FOSS 主机的入侵检测系统)。以下是 TLDR:
- 使用mod_remoteip记录客户端 IP 来代替负载均衡器 IP。
- 在您的 vhost 配置中,使用包括可选指令内部RequireAll指向包含其他内容的目录中的源的指令mod_authz_host指令,由OSSEC编写。
- 创建自定义主动响应脚本对于 OSSEC,它将为 OSSEC 检测到恶意活动的每个 IP 地址添加一个带有 mod_authz_host 指令的文件(类似于
Require not ip 1.2.3.4
上述目录)。 - 配置 OSSEC 以开始使用上述主动响应脚本——我建议从OSSEC 默认的
command
和配置块中复制设置active-response
主机拒绝主动响应,如果触发警报的 IP 地址达到或超过 10 分钟,则会阻止该 IP 地址 10 分钟6 级。 - 向 OSSEC 的
local_rules.xml
定义文件中添加一些自定义规则,用于记录到 Apache 访问日志中的 HTTP 请求,这些规则在与 X 匹配时将触发上述主动响应频率在 Y大体时间(例如,在 10 秒内说超过 50 次,或者任何你认为是辱骂性的话语)。
如果你还没有使用 OSSEC(或其他 HIDS),我强烈推荐它——它设置起来非常简单,并且提供了很多开箱即用的功能。DigitalOcean 有一个很好的OSSEC安装教程适用于 Ubuntu 14.04(在其他 Linux 上也可以很好地遵循)。您可以先在每台服务器上以“本地”模式安装它,然后再重新安排它以使用其精美的客户端-服务器架构。
还要注意,每次将 IP 添加到阻止列表时,此技术都需要自动重新启动 Apache,对于某些人来说这可能是不可行的。