替换 OpenSSH 的 moduli 文件是否值得?

信息安全 密码学 SSH 打开sh
2021-09-03 19:00:52

/etc/ssh/moduli 被篡改的后果描述了如果 OpenSSH 服务器的 moduli 文件被篡改的可能风险。

将逻辑更进一步,OpenSSH 附带的默认文件有什么问题吗?我问是因为Secure Secure Shell文章提到了这一点:

如果您选择启用 5 [diffie-hellman-group-exchange-sha256],如果存在则打开 /etc/ssh/moduli,并删除第 5 列小于 2000 的行。如果不存在,则创建它:

ssh-keygen -G "${HOME}/moduli" -b 4096
ssh-keygen -T /etc/ssh/moduli -f "${HOME}/moduli"
rm "${HOME}/moduli"

这在我看来好像小于 2048 的 DH 素数被认为是不安全的,应该用更大的素数替换。但是,聪明的人,OpenSSH 开发人员并没有用包含更大素数的文件替换默认附带的文件。我错过了什么吗?

2个回答

交换/选择过程

为什么要删除短于 2000 位的素数?根据RFC4419,密钥交换从客户端以 3 个数字的形式将其首选项发送到服务器开始:

  • 最小可接受模数长度,
  • 最大可接受长度
  • 和首选长度。

然后服务器选择一个最能满足这个要求的随机素数。

在实践中(至少对于 OpenSSH 6.7),客户端的最小值和最大值始终为 1024 和 8192。首选长度是对称密码安全级别的 8 倍。然后服务器选择如下:

  • 它丢弃最小-最大范围之外的素数,
  • 然后它选择不小于首选长度的最短可用长度
  • 最后,它从其中随机选择一个。

使用 AES-128,我们最终得到一个 1024 位模数,这更像是 2^80 的努力来打破。(它不是线性的,你不能只乘以 8。)

为什么要再生?

为什么要从头开始重新生成文件?引用 RFC4419

The use of multiple moduli inhibits a determined attacker from
precalculating moduli exchange values, and discourages dedication of
resources for analysis of any particular modulus.

这已在Logjam攻击中得到证明。

如果每个人都使用与 SSH 包一起分发的相同模数文件,则效果不佳。出于这个原因,我在每台主机上生成了不同的模数文件。

注意:现代 SSH 使用椭圆曲线 Diffie-Hellman,理论上更安全。

如果要生成新的非椭圆曲线素数,请执行以下操作:

ssh-keygen -G moduli-2048.candidates -b 2048
ssh-keygen -T moduli-2048 -f moduli-2048.candidates

然后将您的模数(通常/etc/ssh/moduli)文件的内容替换moduli-2048

这些ssh-keygen选项似乎已经过时了-G-T

根据man ssh-keygen,在该MODULI GENERATION部分中,当前的命令是:

ssh-keygen -M generate -O bits=2048 moduli-2048.candidates
ssh-keygen -M screen -f moduli-2048.candidates moduli-2048