我即将为我们的网站实现一个 RESTful API(基于 WCF 数据服务,但这可能无关紧要)。
通过此 API 提供的所有数据都属于我服务器的某些用户,因此我需要确保只有这些用户才能访问我的资源。因此,所有请求都必须使用登录名/密码组合作为请求的一部分来执行。
在这种情况下防止暴力攻击的推荐方法是什么?
我正在考虑记录由于错误凭据而被拒绝的失败请求,并在超过某个失败请求阈值后忽略源自同一 IP 的请求。这是标准方法,还是我遗漏了一些重要的东西?
我即将为我们的网站实现一个 RESTful API(基于 WCF 数据服务,但这可能无关紧要)。
通过此 API 提供的所有数据都属于我服务器的某些用户,因此我需要确保只有这些用户才能访问我的资源。因此,所有请求都必须使用登录名/密码组合作为请求的一部分来执行。
在这种情况下防止暴力攻击的推荐方法是什么?
我正在考虑记录由于错误凭据而被拒绝的失败请求,并在超过某个失败请求阈值后忽略源自同一 IP 的请求。这是标准方法,还是我遗漏了一些重要的东西?
由于存在大量 NAT 网关,基于 IP 的阻止本身是有风险的。
如果客户端快速发出太多请求,您可能会减慢(焦油坑)客户端;也就是说,在响应之前故意插入几秒钟的延迟。人类不太可能抱怨,但你已经放慢了机器人的速度。
我会使用与网站相同的方法。跟踪某个窗口内失败的登录尝试次数——比如在某个合理的跨度内(比如 15 分钟)允许 3 次(或 5 或 15 次)。如果超过阈值,则将帐户锁定并标记锁定发生的时间。您也可以记录此事件。在另一个合适的时间过去后,比如一个小时,解锁帐户(在下次登录尝试时)。成功登录会重置计数器和上次锁定时间。请注意,您实际上从未尝试在锁定的帐户上登录,您只是返回登录失败。
这将有效地限制任何暴力攻击,使得对合理密码的攻击不太可能成功。使用我上面的数字的攻击者每 1.25 小时只能尝试 3 次(或 5 或 15 次)。使用您的日志,您可以通过在同一天从同一帐户中查找多个锁定来检测何时可能发生此类攻击。由于您的服务旨在供程序使用,因此一旦访问该服务的程序正确设置了其凭据,它将永远不会遇到登录失败,除非正在进行攻击。这将是可能发生攻击的另一个迹象。一旦您知道攻击正在进行中,那么您可以采取进一步措施来限制对违规 IP 的访问,或者在适当的情况下让当局参与进来,并阻止攻击。