配置 SSH 密钥登录并关闭口令登录
This content is not available in your language yet.
适用:CentOS Stream 9 / 10(OpenSSH 9.9p1 实测)· 核对日:2026-11-01 · 官方依据:sshd_config(5) 与系统自带配置文件栈。
关掉口令登录是装机后性价比最高的安全动作,前提是先把密钥通道打通并验证——顺序反了就是把自己锁在门外。本页的每一步都在 Stream 9 容器实测过,包括「密码被拒」的对照验证。
- 能通过现有方式登录目标机(口令 SSH 或本地控制台);
- 准备第二个会话保持登录状态,改配置期间不要全部退出——这是远程改 sshd 的标准保命手段;
- 回退点:改动前备份
/etc/ssh/sshd_config与 drop-in 目录。
-
在客户端生成密钥(已有 ed25519 密钥可跳过):
生成 ed25519 密钥对 $ ssh-keygen -t ed25519 -C "you@host"预期:
~/.ssh/id_ed25519(私钥)与id_ed25519.pub(公钥)生成;passphrase 建议设置。 -
把公钥部署到服务器:
一键部署公钥(还输得进口令时最省事) $ ssh-copy-id -i ~/.ssh/id_ed25519.pub user@server手动等价操作(服务器端):
手动部署 authorized_keys $ mkdir -p ~/.ssh && chmod 700 ~/.ssh$ echo '<你的公钥一行>' >> ~/.ssh/authorized_keys$ chmod 600 ~/.ssh/authorized_keys权限是密钥登录最常见的失败原因:
~/.ssh必须 700,authorized_keys必须 600,home 目录不能对组/其他人可写。 -
先验证密钥能登录,再谈关口令:
验证密钥登录(新开会话) $ ssh -i ~/.ssh/id_ed25519 user@server 'echo KEY-LOGIN-OK'预期输出(实测摘录):
KEY-LOGIN-OK -
核对生效配置:
查看合并后的有效值 $ sudo sshd -T | grep -E '^(passwordauthentication|pubkeyauthentication|permitrootlogin)'预期输出(实测摘录,新装机默认):
passwordauthentication yespubkeyauthentication yespermitrootlogin without-passworddrop-in 优先级提醒:
sshd_config的Include /etc/ssh/sshd_config.d/*.conf在文件最前面,OpenSSH 取第一次出现的值,所以 drop-in 里的行会压过主文件后面的同名行。想在主文件里改口令开关却看不到效果时,先查 drop-in。 -
关闭口令登录:
写入 drop-in(推荐,别改主文件) $ echo 'PasswordAuthentication no' | sudo tee /etc/ssh/sshd_config.d/99-disable-password.conf$ sudo sshd -t && sudo systemctl reload sshdsshd -t无输出即语法正确;reload 不断开现有会话。 -
验证口令真的被拒(开新会话,别用当前会话):
Terminal window $ ssh -o PubkeyAuthentication=no -o PreferredAuthentications=password user@server预期输出(实测摘录):
Permission denied (publickey,gssapi-keyex,gssapi-with-mic).括号里的认证方式列表不再包含 password,即关闭生效。同时用第 3 步的命令确认密钥登录仍正常。
关于 root 登录
Section titled “关于 root 登录”新装机的默认值里 permitrootlogin without-password 已经禁止 root 口令登录,只放行密钥。是否进一步收紧成 prohibit-password 以外的值(如完全 no、改用普通用户 + sudo)是运维策略问题:个人 VPS 常用「专用管理用户 + sudo」,多机环境常配合自动化工具使用固定管理账号。改这个值同样走 drop-in + sshd -T 验证的流程。
$ sudo rm /etc/ssh/sshd_config.d/99-disable-password.conf$ sudo sshd -t && sudo systemctl reload sshd$ sudo sshd -T | grep ^passwordauthentication预期回到 passwordauthentication yes。密钥通道不受影响,无需回退。
| 现象 | 原因 | 处理 |
|---|---|---|
| 公钥部署了仍要口令 | 权限不对或 SELinux 上下文丢失 | 查 ~/.ssh 700/文件 600;restorecon -Rv ~/.ssh |
| 改了主配置没生效 | drop-in 里的同名行先生效 | sshd -T 看有效值;改动写进 drop-in |
| reload 后新会话连不上 | 语法错误或 SELinux 拦截 | 用保命会话回滚 drop-in;journalctl -u sshd -n 20 |
| 密钥登录提示 refused | 客户端未提供正确私钥 | ssh -v 看 offer 的密钥;确认 -i 指向私钥 |
- 运维基线 — 新机的系统性加固清单
- 安全更新跟踪 — OpenSSH 的安全更新来自哪条仓库
- Kickstart 自动安装 — 装机阶段就锁 root 口令
- 官方:CentOS Stream 文档