启动期间出现 LUKS 错误

启动期间出现 LUKS 错误
alg: drbg: could not allocate DRNG handle for ...

我只在我们创建的虚拟机启动过程中在控制台上看到此错误。编辑:2/5/16 - 我在一些裸机安装上也看到它。(它确实可以完全启动。)我认为这与虚拟化硬件和缺少(兼容的)随机数生成器有关。问题是我无法评估严重性。加密强度是否受到损害?(我应该关心这个错误吗?)我该如何修复它?

我们在 CentOS 6.7 下使用 QEMU/KVM。virsh dumpxml 如果您真的认为这会有所帮助,我可以做一个示例系统。我们正在使用Anaconda 默认密码/密钥大小. (aes-xts-plain64/512)

这是最早参考我发现linux-crypto 邮件列表。不幸的是,这有点超出我的理解范围。

http://www.mail-archive.com/linux-crypto%40vger.kernel.org/msg10398.html

alg: drbg: 无法为...分配 DRNG 句柄

答案1

简而言之,我不认为它会影响加密的强度。

我已经检查过源代码,只要我理解正确,你就不必担心这个问题。

此代码属于模块“stdrng”。至少在 Fedora 23 上,它内置于内核中,而不是作为内核模块导出。

第一次初始化 stdrng 时会发生以下调用。

在 crypto/drbg.c 中初始化从这里开始。

1997 module_init(drbg_init);

这将注册系统已知的所有 drbgs。

1985         for (j = 0; ARRAY_SIZE(drbg_cores) > j; j++, i++)
1986                 drbg_fill_array(&drbg_algs[i], &drbg_cores[j], 1);
1987         for (j = 0; ARRAY_SIZE(drbg_cores) > j; j++, i++)
1988                 drbg_fill_array(&drbg_algs[i], &drbg_cores[j], 0);

然后将其传递给执行初始化的辅助函数:

1989         return crypto_register_rngs(drbg_algs, (ARRAY_SIZE(drbg_cores) * 2));

crypto/rng.c此只需遍历每个 rng 来注册它即可。

210         for (i = 0; i < count; i++) {
211                 ret = crypto_register_rng(algs + i);
212                 if (ret)
213                         goto err;
214         }

该函数执行一系列初始化步骤,然后调用另一个函数进行分配。

196         return crypto_register_alg(base);

不太明显的是注册期间发生的事情。

内核中还内置了另一个模块,称为tcrypt接收插入新算法的通知。一旦发现新注册的算法,它就会安排测试。这就是您在屏幕上看到的输出。

测试完成后,算法进入测试状态。如果测试失败,我想象(我找不到产生这种行为的位)如果传递了正确的标志,则无法选择搜索。

测试是否通过肯定是内部存储的。

除此之外,调用伪随机数生成器会导致按照强度顺序迭代 prng 算法列表,如本说明中所述crypto/drbg.c

107 /*
108  * The order of the DRBG definitions here matter: every DRBG is registered
109  * as stdrng. Each DRBG receives an increasing cra_priority values the later
110  * they are defined in this array (see drbg_fill_array).
111  *

由于最强的一个不会失败(hmac sha256),即使可以选择它们,您也不太可能使用失败的。

总结一下 -

  • stdrng当某些东西需要该模块时,就会发生这种情况。
  • 它加载所有已知的算法。
  • 所有加载的算法都会被测试。有些算法可能会失败(此答案未考虑原因)。
  • 测试失败的算法不应该稍后可供选择。
  • PRNGS 按强度排序,通过的强 PRNGS 将首先尝试。
  • 依赖于stdrng希望的事物不应该使用这些算法作为其 PRNG 源的基础。

您可以使用以下命令查看哪些算法已成功并通过了测试:

 grep -EC5 'selftest.*passed' /proc/crypto

您还可以通过“优先级”字段查看选择优先级。根据模块作者的说法,值越高,PRNG 越强。

因此,我很高兴在这里错了,因为我不认为自己是一名内核程序员,但总而言之 -

stdrng加载时,它似乎从可接受算法列表中选择其他算法,这些算法被认为比失败的算法更强,而且失败的算法不太可能被选中。

因此,我相信使用 luks 不会给您带来额外的风险。

答案2

我该如何修复它?

根据 Red Hat 知识库,您必须将“ctr”内核模块添加到 initrd。他们的说明还说要包含“ecb”,但问题似乎是“ctr”模块未加载。

dracut -f -v --add-drivers "ctr ecb"

订阅者可以看到完整的信息。我不确定我是否被允许在这里重新发布其余内容,所以我改写了完整的解决方案。

https://access.redhat.com/solutions/2249181

编辑于2016年9月29日:

您还可以添加这些驱动程序,/etc/dracut.conf以便在内核升级时将它们添加到新的 initramfs 中。否则,您的症状会在几个月后神秘地再次出现。;)

add_drivers+="ctr ecb"

相关内容