openssh 默认配置存在严重安全风险,必须禁用 root 密码登录、强制密钥认证、严格校验文件权限,并合理设置连接超时与认证限制。

sshd_config 默认配置为什么不能直接用
OpenSSH 服务一装好就监听 22 端口,但默认配置里 PermitRootLogin 往往是 yes,PasswordAuthentication 也开着,等于把 root 密码大门敞开——尤其在公网暴露时,扫描器几秒就能撞上。
常见错误现象:sshd -t 检查通过,但日志里持续出现 Failed password for root 或来自不同 IP 的暴力尝试;或者安全扫描工具直接报「高危:允许 root 密码登录」。
-
PermitRootLogin必须设为no(禁用 root 登录)或至少prohibit-password(仅密钥) -
PasswordAuthentication建议设为no,除非你明确需要密码登录且已限制用户范围 -
UsePAM保持yes,否则某些系统级认证策略(如 faillock)会失效 - 改完必须执行
sudo systemctl restart sshd,光 reload 不一定生效(尤其涉及 PAM 变更时)
密钥登录怎么配才不踩坑
很多人生成了密钥、放好了 authorized_keys,却还是被拒绝,问题常出在权限和路径上——OpenSSH 对文件权限极其敏感,稍松一点就直接拒之门外。
使用场景:从跳板机登录生产服务器、CI/CD 自动部署、免密运维脚本触发。
-
~/.ssh/目录权限必须是700(drwx------),不是755,也不是777 -
~/.ssh/authorized_keys文件权限必须是600(-rw-------),不能是644 - 确保
sshd_config中PubkeyAuthentication是yes,且AuthorizedKeysFile没被意外注释或改错路径 - 私钥别用
ssh-keygen -t rsa(RSA-1024 已不安全),推荐ssh-keygen -t ed25519或ssh-keygen -t ecdsa -b 256
Timeout 和连接限制怎么防爆破又不误伤
单纯关密码登录还不够,得让暴力尝试成本变高、时间变短。但参数设太激进,反而导致正常用户频繁断连,尤其走 NAT 或弱网络时。
性能影响:MaxAuthTries 和 LoginGraceTime 属于内存内判断,几乎无开销;ClientAliveInterval 有少量心跳流量,但远小于重连开销。
-
MaxAuthTries设为3(默认 6),三次输错就断连,减少爆破窗口 -
LoginGraceTime缩到30秒(默认 120),防止慢速试探长期占着连接 -
ClientAliveInterval设300,ClientAliveCountMax设0,5 分钟没响应就踢,避免僵尸连接堆积 - 不要滥用
MaxStartups(如设成10:30:60),它控制未认证连接队列,设太小会导致并发登录失败,尤其 Jenkins 触发多任务时
sshd -t 检查通过但服务起不来?看这三处
sshd -t 只校验语法,不验证实际路径、权限、模块加载,所以“配置合法”不等于“能跑”。真正启动失败时,systemd 日志比 OpenSSH 自己的日志更准。
典型错误现象:systemctl status sshd 显示 failed to start,journalctl -u sshd -n 50 里出现 Could not load host key 或 Missing privilege separation directory。
- 检查
/etc/ssh/ssh_host_*.key文件是否存在,缺失就运行sudo dpkg-reconfigure openssh-server(Debian/Ubuntu)或sudo ssh-keygen -A(通用) - 确认
PrivilegeSeparation(新版已默认sandbox)对应目录/var/run/sshd存在且属主是root:root、权限755 - 如果启用了
Match User或Match Group块,注意它们必须写在全局配置之后,且每个Match块结尾不能漏掉空行(某些老版本 sshd 解析会卡住)
权限、路径、顺序——这三个点不盯紧,再合规的参数也白调。










