Linux

引導期間的 LUKS 錯誤

  • September 30, 2016
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 句柄

我該如何解決?

根據 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"

很明顯,我認為它不會影響您的加密強度。

我已經檢查了原始碼,只要我解釋了我讀對的內容,您就不必擔心這一點。

此程式碼屬於模組“stdrng”。至少在 Fedora 23 上,這是內置在核心中的,而不是作為核心模組導出的。

當第一次初始化 stdrng 時,會發生以下呼叫。

在 crypto/drbg.c 中,初始化從這裡開始。

1997 module_init(drbg_init);

這會註冊系統已知的所有 drbg。

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內置於核心中的模組接收插入新算法的通知。一旦它看到一個新的註冊算法,它就會安排對其進行測試。這就是產生您在螢幕上看到的輸出的原因。

測試完成後,算法進入 TESTED 狀態。如果測試失敗,我(我找不到產生這種行為的位)如果您通過正確的標誌,則無法選擇搜尋。

測試是否通過肯定是內部儲存的。

除此之外,呼叫偽隨機數生成器會導致算法列表按照強度順序迭代 prngscrypto/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 時這不會給您帶來額外的風險。

引用自:https://serverfault.com/questions/746733