禁用密码认证是防SSH爆破的根本措施,需设置PasswordAuthentication no等参数并启用密钥认证;辅以pam_faillock账户锁定和fail2ban IP封禁,再配合PermitRootLogin no、AllowUsers等加固策略。

禁用密码重试机制本身不能防爆破——因为只要 PasswordAuthentication yes 还开着,攻击者就能无限新建连接重试。真正有效的做法不是“限制重试次数”,而是让密码认证这条路根本走不通。
核心原则:密码认证必须关闭,而不是仅设 MaxAuthTries
关闭密码登录(根治手段)
编辑 /etc/ssh/sshd_config:
sudo nano /etc/ssh/sshd_config
确保以下几行明确设置为 no(取消注释并修改):
PasswordAuthentication noChallengeResponseAuthentication no-
UsePAM no(若未专门配置 PAM 密码策略,建议关闭,避免绕过)
同时确认这两项已启用:
PubkeyAuthentication yesAuthorizedKeysFile .ssh/authorized_keys
保存后,先验证语法:
sudo sshd -t
无输出即表示合法。再重启服务:
sudo systemctl restart sshd
⚠️ 操作前务必用另一终端测试密钥登录成功,再关闭原会话。
配合账户级失败锁定(增强纵深防御)
即使已禁用密码,仍建议启用 pam_faillock,防止本地或其它服务被爆破:
编辑 /etc/pam.d/sshd,在顶部插入两行(顺序不能错):
auth [default=die] pam_faillock.so preauth silent deny=3 unlock_time=600 auth [default=bad] pam_faillock.so authfail
同样在 /etc/pam.d/system-auth 中加入相同两行,使规则对本地登录也生效。
-
deny=3:10 分钟内失败 3 次即锁账户 -
unlock_time=600:600 秒(10 分钟)后自动解锁
测试锁定状态:
sudo faillock --user username sudo faillock --reset --user username # 手动解封
加上 IP 级实时封禁(关键防线)
fail2ban 是目前最可靠、最灵活的动态防护工具,它不依赖 PAM,直接解析日志封 IP:
确认日志路径(Ubuntu/Debian 是 /var/log/auth.log,RHEL/CentOS 是 /var/log/secure),然后编辑 /etc/fail2ban/jail.local,在 [sshd] 段中至少配置:
enabled = true maxretry = 3 findtime = 120 bantime = 86400
启动并验证:
sudo systemctl enable --now fail2ban sudo fail2ban-client status sshd sudo tail -f /var/log/fail2ban.log # 实时观察封禁动作
补充加固(降低攻击面)
-
禁止 root 直接登录:
PermitRootLogin no -
限定可登录用户:
AllowUsers deploy admin或AllowGroups sshusers -
改非标端口(可选):如
Port 2222,并同步在防火墙放行(如ufw allow 2222) -
缩短登录窗口:
LoginGraceTime 30(30 秒内未完成认证则断开)
不复杂但容易忽略











