如何阻止对Web应用程序发起的DoS攻击?( 三 )

如果一个攻击者发现一个比正常速度慢得多的区域,就可以向该端点发送垃圾信息,造成与上述类似的资源耗尽 。但是,这些通常并不是 bug;它们只是应用程序的特性 。有些特性总是比较慢或占用资源比较多;对某些事情很少有“修复”方法,只是需要一些时间 。有时,性能优化可以降低风险,但是那通常需要大量的投资或不可接受的权衡(例如放弃一致性写入) 。
然而,还是有一些缓解因素可以降低这类问题的风险:

  • 这种端点通常都在一些身份验证或登录验证后 。例如,GraphQL API 需要一个 API key;财务报告只开放给有特殊权限的用户;数据库写入只会被已经登录的用户触发 。这能降低上述风险 。
  • 这种特性通常比高杠杆率等级的风险需要更多的攻击流量来击垮 。例如,虽然在典型的应用程序中写入比读取慢,但是也不是那么慢;一个调优得比较好的数据库能处理每秒上千次写入 。因此,攻击者必须更费力地投入更多资源来造成资源匮乏 。
综上所述,我认为这意味着将这种类别的潜在漏洞视为可接受的风险是更为合理的 。“我们将屏蔽试图让我们崩溃的 API key”似乎是一个合理决定 。
缓解建议措施:速率限制换言之,有一个常见架构上的缓解措施值得考虑:速率限制 。速率限制对某个特定端点在一段时间窗口内设置了请求数量的阈值 。速率限制很容易搭建和应用,通常是一个简单的正向工程实践 。只要你设置的限制足够高,不妨碍正常使用,它们就可以防止一系列问题,包括 DoS 。
在 Django 中,django-ratelimit 提供了一个简单的基于装饰器的 API,使得为视图增加速率限制非常容易:
?复制代码
from ratelimit.decorators import ratelimit @ratelimit(key='user’, rate=’10/s’)def my_view(request):…或者,如果你在使用 Django REST 框架,它可以通过一系列配置实现内置的速率限制 。对一些应用程序来说,广泛应用速率限制是很好的办法——甚至可以在每个视图上应用速率限制 。在那些例子中,你可以用Semgrep 来发现并警告未被装饰的视图 。
下面是一个例子,Semgrep 配置可以发现没有被 @ratelimit装饰器装饰的视图:
?复制代码
【如何阻止对Web应用程序发起的DoS攻击?】rules:- id: my_pattern_id patterns: - pattern-either: - pattern: | def $FUNC(..., request, ...): ... - pattern-not: | @ratelimit.decorators.ratelimit(...) def $FUNC(..., request, ...): ... message: | This view Appears not to have a rate limit applied. Consider applying one with the @ratelimit decorator. fix: | severity: WARNING你可能想针对你的具体应用程序修改规则集;这只是个起点 。迭代开发一个定制规则集的一个好方法是从这个规则集开始在 Semgrep 的交互实验室进行迭代 。
低杠杆率 DoS 风险:DDoS最后,我们讨论最后一种 DoS 攻击:真正的 DDoS 攻击,即一个攻击者指挥大量计算机向你的应用程序发送大量流量 。这些流量通常不是针对具体应用程序的;它通常是一些没有意义的 TCP 或 UDP 包,设计用来使网络本身崩溃 。
一次 DDoS 攻击的规模通常只受限于攻击者的预算 。这种类型的攻击通常会使应用程序安全工程师举手投降——包括我自己!实在没有什么措施可以用来缓解这种漏洞 。在应用程序级别肯定是没有方法的 。我比较同意,真正的 DDoS 攻击是超出了应用程序安全范畴的 。
缓解建议:充分准备和网络级别的安全措施那就是说,你可以在网络层级做一些事情,主要是在准备方面:
  • 你应该考虑将应用程序放在可以防护DDoS 的 Cloudflare 之类的服务后面 。你还能从 CloudFlare 之类的 CDN 获得大量性能好处,因此,这通常是值得的 。
  • 你应该理解网络层级以及网络规则可以应用到哪个层级 。许多 DDoS 攻击是可以被识别的(通过 IP、源端口、流量类型或某种组合) 。知道如何应用网络规则来阻止恶意流量有助于你快速对攻击做出响应 。
  • 除了自己控制的系统外,你应该了解你的网络供应商是谁以及它们可以应用哪些缓解措施 。通常,你的网络供应商能比你更有效地阻拦这些攻击 。例如,如果你在 AWS 上托管主机,作为 AWS Shield Advanced 的一部分,你可以得到 AWS DDoS 响应团队 24x7 的支持 。这个服务的起始价格是 36000 美元每年,这看起来可能贵的离奇或者超级便宜,一切取决于你的业务 。
如果你想了解更多关于准备和缓解 DDoS 攻击的内容,谷歌的 Building Secure and Reliable Systems 第 10 章是个不错的起点 。


推荐阅读