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
实际上,我不相信它会影响您的加密强度。
我已经检查了源代码,只要我解释的内容是正确的,您就不必担心这一点。
此代码属于模块“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某个模块需要某个模块时,就会发生这种情况。stdrng希望依赖的事物不应使用这些算法作为其 PRNG 源的基础。您可以使用以下命令查看哪些算法成功并通过了测试:
grep -EC5 'selftest.*passed' /proc/crypto
Run Code Online (Sandbox Code Playgroud)
您还可以使用“优先级”字段查看选择优先级。根据模块作者的说法,值越高,PRNG 越强。
所以,很高兴在这里犯错,因为我不认为自己是内核程序员,但总而言之 -
当stdrng加载时,它似乎从可接受的算法列表中选择其他算法,这些算法被认为比失败的算法强,而且无论如何都不太可能选择失败的算法。
因此,我相信在使用 luks 时这不会给您带来额外的风险。
我该如何修复它?
根据 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)
| 归档时间: |
|
| 查看次数: |
335 次 |
| 最近记录: |