好吧,足够拖延;到目前为止,这是我想出的
(对不起,很长的篇幅。勇敢点,朋友,旅途值得)
将原始帖子中的方法3和4组合成一种“模糊”或动态白名单,然后-这就是窍门- 不阻止非列入白名单的IP,只是将它们限制在地狱之中。
请注意,此措施仅旨在阻止这种非常特殊的攻击。当然,实际上,它可以与其他最佳身份验证方法结合使用:固定用户名限制,按IP限制,代码强制的强密码策略,无限制的cookie登录,在保存所有密码等效项之前对其进行哈希处理,从不使用安全性问题等
关于攻击场景的假设
如果攻击者针对可变用户名,则不会触发我们的用户名限制。如果攻击者正在使用僵尸网络或可以访问较大的IP范围,则我们的IP限制是无能为力的。如果攻击者已经预先抓取了我们的用户列表(通常是在开放注册的Web服务上可能),则我们无法根据“未找到用户”错误的数量来检测正在进行的攻击。而且,如果我们在整个系统范围内(所有用户名,所有IP)实施限制性限制,则任何此类攻击都将在攻击持续时间和限制时间段内对整个站点进行DoS。
因此,我们需要做其他事情。
对策的第一部分:白名单
我们可以确定的是,攻击者无法检测到并且动态地欺骗了我们数千名用户的IP地址。这使白名单可行。换句话说:对于每个用户,我们存储该用户(先前)登录过的(散列)IP的列表。
因此,我们的白名单方案将充当锁定的“前门”,其中用户必须从其公认的“良好” IP之一连接才能完全登录。对该“前门”进行暴力攻击几乎是不可能的(+)。
(+),除非攻击者“拥有”服务器,所有用户的主机或连接本身,并且在这种情况下,我们不再遇到“身份验证”问题,那么我们将拥有真正的特许经营权插头FUBAR情况
对策的第二部分:无法识别IP的系统范围限制
为了使白名单适用于开放注册的Web服务,在该服务中用户经常切换计算机和/或从动态IP地址进行连接,我们需要为通过未识别IP进行连接的用户保持“猫门”。诀窍是设计该门,以使僵尸网络陷入困境,从而使合法用户尽可能少受到打扰。
在我的方案中,这是通过设置一个非常严格的最大限制来实现的,该限制是由未经批准的IP在3小时的时间内设定的最大失败登录尝试次数(根据服务类型,使用较短或较长的时间可能更明智),并且使限制成为全局,即。对于所有用户帐户。
使用这种方法,即使是缓慢的(两次尝试之间只有1-2分钟)强力也会被检测到并快速有效地受到挫败。当然,仍然可能不会注意到真正缓慢的蛮力,但是太慢的速度会破坏蛮力攻击的目的。
我希望通过这种限制机制来实现的目的是,如果达到最大限制,我们的“猫门”猛然关闭一会儿,但是我们的前门仍然向通过常规方式连接的合法用户开放:
- 通过从其公认的IP之一进行连接
- 或通过使用永久性登录cookie(从任何地方)
遭受攻击的唯一合法用户-即。在启动节流时-将是没有永久登录cookie的用户从未知位置或使用动态IP登录。这些用户将无法登录,直到限制消失为止(如果攻击者尽管受到限制,攻击者仍保持其僵尸网络运行,则可能需要一段时间)。
为了使这小部分用户挤过原本被密封的猫门,即使机器人仍在敲门,我仍将使用带有CAPTCHA的“备份”登录表单。这样,当您显示“对不起,但您目前无法从该IP地址登录”消息时,请包含一个链接,内容为“ 安全备份登录-仅限人类(机器人:不说谎) ”。除了开个玩笑,当他们单击该链接时,请给他们提供经过reCAPTCHA身份验证的登录表单,该表单绕过了整个站点范围的限制。这样,如果它们是人为的并且知道正确的登录名和密码(并且能够读取验证码),则即使它们从未知主机进行连接并且未使用自动登录cookie ,也永远不会拒绝它们的服务。
哦,请澄清一下:由于我确实认为验证码通常是邪恶的,因此仅在节流处于活动状态时才会显示“备份”登录选项。
不可否认的是,像这样的持续攻击仍将构成DoS攻击的一种形式,但是使用所描述的系统,它只会影响到我怀疑只是一小部分用户的用户,即那些不使用网络攻击的用户。 “记住我” cookie,并且正巧在发生攻击时登录,并且不会从他们的任何常规IP登录并且无法读取验证码。只有那些拒绝所有这些条件的人-特别是机器人和真正不幸的残疾人-在机器人攻击期间会被拒绝。
编辑:确实,我想到了一种方法,甚至可以让受验证的用户在“锁定”期间通过:代替或作为备用验证码登录的补充,可以为用户提供一次性使用的选项,将特定于用户的锁定代码发送到他的电子邮件,然后他可以用来绕过限制。这肯定超过了我的“烦恼”门槛,但是由于它仅是一小部分用户的最后选择,并且仍然可以避免被锁定在您的帐户之外,因此可以接受。
(此外,请注意,如果攻击的复杂性不如我在此描述的讨厌的分布式版本,则不会发生任何情况。如果攻击仅来自几个IP或仅攻击了几个用户名,它将在更早的时候被阻止,并且不会对整个网站造成影响)
因此,这是我将在我的auth库中实现的对策,一旦我确信这是合理的,并且没有我错过的更简单的解决方案。事实是,有许多微妙的方法可以解决安全性方面的错误,而我也不能做出错误的假设或毫无希望的错误逻辑。因此,请您对所有反馈,批评和改进,细微之处等表示高度赞赏。