当你的服务器没有设置 SSH 登录超时(LoginGraceTime)时,未认证连接会长时间占用资源,暴力破解的窗口也更大。启用合理的超时不仅能降低风险,还能限制并发的未认证会话数量,从根上把“撞库”行为拖慢、压缩和淘汰。
概览与目标
这篇教程面向工程团队与运维同学,带你从原理到落地,完成 LoginGraceTime 的配置与验证,并提供可复制的自动化示例与回滚策略。
- 目标清单:理解 LoginGraceTime 的作用、完成安全取值配置、验证生效与兼容性、掌握常见故障排查与安全回滚。
- 适用场景:物理机、云主机、容器化环境与多发行版(Debian/Ubuntu、RHEL/CentOS、AlmaLinux、Amazon Linux)。
- 读者收益:一套可直接落地的安全基线,加上团队化的自动化与变更守护。
原理与风险
- 参数含义:LoginGraceTime 定义客户端在连接后完成认证的时间上限(秒)。超时未认证的连接会被服务端主动断开。
- 风险压缩:缩短超时能缩窄暴力破解的可用窗口,降低攻击者维持并发未认证连接的能力。
- 资源保护:限制未认证连接的存活时长,有助于缓解线程/进程与内存占用,避免被“拖死”。
- 协同参数:与 MaxStartups(控制未认证并发)和 MaxAuthTries(控制每连接的认证尝试次数)组合效果更佳。
配置步骤与验证
基础设置(安全且可回滚)
备份配置文件
- 命令:
sudocp/etc/ssh/sshd_config /etc/ssh/sshd_config.bak.$(date+%F-%H%M%S) - 理由:快速回滚,避免生产事故。
- 命令:
编辑主配置或片段目录
- 路径:
- 主文件:/etc/ssh/sshd_config
- 片段目录(较新的发行版可能启用):/etc/ssh/sshd_config.d/
- 建议:若系统支持片段目录,优先新建片段文件,便于审计与合并:
或直接编辑主文件:echo"LoginGraceTime 60"|sudotee/etc/ssh/sshd_config.d/10-login-grace.confsudovi/etc/ssh/sshd_config# 添加或修改LoginGraceTime60
- 路径:
语法与生效前检查
- 语法自检:
sudosshd -t - 理由:防止配置错误导致 sshd 无法启动。
- 语法自检:
平滑应用变更
- 优先 reload:
sudosystemctl reload sshd - 备用 restart(更激进):
sudosystemctl restart sshd - 兼容命令:
sudoservicesshd reload# 或sudoservicesshd restart
- 优先 reload:
确认生效
- 查看规范化配置:
sudosshd -T|greplogingracetime - 预期输出:logingracetime 60
- 查看规范化配置:
安全操作提示
- 双连接保护:变更期间保持一个已登录的备用会话,防止误锁死。
- 跳板机准备:在多层网络时确保有可用的跳板与控制台访问(如云厂商控制台)。
取值建议与联动参数
- 推荐区间:30–60 秒。平衡人类操作与安全收口。输入口令、切换令牌、粘贴 OTP 时一般可控在这个窗口。
- 更激进场景:10–30 秒,配合禁用密码登录与公钥认证,适合自动化密钥环境。
- 不建议过大:≥120 秒会显著放宽攻击窗口且浪费资源。
- 联动参数:
- MaxAuthTries:限制每连接的认证尝试次数(如 3–4)。
- MaxStartups:限制未认证并发连接与拒绝概率,典型如:
MaxStartups 10:30:100 # 含义:最小10并发;超过30开始概率丢弃;100为全丢弃阈值 - PermitRootLogin:建议
no或prohibit-password。 - PasswordAuthentication:在具备密钥分发的团队中建议
no。 - AllowUsers/AllowGroups:白名单收口到必需账号或组。
故障排查与回滚
语法错误
- 现象:reload/restart 失败或 SSH 无法连接。
- 检查:
sudosshd -tsudojournalctl -u sshd --since"10 min ago" - 回滚:
sudomv/etc/ssh/sshd_config.bak.* /etc/ssh/sshd_configsudosystemctl restart sshd
片段加载顺序
- 现象:设置未生效或被后续片段覆盖。
- 检查:审阅 /etc/ssh/sshd_config 与 /etc/ssh/sshd_config.d/ 的加载顺序与冲突;使用
sshd -T看最终合成值。
发行版差异
- 现象:服务名为
ssh而非sshd。 - 处理:
sudosystemctl reloadssh# 或sudoservicesshreload
- 现象:服务名为
连接被动断开
- 现象:用户长时间停留在登录提示而超时。
- 建议:教育与提示;在身份验证复杂(OTP、跳转)的环境不宜过小取值。
自动化示例与团队落地
Ansible 片段(推荐团队化)
-name:Harden SSH LoginGraceTimehosts:ssh_hostsbecome:yestasks:-name:Ensure sshd_config.d directory existsfile:path:/etc/ssh/sshd_config.dstate:directorymode:'0755'-name:Deploy LoginGraceTime snippetcopy:dest:/etc/ssh/sshd_config.d/10-login-grace.confcontent:|LoginGraceTime 60owner:rootgroup:rootmode:'0644'-name:Validate sshd configcommand:sshd-tregister:sshd_checkchanged_when:false-name:Reload sshdservice:name:sshdstate:reloadedwhen:sshd_check.rc == 0Bash 安全打补丁(带备份与校验)
#!/usr/bin/env bashset-euo pipefailbackup="/etc/ssh/sshd_config.bak.$(date+%F-%H%M%S)"conf="/etc/ssh/sshd_config"snippet_dir="/etc/ssh/sshd_config.d"snippet="$snippet_dir/10-login-grace.conf"sudocp"$conf""$backup"sudomkdir-p"$snippet_dir"echo"LoginGraceTime 60"|sudotee"$snippet">/dev/nullifsudosshd -t;thensudosystemctl reload sshd||sudoservicesshd reloadsudosshd -T|grep-q"logingracetime 60"&&echo"LoginGraceTime 已生效为 60"elseecho"sshd 配置校验失败,正在回滚..."sudomv"$backup""$conf"exit1fi团队落地要点
- 变更窗口:在低峰时段执行,维持双会话或控制台备用。
- 灰度发布:先在跳板/单点测试,再逐步推广到批量主机。
- 审计记录:记录备份文件名、操作人、时间戳与最终
sshd -T认证值。 - 教育与提示:通知取值变化,避免用户误以为“服务异常”。