在 crypttab 中使用 cryptsetup passdev 超时

在 crypttab 中使用 cryptsetup passdev 超时

首先,我知道将密钥存储在一根棍子上不太安全,但我很懒,所以我会带着植入式 USB 驱动器到处跑 ;-)

场景如下。磁盘:

sda                                          8:0    0 931.5G  0 disk
├─sda1                                       8:1    0   487M  0 part  /boot
├─sda2                                       8:2    0     1K  0 part
└─sda5                                       8:5    0   931G  0 part
  └─sda5_crypt                             254:1    0   931G  0 crypt
    ├─marvserv--vg-root                    254:2    0 278.3G  0 lvm   /
    └─marvserv--vg-swap_1                  254:3    0   976M  0 lvm   [SWAP]
    
sdd                                          8:48   0   3.6T  0 disk
└─marvserver_encrypt-marvserv_encrypt_home 254:0    0   3.6T  0 lvm
  └─encrypt_home                           254:4    0   3.6T  0 crypt /mnt/encrypt_home

在启动过程中,两个设备都应该通过 passdev 或另一个 keyscript 传递存储在 usb 驱动器上的密钥文件中的密钥。不知何故 passdev 超时或 keyscript 无法正确解释密钥文件。

我使用 dd 为它们两个创建了一个密钥文件,然后相应地将密钥添加到设备 sda5_crypt 中,其中 b2552556-5eb6-11ed-9ecf-6b30b12a33e2.lek 和 encrypt_home 的 b2552556-5eb6-11ed-9ecf-6b30b12a33e2.lek。这两个密钥都有效,我已经使用实时系统仔细检查了这一点。第二个(不是 root...)可以在启动期间使用密钥文件加密,当挂载 usb 驱动器时,我在 crypttab 中输入了绝对路径,但对于另一个,它不起作用(cryptsetup:警告:跳过 root 目标 sda5_crypt:使用密钥文件)。肮脏的解决方案是在 crytsetup 处修改一些代码以避免出现警告,但每次更新 cryptsetup 时都必须这样做...

正确的解决方案是使用像 passdev 这样的密钥脚本(https://cryptsetup-team.pages.debian.net/cryptsetup/README.initramfs.html#the-passdev-keyscript) 例子:

cryptroot /dev/sda2 /dev/disk/by-label/myusbkey:/keys/root.key discard,cipher=aes-xts-plain64,size=256,hash=sha1,keyscript=passdev

这是我在第二个 vg 的 crypttab 中的条目:

encrypt_home UUID=7d9258cd-a71b-449c-bac8-f40a1a84d9f3 /dev/disk/by-uuid/E622-586F:b2552556-5eb6-11ed-9ecf-6b30b12a33e2.lek luks,discard,keyscript=/lib/cryptsetup/scripts/passdev

我也尝试过类似的更改,例如 /dev/disk/by-uuid/E622-586F:/b2552556-5eb6-11ed-9ecf-6b30b12a33e2.lek (添加斜线) /dev/disk/by-uuid/E622-586F:/b2552556-5eb6-11ed-9ecf-6b30b12a33e2 (删除 lek)以及另一个关键脚本(https://tqdev.com/2022-luks-with-usb-unlock

两次尝试都没有成功,所以要么是 passdev 超时,要么是使用的脚本(luksunlockusb)路径在 crypttab 中不是绝对的,它指的是 crypttab 中的第三个条目(b2552556-5eb6-11ed-9ecf-6b30b12a33e2):

encrypt_home UUID=7d9258cd-a71b-449c-bac8-f40a1a84d9f3 b2552556-5eb6-11ed-9ecf-6b30b12a33e2 luks,discard,keyscript=/bin/luksunlockusb

我还将以下四个模块添加到 /etc/initramfs-tools/modules 中:

vfat
nls_cp437
nls_ascii
usb_storage

每次在 crypttab 中发生更改后,我都会运行 update-initramfs -u

USB 驱动器已格式化,并且使用此脚本传输密钥: https://github.com/mevdschee/bitlocker-luks-tools/blob/main/create_usb.sh

密钥仅存储在具有读取标志且 root 作为所有者的根文件夹中,但如前所述,如果我通过 fstab 在启动时安装了 usb 并在 crypttab 输入绝对路径,那么到目前为止第二个磁盘就可以正常工作。

我是否需要添加任何模块,或者它是不同的语法,这里是我正在使用的 debian 版本:分销商 ID:Debian 描述:Debian GNU/Linux 11(bullseye)版本:11 代号:bullseye

//更新:在 crypttab 中使用以下行:

encrypt_home UUID=7d9258cd-a71b-449c-bac8-f40a1a84d9f3 /dev/disk/by-uuid/E622-586F:b2552556-5eb6-11ed-9ecf-6b30b12a33e2.lek luks,discard,keyscript=/lib/cryptsetup/scripts/passdev

检查它是否正常工作:

cryptdisks_start encrypt_home

也正在工作。Debian 通知

EXT4-fs (sde1): VFS:Can't find ext4 filesystem

但是 usb 棒的 fstype 是 vfat,fsver 是 FAT16,通过谷歌搜索,我发现如果在执行挂载时不指定类型,它会自动尝试。然而,在某个时候,他得到了正确的文件系统并解锁了加密的 lvm。因此,根据这些信息,感觉就像启动时缺少一个可以正确挂载 usb 棒的模块。

相关内容