如何防止对 RESTful 数据服务的暴力攻击

Posted

技术标签:

【中文标题】如何防止对 RESTful 数据服务的暴力攻击【英文标题】:How do you prevent brute force attacks on RESTful data services 【发布时间】:2011-02-27 06:55:12 【问题描述】:

我即将为我们的网站实现一个 RESTful API(基于 WCF 数据服务,但这可能无关紧要)。

通过此 API 提供的所有数据都属于我服务器的某些用户,因此我需要确保只有这些用户才能访问我的资源。因此,所有请求都必须使用登录名/密码组合作为请求的一部分来执行。

在这种情况下防止暴力攻击的推荐方法是什么?

我正在考虑记录由于错误凭据而被拒绝的失败请求,并在超过某个失败请求阈值后忽略源自同一 IP 的请求。这是标准方法,还是我遗漏了一些重要的东西?

【问题讨论】:

【参考方案1】:

由于 NAT 网关的数量,基于 IP 的阻止本身是有风险的。

如果客户端快速发出太多请求,您可能会减慢(tar 坑)客户端;也就是说,在响应之前故意插入几秒钟的延迟。人类不太可能抱怨,但你已经放慢了机器人的速度。

【讨论】:

嗯,您想如何将 CAPTCHA 放入 RESTfull API? AFAIU 的所有客户都不应该是人类。 好点,我一定是对 RESTful 位眨眼了。棘手。 验证码是我现在用于常规网站的方法。但正如 Iphone 初学者指出的那样,这不是一个安静的 api 的选择。不过,Tarpitting 可能是个好主意。 你可以让缓送自适应吗?增加来自同一 IP 的连续错误请求的延迟 - 可能成倍增加。【参考方案2】:

我会使用与网站相同的方法。跟踪某个窗口内失败的登录尝试次数——比如在某个合理的跨度内(比如 15 分钟)允许 3 次(或 5 或 15 次)。如果超过阈值,则将帐户锁定并标记锁定发生的时间。您也可以记录此事件。在另一个合适的时间过去后,比如一个小时,解锁帐户(在下次登录尝试时)。成功登录会重置计数器和上次锁定时间。请注意,您实际上从未尝试在锁定的帐户上登录,您只是返回登录失败。

这将有效地限制任何暴力攻击,使针对合理密码的攻击不太可能成功。使用我上面的数字的攻击者每 1.25 小时只能尝试 3 次(或 5 或 15 次)。使用您的日志,您可以通过在同一天从同一帐户中查找多个锁定来检测何时可能发生此类攻击。由于您的服务旨在供程序使用,因此一旦访问该服务的程序正确设置了其凭据,它将永远不会遇到登录失败,除非正在进行攻击。这将是可能发生攻击的另一个迹象。一旦您知道攻击正在进行中,您就可以采取进一步措施来限制对违规 IP 的访问,或者在适当的情况下让当局参与进来,从而阻止攻击。

【讨论】:

这不是更容易对用户帐户发起 DOS 攻击吗?例如,我们网站的恶意竞争对手可能会故意通过发布错误密码来锁定用户。他无法访问他们的帐户,但他会成功地使我们的网站看起来不可靠。这就是我考虑基于 IP 的方法的原因 - 攻击者必须欺骗真实用户的 IP 地址才能将他锁定。 @Adrian - 是的,但这是不同类型的问题。使用基于 IP 的方法来解决它可能会使您的服务实际上不可靠,因为用户可能只是在密码更改后忘记更新他的脚本。在这种情况下,用户可以简单地等到超时时间过去,然后再试一次,而无需您参与。使用日志记录,您仍然能够检测到 DOS 攻击并从恶意站点设置 IP 块,在这种情况下,请务必致电当局。

以上是关于如何防止对 RESTful 数据服务的暴力攻击的主要内容,如果未能解决你的问题,请参考以下文章

ubuntu 16.04防止SSH暴力登录攻击

如何防止 Django Rest 中的暴力攻击 + 使用 Django Rest Throttling

如何防止android中的拒绝服务(DOS)攻击?

如何有效防止API的重放攻击(转自阿里云)

暴力破解原理与过程详解

SQL服务器怎样做才能防止黑客攻击?