配置 Ubuntu 22.04 (ZFS) 透過 USB 驅動器啟動時自動 LUKS 解鎖

配置 Ubuntu 22.04 (ZFS) 透過 USB 驅動器啟動時自動 LUKS 解鎖

我剛剛安裝了 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。

  1. 使用 ZFS 安裝 Ubuntu 22.04 桌面並使用 Ubuntu 安裝程式進行加密。確保安全地記錄加密密碼以供後續步驟使用。我沒有在安裝程式中設定恢復金鑰,因此我不知道使用復原金鑰時這些步驟是否有效。 YMMV。

  2. 安裝後,格式化 USB 磁碟機並使用 ext4 標準建立新分割區(我在 Ubuntu 中使用磁碟實用程式)。將該分割區命名為“linux-key”。

  3. 確保 USB 隨身碟已安裝。使用「檔案」應用程式驗證 USB 是否已安裝在檔案視窗的左側欄中。

  4. 啟動終端機並鍵入以下命令切換到 root,然後切換到 USB 驅動器:

    sudo su
    cd /media/<yourusername>/linux-key
    ls -la
    
  5. 您應該列出一個空目錄,顯示 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
    
  6. 鍵入以下命令以顯示系統中的 LUKS 分區。我們需要修改的預設分割區通常是/dev/zd0。確保在執行以下命令時顯示它。

    $ blkid --match-token TYPE=crypto_LUKS -o device
    /dev/sdc2
    /dev/zd0
    
  7. 建立新的加密密鑰檔案。

    dd if=/dev/urandom bs=1 count=256 > linux.key
    
  8. 確保密鑰檔案存在 - 您應該在清單中看到該檔案。

    $ ls -la
    -rw-rw-r--  1 root  root    256 Jan 25 15:10 linux.key
    
  9. 設定金鑰檔案以與分割區配合使用,然後輸入先前在安裝程式中配置的解密密碼。

    cryptsetup luksAddKey /dev/zd0 linux.key
    
  10. 透過確保鍵槽 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
        ...
    
  11. 調整金鑰檔案權限

    chmod 400 linux.key
    
  12. 接下來,導航到 initramfs 腳本資料夾並開啟名為“zfs”的檔案。您可以使用任何您想要的文字編輯器。 (我nano在這個例子中使用)

    cd /usr/share/initramfs-tools/scripts
    nano zfs
    
  13. 找到以下行,並將其替換為以下文字。

    找到這一行

    echo "keystore-${pool} ${ks} none luks,discard" >> "${TABFILE}"
    

    替換為這個

    echo "keystore-${pool} ${ks} none luks,discard,tries=10,keyscript=/scripts/usb-unlock" >> "${TABFILE}"
    
  14. 儲存並關閉文件。

  15. 在同一目錄中建立一個名為「usb-unlock」的新檔案。

    nano usb-unlock
    
  16. 貼上此要點中的腳本 - 這會檢查名為「linux-key」的 USB 磁碟機分割區,搜尋名為 linux.key 的檔案並嘗試使用該檔案來解密該分割區。

  17. 儲存並關閉文件。

  18. 調整usb-unlock腳本的權限

    chmod 755 usb-unlock
    
  19. 列出腳本的目錄。確保您剛剛使用的兩個檔案屬於具有 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
    
  20. 最後,更新 initramfs,以便它在啟動時執行腳本。

    update-initramfs -u
    
  21. 重新啟動計算機,確保 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 的金鑰。

相關內容