首先,我知道将密钥存储在一根棍子上不太安全,但我很懒,所以我会带着植入式 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 棒的模块。