如何阻止对Web API的黑客/ DOS攻击

Jam*_*mes 51 java security android http

我的网站上周一直遭遇拒绝服务/黑客攻击.攻击是在循环中随机生成的无效API密钥攻击我们的Web API.

我不确定他们是否试图猜测一个密钥(在数学上不可能作为64位密钥)或尝试DOS攻击服务器.攻击是分布式的,所以我不能禁止所有的IP地址,因为它发生在数百个客户端.

我的猜测是它是IP的Android应用程序,所以有人在Android应用程序中有一些恶意软件,并使用所有安装来攻击我的服务器.

服务器是Tomcat/Java,目前Web API只响应400无效密钥,并缓存已经进行了几次无效密钥尝试的IP,但仍需要对每个错误请求进行一些处理.

有什么建议如何阻止攻击?有没有办法识别从HTTP标头发出请求的Android应用程序?

F. *_*n Q 44

防止蛮力攻击:

有大量工具和策略可以帮助您完成此任务,使用哪些工具和策略完全取决于您的服务器实现和要求.

如果不使用防火墙,IDS或其他网络控制工具,您无法真正阻止DDOS拒绝为您的应用程序提供服务.但是,您可以修改应用程序以使暴力攻击更加困难.

执行此操作的标准方法是实施锁定渐进式延迟.如果IP无法登录N次,则锁定会阻止IP发出X分钟的登录请求.渐进式延迟会增加处理每个错误登录请求的延迟和延迟.

如果您正在使用Tomcat的身份验证系统(即您<login-constraint>的webapp配置中有一个元素),您应该使用Tomcat LockoutRealm,它可以让您在发出大量错误请求后轻松将IP地址置于锁定状态.

如果您没有使用Tomcat的身份验证系统,那么您必须发布有关您正在使用的更多信息以获取更具体的信息.

最后,您可以简单地增加API密钥的长度.64位似乎是一个不可逾越的巨大搜索关键空间,但它的重量不足现代标准.许多因素可能会使其远远低于您的预期:

  • 如果您没有保护措施,僵尸网络(或其他大型网络)每秒可以进行数万次尝试.
  • 根据您生成密钥和收集熵的方式,您的事实上的密钥空间可能会小得多.
  • 随着有效密钥数量的增加,需要尝试查找有效密钥的密钥数量(至少在理论上)急剧下降.

将API密钥长度增加到128(或256或512)将不会花费太多,并且您将极大地增加任何暴力攻击的搜索空间(因此,难度).

减轻DDOS攻击:

但是,要减轻DDOS攻击,您需要做更多的工作.DDOS攻击难以防御,如果您不控制服务器所在的网络,则特别困难.

话虽这么说,你可以做一些服务器端的事情:

  • 安装和配置Web应用程序防火墙(如mod_security)以拒绝违反您定义的规则的传入连接.
  • 设置IDS系统(如Snort)以检测DDOS攻击何时发生,并采取第一步来缓解它
  • 请参阅@Martin Muller的帖子,了解另一个出色的选择,fail2ban
  • 创建你自己的Tomcat Valve,如所描述这里,拒绝通过其进入的请求User-Agents(或任何其他标准)作为防御的最后一道防线.

但是,最终,您可以做很多事情来免费停止DDOS攻击.服务器只有很多内存,如此多的CPU周期和如此多的网络带宽; 有足够的传入连接,即使最有效的防火墙也不会让你失望.如果您投资于更高带宽的互联网连接和更多服务器,或者您在Amazon Web Services上部署应用程序,或者您购买了许多消费者和企业DDOS缓解产品中的一种,那么您将能够更好地抵御DDOS攻击(@ SDude在他的帖子中提出了一些很好的建议.这些选项都不便宜,快捷或简单,但它们都是可用的.

底线:

如果您依赖应用程序代码来缓解DDOS,那么您已经输了


小智 7

这里有一些想法。此外还有许多策略,但这应该可以帮助您入门。还要认识到,亚马逊经常受到 ddos​​ 攻击,他们的系统往往有一些启发式方法,可以使他们(以及您)免受这些攻击,特别是如果您使用弹性负载平衡,无论如何您都应该使用它。

  • 使用 CDN——他们通常有检测和防御 DDoS 的方法。Akamai、Mastery 或亚马逊自己的云前端。
  • 使用 iptables 将攻击性 ip 列入黑名单。您拥有的工具越多,阻止/解锁的速度就越快
  • 使用限流机制阻止大量请求

  • 在非常大的请求(例如大于 1-2mb;除非您有照片上传服务或类似服务)到达您的应用程序之前自动拒绝它们

  • 通过限制与系统中其他组件的连接总数来防止级联故障;例如,不要因为打开了一千个连接而让数据库服务器过载。


SDu*_*ude 5

如果足够大,您将无法独自阻止它。您可以在应用程序级别上进行所有想要的优化,但是仍然会失败。除了用于预防的应用程序级安全性(如FSQ的回答),您还应该使用行之有效的解决方案,让专业人士(如果您对业务很认真)承担了沉重的负担。我的建议是:

  1. 注册CloudFlareIncapsula。这对他们来说是日常的。
  2. 考虑将AWS API网关用作API请求的第二阶段。您将在Amazon级享受API的过滤,限制,安全性,自动扩展和HA 。然后,您可以将有效请求转发到您的计算机(在亚马逊内部或外部)

互联网-> CloudFlare / Incapsula-> AWS API Gateway->您的API服务器

0,02

PS:我认为这个问题属于Sec