我刚刚安装了 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。
使用 Ubuntu 安装程序安装使用 ZFS 和加密的 Ubuntu 22.04 桌面。确保安全记录加密密码以供后续步骤使用。我没有在安装程序中设置恢复密钥,所以我不知道这些步骤在使用恢复密钥时是否有效。YMMV。
安装后,格式化 USB 驱动器并使用 ext4 标准创建一个新分区(我使用了 Ubuntu 中的磁盘实用程序)。将该分区命名为“linux-key”。
确保 USB 驱动器已安装。使用“文件”应用程序验证 USB 是否已安装在文件窗口的左侧列中。
启动终端并输入以下命令切换到根目录,然后切换到 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 加密的 zvols () 的 crypttab 条目zfs list -t volume
是在启动期间动态创建到 /cryptroot/crypttab 中的。
然后向用户查询这些条目的密码。
然后设备将被解锁并以未加密的形式安装/run/rpool/keystore
。
由于 rpool 本身是加密的,并且其密钥位置指向此位置,因此可以加载 rpool 的密钥并继续启动过程。
也许有人应该正确地记录下来;)
至于您最初的问题,您可以尝试使用 initramfs 的可能扩展点来调整行为以/etc/initramfs-tools/scripts/local-*/
执行相同的操作,并使用来自 USB 设备的密码自行挂载 zvol,或者以某种方式直接提供 rpool 的密钥。