您如何正确实施针对暴力破解的防御措施?最好存储有人尝试登录并在 X 次尝试后阻止他们的次数?以及如何识别“某人”?与会议?一个IP?
如何防止暴力破解
拒绝蛮力的答案是拒绝大量尝试,其中大是由您的密钥空间和风险接受度定义的。
每种情况都会有不同的解决方案。
肉类空间
- 门被加固以防止暴力损坏。
- 通过向警察发出警报的机会可以减轻撞门的情况。
- 密钥只有大约 5 个变量,但是每个密钥中的一个都需要资源(更容易以其他非蛮力的方式攻击锁)
电脑
- 自动化蛮力攻击意味着您需要以某种方式限制速率。使用速率限制,您绝对可以知道您在一定时间内的尝试上限。
- 监控:如果您可以将蛮力尝试限制在一定的速率(也许 500 次/天),那么监控和警报可以让人们知道仔细查看正在发生的事情。需要多少次尝试才能达到一定程度的不可接受的风险?
- 大密钥空间:具有复杂的密码要求可以大大增加找到密码的一定概率所需的尝试次数。
- 两因素身份验证:在这种情况下,暴力破解密码是不够的
所有的解决方案也像生活中的其他事情一样需要权衡取舍。
- 速率限制:可以拒绝合法用户,如果攻击是广度优先则无效 - 在第二次尝试之前为每个帐户尝试一次
- IP限速:分布式攻击无效
- 密码复杂性:通常是可用性的权衡,这意味着用户会写下他们的密码 - 安全性比暴力威胁降低更多
- 两个因素:可能被视为昂贵,可能会丢失代币
帐户锁定是一种选择,其中帐户被永久锁定或在 x 次登录失败后锁定一段时间。这里的问题是攻击者试图猜测密码时的拒绝服务风险以及重置帐户的管理开销(假设自动重置不可用)
另一种选择是将验证码引入登录过程。这旨在限制自动攻击,并阻止帐户锁定导致的拒绝服务。它的问题可能是可访问性要求和自动验证码破解。从我所见,一些验证码比其他软件更容易破解。
第三种选择是在登录过程中引入渐进式延迟,因此对于每个错误的登录,您都会导致过程变得越来越慢。这对真实用户的影响有限,但会使自动暴力破解更加困难。
关于确定攻击的“某人”的问题的第二部分,这取决于他们在做什么。如果他们只是攻击单个用户,则用户名是标识符,并且操作与该帐户相关联。如果他们对广泛的用户进行暴力破解,那么源 IP(可能与浏览器代理结合使用)是一种选择。它并不完美(例如,使用僵尸网络、代理欺骗),但可能是您必须继续了解的唯一信息。
重要的是您如何识别“某人”?
您不能通过 IP 地址来做到这一点 - 许多用户可能看起来拥有相同的客户端地址(随着 IPV4 地址匮乏的持续问题,这将变得更加频繁)。
一个用户可能会从多个客户端地址连接 - 例如使用 AOL 的负载平衡代理,或者不太合法,通过 tor。
其他任何东西都是客户端提供的数据 - 因此它们可能会修改您设置的任何 cookie、用户代理字符串等。
唯一实用的方法是对请求应用启发式评分,以尝试将其与之前的尝试进行匹配——但仍然无法区分复杂的攻击和合法用户。
设置一个分数阈值,在该阈值上您认为客户试图暴力破解您的网站,例如 -20。
要求会话 cookie 引用的当前有效会话(未在提示输入用户名/密码的页面中设置)是一个开始 - 如果 cookie 未显示身份验证详细信息,则重定向到一个单独的页面,该页面删除 cookie 并初始化会话得分为 -10,客户端 IP 地址得分(例如)-2。当您开始看到来自同一地址的多个有效用户时,您可以使用动态评分机制。同样,您可以通过用户代理和用户名维护动态评分。
当为不存在的用户提供 cookie+auth 时,将 -5 添加到会话,-1 到客户端地址,-5 到用户名。
当 cookie+auth 出现无效密码时,将 -3 分添加到会话,-1 到客户端地址,-4 到用户名。
当 cookie+auth+valid password 时,客户端地址得分 +4,用户名 +3,用户代理 +2。
注意,您还需要设置衰减以允许针对客户端地址/用户代理/用户名保留的任何分数恢复,例如 +2/小时
您需要考虑当分数超过阈值时会发生什么。您是否为任何人提供了阻止访问您网站的机制?
如果您以特定用户名的高分阻止访问,请向该帐户的注册用户发送一封包含重置 URL 的电子邮件,以便他们可以重置为其用户名保留的分数并降低为其用户代理保留的分数/地址。
正如我所建议的,您的意思是在 Web 应用程序中暴力破解登录名/密码。
没有人手动暴力破解。因此,如果怀疑这是试图进行身份验证的人,请显示验证码,例如,从 3-d 失败的登录尝试中。此外,您可以在登录尝试之间设置超时 - 但这不适用于来自不同 IP 的分布式攻击。接下来,有两种类型的暴力破解——盲目的,只是尝试随机登录/密码,以及针对某些用户的攻击。对于最后一次攻击,实施诸如封锁帐户一段时间并通过电子邮件通知用户等功能是有效的。因为盲目的蛮力缓解可能更难实施,特别是如果该网站很受欢迎。在这种情况下,您可以跟踪 IP/国家/浏览器/等此类用户信息,并找出这些信息的组合,您可以假设这是否是有效用户。作为对此的补充,
如果没有 Web 应用程序类型的解决方案,则可以实现像 Apache 的 mod_evasive 这样的服务器级解决方案。甚至编写自己的网络服务器模块,专门用于此类目的。
当然,还有许多其他方法可以加强蛮力攻击缓解,但结果往往是嘈杂、无用且令人讨厌。尽量保持KISS。