防止恶意请求 – DOS攻击

我正在开发一个asp.net MVC Web应用程序,客户端要求我们尽最大努力使其尽可能具有抵御拒绝服务攻击的能力。 他们担心该网站可能会收到恶意的大量请求,意图减慢/取消网站。

我已经与产品所有者讨论过这个问题,因为它实际上已经超出了实际Web应用程序的范围。 我认为托管/网络团队有责任监控流量并响应恶意请求。

但是他们坚持认为应用程序应该内置一些预防措施。 但他们不想实施CAPTCHA。

有人建议我们限制在给定时间范围内可以为会话提出的请求数。 我在考虑做这样的事情在ASP.NET MVC中实现请求限制的最佳方法? 但是使用会话ID而不是客户端IP,因为这会给来自公司防火墙后面的用户带来问题 – 他们的IP都将是相同的。

他们还建议添加关闭网站某些区域的能力 – 建议管理员用户可以关闭数据库密集区域…..但是这将通过用户界面来控制,当然如果它是在DOS攻击下管理员用户无论如何都无法使用它。

我的问题是,这样做真的值得吗? 当然真正的DOS攻击会更先进吗?

你有什么其他的建议?

拒绝服务攻击几乎可以影响其他人的服务稳定性。 在这种情况下,您正在谈论网络DoS,并且如前所述,这通常不会发生在您的应用程序级别。

理想情况下,这种攻击将在网络级别得到缓解。 有专门为此构建的防火墙,例如Cisco ASA 5500系列 ,它可以从基本保护到高吞吐量缓解。 它们是相当智能的盒子,我可以保证它们有效阻止这些类型的攻击,只要正在使用正确的吞吐量模型。

当然,如果无法访问为您执行此操作的硬件防火墙,则可以采取一些权宜措施来协助防御这些类型的攻击。 请注意,这些都不会像专用防火墙那样有效。

其中一个例子是IIS模块动态IP限制 ,它允许您定义最大并发请求的限制。 但是,实际上这有一个缺点,它可能会开始阻止来自具有高并发请求吞吐量的浏览器的合法请求以下载脚本和图像等。

最后,你可以做的事情非常粗糙,但也非常有效,就像我之前写的那样。 基本上,它是一个小工具,可以监视来自同一IP的重复请求的日志文件。 因此,假设从1.2.3.4对2秒的/Home请求10次。 如果检测到此情况,将添加防火墙规则(在Windows高级防火墙中,使用shell命令添加)来阻止来自此IP的请求,然后可以在30分钟左右删除该规则。

就像我说的那样,它非常粗糙,但是如果你必须在服务器级别进行,那么你并没有真正有很多明智的选择,因为它不是应该在哪里完成的。 你完全正确,责任在于托管服务提供商。

最后,你对CAPTCHA也是对的。 如果有的话,它可以通过一次又一次地执行图像生成(可能是资源密集型)来协助DoS,从而使您的资源更加匮乏。 CAPTCHA有效的时间是,如果您的网站被自动注册机器人发送垃圾邮件,但我相信您已经知道了。

如果你真的想在应用程序级别做一些事情只是为了取悦你的权力,在你的应用程序中实现基于IP的请求限制是可行的,尽管90%无效(因为你仍然需要处理请求)。

如果你必须熬夜,你可以在云中实施解决方案并扩展服务器,但它可能会变得昂贵……

另一个想法是记录注册用户的IP地址。 如果DOS限制来自“好”用户的请求的所有流量。

在应用程序级别上防止真正的DoS攻击实际上是不可行的,因为请求很可能在它杀死您的应用程序之前杀死您的Web服务器,因为您的应用程序与应用程序池相关联,该应用程序池同时具有最多的并发请求由您正在使用的服务器技术定义。

这篇有趣的文章http://www.asp.net/web-forms/tutorials/aspnet-45/using-asynchronous-methods-in-aspnet-45表明Windows 7,Windows Vista和Windows 8最多同时发生10个并发要求。 它进一步说明了“你需要一个Windows服务器操作系统才能看到高负载下异步方法的好处”。

您可以增加与应用程序关联的应用程序池的HTTP.sys队列限制,以增加将排队的请求数量(以便在线程准备好时进行后续计算),这将阻止HTTP协议栈(HTTP) .sys)在超出限制时返回Http错误503并且没有工作进程可用于处理进一步的请求。

您提到客户要求您“尽力使其尽可能具有抵御拒绝服务攻击的能力”。 我的建议可能不适合您的情况,但您可以考虑实施本文中提到的基于任务的异步模式(TAP),以满足客户的需求。

此模式将在执行持久操作时释放线程,并使线程可用于进一步请求(从而使您的HTTP.sys队列保持较低) – 同时还为您的应用程序提供了在向第三方服务发出多个请求时提高整体性能的好处或执行多个密集IO计算。

此措施不会使您的应用程序对DoS攻击具有弹性,但它会使您的应用程序尽可能对其所服务的硬件负责。