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

生成SSH密钥,将公钥复制到服务器,使用ssh-agent,并安全地管理特定主机的SSH配置。

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

SSH密钥允许您登录服务器,而无需通过网络发送可重复使用的密码。如果您管理Linux服务器、云实例或Git远程仓库,一个妥善保护的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): 按Enter接受默认位置。这将在您的.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代理: 当您登录到桌面环境时,代理通常会自动启动。如果没有,您可以手动启动:
    eval "$(ssh-agent -s)"
    
  • 向代理添加密钥: 代理运行后,添加您的私钥:
    ssh-add ~/.ssh/id_ed25519
    
    系统会提示您输入密码短语。之后,代理将管理该密钥,后续的SSH连接将自动使用它。

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

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

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

# 默认设置
Host *
  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文件中定义的正确用户名、端口和私钥文件。避免全局启用ForwardAgent yes;代理转发对于某些跳板主机工作流很有用,但它在会话活动期间会将您的代理套接字暴露给远程主机。

密钥轮换和撤销

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

最佳实践和安全提示

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

要点

SSH密钥值得在您需要紧急服务器访问之前进行设置。生成一个现代密钥,用密码短语保护私钥,仅将公钥复制到服务器,并在访问权限变更时从authorized_keys中移除过时的密钥。