在 CentOS 7 里,想把用户登录重试限制真正配到位,MaxAuthTries 和 pam_tally2.so 需要一起设置:前者管的是单次 SSH 连接里最多能输错几次密码,比如设为 3;后者负责跨会话累计失败次数后的锁定,比如 deny=5。少了任何一个,限制都不完整。还有一个关键细节不能忽略:pam_tally2 必须放在 /etc/pam.d/sshd 的 auth 段开头。

CentOS 7 修改用户登录重试次数,核心是改两处:SSH 远程登录的 MaxAuthTries(控制单次连接内最多输错几次密码),以及 PAM 的 pam_tally2.so(控制跨会话的累计失败次数并锁定账户)。只改一个不顶用,必须配合使用。
改 /etc/ssh/sshd_config 中的 MaxAuthTries
这个参数限制的是「一次 SSH 连接过程中」允许输入错误密码的次数。比如设为 3,用户连上来后连续输错 3 次,连接直接断开,不会等到第 4 次才拒绝。
- 编辑配置:
sudo vi /etc/ssh/sshd_config - 取消注释并修改这一行:
MaxAuthTries 6→ 改成MaxAuthTries 3 - 注意:不要设为
1,否则用户输错一次就断连,体验极差;也不建议低于3,容易误锁 - 改完必须重启服务:
sudo systemctl restart sshd
在 /etc/pam.d/sshd 中启用 pam_tally2.so
这才是真正实现「连续失败 N 次后锁定账号」的关键。它记录的是用户维度的累计失败次数,和连接无关 —— 即使每次连上来只输错 1 次,连错 5 次照样被锁。
- 在
/etc/pam.d/sshd文件顶部(#%PAM-1.0下一行)插入:auth required pam_tally2.so deny=5 unlock_time=300 even_deny_root root_unlock_time=300 deny=5表示累计失败 5 次即锁定;unlock_time=300是普通用户 300 秒后自动解锁;root_unlock_time单独控制 root 解锁时间- 务必加在
auth段开头,否则可能被后续规则绕过(比如放在password-auth后面,会导致未验证密码就计数) - 确认系统有该模块:
ls /lib64/security/pam_tally2.so(CentOS 7 默认自带)
验证和排错:为什么改了还是没锁?
常见失效原因不是配置写错,而是逻辑没理清:
- 用户首次登录成功后,失败计数器才会清零 —— 所以反复输错但从未登成功过,计数会一直累加
- 用
pam_tally2 --user username查看当前失败次数,输出里带lock_time字样说明已锁定 - 如果改完配置仍能用错密码反复试,检查是否漏了
auth required(写成auth [default=ignore]就无效) pam_tally2不影响 root 的 SSH 登录权限本身,但若PermitRootLogin no已禁用 root SSH,则even_deny_root实际无意义
最易被忽略的一点:PAM 规则生效依赖于调用顺序,auth required 必须出现在所有密码验证模块之前;而 MaxAuthTries 是 SSH daemon 层的硬性拦截,两者缺一不可 —— 前者防爆破,后者减负载。