LUKS 將密鑰文件儲存在加密的 USB 驅動器中
我已經問過一次關於Linux 中多個 HDD 的 LUKS 解鎖:LUKS 和多個硬碟驅動器。
現在我想知道如何安全儲存用於關聯分區自動解鎖的密鑰文件。
我的計劃是(如果可能的話):
- 使用需要密碼的 LUKS 加密小型 USB 驅動器
- 使用密碼在啟動時將其解鎖為第一個驅動器
- 將其掛載到給定的掛載點,例如 /test(這可能嗎?)
- 現在可以安全地讀取密鑰文件:/test/keyfile
- 使用密鑰文件解鎖其他驅動器,無需詢問密碼
- Luks 在其他驅動器解鎖後關閉 USB 驅動器以確保一定程度的安全
- 像往常一樣自動掛載 /、/usr、/var 和其他掛載點
這能行嗎?基本上,我將 LUKS 密鑰文件儲存在密碼加密的 LUKS USB 驅動器上,該驅動器只要求輸入一次密碼,而所有其他驅動器無需進一步操作即可解鎖。我不確定是否有某種方法可以首先解鎖 USB 驅動器,然後安裝,然後其他驅動器才會嘗試訪問密鑰文件。此外,在涉及自動化的方面,我認為 /etc/fstab 和 /etc/crypttab 應該可以在安裝其他驅動器之前訪問,但如果整個 / 文件系統是 LUKS 加密的,則這是不可能的。
除非有可能完全手動配置 LUKS 的工作方式:
- LuksOpen /dev/sdc1 usb_keyfile
- mount /dev/mapper/usb_keyfile /keyfile (這可能嗎?)
- LuksOpen –keyfile /keyfile/key /dev/sda1 disk1
- LuksOpen –keyfile /keyfile/key /dev/sdb1 disk2
- LuksClose /dev/sdc1
基本上能夠在載入所需模組後執行 shell 腳本並禁用自動 LUKS 密碼提示。
其他細節
- 使用的發行版:Gentoo GNU/Linux (amd64) 或 Debian GNU/Linux (amd64) 因為我想將此過程應用於多個安裝
你的方法看起來不錯。不過有一些評論:
- 如果你想加密 rootfs,你需要使用 initrd(有一些最小的未加密系統來處理加密的分區)。
如果 USB 設備是可移動的,則 initrd 和核心都可以儲存在 USB 上以提高防篡改能力(假設您確保 USB 不會落入未經授權的人手中)——這通常是加密 rootfs 的原因。一旦核心和 initrd 都位於可移動媒體上,您可以確保沒有人通過簡單地刪除媒體來更改正在執行的系統中的核心(或 initrd)。
如果您想將其安裝在伺服器中,這當然不是一種選擇,但問題是,擁有這樣的設備是否有意義,而不是在其中一個硬碟驅動器上使用小分區。例如,如果機器中的所有驅動器都在 RAID 中,則可能還想將 rootfs 放在 USB 上。順便說一下,內部連接的 USB 快閃記憶體設備的一個有趣的替代方案可能是通過適配器連接到 ATA 介面的 CompactFlash 卡。
一些發行版為加密根提供了準備好的解決方案,而另一些則沒有 - 但主要是在它嘗試掛載“真正的”根之前將幾行放入 initrd 腳本中(參見例如手冊頁
pivot_root
,通常在第 2 節中( syscall)和 8(bonary),如果您不熟悉該過程)。
- 請記住備份密鑰和密碼,以防您的 USB 驅動器當機。LUKS 在損壞其標頭時採用了相當片面的方法 - 一旦其標頭的單個扇區(更準確地說是鍵槽)死亡,您將無法安裝它。這是為了確保擦除標頭不會被設備本身執行的塊重新分配有效地阻止(因為這是基於快閃記憶體的設備經常做的事情) - 密鑰分佈在整個密鑰插槽上,需要所有重建它的數據 - 沒有冗餘。有關更深入的討論,請參閱Clemens Fruwirth 的網站。
也就是說,也許 USB 上的一個簡單加密設備就足夠了(查看參考資料
PLAIN MODE
中的部分man cryptsetup
)。或使案例如加密的文件openssl enc
。即使對於加密分區本身,前者實際上也可能是一種選擇。