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

问题描述 投票:49回答:6

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

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

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

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

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

java android http security
6个回答
43
投票

防止蛮力攻击:

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

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

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

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

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

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

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

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

减轻DDOS攻击:

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

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

  • 安装和配置Web应用程序防火墙(如mod_security),以拒绝违反您定义的规则的传入连接。
  • 设置IDS系统,如Snort,以检测DDOS攻击何时发生,并采取第一步措施来缓解它
  • 查看@Martin Muller's post的另一个很好的选择,fail2ban
  • 创建你自己的Tomcat Valve,如here所描述的那样,通过他们的User-Agents(或任何其他标准)拒绝传入的请求作为最后一道防线。

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

底线:

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


4
投票

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

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

Internet - > CloudFlare / Incapsula - > AWS API Gateway - >您的API服务器

0,02

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


3
投票

最好的方法是完全阻止对那些失败的IP地址进行3次访问。这将占用服务器的大部分负载,因为攻击者在Tomcat甚至必须为该用户启动线程之前被阻止。

实现这一目标的最佳工具之一称为fail2ban(http://www.fail2ban.org)。它作为所有主要Linux发行版中的包提供。

您需要做的是基本上将失败的尝试记录到文件中并为fail2ban创建自定义过滤器。 Darryn van Tonder在他的博客上有一个关于如何编写自己的过滤器的很好的例子:https://darrynvt.wordpress.com/tag/custom-fail2ban-filters/


2
投票

如果D-DOS攻击严重,则应用程序级别检查根本不起作用。 D-DOS客户端将占用整个带宽,并且不会触发您的应用程序级别检查。实际上,您的Web服务根本不运行。

如果您必须保护您的应用程序免受严重的D-DOS攻击,除了依靠第三方工具付钱之外,您没有任何其他选择。我可以从我过去的经验中找到一个干净的管道提供商(只发送良好的流量)工具:Neustar

如果您网站中的D-DOS攻击温和,您可以实施应用程序级别检查。例如,下面的配置将限制Restrict calls from single IP中引用的单个IP的最大连接数

<Directory /home/*/public_html> -- You can change this location
    MaxConnPerIP 1  
    OnlyIPLimit audio/mpeg video
</Directory>

有关D-DOS攻击的更多信息,请访问Wiki link。它提供了预防和响应工具列表,其中包括:防火墙,交换机,路由器,基于IP的预防,基于D-DOS的防御

最后

清洁管道(所有交通通过各种方法通过“清洁中心”或“清洗中心”,如代理,隧道甚至直接电路,分隔“坏”流量(DDoS和其他常见的互联网攻击)并仅发送超出服务器的良好流量)

你可以找到12个清洁管道经销商。


2
投票

这里有几个想法。此外还有许多策略,但这应该可以帮助您入门。还要意识到亚马逊经常得到ddos'd并且他们的系统倾向于有一些启发式方法来加强他们(以及你)这些攻击,特别是如果你使用Elastic负载平衡,你应该使用它。

  • 使用CDN - 他们经常有办法检测和防御ddos。 Akamai,掌握或亚马逊拥有云端。
  • 使用iptables将令人反感的ips列入黑名单。你有更多的工具,你可以更快地blok / unblock
  • 使用限制机制来防止大量请求
  • 在到达您的应用程序之前,自动拒绝非常大的请求(例如,大于1-2mb;除非您有照片上传服务或类似服务)
  • 通过限制与系统中其他组件的连接总数来防止级联故障;例如,不要让数据库服务器通过打开一千个连接来使其过载。

1
投票

对于有针对性和高度分布的DOS攻击,唯一可行的解​​决方案(除了提供吸收它的能力之外)是分析攻击,识别“告知”并将该流量路由到低资源处理程序。

你的问题有一些说法 - 请求是无效的,但可能在确定这个问题时花费太多。请求源自特定的网络组,并且可能是它们以突发形式发生。

在你的评论中,你告诉我们至少另一个告诉 - 用户代理是空的。

在不添加任何其他组件的情况下,您可以通过对连接进行tarp来开始 - 如果匹配该配置文件的请求进入,请继续并验证密钥,然后让您的代码休眠一两秒钟。这将以较低的成本降低这些客户的请求率。

另一种解决方案是使用与tell匹配的日志失败并使用fail2ban实时重新配置防火墙,以便暂停源地址中的所有数据包一段时间。

不,你不太可能在没有拿到受影响的设备的情况下识别应用程序。

© www.soinside.com 2019 - 2024. All rights reserved.