Apache mod_wsgi slowloris DoS 保护

Apache mod_wsgi slowloris DoS protection

假设以下设置:

一个简单的 slowloris 攻击,就像这里描述的那样,使用 "slow" 请求 body:https://www.blackmoreops.com/2015/06/07/attack-website-using-slowhttptest-in-kali-linux/

上述攻击仅需 15 个请求(与 mod_wsgi 线程相同)就可以轻松锁定服务器直到超时发生,原因可能是:

但是,只有 15 个并发 "slow" 请求,我能够将服务器锁定长达 60 秒。

重复相同但使用更奇怪的数字,如 4096 个请求,几乎会永久锁定服务器,因为一旦前一个超时,总会有一个新请求需要由 mod_wsgi 提供服务。

我希望负载均衡器在向 apache 发送请求之前应该 handle/detect 这样做,它已经为类似的攻击做了(部分 headers,或者 tcp syn flood 攻击永远不会攻击 apache很好)

有哪些选项可以帮助解决这个问题?我知道没有防故障选项,因为这类攻击很难检测和保护,但服务器可以这么容易被锁定是很愚蠢的。

此外,如果 wsgi 应用程序从不读取请求 body,我希望问题不会发生,因为请求应该立即 return,但我不确定这一点或 mod_wsgi 的内部结构,例如,当使用本地开发 wsgi 服务器时是这样(自请求 body 以来的攻击文件从未被读取)但使用 mod_wsgi 时攻击成功,这让我认为它甚至在将 body 发送到 wsgi 代码之前就尝试读取它。

解决方案:
如果您受到攻击,我建议您去找一家可以防止 DDoS 攻击的提供商。但是,最好的办法是一旦确定 IP 是恶意的,就以编程方式阻止它。如果您收到两个大的 Content-Length POST 请求,您应该阻止 IP 几分钟以进行可疑活动。很多大公司都很便宜,有的基本包免费,比如Cloud Flare。我将它们用于我的公司,我非常高兴拥有它们!

编辑:他们的工作就是保护你。就是这样。

Slowloris 是一种非常简单的拒绝服务攻击。这很容易检测和阻止。

检测和防止 DoS 和 DDos 攻击是一个复杂的主题,有许多解决方案。在您的情况下,您使用过时的软件并选择较低的工作线程数会使情况变得更糟,从而使问题迅速出现。

可用于管理 Dos 和 DDos 攻击的服务组合。

整个系统的前端将受到防火墙的保护。通常,此防火墙将包括一个 Web 应用程序防火墙,以了解 HTTP 协议的细微差别。在AWS的世界里,常用的有Amazon WAF和Shield。

另一个有用的服务是 CDN。 Amazon CloudFront 使用 Amazon Shield,因此它具有良好的 DDoS 支持。

下一步是将负载均衡器与自动缩放机制相结合。当健康检查开始失败(由 Slowloris 引起)时,自动缩放器将开始启动新实例并终止失败的实例。然而,持续的 Slowloris 攻击只会攻击新服务器。这就是 Web 应用程序防火墙需要检测攻击并开始阻止它的原因。

为了您的学习,请查看 mod_reqtimeout。对于大多数 Slowloris 攻击,这是适用于 Apache 的有效且可调整的解决方案。

[更新]

亚马逊2015年6月DDoS白皮书中特别提到了Slowloris

On AWS, you can use Amazon CloudFront and AWS WAF to defend your application against these attacks. Amazon CloudFront allows you to cache static content and serve it from AWS Edge Locations that can help reduce the load on your origin. Additionally, Amazon CloudFront can automatically close connections from slow-reading or slow-writing attackers (e.g., Slowloris).

Amazon DDoS White Paper June 2015

在 mod_wsgi 守护进程模式下,有许多选项可以通过从中恢复并丢弃等待太久的 queued 请求来进一步帮助对抗此类攻击。尝试使用 mod_wsgi-express 进行测试,因为它为许多这些选项定义了默认值,而当您自己直接使用 mod_wsgi 时,没有默认值。使用 mod_wsgi-express start-server --help 查看默认值。您要查看 mod_wsgi 守护程序模式的实际选项是 request-timeoutconnect-timeoutsocket-timeoutqueue-timeout。您还可以使用与缓冲区大小和侦听器积压相关的其他选项。请注意,最终 Apache 工作进程的监听积压仍然是一个问题,因为它通常默认为 500,这意味着很多请求可能 queue 在您甚至可以用时间标记它们之前卡住通过跟踪 queue 时间来帮助丢弃积压。

您可以在以下位置找到文档:

关于 mod_wsgi 是否在发送之前读取请求 body 的问题,不,它没有。 Apache 本身因为它读取块可能会在读取 headers 时部分读取请求 body,但它不应该阻塞它。一旦完整请求 headers 被传递到 mod_wsgi 并发送到守护进程,然后 mod_wsgi 将开始传输请求 body.