为了防止暴力攻击,需要对每个面向互联网的登录进行多因素身份验证,按帐户、IP 和全局限制失败尝试的速率,阻止泄露的密码,使用 Argon2id 或 bcrypt 存储哈希值,并对异常登录失败发出警报。将这些控件分层,因为没有一个可以阻止所有变体。
在任何 SSH 服务器上线几个小时后打开其身份验证日志,您将看到以下内容:
10 月 3 日 02:14:07 web01 sshd[2231]:来自 203.0.113.45 端口 51022 ssh2 的 root 密码失败
10 月 3 日 02:14:09 web01 sshd[2233]:来自 198.51.100.17 端口 40318 ssh2 的管理员密码失败
10 月 3 日 02:14:11 web01 sshd[2236]:来自 192.0.2.88 端口 33874 ssh2 的 ubuntu 密码失败三个用户名,三个 IP,间隔两秒。没有人在打字。机器人会测试他们找到的每个登录页面、SSH 端口和 API 端点,一次成功的猜测会直接导致帐户接管。以下是按影响排名的九种控制措施,以及如何检测和响应正在进行的攻击。
如何防止暴力攻击:按影响排名的 9 种控制措施
实施多重身份验证。正确猜测或泄露的密码将不再授予访问权限。
速率限制和限制登录。缓慢的猜测速度使其变得毫无意义。
遵循 NIST SP 800-63B 密码规则。支持长度、阻止破解密码、放弃强制轮换。
使用 Argon2id 或 bcrypt 对密码进行哈希处理。被盗的数据库不应该被破解。
有选择地添加验证码和机器人检测。仅挑战可疑流量。
强化 SSH、RDP、CMS 登录和 API。关闭攻击者首先攻击的服务。
使用 IP 信誉、地理规则和 WAF。及早切断已知的不良交通。
监视身份验证失败并发出警报。抓住那些漏掉预防措施的东西。
测试你自己的防御能力。在攻击者之前确认控件是否有效。
时间紧迫?首先执行控制 1、2 和 8。 MFA 限制损害,限制速率减缓攻击,并且监控会告诉您攻击正在发生。
为什么预防措施因变体而异

每个变体都由不同的控件停止,因此请知道您面对的是哪一个。
变体 | 它是如何工作的 | 日志签名 | 最佳控制 |
|---|---|---|---|
简单的暴力破解 | 针对一个帐户的多种猜测 | 多次失败,一个用户名 | 节流、临时锁定 |
密码喷洒 | 许多帐户的一些常用密码 | 每个帐户一两次失败 | 每个 IP 和全局限制,MFA |
撞库 | 泄露的用户名和密码对重播 | 高容量、轮换 IP | MFA,违规筛查 |
离线破解 | 猜测被盗的哈希值 | 您的系统上没有 | Argon2id 或 bcrypt,长密码 |
喷射可以避免每个帐户的锁定,因为每个帐户几乎没有出现任何故障。离线破解根本不会留下任何痕迹,这就是为什么即使您的登录页面是完美的,哈希也很重要。
控制措施 1:强制执行多重身份验证

MFA 排名第一,因为它使得正确的密码不够。按实力排名:
万能钥匙和 FIDO2 密钥。防网络钓鱼,因为凭证绑定到真实域。
身份验证器应用程序 TOTP。可靠,尽管实时网络钓鱼代理可以中继代码。
通过号码匹配推送。阻止盲目批准。
短信代码。最弱,容易发生 SIM 卡交换。仅用作后备。
对抗 MFA 疲劳,攻击者通过数字匹配、每小时提示上限以及重复拒绝后发出警报等方式发送垃圾邮件推送提示,直到有人批准。按爆炸半径推出:管理面板和云控制台,然后是电子邮件、VPN 和代码托管,然后是其他所有人。也锁定恢复路径。切勿让支持人员仅通过电子邮件禁用 MFA。
控制 2:速率限制和限制登录尝试

机器人每分钟尝试 10,000 个密码是一种威胁。保持在每分钟5次,事实并非如此。在锁定之前进行限制,因为硬锁定会让攻击者拒绝向真实用户提供服务。
失败1至3:无延迟
失败 4 次以后:1、2、4、8 秒,上限为 60
10 次失败后:15 分钟锁定以及发送给帐户所有者的电子邮件
限制三个维度,因为每个变体都会超过不同的维度:每个帐户(每 15 分钟 10 次失败)、每个 IP(每分钟 20 次尝试)和全局(高于 3 倍基线失败的警报)。
nginx
limit_req_zone $binary_remote_addr 区域=登录:10m 速率=5r/m;
位置/登录{
limit_req zone=登录突发=3 nodelay;
限制请求状态429;
proxy_pass http://app_backend;
}Nginx 只能看到 IP,因此请使用 Redis 计数器或 WAF 作为帐户层和全局层。对密码重置、MFA 输入(6 位代码只有 1,000,000 种组合)和 API 登录路由应用相同的限制。
控制 3:根据 NIST SP 800-63B 设置密码规则
NIST 用基于攻击者猜测方式的指导取代了旧的复杂性规则。
MFA 至少需要 8 个字符,管理员帐户至少需要 15 个字符。允许 64 个或更多。
放弃强制混合符号和数字。
正确的马电池主食节拍P@ssw0rd!。根据 Have I Been Pwned Pwned Passwords API 检查新密码,该 API 使用 k-匿名性,因此完整密码永远不会离开您的系统。
结束预定轮换。仅根据妥协证据强制重置,例如通过找到的匹配项暗网监控。
允许粘贴,以便密码管理器正常工作。
如果审核员仍然要求轮换,请记录 NIST 的理由,并仅在框架要求的情况下应用更严格的规则。
控制 4:哈希密码以阻止离线攻击
一旦攻击者掌握了您的数据库,速率限制就不起作用。现代 GPU 每秒测试数十亿次 MD5 猜测,因此快速哈希可以在数小时内完成。这就是的地方了解哈希的工作原理得到回报。使用缓慢、内存困难的算法:
氩气2id。当前 OWASP 建议。
加密。强有力的替代方案。
bcrypt。经过实战检验,成本系数 12 或更高。
PBKDF2。仅在合规性要求的情况下,迭代 600,000 次或更多。
切勿单独使用 MD5、SHA-1 或 SHA-256。库会处理 salting,所以永远不要自己编写。将每个哈希的工作因子调整为大约 250 到 500 毫秒,并在设置改进后在下次登录时重新哈希。
蟒蛇
从 argon2 导入PasswordHasher
ph = PasswordHasher(time_cost=2, memory_cost=19456, 并行度=1)
存储 = ph.hash(密码)
ph.verify(stored, password) # 不匹配时引发发货前请根据当前 OWASP 密码存储备忘单确认参数。
控制 5:有选择地添加验证码和机器人检测
验证码会增加摩擦力,而不是墙壁。求解器服务以低廉的价格出售人类解决的挑战,而人工智能模型现在已经解决了许多图像难题。触发风险挑战:三个或更多故障、新设备或国家/地区、托管提供商 IP 或无头浏览器签名。 Cloudflare Turnstile、hCaptcha 和 reCAPTCHA v3 无形地对风险进行评分。将它们与设备指纹识别和时序分析配对,为无法完成视觉挑战的用户提供一种易于使用的替代方案。
控制 6:强化攻击者最常攻击的服务
SSH。去掉密码,暴力破解就没什么可猜的了。
密码验证 否
允许根登录 否
允许用户部署管理员
最大验证尝试 3使用生成密钥ssh-keygen -t ed25519,在第二个会话中确认密钥登录,然后重新加载sshd。添加 Fail2ban 作为支撑层。更改端口可以减少日志噪音,但不是一种控制。
远程桌面开发计划。切勿暴露端口 3389。将其放在 VPN 或网关后面(参见ZTNA 和 VPN 如何适应现代安全策略),启用网络级身份验证,要求 MFA,并设置 15 分钟内 5 次失败的锁定策略。
WordPress 和 CMS。限制登录尝试,阻止/xmlrpc.php(其system.multicall方法测试每个请求数百个密码),限制/wp-login.php通过 IP,并强制执行管理 MFA。
蜜蜂。使用设置每个密钥和每个 IP 的限制第429章响应,使用 332 字节或更长的随机密钥,令牌在一小时内过期,并针对错误的用户名和错误密码返回相同的错误。
控制 7:使用 IP 信誉、地理规则和 WAF
边缘过滤是预过滤器,而不是主要防御。引入 AbuseIPDB 和 Spamhaus DROP 等声誉源,挑战登录路线上的托管提供商范围和 Tor 出口节点,并在客户集中的地方应用地理规则。使用升压 MFA 代替硬块,这样旅行者就不会被锁在门外。部署基于速率的 WAF 规则(Cloudflare、AWS WAF 或 ModSecurity),从计数模式开始,然后切换到阻止。住宅代理网络会轮换真实家庭 IP 并规避所有这些,因此 MFA 和按帐户限制仍然会承担负载。
控制 8:监视身份验证失败并发出警报

预防最终会失败,并且在没有监控的情况下,成功的暴力登录看起来很正常。好网络安全监控从正确的日志开始:Windows 事件 ID 4625、4624 和 4740; SSHauth.logWeb 登录和身份提供商登录日志出现 401 峰值。切勿记录密码。
为每个变体编写一个检测:
蛮力:一个账户5分钟内失败10次以上
喷涂:30 分钟内一个 IP 对超过 15 个用户名失败
馅料:登录量高于基线 3 倍,失败率很高
妥协:失败爆发后成功登录。为这个找某人。
MFA 滥用:三个或更多拒绝推送提示
索引=wineventlog 事件代码=4625
| bin_时间跨度=30m
| stats dc(TargetUserName) as users by _time, IpAddress
|其中用户 > 15Wazuh 是一个免费的起点,具有内置 SSH 和暴力破解规则。以仅报告模式运行警报一周,并根据您自己的基准进行调整。
控制措施 9:测试你自己的防御能力
未经测试的控制是一种假设。使用专用测试帐户仅测试您拥有或具有书面测试授权的系统。 Hydra、Medusa 和 Burp Intruder 涵盖了登录表单和服务,Hashcat 在实验室中测试了针对您自己的哈希副本的离线抵抗力。将其折叠成更广泛的渗透测试和漏洞评估程序使其按计划进行。
验证 15 次快速故障是否会触发延迟、30 个帐户中的一个密码是否会触发喷射检测、没有 MFA 的正确密码会被拒绝、SSH 会拒绝密码,以及成功后的故障突发会到达您的寻呼机。警报测试与块测试一样重要。每季度以及在任何身份验证更改后重新测试。
在主动攻击期间该怎么做
确认范围。识别目标帐户、源 IP 以及失败爆发后的任何成功。
封锁源头。使用防火墙或 WAF 规则,或者在 IP 轮换时按 ASN 或请求模式进行阻止。将计数模式规则切换为阻止。
锁定受损帐户。重置密码、撤销会话并通过另一个渠道验证 MFA 所有权。
暂时收紧。降低阈值并要求加强 MFA,然后在攻击后取消措施。
追踪受损后的活动。寻找新的 MFA 设备、邮箱转发规则、API 密钥和 OAuth 授权。
文档。记录哪个控件应该阻止此操作并修复间隙。如果数据被访问,请检查违规通知期限。
暴力破解预防清单
今天做
列出每个面向互联网的登录
在管理员、电子邮件和云帐户上启用 MFA
禁用 SSH 密码并关闭公共 RDP
这周做
添加登录、重置和 MFA 端点速率限制
根据违规列表筛选密码
在失败爆发后设置成功警报
本季度做
针对每个控件运行授权测试
调整警报阈值
重新基准哈希工作因素
底线
暴力攻击是自动且持续的,因此防御也必须是自动的。优先考虑 MFA、分层速率限制、带有违规筛选的强哈希以及失败后成功警报。它们共同提高了攻击您的成本,超过了大多数机器人的花费。
今天的下一步:列出每个面向互联网的登录并标记哪些缺少 MFA 和速率限制。首先修复管理面板、电子邮件和远程访问。
常见问题
防止暴力攻击最有效的方法是什么?
防网络钓鱼 MFA,例如密钥或 FIDO2 密钥。它使得正确的密码不够,从而抵消了猜测、填充和网络钓鱼凭据的影响。将其与速率限制配对。
帐户锁定是否可以阻止暴力攻击?
它可以阻止单帐户猜测,但攻击者可以触发锁定来阻止真实用户,并且它对密码喷洒没有任何作用。使用渐进延迟加上每个 IP 和全局限制。
暴力破解密码需要多长时间?
它取决于长度、字符集和哈希类型。长度最重要,像 MD5 这样的快速哈希值比 Argon2id 下降得快得多。在实验室中测试您自己的哈希值,而不是相信通用数字。
VPN 或更改默认端口能否阻止暴力攻击?
VPN 消除了公开暴露,因此攻击者必须首先通过其身份验证。更改端口只会减少扫描仪噪音,并且只需几分钟即可找到。
暴力破解和撞库有什么区别?
暴力破解密码。撞库重放真实泄露的对,押注于重用。唯一密码、违规筛查和 MFA 阻止填充。
我怎么知道我是否受到暴力强迫?
查找失败的登录峰值、一个 IP 在多个用户名上失败、在多个帐户上尝试一个密码以及锁定洪水。失败爆发后的成功是最严重的迹象。
Fail2ban 足以保护 SSH 吗?
不会。分布式攻击仍低于其阈值。禁用密码身份验证并需要密钥,并保留 Fail2ban 作为支持层。
