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
答案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"