配置 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. 使用 Ubuntu 安装程序安装使用 ZFS 和加密的 Ubuntu 22.04 桌面。确保安全记录加密密码以供后续步骤使用。我没有在安装程序中设置恢复密钥,所以我不知道这些步骤在使用恢复密钥时是否有效。YMMV。

  2. 安装后,格式化 USB 驱动器并使用 ext4 标准创建一个新分区(我使用了 Ubuntu 中的磁盘实用程序)。将该分区命名为“linux-key”。

  3. 确保 USB 驱动器已安装。使用“文件”应用程序验证 USB 是否已安装在文件窗口的左侧列中。

  4. 启动终端并输入以下命令切换到根目录,然后切换到 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 加密的 zvols () 的 crypttab 条目zfs list -t volume是在启动期间动态创建到 /cryptroot/crypttab 中的。

然后向用户查询这些条目的密码。

然后设备将被解锁并以未加密的形式安装/run/rpool/keystore

由于 rpool 本身是加密的,并且其密钥位置指向此位置,因此可以加载 rpool 的密钥并继续启动过程。

也许有人应该正确地记录下来;)


至于您最初的问题,您可以尝试使用 initramfs 的可能扩展点来调整行为以/etc/initramfs-tools/scripts/local-*/执行相同的操作,并使用来自 USB 设备的密码自行挂载 zvol,或者以某种方式直接提供 rpool 的密钥。

相关内容