引导期间的 LUKS 错误

Aar*_*ley 7 linux disk-encryption centos6 luks random-number-generator

alg: drbg: could not allocate DRNG handle for ...
Run Code Online (Sandbox Code Playgroud)

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

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

这是我在linux-crypto mailing list上找到的最早的参考资料。不幸的是,这有点超出我的想象。

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

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

Mat*_*Ife 8

实际上,我不相信它会影响您的加密强度。

我已经检查了源代码,只要我解释的内容是正确的,您就不必担心这一点。

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

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

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

1997 module_init(drbg_init);
Run Code Online (Sandbox Code Playgroud)

这会注册系统已知的所有 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);
Run Code Online (Sandbox Code Playgroud)

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

1989         return crypto_register_rngs(drbg_algs, (ARRAY_SIZE(drbg_cores) * 2));
Run Code Online (Sandbox Code Playgroud)

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         }
Run Code Online (Sandbox Code Playgroud)

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

196         return crypto_register_alg(base);
Run Code Online (Sandbox Code Playgroud)

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

另一个tcrypt内置于内核中的模块接收插入新算法的通知。一旦它看到一个新的注册算法,它就会安排一个测试。这就是产生您在屏幕上看到的输出的原因。

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

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

除此之外,调用伪随机数生成器会导致按照本注释中规定的强度顺序迭代 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  *
Run Code Online (Sandbox Code Playgroud)

由于最强者不会失败(hmac sha256),因此即使可以选择失败者,您也不太可能使用失败者。

总结一下——

  • stdrng某个模块需要某个模块时,就会发生这种情况。
  • 它加载所有已知的算法。
  • 加载的所有算法都经过测试。有些可能会失败(为什么在这个答案中没有考虑)。
  • 测试失败的算法不应该可供以后选择。
  • PRNGS 按强度排序,首先尝试通过的强 PRNGS。
  • stdrng希望依赖的事物不应使用这些算法作为其 PRNG 源的基础。

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

 grep -EC5 'selftest.*passed' /proc/crypto
Run Code Online (Sandbox Code Playgroud)

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

所以,很高兴在这里犯错,因为我不认为自己是内核程序员,但总而言之 -

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

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


Aar*_*ley 1

我该如何修复它?

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

dracut -f -v --add-drivers "ctr ecb"
Run Code Online (Sandbox Code Playgroud)

订阅者可以看到完整的信息。我不确定是否允许我在这里重新发布其余部分,因此我已经解释了完整的解决方案。

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

2016 年 9 月 29 日编辑:

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

add_drivers+="ctr ecb"
Run Code Online (Sandbox Code Playgroud)