Arch-Linux

“cryptsetup luksOpen <root device>”在掛起和恢復之間的數據失去安全

  • December 18, 2021

我正在 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 &lt;swap device&gt; cryptswap 提示輸入密碼。openroot 掛鉤對根分區設備執行相同的操作:cryptsetup luksOpen &lt;root device&gt; cryptroot.

接下來,內置的 resume 掛鉤將交換設備的主要和次要編號寫入/sys/power/resume.

printf "$devmajor:$devminor" &gt;/sys/power/resume

此時有兩種情況。

場景一:完全關機後開機

完全關機後啟動電腦時,未鎖定的交換分區中沒有休眠映像。沒有可恢復的內容,因此會進行正常引導。此時根分區已解鎖(通過 openroot 掛鉤),因此可以正確進行引導。

在這種情況下沒有安全問題。

場景 2:如果在suspend-to-disk 之後啟動

早些時候,當我啟動磁碟掛起時,根分區將處於解鎖和掛載狀態,而休眠映像將按原樣擷取此狀態。現在,核心使用這個休眠映像恢復後,系統將繼續使用這個(已經)解鎖/掛載的根分區設備。

這就是我的問題出現的地方:

我知道*mount*在掛起和恢復之間的設備是不好的。例如,kernel.org 說:“如果您在掛起和恢復之間觸摸磁碟上的任何內容…………與您的數據告別。” 我的配置不這樣做。

cryptsetup luksOpen在掛起和恢復之間的設備是否同樣糟糕?是否cryptsetup luksOpen構成觸摸(上面的kernel.org術語)磁碟?回想一下 initramfs openroot 掛鉤cryptsetup luksOpen &lt;root device&gt; cryptroot在掛起和恢復之間執行。

如果是這樣,如何處理?

就其本身而言,它cryptsetup luksOpen是一個純粹的只讀操作。然而,簡單的解鎖塊設備的行為會觸發 udev 規則等依賴關係,這反過來可能會觸發自動組裝(對於 raid 和 lvm 設備),這反過來會創建更多的塊設備,進而觸發更多的 udev 規則等.

所以最好通過以正確的順序執行鉤子來避免整個難題。

如果resume鉤子只需要交換分區(即不涉及其他交換設備或交換文件),resume應該直接執行 after openswap, before openroot

否則,您的設置也會給人一種虛假的安全感,因為它要求輸入根本不需要恢復的根加密密碼,並且無論如何最終都會被恢復丟棄。

除非您有停止執行的程式碼,否則對於掛起的系統,resume即使您反复輸入錯誤的掛鉤密碼,掛鉤也應該成功openroot。因此,這是在更改掛鉤順序之前驗證該理論的一種簡單方法。

引用自:https://unix.stackexchange.com/questions/682935