68·网络进阶

SSH 密钥认证与配置

ssh-keysauthentication

第68课 - SSH 密钥认证与配置

学习目标

完成本课学习后,你将能够:

  1. 理解SSH密钥认证(非对称加密)的原理及其相比密码认证的安全性优势。
  2. 熟练使用 ssh-keygen 生成SSH密钥对,并使用 ssh-copy-id 部署公钥到远程服务器。
  3. 正确配置SSH客户端和服务端,实现安全、便捷的免密登录。
  4. 诊断并解决常见的SSH密钥认证失败问题。
  5. 掌握SSH密钥管理的最佳实践,如使用强密码保护私钥、配置SSH代理等。

核心概念

为什么使用密钥认证?

使用密码登录SSH服务器,就像每次开门都用同一把钥匙。如果钥匙(密码)被猜到或暴力破解,门就被打开了。而密钥认证,则像是使用一套独一无二的“配对锁和钥匙”系统:

  • 私钥(Private Key):牢牢保存在你本地电脑上的“钥匙”,绝不能外泄。
  • 公钥(Public Key):安装在远程服务器门上的“锁”。任何人都可以拿到这把“锁”,但只有对应的“钥匙”(你的私钥)才能打开它。

这种机制基于非对称加密,安全性远高于可被猜测或字典攻击的密码,同时可以实现“免密”登录,非常适合自动化脚本和服务器管理。

认证流程

  1. 你在本地电脑发起SSH连接请求。
  2. 远程服务器检查你的公钥(锁)是否存在。
  3. 服务器生成一个随机挑战信息,并用你的公钥加密后发送给你。
  4. 你的本地SSH客户端使用私钥(钥匙)解密这个挑战信息,并将结果发回。
  5. 服务器验证解密结果,如果正确,则允许你登录。

代码示例

步骤一:生成SSH密钥对(在本地客户端)

在你的个人电脑或管理终端上执行此命令。

# 1. 使用 Ed25519 算法生成密钥对(当前推荐,比 RSA 更安全高效)
ssh-keygen -t ed25519 -C "[email protected]"

# 2. 交互过程:
# Generating public/private ed25519 key pair.
# Enter file in which to save the key (/home/youruser/.ssh/id_ed25519): [按回车使用默认路径]
# Enter passphrase (empty for no passphrase): [为你的私钥设置一个强密码,按回车则无密码]
# Enter same passphrase again: [再次输入密码]
# Your identification has been saved in /home/youruser/.ssh/id_ed25519
# Your public key has been saved in /home/youruser/.ssh/id_ed25519.pub

执行后,会在 ~/.ssh/ 目录下生成两个文件:

  • id_ed25519:你的私钥文件(务必保管好!权限应为 600)。
  • id_ed25519.pub:你的公钥文件(将被复制到服务器)。

步骤二:将公钥部署到远程服务器

# 使用 ssh-copy-id 命令,这是最简单安全的方式
ssh-copy-id -i ~/.ssh/id_ed25519.pub user@remote_host

# 系统会提示你输入远程服务器用户的密码(最后一次使用密码登录)。
# 成功后,公钥内容会被追加到远程服务器该用户的 `~/.ssh/authorized_keys` 文件中。

如果 ssh-copy-id 不可用,可以手动操作:

# 在本地将公钥内容输出,并通过SSH管道追加到远程服务器的授权文件
cat ~/.ssh/id_ed25519.pub | ssh user@remote_host "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"

步骤三:测试免密登录

# 尝试登录,如果为私钥设置了密码,此时只需输入私钥的密码(passphrase)而无需服务器用户密码
ssh user@remote_host

步骤四:服务端安全配置(可选但推荐)

编辑远程服务器的 /etc/ssh/sshd_config 文件:

sudo nano /etc/ssh/sshd_config

确保以下配置项(取消注释并修改):

PubkeyAuthentication yes       # 启用公钥认证
PasswordAuthentication no      # 【可选】禁用密码认证,强制使用密钥,更安全但请确保已正确配置好密钥登录!
PermitRootLogin prohibit-password # 禁止root用密码登录,允许密钥登录(或设为 no 完全禁止root登录)

修改后,重启SSH服务使配置生效:

sudo systemctl restart sshd

实践练习

练习 1:生成并管理密钥对

  1. 使用 ssh-keygen 生成一对 RSA 密钥(-t rsa),密钥文件名为 my_server_key,并为其设置一个强密码。
  2. 使用 ls -l ~/.ssh/ 命令查看生成的私钥和公钥文件的权限,确认私钥权限为 -rw-------

练习 2:配置免密登录

  1. 找到或启动一个测试用的Linux虚拟机/服务器(IP地址:192.168.1.100, 用户名:testuser)。
  2. 使用 ssh-copy-id 将练习一中生成的公钥(my_server_key.pub)部署到该服务器。
  3. 测试使用 ssh -i ~/.ssh/my_server_key [email protected] 进行免密登录(只需输入密钥密码)。

练习 3:调试与验证(进阶)

  1. 尝试将远程服务器上 ~/.ssh/authorized_keys 文件的权限修改为错误的值(如 chmod 644 ~/.ssh/authorized_keys),然后再尝试密钥登录,观察错误信息。
  2. 使用 ssh -v [email protected] 命令进行详细模式登录,查看输出日志,找到客户端尝试加载哪个密钥以及服务器接受了哪个密钥的关键信息。

常见错误

  1. 权限问题

    • 错误现象:服务器拒绝密钥认证,密码登录正常。
    • 原因:服务器对 ~/.ssh 目录或 authorized_keys 文件的权限要求严格。
    • 解决:确保在服务器上,用户主目录的 ~/.ssh 权限为 700~/.ssh/authorized_keys 文件权限为 600。可以使用以下命令修复:
      chmod 700 ~/.ssh
      chmod 600 ~/.ssh/authorized_keys
      
  2. 公钥未正确复制

    • 错误现象:密钥登录失败,客户端日志显示 Permission denied (publickey)
    • 原因:公钥内容未完整、正确地添加到 authorized_keys 文件,或该文件本身不存在。
    • 解决:检查 ~/.ssh/authorized_keys 文件内容是否与本地 .pub 文件完全一致(包括换行)。使用 ssh-copy-id 可以最大程度避免此问题。
  3. 私钥权限过宽

    • 错误现象:客户端直接报错,提示 Permissions for 'mykey' are too open
    • 原因:本地私钥文件被其他用户读取,系统认为不安全。
    • 解决:修改本地私钥文件权限:
      chmod 600 ~/.ssh/my_server_key
      
  4. 服务器配置禁止

    • 错误现象:所有密钥认证均失败,但配置看起来正确。
    • 原因:服务器端 sshd_configPubkeyAuthentication 被设为了 no
    • 解决:检查并修改服务器配置文件。

小结

  • SSH密钥认证是比密码认证更安全、更便捷的远程登录方式,是生产环境和自动化的标准。
  • 核心流程是:本地生成密钥对 -> 部署公钥到服务器 -> 使用私钥进行认证
  • 安全的关键在于:保护好私钥,为其设置强密码,并严格控制文件权限(私钥600, ~/.ssh 目录700)。
  • 使用 ssh-copy-id 是部署公钥最安全、最不容易出错的方法。
  • 当认证失败时,遵循 “客户端权限 -> 公钥内容 -> 服务端权限 -> 服务端配置” 的顺序进行排查,并善用 ssh -v 详细日志进行分析。

练习编辑器

rust
Loading...

继续学习

完成本课后,建议继续学习下一课「iptables 防火墙」 以巩固所学知识。