将原帖中方法3和4结合为一种“模糊”或动态白名单,然后 - 这是关键 -
不要阻止非白名单IP,而是将它们限制到极致。请注意,此措施
仅旨在挫败这种特定类型的攻击。实际上,它会与其他最佳实践方法相结合使用:固定用户名节流、按IP地址节流、代码强制执行强密码策略、无节流cookie登录、保存所有密码等价物之前进行哈希处理、永不使用安全问题等。
对攻击场景的假设
如果攻击者针对可变用户名,则我们的用户名节流不起作用。如果攻击者使用僵尸网络或访问大量IP范围,则我们的IP节流也无能为力。如果攻击者已经预先获取了我们的用户列表(通常可以在开放注册的网页服务上实现),我们无法根据“未找到用户”的错误数检测到正在进行的攻击。如果我们强制执行系统范围的(所有用户名、所有IP)节流,则任何此类攻击将使我们的整个站点在攻击期间加上节流时期被拒绝服务(DoS)。
所以我们需要做些其他的事情。
防御措施的第一部分:白名单
我们可以相当确信的是,攻击者无法检测并动态欺骗我们数千个用户的IP地址(+)。这使得白名单成为可能。换句话说:对于每个用户,我们存储该用户最近登录的IP地址列表(经过哈希处理)。
因此,我们的白名单方案将作为一个锁定的“前门”运行,只有连接到其已知的“好”IP之一的用户才能登录。对这个“前门”的暴力攻击几乎是不可能的(+)。
(+) 除非攻击者“拥有”服务器、所有用户的计算机或连接本身--在这些情况下,我们不再面临“认证”问题,而是面临一个真正的规模如同特许经营的拔插FUBAR情况
防御措施的第二部分:未识别IP的系统范围节流
为了使白名单对开放注册的网络服务起作用,其中用户经常更换计算机和/或从动态IP地址连接,我们需要为从未被批准的IP连接的用户保持一个“猫门”开放。关键是设计这个门,以便僵尸网络被卡住,而合法用户受到的骚扰尽可能少。
在我的方案中,这是通过设置在3小时内未经批准的IP连接的极其严格的最大失败登录尝试次数(根据服务类型,使用较短或较长的时间段可能更明智),并将该限制应用于所有用户帐户的方法实现的。
即使是缓慢(1-2分钟之间的尝试)的暴力破解也会被这种方法迅速有效地检测和挫败。当然,一个
真正缓慢的暴力攻击仍然可能不被注意,但过慢的速度将打败暴力攻击的本质目的。
我希望通过这种限制机制实现的目标是,如果达到最大限制,我们的“猫门”会关闭一段时间,但是我们的前门仍然对通过常规方式连接的合法用户开放:
- 通过从他们认可的IP之一连接,
- 或者使用持久性登录cookie(从任何地方)
在攻击期间受影响的唯一合法用户是没有持久性登录cookie的用户,他们正在从未知位置或动态IP登录。 这些用户将无法登录,直到限制消失为止(如果攻击者继续运行他的僵尸网络,则可能需要很长时间才能消失)。
为了让这个小子集的用户通过已被封闭的猫门,即使bot仍在努力攻击它,我会使用带有CAPTCHA的备份登录表单。这样,在您显示“抱歉,但是您目前无法从此IP地址登录”的消息时,请包含一个链接,上面写着“
安全备份登录 - 仅限人类(bots:不要说谎)”。开个玩笑,当他们点击那个链接时,请给他们一个reCAPTCHA认证的登录表单,该表单可以绕过全站点缓慢限制。这样,如果他们是人类,并且知道正确的登录+密码(并且能够读取CAPTCHA),即使他们正在连接到未知主机并且没有使用自动登录cookie,他们也
永远不会被拒绝服务。
哦,只是为了澄清:由于我认为CAPTCHA通常是邪恶的,因此“备份”登录选项只会在限制活动时出现。
毫无疑问,像那样持续的攻击仍然构成一种DoS攻击形式,但使用上述系统只会影响我怀疑只有极小一部分用户,即不使用“记住我” cookie并且恰好在攻击发生时登录并且没有从任何常用IP登录的人们以及不能阅读CAPTCHA的人们。 只有那些能够满足所有这些标准的人,特别是bot和
非常不幸的残障人士,在bot攻击期间将被拒之门外。
编辑:实际上,我想到了一个方法,即使是验证码困难的用户也可以在“封锁”期间通过:与备用验证码登录相比或作为其补充,向用户提供将单次使用、特定于用户的封锁代码发送到他的电子邮件的选项,然后可以使用该代码绕过限制。这肯定超出了我的“烦恼”阈值,但由于它仅用作少数用户的最后手段,并且因为它仍然优于被锁定在您的账户之外,所以这是可以接受的。
(还要注意:如果攻击不像我在这里描述的那样复杂,则没有任何全站后果。如果攻击只来自几个IP地址或仅针对几个用户名,则它将很早就被挫败。)
因此,这就是我将在我的认证库中实施的反制措施,一旦我确信它是有效的,并且我没有漏掉更简单的解决方案。事实是,在安全方面有很多微妙的做错事情的方式,我并不排除会做出错误的假设或无望的缺陷逻辑。因此,请提供任何和所有的反馈、批评和改进,细微之处等都将不胜感激。