密码登录是 SSH 安全的薄弱环节:密码可以被猜测、被碰撞、被盗取。SSH 密钥登录则完全不同——私钥保存在你的本地计算机,服务器只存公钥,整个认证过程没有密码在网络上传输。在确保密钥可用的前提下禁用密码登录,是服务器安全加固的重要环节。
本文要点
- 生成 SSH 密钥对并将公钥上传到服务器
- 确认密钥登录成功后再禁用密码认证
- 修改 sshd_config 并重启 SSH
- 应急预案:密钥丢失时如何通过紧急控制台恢复
第一步:生成 SSH 密钥对(本地执行)
# 推荐 ed25519 算法(更安全、密钥更短)
ssh-keygen -t ed25519 -C "your_email@example.com"
# 或使用 RSA 4096
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"按提示选择保存路径(默认 ~/.ssh/id_ed25519),建议设置密钥口令(passphrase)。
第二步:上传公钥到服务器
# 方法一:ssh-copy-id(最简单,在本地执行)
ssh-copy-id -i ~/.ssh/id_ed25519.pub -p 端口 用户名@服务器IP
# 方法二:手动追加
cat ~/.ssh/id_ed25519.pub | ssh -p 端口 用户名@服务器IP \
"mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"权限必须严格
~/.ssh 目录权限必须是 700,authorized_keys 文件权限必须是 600,否则 SSH 拒绝使用密钥认证,这是最常见的密钥无效原因。第三步:验证密钥登录可用
必须先验证密钥可用,再禁密码
如果密钥配置有问题就禁用了密码,你将彻底失去 SSH 访问权限(只能靠 KiwiVM 紧急控制台补救)。务必先成功登录一次再进行下一步。
# 新开终端,用密钥测试登录
ssh -i ~/.ssh/id_ed25519 -p 端口 用户名@服务器IP
# 无需输入密码(或只提示密钥口令)即为成功第四步:修改 sshd_config 禁用密码登录
nano /etc/ssh/sshd_config找到以下选项并修改(确保没有被 # 注释掉):
PasswordAuthentication no
PermitEmptyPasswords no
ChallengeResponseAuthentication no
# 新版本 OpenSSH 使用
KbdInteractiveAuthentication no| 配置项 | 含义 | 禁密码时应设为 |
|---|---|---|
| PasswordAuthentication | 允许密码登录 | no |
| PermitEmptyPasswords | 允许空密码 | no |
| ChallengeResponseAuthentication | PAM 交互认证 | no |
| PubkeyAuthentication | 允许密钥认证 | yes(默认保持) |
第五步:重启 SSH 并验证
sshd -t # 先检查语法
systemctl restart ssh # Debian/Ubuntu
systemctl restart sshd # CentOS/RHEL
# 验证:尝试密码登录(应被拒绝)
ssh -o PreferredAuthentications=password -o PubkeyAuthentication=no 用户名@服务器IP
# 预期:Permission denied (publickey)应急预案:密钥丢失时的恢复流程
- 通过 KiwiVM 紧急控制台登录服务器
- 将 sshd_config 中 PasswordAuthentication 改回 yes
- 重启 SSH 服务:systemctl restart ssh
- 用密码临时登录,重新配置新的密钥对
- 再次禁用密码登录
妥善备份私钥
私钥是进入服务器的唯一凭证,建议加密后备份到密码管理器或离线存储。管理多台服务器时,考虑用 SSH 证书统一管理访问权限。
小结
- 先验证密钥登录成功,再禁用密码
- 同时设置 PasswordAuthentication no 和 ChallengeResponseAuthentication no
- 修改后先测试再关旧连接,不要冒险
- 私钥妥善备份,丢失只能走紧急控制台补救
常见问题
能在多台电脑上用同一把私钥吗?
可以,将私钥文件复制到其他设备并设置 chmod 600 权限即可。不推荐将私钥存放在不受控的公共设备上。
禁用密码后同事无法登录怎么办?
将同事的公钥追加到 ~/.ssh/authorized_keys(一行一个)即可允许多个密钥登录同一账户。
ssh-copy-id 报错 Permission denied 怎么办?
先确认密码登录仍可用(尚未禁用),检查端口和用户名是否正确,确认 ~/.ssh 权限为 700、authorized_keys 权限为 600。