使用 ssh-keygen 生成新 ssh 秘钥

Bran: “Can a man still be brave if he’s afraid?”
Ned: “That is the only time a man can be brave.”

——《A Song of Ice and Fire》GRRM

SSH 协议用来验证主机和用户公钥加密。SSH 引入了公钥身份验证,作为较旧的.rhosts身份验证的一种更安全的替代方法。它避免了将密码存储在文件中的需求,从而提高了安全性,并消除了遭到破坏的服务器窃取用户密码的可能性。ssh-keygen 是用于为SSH创建新的身份验证密钥对的工具。此类密钥对用于自动登录,单点登录和验证主机。

创建 SSH 密钥对

最简单方法创建 SSH 密钥对

生成密钥对的最简单方法是ssh-keygen不带参数运行。在这种情况下,它将提示您在其中存储密钥的文件。

首先,该工具询问将文件保存在何处。用于用户身份验证的SSH密钥通常存储在主.ssh目录下的用户目录中。但是,在企业环境中,位置通常是不同的。默认密钥文件名取决于算法,在这种情况下id_rsa,使用默认的RSA算法。例如,它也可以是id_dsa或id_ecdsa。

然后要求输入密码。密码用于加密密钥,因此即使有人获得了私钥文件,也无法使用该密码。密码短语应具有加密强度。我们的在线随机密码生成器是生成强密码短语的一种可能工具。

1
2
3
4
5
6
7
8
9
10
11
12
13
ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/user/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/user/.ssh/id_rsa.
Your public key has been saved in /home/user/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx user@host
The key's randomart image is:
+---[RSA 2048]----+
............
+----[SHA256]-----+

选择算法和密钥大小

SSH支持多种用于身份验证密钥的公共密钥算法:

  • rsa-一种基于分解大数的难度的旧算法。对于RSA,建议密钥大小至少为2048位。4096位更好。RSA越来越老,并且在分解方面取得了重大进展。建议选择其他算法。在可预见的将来,RSA算法很有可能会变得实用。所有SSH客户端均支持此算法
  • dsa-一种旧的美国政府数字签名算法。它基于计算离散对数的难度。密钥大小通常为1024。不再建议使用原始形式的DSA
  • ecdsa-使用椭圆曲线的美国政府认可的一种新的数字签名算法。对于当前的应用程序,这可能是一个很好的算法。仅支持三种密钥大小:256、384和521(双)位。我们建议始终将其与521位一起使用,因为密钥仍然较小,并且可能比较小的密钥更安全(即使它们也应该是安全的)。现在,大多数SSH客户端都支持此算法
  • ed25519-这是OpenSSH中添加的新算法。客户对此的支持尚不普遍。因此,在一般用途的应用中可能尚不建议使用

使用-t选项选择算法,并使用选项选择密钥大小-b

1
2
3
4
ssh-keygen -t rsa -b 4096
ssh-keygen -t dsa
ssh-keygen -t ecdsa -b 521
ssh-keygen -t ed25519

指定文件名

通常,该工具会提示您输入用于存储密钥的文件。但是,也可以使用-f <filename>选项在命令行中指定。

1
ssh-keygen -f ~/the-key-of-ecdsa -t ecdsa -b 521

将公钥复制到服务器

要使用公共密钥身份验证,必须将公共密钥复制到服务器并安装在authorized_keys文件中。可以使用ssh-copy-id工具方便地完成此操作。一旦在服务器上配置了公钥,服务器将允许具有私钥的任何连接用户登录。在登录过程中,客户端通过对密钥交换进行数字签名来证明拥有私钥。

1
ssh-copy-id -i ~/.ssh/the-key-of-ecdsa user@host

创建主机密钥

该工具还用于创建主机身份验证密钥。主机密钥存储在/etc/ssh/目录中。主机密钥只是普通的SSH密钥对。每个主机可以为每种算法具有一个主机密钥。主机密钥几乎总是存储在以下文件中:

1
2
3
4
/etc/ssh/ssh_host_dsa_key
/etc/ssh/ssh_host_ecdsa_key
/etc/ssh/ssh_host_ed25519_key
/etc/ssh/ssh_host_rsa_key

主机密钥通常在安装SSH服务器时自动生成。它们可以随时重新生成。但是,如果更改了主机密钥,则客户端可能会警告已更改的密钥。当有人尝试执行中间人攻击时,也会报告更改的密钥。因此,不建议培训用户盲目接受他们。因此,最好使用也在客户端上更改密钥的SSH密钥管理工具来完成密钥的更改,或者使用证书。

常用 SSH 命令和选项

以下是keygen工具常用选项的摘要:

  • -b “位数”此选项指定密钥中的位数。管理SSH用例的法规可能要求使用特定的密钥长度。通常,对于RSA密钥,认为2048位就足够了
  • -e “导出”(Export)此选项允许在OpenSSH密钥文件格式和RFC 4716中记录的格式” SSH公共密钥文件格式” 之间重新格式化现有密钥
  • -p “更改密码短语”此选项允许使用[-P old_passphrase]和[-N new_passphrase],更改私钥文件的密码短语[-f keyfile]
  • -t “类型”此选项指定要创建的密钥的类型。常用的值是: - RSA为RSA密钥 - DSA为DSA密钥 - ECDSA为椭圆曲线DSA密钥
  • -i “输入”当需要ssh-keygen访问现有密钥时,此选项指定文件
  • -f “文件”指定用于存储创建的密钥的文件的名称
  • -N “ New”为密钥提供新的密码短语
  • -P “ Passphrase”在读取密钥时提供(旧的)密码短语
  • -c “注释”更改密钥文件的注释
  • -p 更改私钥文件的密码
  • -q 静默ssh-keygen
  • -v 详细模式
  • -l “ Fingerprint”打印指定公用密钥的指纹
  • -B “气泡声”显示密钥文件的”气泡声”(Tectia格式)指纹
  • -F 在known_hosts文件中搜索指定的主机名
  • -R 从known_hosts文件中删除属于主机名的所有键
  • -y 读取专用的OpenSSH格式文件,并将OpenSSH公用密钥打印到stdout

SSH 密钥管理须知

创建和配置新的SSH密钥很容易。在默认配置中,OpenSSH允许任何用户配置新密钥。密钥是永久访问凭据,即使删除了用户帐户,该凭据也仍然有效。

在拥有几十个用户的组织中,多年来,SSH密钥很容易累积在服务器和服务帐户上。我们已经看到具有数百万个密钥的企业向其生产服务器授予访问权限。只需一个泄露,被盗或配置错误的密钥即可访问。

在任何大型组织中,几乎都需要使用SSH密钥管理解决方案。SSH密钥也应通过适当的设置和终止过程移到根拥有的位置。有关更多信息,请参阅如何管理SSH密钥通用SSH密钥管理器是广泛用于OpenSSH的SSH密钥管理工具。

实际上,所有网络安全监管框架都要求管理谁可以访问什么。SSH密钥授予访问权限,并且属于此要求。为此,需要遵从法规要求的组织对密钥实施适当的管理流程。 NIST IR 7966是一个很好的起点。

确保有足够的随机性

生成SSH密钥时,确保系统中存在足够不可预测的熵非常重要。当Internet上成千上万的设备被不正确地配置为生成密钥而没有适当的随机性时,会发生这样的事件:Internet上的数千个设备共享相同的主机密钥。

通用系统

在通用计算机上,SSH密钥生成的随机性通常不是问题。最初安装SSH服务器并生成主机密钥时,这可能是个问题,通常只有构建新Linux发行版或SSH安装程序包的人才需要担心。

我们的建议是在整个操作系统安装过程中收集随机性,并将该随机性保存在随机种子文件中。然后引导系统,在引导过程中收集更多随机性,从种子文件中混合保存的随机性,然后才生成主机密钥。这样可以最大程度地利用可用的随机性。并确保定期对随机种子文件进行更新,特别是确保在生成SSH主机密钥后对其进行更新。

许多现代的通用CPU也具有硬件随机数生成器。这对解决这个问题很有帮助。最佳实践是以其他方式收集一些熵,仍将其保存在随机种子文件中,并从硬件随机数生成器中混合一些熵。这样,即使其中一个受到某种程度的损害,另一个随机性源也应确保密钥的安全。

嵌入式设备和物联网

在系统上没有其他活动的小型IoT设备上,可用的熵可能是一个真正的问题。它们可能只是没有磁盘驱动器机械运动定时,用户引起的中断或网络流量等机械随机性。此外,嵌入式设备通常在可能没有硬件随机数生成器的低端处理器上运行。

当此类设备生成HTTPS密钥时,熵的可用性也至关重要。

我们的建议是此类设备应具有硬件随机数生成器。如果CPU没有,则应将其安装在主板上。成本很小。

Reference

  1. ssh-keygen - Generate a New SSH Key