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

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

36 浏览量

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

安全外壳 (SSH) 是安全连接到远程服务器和系统的标准协议。虽然密码身份验证很常见,但使用 SSH 密钥对提供了一种明显更强大、更方便、更可靠的身份验证方法。本综合指南将引导您完成生成强大的 SSH 密钥对、使用密码短语保护它们,以及利用 ssh-agent 实现无缝、安全的远程访问。

了解密钥管理对于维护基础设施的安全至关重要。通过用加密密钥替换易受攻击的密码,您可以降低与暴力攻击和凭证填充相关的风险,从而为安全的远程连接奠定基础。

了解 SSH 密钥对

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

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

选择正确的算法

生成密钥时,必须选择现代、强大的加密算法。RSA 仍然被广泛使用,但 Ed25519 因其速度和强大的安全保证而通常被推荐。

步骤 1:生成 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 file in which to save the key): 按 Enter 键接受默认位置(/home/user/.ssh/id_ed25519)。
  2. 输入密码短语(推荐)(Enter passphrase (recommended)): 始终设置一个强密码短语。这会加密您的私钥,因此即使有人窃取了该文件,没有密码短语他们也无法使用它。

生成 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)。

步骤 2:将公钥复制到服务器

远程服务器必须在其 ~/.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

步骤 3:使用 ssh-agent 保护访问

每次连接到服务器时都输入密码短语会很麻烦。ssh-agent 是一个后台程序,它将您解密的私钥安全地保存在内存中,允许您使用它们而无需重复输入密码短语。

启动和使用 ssh-agent

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

    bash echo $SSH_AUTH_SOCK

  2. 将密钥添加到代理: 使用 ssh-add 命令加载您的私钥。您只会被提示输入一次密码短语。

    ```bash
    ssh-add ~/.ssh/id_ed25519

    输入 /home/user/.ssh/id_ed25519 的密码短语: ****

    身份已添加: /home/user/.ssh/id_ed25519 (comment)

    ```

  3. 验证已加载的密钥:

    bash ssh-add -l

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

重要的 ssh-agent 说明

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

高级安全:禁用密码身份验证

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

  1. 使用您的密钥通过 SSH 连接到您的服务器。
  2. 编辑通常位于 /etc/ssh/sshd_config 的 SSH 守护程序配置文件:

    bash sudo nano /etc/ssh/sshd_config

  3. 找到并设置以下指令:

    ```config

    确保此项设置为 yes(通常是默认值)

    PubkeyAuthentication yes

    禁用密码登录

    PasswordAuthentication no
    ```

  4. 重新启动 SSH 服务以应用更改:

    ```bash
    sudo systemctl restart sshd # 对于基于 systemd 的系统(大多数现代 Linux)

    或者

    sudo service ssh restart # 较旧的系统
    ```

警告: 在禁用密码身份验证之前,请确保您已使用新密钥成功登录至少一次。由于配置错误导致自己被锁定是一种常见但可恢复的错误,但这需要控制台或替代访问权限。

总结和后续步骤

生成和管理 SSH 密钥是安全系统管理的基本技能。通过遵循这些步骤——生成现代的 Ed25519 密钥、使用强密码短语保护私钥、将公钥安全地安装到目标服务器上,以及利用 ssh-agent——您可以建立一个高度安全且高效的身份验证机制。

后续步骤:

  • 为每个主要访问的系统或服务生成唯一的密钥对。
  • 定期审核关键服务器上的 authorized_keys 文件。
  • 如果可能,为不同的密钥对使用不同的密码短语,或者至少确保它们复杂。