我剛剛安裝了 Ubuntu 22.04 並使用了安裝程式中的 ZFS+LUKS 全驅動器加密選項。
我一直在網上搜尋一種方法,將驅動器配置為在檢測到 USB 密鑰(USB 記憶棒上的 LUKS 解鎖密鑰)時在啟動時自動解鎖,而不是每次啟動系統時輸入解密密碼。
我找到了大量的指南,但它們的說明似乎都不適用於 22.04 在使用 ZFS 和 LUKS 時在磁碟機上設定分割結構的方式。
我正在關注的最接近的指南在這裡: https://tqdev.com/2022-luks-with-usb-unlock
一切似乎都很順利,直到我必須將金鑰添加到 LUKS 驅動器(第六步) - 因為有兩個驅動器被列為 LUKS 驅動器。
root@bob-home-linux:~# sudo blkid --match-token TYPE=crypto_LUKS -o device
/dev/sdc2
/dev/zd0
我不知道如何從這裡繼續下去!
答案1
影片演練:
更新:2024 年 3 月 20 日:當 ubuntu 進行點發布(例如:22.04.3 > 22.04.4)時,這些變更將會重置,並需要再次重做步驟 13 和步驟 20。
使用 ZFS 安裝 Ubuntu 22.04 桌面並使用 Ubuntu 安裝程式進行加密。確保安全地記錄加密密碼以供後續步驟使用。我沒有在安裝程式中設定恢復金鑰,因此我不知道使用復原金鑰時這些步驟是否有效。 YMMV。
安裝後,格式化 USB 磁碟機並使用 ext4 標準建立新分割區(我在 Ubuntu 中使用磁碟實用程式)。將該分割區命名為“linux-key”。
確保 USB 隨身碟已安裝。使用「檔案」應用程式驗證 USB 是否已安裝在檔案視窗的左側欄中。
啟動終端機並鍵入以下命令切換到 root,然後切換到 USB 驅動器:
sudo su cd /media/<yourusername>/linux-key ls -la
您應該列出一個空目錄,顯示 USB 隨身碟是空的。
root@ubuntu:/media/bob/linux-key$ ls -la total 29 drwx------ 3 bob bob 4096 Jan 25 15:07 . drwxr-x---+ 3 root root 3 Jan 25 15:08 .. drwx------ 2 root root 16384 Jan 25 15:07 lost+found
鍵入以下命令以顯示系統中的 LUKS 分區。我們需要修改的預設分割區通常是/dev/zd0。確保在執行以下命令時顯示它。
$ blkid --match-token TYPE=crypto_LUKS -o device /dev/sdc2 /dev/zd0
建立新的加密密鑰檔案。
dd if=/dev/urandom bs=1 count=256 > linux.key
確保密鑰檔案存在 - 您應該在清單中看到該檔案。
$ ls -la -rw-rw-r-- 1 root root 256 Jan 25 15:10 linux.key
設定金鑰檔案以與分割區配合使用,然後輸入先前在安裝程式中配置的解密密碼。
cryptsetup luksAddKey /dev/zd0 linux.key
透過確保鍵槽 1 已填滿來檢查鑰匙插入是否成功。
cryptsetup luksDump /dev/zd0;
... Area offset:32768 [bytes] Area length:258048 [bytes] Digest ID: 0 1: luks2 <------------- the key you just added Key: 512 bits Priority: normal Cipher: aes-xts-plain64 Cipher key: 512 bits PBKDF: argon2id ...
調整金鑰檔案權限
chmod 400 linux.key
接下來,導航到 initramfs 腳本資料夾並開啟名為“zfs”的檔案。您可以使用任何您想要的文字編輯器。 (我
nano
在這個例子中使用)cd /usr/share/initramfs-tools/scripts nano zfs
找到以下行,並將其替換為以下文字。
找到這一行
echo "keystore-${pool} ${ks} none luks,discard" >> "${TABFILE}"
替換為這個
echo "keystore-${pool} ${ks} none luks,discard,tries=10,keyscript=/scripts/usb-unlock" >> "${TABFILE}"
儲存並關閉文件。
在同一目錄中建立一個名為「usb-unlock」的新檔案。
nano usb-unlock
貼上此要點中的腳本 - 這會檢查名為「linux-key」的 USB 磁碟機分割區,搜尋名為 linux.key 的檔案並嘗試使用該檔案來解密該分割區。
儲存並關閉文件。
調整usb-unlock腳本的權限
chmod 755 usb-unlock
列出腳本的目錄。確保您剛剛使用的兩個檔案屬於具有 755 權限集的 root 使用者。
$ ls -la # you should see these files... -rwxr-xr-x 1 root root 550 Dec 22 20:38 usb-unlock -rwxr-xr-x 1 root root 31665 Dec 22 20:40 zfs
最後,更新 initramfs,以便它在啟動時執行腳本。
update-initramfs -u
重新啟動計算機,確保 USB 驅動器已插入。如果插入,您不需要輸入解密密碼。如果遺失,腳本將回退到要求您輸入密碼。
答案2
它隱藏在 initramfs 中——zfs-initramfs
確切地說是在包中。
查看 /usr/share/initramfs-tools/script/zfs 並找到以下行:
# Open and mount luks keystore for any pools using one
行為如下:
導入池(例如rpool
)後,其中的未加密磁碟區(zvol)可用作/dev/zvol/rpool/keystore
。
此 zvol 設備仍處於加密狀態。
這些 luks 加密的 zvol ( zfs list -t volume
) 的 crypttab 條目是在引導期間動態建立到 /cryptroot/crypttab 中的。
然後向使用者查詢這些條目的密碼。
然後,設備將被解鎖,並將以未加密的方式安裝在/run/rpool/keystore
。
由於 rpool 本身已加密且其金鑰位置指向此位置,因此可以載入 rpool 的金鑰並且可以繼續啟動程序。
也許有人應該正確記錄這一點;)
至於您最初的問題,您可以嘗試使用 initramfs 的可能擴充點來調整行為,以/etc/initramfs-tools/scripts/local-*/
執行相同的操作,並使用 USB 裝置中的密碼自行安裝 zvol 或直接以某種方式提供 rpool 的金鑰。