应禁用密码认证并仅允许 SSH 密钥登录,确保 AuthorizedKeysFile 路径正确、公钥写入且权限严格(~/.ssh 为 700,authorized_keys 为 600),修改 sshd_config 后 reload 服务,并保留逃生会话。

如何限制用户只能通过 SSH 密钥登录,禁用密码认证
直接禁用密码登录是降低暴力破解风险最有效的手段之一。关键不是“能不能关”,而是关了之后是否还能登录——必须确保 AuthorizedKeysFile 路径正确、公钥已写入且权限严格。
-
/etc/ssh/sshd_config中设置PasswordAuthentication no和PubkeyAuthentication yes - 确认用户
~/.ssh/authorized_keys文件权限为600,目录~/.ssh为700,否则 OpenSSH 拒绝读取 - 修改后必须运行
sudo systemctl reload sshd(或sudo service ssh reload), 不要用 restart,避免断连后无法恢复 - 测试新连接前,务必保留一个已登录的 root 或其他密钥可用会话作为“逃生通道”
为什么 PAM 的 faillock 比 denyhosts 更适合现代系统
CentOS 8+/RHEL 8+、Debian 10+ 默认启用 pam_faillock.so,它在 PAM 层拦截失败登录,不依赖独立进程和日志轮转解析,响应更快、规则更可控。
- 启用方式:在
/etc/pam.d/sshd中添加两行(顺序不能错):auth [default=bad success=ok user_unknown=ignore] pam_faillock.so preauth silent deny=5 unlock_time=900 auth [default=die] pam_faillock.so authfail deny=5 unlock_time=900 -
deny=5表示 5 次失败后锁定,unlock_time=900是 15 分钟自动解锁(单位秒) - 锁定状态可查:
faillock --user;手动解锁:faillock --user--reset - 注意:该策略仅对 PAM 认证路径生效(如 SSH 密码登录、su),对密钥登录无效——这也正是你希望的:密钥本就不该被限次
/etc/security/limits.conf 能防爆破吗?不能,但能防资源耗尽
它不参与认证流程,无法阻止登录尝试,但能限制单个用户创建的进程数、打开文件数等,防止恶意脚本或反复 fork 进程拖垮系统。
- 例如限制某用户最多 10 个并发登录会话:
username hard maxsyslogins 10 username hard maxlogins 10 - 更实用的是控制 shell 进程上限:
username hard nproc 32,避免fork bomb类攻击 - 修改后需用户重新登录才生效;若配合
systemd-logind,还需检查/etc/systemd/logind.conf中的UserTasksMax是否冲突 - 常见误区:把
nofile设太高(如 65536)反而可能掩盖异常连接行为,建议按业务需要设合理值(如 4096)
账号闲置停用与定期审计该怎么做才不漏掉服务账户
人工查 last 或 lastlog 容易忽略无人交互但仍在运行的服务账户(比如 nginx、redis),真正要防控的是“可用但长期不用”的交互式账号。
- 筛选 90 天未登录的普通用户(排除系统账号):
awk -F: '$3 >= 1000 && $3 <65534 {print $1}' /etc/passwd | while read u; do [[$(lastlog -u "$u" | tail -1 | awk '{print $5,$6,$7,$8,$9}') == "Never" || $(date -d "$(lastlog -u"$u"| tail -1 | awk'{print $5,$6,$7,$8,$9}')" +%s 2>/dev/null) -lt $(date -d '90 days ago' +%s 2>/dev/null) ]] && echo "$u"; done - 对确认停用的账号,执行
usermod -L -e 1:-L 锁密码,-e 1 设过期时间为 Unix 纪元(1970-01-01),彻底禁用 - 特别注意:不要对
sshd使用的nologin或falseshell 账户执行chsh,某些旧版 PAM 会因此拒绝密钥登录
真实环境中,最大的疏漏往往不是配置多复杂,而是忘了给批量创建的 CI/CD 临时账号加过期时间,或者把监控告警账号也加进了 faillock 白名单却没配解锁机制。