配置 Ubuntu 22.04 (ZFS) 通过 USB 驱动器启动时自动 LUKS 解锁

Bob*_*ina 7 encryption usb luks zfs cryptsetup

我刚刚安装了 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
Run Code Online (Sandbox Code Playgroud)

我不知道如何从这里继续!

Bob*_*ina 2

视频演练

\n

更新:2023 年 11 月 30 日:更新到 22.04.3 后,zfs 脚本似乎已重置为其默认值。如果您受到影响,请再次运行步骤 13。

\n

更新:2023 年 2 月 23 日:从 22.04.1 更新到 22.04.2 后,zfs 脚本似乎已重置为默认值。如果使用此解决方案,请记住这一点。

\n
    \n
  1. 使用 ZFS 安装 Ubuntu 22.04 桌面并使用 Ubuntu 安装程序进行加密。确保安全地记录加密密码以供后续步骤使用。我没有在安装程序中设置恢复密钥,因此我不知道使用恢复密钥时这些步骤是否有效。YMMV。

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

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

    \n
  6. \n
  7. 启动终端并键入以下命令切换到 root,然后切换到 USB 驱动器:

    \n
    sudo su\ncd /media/<yourusername>/linux-key\nls -la\n
    Run Code Online (Sandbox Code Playgroud)\n
  8. \n
  9. 您应该列出一个空目录,显示 USB 驱动器是空的。

    \n
    root@ubuntu:/media/bob/linux-key$ ls -la\ntotal 29\ndrwx------  3 bob  bob   4096 Jan 25 15:07 .\ndrwxr-x---+ 3 root root     3 Jan 25 15:08 ..\ndrwx------  2 root root 16384 Jan 25 15:07 lost+found\n
    Run Code Online (Sandbox Code Playgroud)\n
  10. \n
  11. 键入以下命令以显示系统中的 LUKS 分区。我们需要修改的默认分区通常是/dev/zd0。确保运行以下命令时显示它。

    \n
    $ blkid --match-token TYPE=crypto_LUKS -o device\n/dev/sdc2\n/dev/zd0\n
    Run Code Online (Sandbox Code Playgroud)\n
  12. \n
  13. 创建新的加密密钥文件。

    \n
    dd if=/dev/urandom bs=1 count=256 > linux.key\n
    Run Code Online (Sandbox Code Playgroud)\n
  14. \n
  15. 确保密钥文件存在 \xe2\x80\x93 您应该在列表中看到该文件。

    \n
    $ ls -la\n-rw-rw-r--  1 root  root    256 Jan 25 15:10 linux.key\n
    Run Code Online (Sandbox Code Playgroud)\n
  16. \n
  17. 配置密钥文件以与分区配合使用,然后输入之前在安装程序中配置的解密密码。

    \n
    cryptsetup luksAddKey /dev/zd0 linux.key\n
    Run Code Online (Sandbox Code Playgroud)\n
  18. \n
  19. 通过确保键槽 1 已填充来检查钥匙插入是否成功。

    \n
    cryptsetup luksDump /dev/zd0;\n
    Run Code Online (Sandbox Code Playgroud)\n
        ...\n    Area offset:32768 [bytes]\n    Area length:258048 [bytes]\n    Digest ID:  0\n  1: luks2 <------------- the key you just added\n    Key:        512 bits\n    Priority:   normal\n    Cipher:     aes-xts-plain64\n    Cipher key: 512 bits\n    PBKDF:      argon2id\n    ...\n
    Run Code Online (Sandbox Code Playgroud)\n
  20. \n
  21. 调整密钥文件权限

    \n
    chmod 400 linux.key\n
    Run Code Online (Sandbox Code Playgroud)\n
  22. \n
  23. 接下来,导航到 initramfs 脚本文件夹并打开名为“zfs”的文件。您可以使用任何您想要的文本编辑器。(我nano在这个例子中使用)

    \n
    cd /usr/share/initramfs-tools/scripts\nnano zfs\n
    Run Code Online (Sandbox Code Playgroud)\n
  24. \n
  25. 找到以下行,并将其替换为以下文本。

    \n

    找到这一行

    \n
    echo "keystore-${pool} ${ks} none luks,discard" >> "${TABFILE}"\n
    Run Code Online (Sandbox Code Playgroud)\n

    替换为这个

    \n
    echo "keystore-${pool} ${ks} none luks,discard,tries=10,keyscript=/scripts/usb-unlock" >> "${TABFILE}"\n
    Run Code Online (Sandbox Code Playgroud)\n
  26. \n
  27. 保存并关闭文件。

    \n
  28. \n
  29. 在同一目录中创建一个名为“usb-unlock”的新文件。

    \n
    nano usb-unlock\n
    Run Code Online (Sandbox Code Playgroud)\n
  30. \n
  31. 粘贴此要点中的脚本 - 这会检查名为“linux-key”的 USB 驱动器分区,搜索名为 linux.key 的文件并尝试使用该文件来解密该分区。

    \n\n
  32. \n
  33. 保存并关闭文件。

    \n
  34. \n
  35. 调整usb-unlock脚本的权限

    \n
    chmod 755 usb-unlock\n
    Run Code Online (Sandbox Code Playgroud)\n
  36. \n
  37. 列出脚本的目录。确保您刚刚使用的两个文件属于具有 755 权限集的 root 用户。

    \n
    sudo su\ncd /media/<yourusername>/linux-key\nls -la\n
    Run Code Online (Sandbox Code Playgroud)\n
  38. \n
  39. 最后,更新 initramfs,以便它在启动时运行脚本。

    \n
    update-initramfs -u\n
    Run Code Online (Sandbox Code Playgroud)\n
  40. \n
  41. 重新启动计算机,确保 USB 驱动器已插入。如果插入,您不需要输入解密密码。如果丢失,脚本将回退到要求您输入密码。

    \n
  42. \n
\n