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

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

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

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

服务器是Tomcat / Java,目前web API只是对无效密钥作出响应400,并caching已经做了几次无效密钥尝试的IP,但仍然需要对每个不良请求进行一些处理。

任何build议如何停止攻击? 有没有什么办法来确定从HTTP头发出请求的Android应用程序?

防止暴力攻击:

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

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

这样做的标准方法是实施locking逐步延迟 。 如果login请求失败N次,locking将阻止IP对X分钟发出login请求。 渐进延迟会为处理每个错误的login请求添加更长和更长的延迟。

如果您使用的是Tomcat的身份validation系统(即您的webappconfiguration中有一个<login-constraint>元素),那么您应该使用Tomcat LockoutRealm ,它允许您在发出大量错误请求后轻松地将IP地址locking。

如果您不使用Tomcat的身份validation系统,那么您将不得不发布更多关于您正在使用的信息来获取更具体的信息。

最后,您可以简单地增加API密钥的长度。 64位似乎是一个不可逾越的巨大密钥空间来进行search,但它的现代化标准是不够的。 一些因素可能导致其远不如您预期的安全:

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

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

减轻DDOS攻击:

但是,为了减轻DDOS攻击,你需要做更多的工作。 DDOS攻击难以抵御,如果不控制服务器的networking,DDOS攻击尤其困难。

这就是说,有几个服务器端的东西你可以做:

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

但是,最后,只有这么多才能免费阻止DDOS攻击。 一台服务器只有这么多的内存,很多的CPU周期以及很多的networking带宽。 有足够的传入连接,即使是最有效的防火墙也不会阻止你下去。 如果您投资更高带宽的互联网连接和更多的服务器,或者将应用程序部署在amazon web services上 ,或者您购买了许多消费者和企业DDOS缓解产品之一,那么您将能够更好地抵御DDOS攻击。 SDude在他的文章中有一些很好的build议 )。 这些选项都不便宜,快速或容易,但它们是可用的。

底线:

如果您依靠您的应用程序代码来减轻DDOS,那么您已经丢失了

如果足够大,你不能单独阻止它。 您可以在应用程序级别执行所有您想要的优化,但是您仍然会下降。 除了预防应用程序级别的安全性(如在FSQ的答案中),您应该使用经过validation的解决scheme,让专业人员(如果您对您的业务非常认真)承担重任。 我的build议是:

  1. 注册CloudFlare或Incapsula 。 这是他们的日常工作。
  2. 考虑将AWS API网关用作API请求的第二阶段。 您将享受亚马逊规模的API的过滤,限制,安全性,自动扩展和HA。 那么你可以转发有效的请求到你的机器(在亚马逊或外部)

互联网 – > CloudFlare / Incapsula – > AWS API网关 – >您的API服务器

0,02

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

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

最好的工具之一就是fail2ban( http://www.fail2ban.org )。 它在所有主要的Linux发行版中作为一个包提供。

你必须做的是基本上logging失败的尝试到一个文件,并创build一个自定义过滤fail2ban。 Darryn van Tonder就如何在自己的博客上撰写自己的filter提供了一个很好的例子: https ://darrynvt.wordpress.com/tag/custom-fail2ban-filters/

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

如果您必须保证您的应用程序不受严重的D-DOS攻击,则除了依靠第三方工具付款之外,您没有其他select。 一个干净的pipe道提供者(谁只发送很好的stream量)工具,我可以从我以往的经验: 诺斯塔尔银行

如果在您的网站上D-DOS攻击是轻度的,您可以实施应用程序级别检查。 例如,下面的configuration将限制来自单个IP的最大连接数,如来自单个IP的限制呼叫中所引用的

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

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

最后

清洁pipe道 (所有的stream量通过代理,隧道甚至直接电路等各种方式通过“清洁中心”或“洗刷中心”,这些方法将“坏”stream量(DDoS和其他常见的互联网攻击)分开,良好的stream量超出服务器)

您可以find12个清洁pipe道分销商。

这里有一些想法。 另外还有一些策略,但这应该让你开始。 也意识到,亚马逊得到ddos'd频繁的基础上,他们的系统往往有一些启发式,硬化他们(因此你)从这些攻击,特别是如果你正在使用弹性负载平衡,你应该使用它。

  • 使用CDN – 他们经常有检测和防御ddos的方法。 Akamai,掌握,或amazons自己的云端。
  • 使用iptables黑名单进攻ips。 你有更多的工具,你可以更快地释放/解锁
  • 使用限制机制来防止大量的请求

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

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

对于一个有针对性和高度分布式的DOS攻击来说,唯一可行的解​​决scheme(除了提供容量来弥补)是描述攻击,识别“告诉”并将stream量路由到低资源处理器。

你的问题有一些说法 – 这个请求是无效的,但是大概是有太多的成本来确定的。 这些请求来源于特定的一组networking,大概是爆发的。

在你的评论中,至less有一个告诉我们 – 用户代理是空的。

在不添加任何附加组件的情况下,您可以首先调整连接 – 如果与configuration文件匹配的请求进入,请继续并validation密钥,然后让您的代码hibernate一两秒钟。 这将以较小的成本降低这些客户的请求率。

另一种解决scheme是使用与告警相匹配的日志失败,并使用fail2ban实时重新configuration防火墙,以便将所有数据包从源地址中丢弃一段时间。

不,不太可能,您将无法获取受影响的设备,从而识别该应用。