SSH 密钥入门指南:生成、使用和安全管理

使用 SSH 密钥解锁安全、无密码的远程访问。本入门指南涵盖了使用 `ssh-keygen` 生成 SSH 密钥对、使用 `ssh-copy-id` 将其部署到服务器,以及使用 `ssh-agent` 和配置文件有效管理密钥。学习最佳实践,以提高您的服务器安全性并简化连接。

41 浏览量

SSH密钥初学者指南:安全地生成、使用和管理

安全外壳协议(SSH)是服务器和其他网络设备安全远程访问的事实标准。虽然基于密码的认证很常见,但它容易受到暴力破解攻击,并且需要记住复杂的密码。SSH密钥提供了一种更强大、更便捷的替代方案,可实现无密码认证并提升您的整体安全态势。

本指南将引导您完成生成、部署和管理SSH密钥对的基本步骤。通过理解和实施这些实践,您可以显著提高远程访问的安全性并简化您的工作流程。我们将涵盖核心概念、实用命令和最佳实践,以帮助您开始使用SSH密钥认证。

理解SSH密钥对

SSH密钥认证依赖于一对加密密钥:私钥和公钥。这些密钥在数学上相关联,但从公钥推导出私钥在计算上是不可行的。

  • 私钥: 此密钥应严格保密,绝不共享。它驻留在您的本地机器上,充当您的身份。当您发起SSH连接时,您的客户端使用您的私钥来证明您的身份。
  • 公钥: 此密钥可以自由共享。您将把公钥放置在您希望访问的远程服务器上。当您尝试连接时,服务器使用您的公钥来验证您是否拥有相应的私钥。

当您尝试连接到服务器时,会发生以下过程:

  1. 您的SSH客户端向服务器出示您的公钥。
  2. 服务器检查此公钥是否已授权(即是否存在于其authorized_keys文件中)。
  3. 如果已授权,服务器会向您的客户端发送一个质询。
  4. 您的客户端使用私钥加密质询,并将加密响应发送回服务器。
  5. 服务器使用您的公钥解密响应。如果解密成功并与原始质询匹配,则无需密码即可授予认证。

生成SSH密钥对

生成SSH密钥对最常用的工具是ssh-keygen。此命令在大多数Linux、macOS和Windows(通过WSL或Git Bash)系统上都可用。

使用 ssh-keygen

要生成新的SSH密钥对,请打开您的终端或命令提示符并运行以下命令:

ssh-keygen -t ed25519

让我们拆解此命令:

  • ssh-keygen:用于生成SSH密钥的命令。
  • -t ed25519:指定要创建的密钥类型。ed25519是一种现代、高度安全且快速的椭圆曲线加密算法。其他常用选项包括rsa(例如,ssh-keygen -t rsa -b 4096 用于生成4096位RSA密钥)。

运行命令后,您会收到一些提示问题:

  1. 输入保存密钥的文件(例如,/home/your_user/.ssh/id_ed25519): 按回车键接受默认位置。这将在您的.ssh目录中创建两个文件:id_ed25519(您的私钥)和id_ed25519.pub(您的公钥)。
  2. 输入密码短语(留空表示无密码短语): 这是一个关键的安全步骤。输入密码短语会加密您磁盘上的私钥。如果您的私钥文件被泄露,攻击者仍需要密码短语才能使用它。强烈建议使用一个强密码短语。
  3. 再次输入相同的密码短语: 确认您的密码短语。

理解输出文件

生成后,您的~/.ssh/目录(或您指定的路径)中将创建两个文件:

  • id_ed25519(或id_rsa):您的私钥切勿共享此文件。将其权限限制为您的用户只读。
  • id_ed25519.pub(或id_rsa.pub):您的公钥。这是您将分发给服务器的密钥。

保护您的私钥

确保您的私钥具有正确的文件权限至关重要。在Linux/macOS上,运行:

chmod 600 ~/.ssh/id_ed25519

此命令将读写权限限制为文件的所有者,从而防止系统上的其他用户访问您的私钥。

将您的公钥部署到服务器

一旦您生成了SSH密钥对,您需要将您的公钥放置到您希望访问的远程服务器上。

使用 ssh-copy-id(推荐)

ssh-copy-id是一个实用脚本,它简化了将公钥复制到远程服务器的过程。它会自动将您的公钥附加到服务器上的~/.ssh/authorized_keys文件,并设置正确的权限。

要使用ssh-copy-id,请从您的本地机器运行以下命令:

ssh-copy-id user@remote_host

user替换为远程服务器上的用户名,将remote_host替换为服务器的IP地址或主机名。您将被最后一次提示输入remote_hostuser的密码,以授权密钥传输。

如果您使用非标准SSH端口(例如2222),您可以使用-p选项来指定:

ssh-copy-id -p 2222 user@remote_host

手动部署(如果ssh-copy-id不可用)

如果ssh-copy-id不可用,您可以手动复制您的公钥。首先,在您的本地机器上显示您的公钥内容:

cat ~/.ssh/id_ed25519.pub

复制整个输出。然后,使用您的密码SSH登录到您的远程服务器:

ssh user@remote_host

登录后,如果.ssh目录不存在,则创建它,然后创建或追加到authorized_keys文件:

mkdir -p ~/.ssh
chmod 700 ~/.ssh

现在,将您的公钥内容粘贴到authorized_keys文件中。您可以使用nanovim等文本编辑器来完成此操作:

nano ~/.ssh/authorized_keys

将复制的公钥粘贴到新行。保存并退出编辑器。

最后,确保authorized_keys文件具有正确的权限:

chmod 600 ~/.ssh/authorized_keys

完成这些步骤后,您应该能够无需密码SSH登录到服务器。

使用SSH密钥连接

一旦您的公钥在服务器上,您就可以使用您的私钥进行连接。SSH客户端将自动尝试使用~/.ssh/中找到的密钥。

ssh user@remote_host

如果您在密钥生成期间使用了密码短语,您现在将被提示输入它。如果您没有使用密码短语,您将直接登录。

指定不同的密钥

如果您有多个SSH密钥对或者您的密钥不在默认位置,您可以使用-i选项来指定要使用的私钥:

ssh -i /path/to/your/private_key user@remote_host

管理SSH密钥

随着您访问更多服务器,您将积累更多SSH密钥。有效的管理是维护安全性和便利性的关键。

SSH代理

SSH代理是一个后台程序,它将您的私钥(用密码短语解密后)保存在内存中。这使您可以在多次SSH连接中重复使用密钥,而无需每次重新输入密码短语。

  • 启动SSH代理: 当您登录桌面环境时,代理通常会自动启动。如果没有,您可以手动启动它:
    bash eval "$(ssh-agent -s)"
  • 将密钥添加到代理: 一旦代理运行,添加您的私钥:
    bash ssh-add ~/.ssh/id_ed25519
    您将被提示输入密码短语。此后,代理将管理该密钥,随后的SSH连接将自动使用它。

SSH配置文件(~/.ssh/config

SSH客户端配置文件(~/.ssh/config)允许您为主机定义别名并指定连接参数,包括为特定主机使用哪个密钥。这对于管理多个服务器来说非常有用。

在您的本地机器上创建或编辑文件~/.ssh/config,并添加如下条目:

# 默认设置
Host *
  ForwardAgent yes
  ServerAliveInterval 60

# 服务器1:Web服务器
Host webserver
  HostName 192.168.1.100
  User webadmin
  Port 2222
  IdentityFile ~/.ssh/webserver_key

# 服务器2:数据库服务器
Host dbserver
  HostName db.example.com
  User dbuser
  IdentityFile ~/.ssh/db_key

有了此配置,您可以使用以下命令连接到Web服务器:

ssh webserver

并使用以下命令连接到数据库服务器:

ssh dbserver

SSH客户端将自动使用~/.ssh/config文件中定义的正确用户名、端口和私钥文件。

密钥轮换和撤销

  • 轮换: 定期考虑轮换您的SSH密钥,特别是对于高度敏感的系统。这包括生成新密钥并替换服务器上的旧公钥。
  • 撤销: 如果私钥被泄露或您不再需要访问权限,您必须从部署了该密钥的所有服务器上的authorized_keys文件中删除相应的公钥。这对于维护安全至关重要。

最佳实践和安全提示

  • 使用密码短语: 始终使用强密码短语保护您的私钥。这是您的主要防御措施,以防止私钥文件被盗后被未经授权使用。
  • 保护私钥权限: 确保您的私钥文件具有600权限(-rw-------)。
  • 使用 ssh-agent 利用SSH代理避免重复输入密码短语。
  • 禁用密码认证: 一旦SSH密钥认证正常工作,考虑在您的服务器上禁用基于密码的认证,以增加一层安全性。
  • 保持密钥更新: 使用Ed25519等现代、强大的算法。避免使用位长不足(至少4096位)的旧RSA密钥。
  • 注意 authorized_keys 只将来自可信来源的公钥添加到您的authorized_keys文件。
  • 定期审计: 定期审查服务器上的authorized_keys文件,以确保只存在授权密钥。

结论

SSH密钥是增强远程服务器管理安全性和便利性的强大工具。通过掌握使用ssh-keygenssh-copy-id等工具生成、部署和管理SSH密钥对,您可以超越基于密码的认证,建立更安全、更高效的远程访问工作流程。请记住通过使用强密码短语和保护您的私钥来优先考虑安全性。