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

时间:2015-09-15 00:40:24

标签: java android http security

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

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

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

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

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

6 个答案:

答案 0 :(得分:43)

防止蛮力攻击:

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

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

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

如果你正在使用Tomcat的身份验证系统(即你的webapp配置中有<login-constraint>元素),你应该使用Tomcat LockoutRealm,这样可以轻松放置IP一旦他们发出许多错误请求,就会锁定地址。

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

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

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

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

减轻DDOS攻击:

然而,要减轻DDOS攻击,您需要做更多的工作。 DDOS攻击是 hard 来防御,如果你不控制服务器所在的网络,它就特别难。

话虽如此,你可以做一些服务器端的事情:

  • 安装和配置网络应用程序防火墙,例如mod_security,以拒绝违反您定义的规则的传入连接。
  • 设置IDS系统,如Snort,以检测DDOS攻击何时发生,并采取第一步措施来缓解它
  • 有关其他优秀选项@Martin Muller's post
  • ,请参阅fail2ban
  • 创建您自己的Tomcat Valve,如here所述,以User-Agents(或任何其他标准)拒绝传入请求作为最后一道防线。

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

底线:

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

答案 1 :(得分:4)

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

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

    0.02

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

答案 2 :(得分:3)

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

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

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

答案 3 :(得分: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个清洁管道经销商。

答案 4 :(得分:2)

以下是一些想法。此外还有许多策略,但这应该可以帮助您入门。还要意识到亚马逊经常得到ddos'd,并且他们的系统往往会有一些启发式方法来加强它们(以及你们)对这些攻击的强化,特别是如果你使用的是弹性负载平衡,无论如何你应该使用它。 / p>

  • 使用CDN - 他们经常有办法检测和防御ddos。 Akamai,掌握或亚马逊拥有云端。
  • 使用iptables将令人反感的ips列入黑名单。你有更多的工具,你可以更快地blok / unblock
  • 使用限制机制来阻止大量请求

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

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

答案 5 :(得分:1)

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

您的问题有一些说明 - 请求无效,但可能确定这样做的成本太高。请求来自特定的网络组,并且可能是它们以突发形式发生。

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

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

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

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