引導期間的 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
我該如何解決?
根據 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 狀態。如果測試失敗,我想(我找不到產生這種行為的位)如果您通過正確的標誌,則無法選擇搜尋。
測試是否通過肯定是內部儲存的。
除此之外,呼叫偽隨機數生成器會導致算法列表按照強度順序迭代 prngs
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 時這不會給您帶來額外的風險。