SSH 密钥登录配置与安全加固实战

举报
云上小栈 发表于 2026/10/30 00:04:50 2026/10/30
【摘要】 为什么要从密码登录切到密钥登录公网上的 SSH 22 端口每天会被扫描上千次,密码登录面临持续的爆破风险。密钥登录把认证凭据换成一对非对称密钥,私钥不出本机,能直接消除密码猜测攻击面。下面是从生成密钥到加固 sshd 的完整流程,配置基于 OpenSSH 8.x。生成密钥并上传公钥优先使用 ed25519,比 RSA 2048 更短更安全。若因兼容旧系统必须用 RSA,长度不要低于 3072...

为什么要从密码登录切到密钥登录

公网上的 SSH 22 端口每天会被扫描上千次,密码登录面临持续的爆破风险。密钥登录把认证凭据换成一对非对称密钥,私钥不出本机,能直接消除密码猜测攻击面。下面是从生成密钥到加固 sshd 的完整流程,配置基于 OpenSSH 8.x。

生成密钥并上传公钥

优先使用 ed25519,比 RSA 2048 更短更安全。若因兼容旧系统必须用 RSA,长度不要低于 3072:

ssh-keygen -t ed25519 -a 100 -C "ops@example.com" -f ~/.ssh/id_ed25519

-a 100 指定 KDF 轮数,能提高私钥口令被离线破解的成本。上传公钥用 ssh-copy-id,它会自动处理远程权限:

ssh-copy-id -i ~/.ssh/id_ed25519.pub user@203.0.113.10

手工上传时要保证权限正确,否则 sshd 会拒绝读取:

chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
chown -R user:user ~/.ssh

sshd_config 关键配置

先保留密码登录,确认密钥能登录后再关闭,避免把自己锁在门外。确认后修改 /etc/ssh/sshd_config:

PubkeyAuthentication yes
PasswordAuthentication no
PermitRootLogin prohibit-password
MaxAuthTries 3
LoginGraceTime 20
ClientAliveInterval 300
ClientAliveCountMax 2
AllowUsers deploy ops

PermitRootLogin prohibit-password 比 no 更稳妥,允许 root 用密钥应急登录而禁止密码。MaxAuthTries 3 压缩爆破尝试空间。改完必须校验语法再重载:

sshd -t && systemctl reload sshd

踩坑一:重载后仍然要求密码

现象是配置改完、服务重载成功,客户端依然弹密码框。sshd -T | grep passwordauthentication 却显示 no。原因是新版发行版把配置拆到了 /etc/ssh/sshd_config.d/*.conf,而主配置文件里的 Include 指令在文件顶部,后续默认值会覆盖前面的设置。排查命令:

grep -rn PasswordAuthentication /etc/ssh/

解决方式有两种:要么在 drop-in 文件里写配置(它优先于主文件),要么把主文件相关行移到 Include 之后。修改后用 sshd -T 看实际生效值,不要只看文件内容。

踩坑二:SELinux 导致 authorized_keys 读取失败

CentOS/RHEL 上出现 Authentication refused: bad ownership or modes for directory /home/user,权限明明已经是 700/600。根因是 ssh-copy-id 或 scp 上传后文件带上了错误的 SELinux 上下文(user_home_t 而非 ssh_home_t)。用 ls -Z ~/.ssh 确认,然后修复:

restorecon -Rv ~/.ssh

如果家目录被挪到 /data 这类非标准路径,还要打标签:semanage fcontext -a -t ssh_home_t "/data/user/.ssh(/.*)?",再执行 restorecon -Rv /data/user/.ssh。

进一步加固

  • 禁用不用的认证方式:ChallengeResponseAuthentication no、KbdInteractiveAuthentication no。
  • 给 sshd 加访问控制,只放行可信网段:ufw allow from 198.51.100.0/24 to any port 22。
  • 私钥设口令,本地用 ssh-agent 托管,避免每台机器明文私钥。
  • 定期轮换:grep -c ssh-ed25519 ~/.ssh/authorized_keys 统计授权数,移除离职人员的公钥。
  • 登录审计:journalctl -u sshd --since today 或 lastb | head 看失败尝试。

小结

核心路径是 ed25519 密钥、正确权限、sshd -t 校验后再 reload、确认密钥可用后再关闭密码。两个高频故障点分别是 drop-in 配置覆盖和 SELinux 上下文,前者用 sshd -T 核对生效值,后者用 restorecon 修复。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。