SSH密钥生成与管理完整教程:从基础到高级应用

本文详细介绍了使用ssh-keygen生成SSH密钥对的全过程,包括密钥创建、代理管理、多服务器部署等核心操作,并提供了Windows和Linux系统的具体命令示例,帮助实现安全的无密码远程登录和自动化运维。

使用ssh-keygen生成新密钥对:完整教程

SSH是登录远程系统的安全方式,但通过使用公钥交换进行通信主机认证可以进一步提高其安全性——即使用ssh-keygen命令生成密钥对。

本教程演示如何使用ssh-keygen命令创建新的公钥及其相关私钥。生成密钥后,您可以执行以下操作:

  • 将公钥上传到远程服务器以实现自动化和认证的无密码登录
  • 在多个远程服务器上使用相同的公钥
  • 在同一服务器上为不同功能使用多个公钥

SSH的GUI版本通常包含与命令行版本相同的功能。例如,PuTTYgen是用于PuTTY的ssh-keygen的GUI版本,PuTTY是Windows的SSH GUI实现。现代操作系统,如Linux、macOS和Windows Server,以及Windows 11,都包含OpenSSH的命令行版本。请记住,SSH是跨平台的,使您能够从其他操作系统访问Linux、macOS和Windows设备。例如,您可能依赖Windows 11工作站进行日常使用,并使用SSH连接到多个Linux服务器。

本教程使用Windows PowerShell和Linux Bash命令行界面的OpenSSH示例。这些示例也适用于macOS版本的OpenSSH。在CLI中使用SSH的优势是命令在不同操作系统间保持一致,这与可能使用各种GUI技术实现命令的GUI版本不同。

为什么生成SSH密钥?

您可以通过密码认证使用SSH而无需密钥对,这是相当安全的。但是,使用公钥-私钥对进行认证是更安全的方法。

该过程很简单。首先,为本地计算机创建公钥-私钥对。接下来,将公钥文件复制到远程SSH服务器。私钥始终保留在本地工作站上。只有具有认证权限的用户才能将公钥文件复制到远程服务器。如果本地用户没有足够的权限,他们可以请求远程主机的系统管理员为他们复制文件。

对中的每个密钥都有各种属性,包括:

  • 公钥:与私钥数学相关,可以通过网络发送或分发给远程用户和工作站
  • 私钥:与公钥数学相关,从不与远程用户和工作站共享

在基于密钥的认证过程中,SSH验证两个密钥之间的关系以确保它们相关,从而提供比密码更安全的身份验证方式。该过程也是透明和自动的。

将公钥文件复制到远程SSH服务器使您能够安全地登录系统。通过登录本地系统,您证明自己控制着公钥对的私钥。

本教程涉及三个用例:

  • 通过将公钥文件从本地计算机复制到远程SSH服务器来配置SSH服务器以识别SSH客户端
  • 将公钥文件复制到远程服务器,使您能够使用相同的登录ID远程访问多个系统
  • 将多个与不同用户帐户关联的公钥复制到远程服务器,每个公钥具有不同级别的权限

SSH工作原理

SSH使用公钥认证在SSH客户端和SSH服务器之间协商安全连接。您可以使用SSH在客户端和远程服务器之间建立临时连接。然后使用密码进行认证,例如使用如下命令:

1
PS C:\Users\alice\.ssh> ssh 192.0.2.44 -l alice

在此PowerShell示例中,ssh命令包括远程服务器的IP地址和-l选项,该选项指定远程服务器上的有效用户帐户。远程系统会提示您输入密码。

接下来,SSH显示以下消息:

1
The authenticity of host '192.0.2.44' can't be established.

此提示后跟服务器的指纹和继续连接的另一个提示。指纹是服务器公钥的安全哈希,位于SSH目录的文件中。在Linux系统上,SSH密钥的默认位置在您的主目录中的~/.ssh/known_hosts文件中。在Windows系统上,默认文件位置是用户目录中的C:\Users\username.ssh\known_hosts文件。

SSH的最佳安全实践是复制该指纹并根据远程服务器的公钥进行认证。在实践中,如果您信任远程服务器,通常可以跳过此步骤。一旦您接受远程服务器的真实性,您的系统会将该服务器及其指纹添加到known_hosts文件中。SSH会直接建立后续连接。

如何生成新的SSH密钥

ssh-keygen命令生成用于认证到远程服务器的公钥-私钥对。大多数SSH实现都包含它。您通常会生成新的公钥和私钥,然后使用SSH和基于密码的登录凭据将公钥复制到远程服务器。

默认情况下,ssh-keygen创建RSA密钥对。它将公钥存储在名为.ssh/id_rsa.pub的文件中,将私钥存储在名为.ssh/id_rsa的文件中。

密钥生成从以下命令开始:

1
$ ssh-keygen -t rsa

在此示例中,ssh-keygen使用RSA公钥算法生成新的SSH密钥对。

此屏幕截图显示了当ssh-keygen命令使用-t选项指定RSA密钥时发生的情况。ssh-keygen命令执行以下操作:

  • 生成公钥对
  • 响应"Enter passphrase"提示,您可以输入密钥密码短语以保护对私钥的访问
  • 私钥(也称为标识)存储在您主目录中名为id_rsa的.ssh目录中的文件中
  • 公钥存在于同一目录中,文件名与私钥相同但扩展名为.pub
  • SSH创建并显示密钥指纹

文件类型和命名规范

ssh-keygen命令为本地计算机创建两个文件,一个公钥文件和一个私钥文件。在这种情况下,两个文件是:

  • id-rsa包含私钥。您不应共享此文件或将其复制到任何远程系统,除非它在您的控制之下
  • id-rsa.pub包含公钥。您可以共享此文件并将其复制到其他系统,特别是当您计划使用SSH登录这些系统时

其他密钥类型的文件名默认使用~/.ssh/id_[密钥类型]的形式。这些文件存储在您主目录中名为.ssh的子目录中。

例如,DSA密钥的名称是:

  • 公钥名称:~/.ssh/id_dsa.pub
  • 私钥名称:~/.ssh/id_dsa

其他密钥类型使用类似的命名约定,ID和密钥类型包含在文件名中。公钥具有.pub文件扩展名。

如何将密钥添加到ssh-agent

ssh-agent应用程序将私钥信息存储在内存中,使密钥可用而无需为每个连接输入密码短语。在开始一系列远程SSH连接之前手动启动代理应用程序。

生成密钥对后,您可以使用ssh-add命令将私钥添加到Linux系统上的代理。使用密钥文件作为参数。

1
ssh-add ~/.ssh/{key-file-name}

使用ssh-add -l命令查看SSH代理中可用的密钥。

ssh-agent在内存中存储私钥密码短语的未加密版本,使其可能容易受到可以访问RAM的恶意软件的攻击。该应用程序不会将密钥写入磁盘——它们已经存储在用户主目录的磁盘上。

因为ssh-agent是一个应用程序,而不是服务或守护进程,它不会在重启后持久存在。作为安全预防措施,在任何系统重启后,在访问远程SSH资源之前必须启动ssh-agent。

如何将公钥复制到服务器

下一步是将新生成的公钥从本地系统复制到远程SSH服务器。当两个系统都在基于Unix的操作系统(包括Linux或macOS)上使用OpenSSH时,您可以使用ssh-copy-id命令安装密钥。OpenSSH将新的公钥添加到authorized_keys文件中。当本地计算机请求连接时,远程服务器的SSH服务会检查该文件。这是一个示例:

1
$ ssh-copy-id -i ~/.ssh/id_rsa.pub alice@192.0.2.44/home/alice/.ssh/authorized_keys

在此示例中,OpenSSH将您的公钥文件复制到authorized_keys文件中。

但是,ssh-copy-id命令可能并不总是可用。例如,Windows系统使用不同的过程。要从Windows命令行将公钥复制到服务器,请使用以下命令:

1
PS c:> type $env:USERPROFILE\.ssh\id_rsa.pub | ssh alice@192.0.2.16 "cat >> .ssh/authorized_keys"

此复合命令使用Windows type命令输出公钥文件的内容。接下来,使用|符号将内容通过管道传输到新的SSH连接。此命令的最后引用部分使用远程服务器上的cat命令将新的公钥文件附加到authorized_keys文件的末尾。此部分命令是必要的,以避免覆盖authorized_keys文件,这会覆盖先前添加到该文件的任何现有密钥。

公钥现在位于远程服务器上的.ssh/authorized_keys文件中。下次您或自动化过程尝试从本地计算机进行SSH连接时,SSH将启动会话,无需手动输入用户名和密码。

每次登录远程SSH服务器而无需输入密码很方便,但这不是使用SSH基于密钥认证的主要原因。无需密码短语即可认证SSH连接使自动化操作能够在无需人工干预的情况下在远程服务器上执行。

如何将公钥复制到多个服务器

系统管理员、网络经理和网络安全专业人员通常需要使用相同的登录ID连接到许多不同的远程服务器。大型组织可以使用SSH密钥管理系统将公钥分发到远程服务器,并为需要它们的个人管理公钥对。

您也可以手动将公钥复制到您访问的所有服务器。您将为每个远程服务器发出上述相同的命令来复制您的公钥,如本示例所示:

1
PS c:> type $env:USERPROFILE\.ssh\id_rsa.pub | ssh alice@ssh.example.org "cat >> .ssh/authorized_keys"

此Windows命令将公钥文件id_rsa.pub发送到远程服务器,以将其与远程服务器ssh.example.org上的用户ID alice关联。

如何将多个公钥复制到服务器

网络和安全专业人员可能需要在同一远程服务器上使用具有不同权限的不同身份。这种方法分隔了访问权限,并且对于以下原因很有用:

  • 您可以将多个公钥对分配给系统上具有各种权限级别的身份,以符合最小权限原则
  • 管理员在处理多个内部客户端时可能使用不同的公钥,以便为同一用户执行的各种功能启用审计

当将多个公钥添加到同一远程服务器时,公钥文件名不同,并且必须在运行ssh命令时指定。考虑以下示例:

1
$ ssh -i ~/.ssh/id_Alice alice@sshserver.example.net

此命令使用-i选项指定~/.ssh/id_Alice标识文件,供远程主机用于认证连接。

SSH密钥管理最佳实践

使用以下SSH密钥管理最佳实践来简化您现有的SSH基础架构,并作为更广泛自动化计划的一部分进行改进:

  • 发现、清点和记录所有密钥
  • 撤销不必要的密钥
  • 选择更强的加密算法以提高安全性
  • 仅对需要的人启用基于密钥的认证
  • 定期轮换和更改SSH密钥
  • 使用密码短语保护私钥
  • 在SSH配置文件中禁用基于密码的认证
  • 在SSH配置文件中禁用root认证
  • 管理Linux、macOS和Windows系统的基于密钥的认证
  • 为自动化配置过程(如Ansible)记录和配置基于密钥的认证

实施SSH基于密钥的认证并遵循这些最佳实践有助于确保手动和自动化任务的安全和功能性SSH部署,即使在跨平台环境中也是如此。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计