在负载平衡器后面的Apache中阻塞重复的http请求

AWS上有许多EC2服务器,在负载平衡器(ELB)后面运行apache。 每隔一段时间,一些IP地址会滥用EC2服务器上托pipe的API并导致拒绝服务。 我无法访问负载平衡器,所以我需要在服务器级别阻止访问。

我根据负载平衡器提供的X-Forwarded-For头来改变apache访问日志来显示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头。

你可以用mod_evasive和mod_rpaf结合来做到这一点 。

前者允许你通过IP地址进行限制(例如阻止DOS攻击),后者允许你将X-FORWARDED-FOR地址显示为IP,正如在这个问题的答案的评论中所讨论的那样。

(如果mod_rpaf不适合你,你必须破解mod_evasive的来源。)

我写了一篇关于如何使用OSSEC (一种基于FOSS主机的入侵检测系统)的Apache 2.4的扩展博客文章 。 这是TLDR:

  1. 使用mod_remoteip来logging客户端IP来代替您的负载均衡器IP。
  2. 在您的vhostconfiguration中,使用RequireAll指令中的IncludeOptional指令来源目录,该目录将包含由OSSEC写入的其他mod_authz_host指令。
  3. 为OSSEC创build一个自定义的主动响应脚本 ,将OSSEC检测到恶意活动的每个IP地址添加一个带有mod_authz_host指令(如Require not ip 1.2.3.4到上述目录。
  4. configurationOSSEC开始使用上面的主动响应脚本 – 我build议复制OSSEC的默认主机拒绝主动响应的commandactive-responseconfiguration块的设置,如果触发器阻塞IP地址10分钟6级或以上的警报。
  5. 为OSSEC的local_rules.xml定义文件添加一些自定义规则,用于logging到您的Apache访问日志中的HTTP请求,当与Y 时间段内的 X 频率匹配时,将触发上述主动响应(例如,在10秒内超过50次,滥用)。

如果您还没有使用OSSEC(或其他一些HIDS),我会尽力推荐它 – 它非常容易设置,并提供了很多function。 DigitalOcean为Ubuntu 14.04提供了一个很好的OSSEC安装教程 (即使对于其他Linux,您也可以很好地遵循)。 您可以在每台服务器上以“本地”模式安装,以便开始使用,之后再重新安排,以使用其独特的客户端 – 服务器体系结构。

另外请注意,每次将IP添加到阻止列表时,此技术都要求自动重新启动Apache,对于某些阻止列表,这可能不是启动器。