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

2022-08-31 16:11:23

我的网站上周一直遭受拒绝服务/黑客攻击。攻击正在使用循环中随机生成的无效API密钥来攻击我们的Web API。

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

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

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

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


答案 1

防止暴力攻击:

有大量的工具和策略可以帮助您做到这一点,使用哪些工具和策略完全取决于您的服务器实现和要求。

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

执行此操作的标准方法是实现锁定渐进式延迟。锁定可防止 IP 在登录 N 次失败时发出 X 分钟的登录请求。渐进式延迟会增加处理每个错误登录请求的越来越长的延迟。

如果您使用的是Tomcat的身份验证系统(即您的Web应用程序配置中有一个元素),则应使用Tomcat LockoutRealm,一旦IP地址发出许多错误的请求,您就可以轻松地将其锁定。<login-constraint>

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

最后,您可以简单地增加 API 密钥的长度。64位似乎是一个不可逾越的巨大搜索密钥空间,但以现代标准来看,它的重量不足。许多因素可能导致它远不如您预期的安全:

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

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

缓解 DDOS 攻击:

但是,要缓解DDOS攻击,您需要做更多的跑腿工作。DDOS攻击很难防御,如果您不控制服务器所在的网络,则尤其困难。

话虽如此,您可以执行一些服务器端操作:

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

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

底线:

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


答案 2

如果它足够大,你就无法独自阻止它。您可以在应用级别执行所需的所有优化,但仍会下降。除了用于预防的应用程序级安全性(如FSQ的答案)之外,您还应该使用经过验证的解决方案,将繁重的工作留给专业人士(如果您认真对待您的业务)。我的建议是:

  1. 注册CloudFlareIncapsula。这对他们来说是每天的。
  2. 请考虑使用 AWS API 网关作为 API 请求的第二阶段。您将在 Amazon 规模上享受 API 的筛选、限制、安全性、自动扩展和 HA。然后,您可以将有效请求转发到您的机器(在亚马逊内部或外部)

互联网 --> CloudFlare/Incapsula --> AWS API Gateway -->您的 API Server

0,02

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