“cryptsetup luksOpen <root device>”在掛起和恢復之間的數據失去安全
我正在 2021.12.x Arch Linux 安裝中設置掛起到磁碟並恢復。我的問題是關於恢復時安全(沒有數據失去)解鎖分區。
這是我的配置。引導載入程序是 grub 2.06,我使用的是基於 busybox 的 initramfs。相關分區如下。我沒有使用LVM。
# partition encrypted mountpoint decrypted volume name - --------- --------- ---------- --------------------- ... 3 root luks2 / cryptroot 4 swap luks2 [SWAP] cryptswap ...
在
/etc/mkinitcpio.conf
我已經配置了這些鉤子。HOOKS=(base udev ... openswap openroot ... resume ... filesystems fsck)
我沒有使用內置的加密鉤子。它只能解鎖一個設備(通常只有
cryptdevice
核心參數中指定的根設備),但我也需要解鎖加密的交換設備。因此,我使用了兩個自定義鉤子而不是加密鉤子:openswap 和 openroot。本質上,openswap 掛鉤執行:cryptsetup luksOpen <swap device> cryptswap
提示輸入密碼。openroot 掛鉤對根分區設備執行相同的操作:cryptsetup luksOpen <root device> cryptroot
.接下來,內置的 resume 掛鉤將交換設備的主要和次要編號寫入
/sys/power/resume
.printf "$devmajor:$devminor" >/sys/power/resume
此時有兩種情況。
場景一:完全關機後開機
完全關機後啟動電腦時,未鎖定的交換分區中沒有休眠映像。沒有可恢復的內容,因此會進行正常引導。此時根分區已解鎖(通過 openroot 掛鉤),因此可以正確進行引導。
在這種情況下沒有安全問題。
場景 2:如果在suspend-to-disk 之後啟動
早些時候,當我啟動磁碟掛起時,根分區將處於解鎖和掛載狀態,而休眠映像將按原樣擷取此狀態。現在,核心使用這個休眠映像恢復後,系統將繼續使用這個(已經)解鎖/掛載的根分區設備。
這就是我的問題出現的地方:
我知道*
mount
*在掛起和恢復之間的設備是不好的。例如,kernel.org 說:“如果您在掛起和恢復之間觸摸磁碟上的任何內容…………與您的數據告別。” 我的配置不這樣做。
cryptsetup luksOpen
在掛起和恢復之間的設備是否同樣糟糕?是否cryptsetup luksOpen
構成觸摸(上面的kernel.org術語)磁碟?回想一下 initramfs openroot 掛鉤cryptsetup luksOpen <root device> cryptroot
在掛起和恢復之間執行。如果是這樣,如何處理?
就其本身而言,它
cryptsetup luksOpen
是一個純粹的只讀操作。然而,簡單的解鎖塊設備的行為會觸發 udev 規則等依賴關係,這反過來可能會觸發自動組裝(對於 raid 和 lvm 設備),這反過來會創建更多的塊設備,進而觸發更多的 udev 規則等.所以最好通過以正確的順序執行鉤子來避免整個難題。
如果
resume
鉤子只需要交換分區(即不涉及其他交換設備或交換文件),resume
應該直接執行 afteropenswap
, beforeopenroot
。否則,您的設置也會給人一種虛假的安全感,因為它要求輸入根本不需要恢復的根加密密碼,並且無論如何最終都會被恢復丟棄。
除非您有停止執行的程式碼,否則對於掛起的系統,
resume
即使您反复輸入錯誤的掛鉤密碼,掛鉤也應該成功openroot
。因此,這是在更改掛鉤順序之前驗證該理論的一種簡單方法。