如何生成和保护用于远程访问的 SSH 密钥

掌握安全远程访问:学习使用 `ssh-keygen` 生成健壮的 SSH 密钥对。本指南涵盖了选择密钥类型 (Ed25519)、使用密码短语保护私钥、使用 `ssh-copy-id` 高效部署公钥,以及利用 `ssh-agent` 实现无缝认证的最佳实践。通过实施基于密钥的访问控制,确保您的基础设施免受暴力破解攻击。

如何生成并保护用于远程访问的SSH密钥

安全外壳(SSH)是连接远程服务器的标准方式。如果您仍在使用密码进行日常访问,SSH密钥能提供更强的身份验证,并消除针对该账户的密码猜测风险。

本指南将向您展示如何生成SSH密钥、使用密码保护私钥、在服务器上安装公钥,以及使用 ssh-agent 避免每次连接都输入密码。

理解SSH密钥对

SSH密钥对由两个不同的部分组成:

  1. 私钥: 此密钥绝不能共享。它安全地保存在您的本地机器上,用于向远程服务器证明您的身份。
  2. 公钥: 此密钥可以自由共享,并上传到您希望访问的远程服务器的 ~/.ssh/authorized_keys 文件中。服务器使用此密钥来验证由您的私钥生成的签名。

选择合适的算法

生成密钥时,请选择现代算法。Ed25519 是当前OpenSSH客户端的一个良好默认选择,因为它速度快、体积小且被广泛支持。RSA仍然有效,并且在您需要连接到不支持Ed25519的旧系统时非常有用。

第一步:生成SSH密钥对

ssh-keygen 工具是在Linux、macOS和Windows(通过Git Bash或WSL)上创建SSH密钥对的标准工具。

生成Ed25519密钥(推荐)

要创建现代的Ed25519密钥,请使用以下命令。我们指定密钥类型(-t ed25519)并提供注释(-C)以帮助识别密钥的用途或所有者:

ssh-keygen -t ed25519 -C "[email protected]_or_host_name"

当提示时:

  1. 输入保存密钥的文件: 按Enter接受默认位置(/home/user/.ssh/id_ed25519)。
  2. 输入密码(推荐): 为用于非一次性实验室系统的密钥设置一个强密码。这将加密您的私钥,因此即使密钥文件被盗也无法立即使用。

生成RSA密钥(备选)

如果需要与非常旧的系统兼容,您可以生成RSA密钥,确保指定足够的密钥长度(至少4096位):

ssh-keygen -t rsa -b 4096 -C "your_rsa_key_comment"

密钥输出文件

生成后,您的 ~/.ssh/ 目录中会创建两个文件(假设使用默认设置):

  • id_ed25519(或 id_rsa):您的私钥
  • id_ed25519.pub(或 id_rsa.pub):您的公钥

安全最佳实践: 切勿共享不带 .pub 扩展名的文件。使用 chmod 600 ~/.ssh/id_ed25519 为您的私钥设置严格的权限。

第二步:将公钥复制到服务器

远程服务器必须将您的公钥放入其 ~/.ssh/authorized_keys 文件中才能授予访问权限。

使用 ssh-copy-id(最简单的方法)

ssh-copy-id 工具可以自动化此过程,处理远程服务器上的目录创建和权限设置。您需要最后一次使用密码进行身份验证以完成初始设置。

ssh-copy-id user@remote_host_ip

如果成功,该命令将通知您密钥已添加。您现在可以尝试登录。

手动复制(如果 ssh-copy-id 不可用)

如果您无法使用 ssh-copy-id,可以手动追加公钥内容。首先,显示公钥:

cat ~/.ssh/id_ed25519.pub

然后,使用密码登录到远程服务器,并将输出追加到 authorized_keys 文件中:

# 在远程服务器上
mkdir -p ~/.ssh
chmod 700 ~/.ssh
# 将 <PASTE_YOUR_PUBLIC_KEY_HERE> 替换为实际的密钥内容
echo "<PASTE_YOUR_PUBLIC_KEY_HERE>" >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys

第三步:使用 ssh-agent 保护访问

每次连接到服务器时都输入密码会变得很繁琐。ssh-agent 是一个后台程序,可以安全地将您解密的私钥保存在内存中,使您无需重复输入密码即可使用它们。

启动并使用 ssh-agent

  1. 确保代理正在运行: 在大多数现代Linux/macOS系统上,代理会在您登录时自动启动。您可以通过查找环境变量来检查其状态:

    echo $SSH_AUTH_SOCK
    
  2. 将密钥添加到代理: 使用 ssh-add 命令加载您的私钥。系统会提示您输入密码仅一次

    ssh-add ~/.ssh/id_ed25519
    # Enter passphrase for /home/user/.ssh/id_ed25519: **********
    # Identity added: /home/user/.ssh/id_ed25519 (comment)
    
  3. 验证已加载的密钥:

    ssh-add -l
    

现在,当您运行 ssh user@remote_host_ip 时,连接将使用代理持有的密钥进行身份验证,而无需再次询问密码(直到代理会话结束)。

重要的 ssh-agent 说明

  • 会话依赖: 加载到代理中的密钥通常仅对当前终端会话或桌面登录会话可用。注销并重新登录后,您需要重新运行 ssh-add
  • 密钥有效期: 您可以使用 -t 标志为代理中持有的密钥设置最大有效期(例如,ssh-add -t 1h ~/.ssh/id_ed25519 将密钥加载一小时)。

高级安全:禁用密码认证

一旦确认基于密钥的身份验证在所有必需的服务器上完美运行,最强大的安全措施就是完全禁用基于密码的登录。这可以防止针对密码的暴力破解攻击。

  1. 使用您的密钥通过SSH连接到服务器。

  2. 编辑SSH守护进程配置文件,通常位于 /etc/ssh/sshd_config

    sudo nano /etc/ssh/sshd_config
    
  3. 找到并设置以下指令:

    # 确保此项设置为yes(通常为默认值)
    PubkeyAuthentication yes
    
    # 禁用密码登录
    PasswordAuthentication no
    
  4. 在重启前检查配置:

    sudo sshd -t
    
  5. 重启SSH服务以应用更改。服务名称在RHEL系列系统上通常为 sshd,在Debian/Ubuntu上为 ssh

    sudo systemctl restart sshd
    # 或
    sudo systemctl restart ssh
    

警告: 在禁用密码认证之前,请保持一个有效的SSH会话打开,并确认使用新密钥的第二次登录正常工作。如果重启失败或密钥错误,您将需要控制台或带外访问。

后续步骤

在第一次基于密钥的登录成功后,请像对待生产凭证一样对待SSH密钥:

  • 为您访问的每个主要系统或服务生成唯一的密钥对。
  • 定期审计关键服务器上的 authorized_keys 文件。
  • 当人员更换角色或机器退役时,移除旧密钥。
  • 在共享工作站上使用 ssh-add -t 进行短期的代理会话。