密码登录是 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
ChallengeResponseAuthenticationPAM 交互认证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)

应急预案:密钥丢失时的恢复流程

  1. 通过 KiwiVM 紧急控制台登录服务器
  2. 将 sshd_config 中 PasswordAuthentication 改回 yes
  3. 重启 SSH 服务:systemctl restart ssh
  4. 用密码临时登录,重新配置新的密钥对
  5. 再次禁用密码登录

妥善备份私钥

私钥是进入服务器的唯一凭证,建议加密后备份到密码管理器或离线存储。管理多台服务器时,考虑用 SSH 证书统一管理访问权限。

小结

  • 先验证密钥登录成功,再禁用密码
  • 同时设置 PasswordAuthentication no 和 ChallengeResponseAuthentication no
  • 修改后先测试再关旧连接,不要冒险
  • 私钥妥善备份,丢失只能走紧急控制台补救

常见问题

能在多台电脑上用同一把私钥吗?

可以,将私钥文件复制到其他设备并设置 chmod 600 权限即可。不推荐将私钥存放在不受控的公共设备上。

禁用密码后同事无法登录怎么办?

将同事的公钥追加到 ~/.ssh/authorized_keys(一行一个)即可允许多个密钥登录同一账户。

ssh-copy-id 报错 Permission denied 怎么办?

先确认密码登录仍可用(尚未禁用),检查端口和用户名是否正确,确认 ~/.ssh 权限为 700、authorized_keys 权限为 600。