什么是 ssh-keygen 最佳实践?

信息安全 加密 SSH 打开sh
2021-09-06 22:37:37

大多数用户只需键入ssh-keygen并接受默认情况下提供的内容。

但是生成ssh密钥的最佳实践是ssh-keygen什么?

例如:

  • 用于-oOpenSSH 密钥格式而不是旧的 PEM 格式(OpenSSH 6.5 于几年前于 2014-01-30引入了此功能)

  • 应该如何计算要使用多少轮KDF-a

  • 应该-T用来测试候选素数的安全性吗?-a用这个有什么价值?

  • 对于不同的密钥类型,推荐的最小-b位大小是多少?

  • 等等......(手册页中有一组令人难以置信的选项)。

4个回答

我推荐Secure Secure Shell文章,其中建议:

ssh-keygen -t ed25519 -a 100

Ed25519 是一种EdDSA方案,具有非常小的(固定大小)密钥,在OpenSSH 6.5 (2014-01-30) 中引入,并在OpenSSH 8.5 (2021-03-03) 中设为默认值(“第一优先”)。由于椭圆曲线加密(ECC),它们具有类似于 4096 位的 RSA 的复杂性。-a 100选项指定 100 轮密钥派生,使您的密钥密码更难暴力破解。

然而,Ed25519 是一种相当新的关键算法(Curve25519 的受欢迎程度仅在推测其他标准已被稀释时才飙升)并且它的采用尚未普遍。2018 年迈出了一大步,所以我们快到了,但在旧系统或旧服务器(如 CentOS/RHEL < 7 或 Ubuntu < 15.04)上,您可以生成一个类似复杂的 4096 字节的 RSA 密钥:

ssh-keygen -t rsa -b 4096 -o -a 100

(您可能需要省略该-o选项,因为它需要 OpenSSH 6.5+ 并且是从 v7.8 开始的默认设置,此时它已从ssh-keygen手册页中删除。这表明使用新的 OpenSSH 格式来存储密钥而不是以前的默认值,PEM。Ed25519需要这种新格式,所以我们不需要明确说明它-t ed25519。以前的手册页指出“新格式增加了对暴力密码破解的抵抗力。”有关更多详细信息,请参阅此答案.)

不要考虑另一种称为ECDSA的新 ECC 算法。它被认为是可疑的(它有已知的弱点,并且由于美国政府参与了它的开发,它可能会受到损害)。Ed25519 的开发没有任何已知的政府参与。

远离 DSA(“ssh-dss”)密钥:它们不仅仅是可疑的,DSA 是不安全的

大多数用户只需键入ssh-keygen并接受默认情况下提供的内容。

是的。要为人们做一个安全,它需要很简单。因此,默认选项应该是安全、兼容和快速的。您可以提供替代方案,但对于那些不在乎的人来说,默认值应该“足够好”。因此,旧 PEM 格式的 RSA (2048) 是目前的默认值。

  • 用于-oOpenSSH 密钥格式而不是旧的 PEM 格式(OpenSSH 6.5 大约在 3 年前的 2014-01-30 引入了此功能)

三年不算什么。这些年来,很多容器都在设法发展,但是 SSH 已经存在 20 多年了,仍然需要处理老客户。新的 OpenSSH 格式尚未被广泛采用和支持。

  • 应该如何计算要使用多少轮 KDF -a

取决于用例。在 Github 上为您的“资料”存储库创建密钥与在您最喜欢的国家机构中创建密钥作为证书颁发机构或访问专用服务器上的超级机密文档不同。

正如所指出的,这仅适用于尚未广泛使用的新格式,它增加了解密密钥的时间。默认轮数是16(很高兴看到它记录在某处)。密码学问题中的更多内容

  • 应该-T用来测试候选素数的安全性吗?-a用这个有什么价值?

不会。它用于生成质数 ( /etc/ssh/moduli) 以进行 DH 密钥交换。它不以任何方式用于生成 SSH 密钥。如何生成和测试moduli文件MODULI GENERATIONssh-keygen.

  • 对于不同的密钥类型,推荐的最小-b bit尺寸是多少?

这不是 SSH 特定的,但 NIST 在本文档第 12 页(根据 2015 年)中通常建议使用密钥大小:

RSA (2048 bits)
ECDSA (Curve P-256)

Ed25519 确实具有固定大小,因此该-b参数被忽略。

这是基于推荐值的 Ed25519 的单行:(无密码)

ssh-keygen -t ed25519 -a 100 -f ~/.ssh/id_ed25519 -q -N ''

RSA 的另一个:

ssh-keygen -t rsa -b 4096 -o -a 100 -f ~/.ssh/id_rsa -q -N ''
  • -N: 新密码
  • -q: 安静 ssh-keygen

编辑和免责声明: 为了回答一些评论,这个答案侧重于简单性,并明确表明它没有使用密码短语作为密钥。上面的一个衬里可以在非交互式脚本中使用来生成密钥对。如果您不喜欢使用空密码,您可以在-N选项之后设置一个(它将被记录到 shell 历史记录中),或者设置一个读取用户输入的环境变量。

chattr对于这些键的额外保护使用,例如

sudo chattr + /home/"username"/.ssh/id_rsa.pub

(还有/etc/passwd等等/etc/shadow