最有效的ssh防暴力破解是禁用密码认证,而非仅设maxauthtries:因后者仅限单次连接内尝试次数,攻击者可快速新建连接绕过;必须配合pam_faillock账户级锁定、fail2ban ip级封禁及密钥认证(passwordauthentication no)才能根治。

最有效的SSH防暴力破解不是“锁失败连接”,而是让密码认证根本不可用——只要 PasswordAuthentication yes 还开着,其他所有锁定都只是拖延时间。
为什么只设 MaxAuthTries 没用
很多人在 /etc/ssh/sshd_config 里加了 MaxAuthTries 3 就以为安全了,其实它只限制单次 TCP 连接内的尝试次数。攻击脚本一秒建 5 个新连接,照样能无限重试。它不记录 IP、不跨连接、不封账户,纯属心理安慰。
-
LoginGraceTime 60同理:只控制登录窗口时长,超时断开后立刻能连下一次 - 这两个参数必须配合 IP 级或账户级封禁才起作用
- 检查是否生效:运行
sudo sshd -t验证语法,再用sudo systemctl restart sshd
真正起效的账户级锁定:用 pam_faillock(非 pam_tally2)
RHEL 8+/Ubuntu 20.04+ 默认已弃用 pam_tally2,改用 pam_faillock。它能按用户维度记录失败次数,并支持自动解锁、白名单、IP 绑定等能力。
- 编辑
/etc/pam.d/sshd,在顶部插入两行(顺序不能错):auth [default=die] pam_faillock.so preauth silent deny=3 unlock_time=600auth [default=bad] pam_faillock.so authfail - 再编辑
/etc/pam.d/system-auth,同样加这两行(否则只对 SSH 生效,本地 tty 不锁) - 注意
deny=3是 10 分钟内失败 3 次就锁;unlock_time=600是 600 秒后自动解 - 测试后若被锁,用
sudo faillock --user username查状态,sudo faillock --reset --user username手动解
fail2ban 封 IP 才是核心防线
fail2ban 不依赖 PAM,直接解析日志,实时调用防火墙封 IP,是目前最可靠、最灵活的动态封禁方案。
- 确认日志路径:Ubuntu/Debian 是
/var/log/auth.log,RHEL/CentOS 是/var/log/secure,写错fail2ban就不干活 - 在
/etc/fail2ban/jail.local的[sshd]段中,至少设这四行:enabled = truemaxretry = 3findtime = 120(2 分钟窗口,比默认 600 更紧)bantime = 86400(封 24 小时,防反复试探) - 启动前先运行
sudo fail2ban-client status sshd看 jail 是否 loaded - 用
sudo tail -f /var/log/fail2ban.log实时观察封禁动作,别只信配置文件写了
密钥登录 + PasswordAuthentication no 是唯一根治手段
所有锁定机制都建立在“密码还能输”这个前提上。一旦关掉密码登录,暴力破解就失去目标——没有认证入口,再多的失败记录也不会产生。
- 务必先用
ssh-copy-id或手动把公钥放进~/.ssh/authorized_keys,并确保权限为600 - 在
/etc/ssh/sshd_config中明确设:PasswordAuthentication noPubkeyAuthentication yesPermitRootLogin noAllowUsers deploy@*(用具体用户名替代deploy) - 重启前,新开一个终端用新用户密钥登录成功,再关旧会话——这是运维最常翻车的地方
- SELinux 启用时,记得
restorecon -Rv ~/.ssh,否则 SSH 守护进程拒绝读私钥
复杂点在于:账户锁定和 IP 封禁是互补关系,不是二选一;而密钥登录是前提条件——没它,其他都是补漏。最容易被忽略的是日志路径匹配、PAM 配置文件引用链(sshd → password-auth → system-auth),以及重启服务前不验证新配置是否真生效。











