我的一个朋友在全盘加密的磁盘上运行着没有 systemd 的 Debian(包括 /boot 与 / 使用 LVM 位于同一分区)。引导时会两次提示她输入加密密码:一次是 grub,一次是内核。我们的目标是只提示她一次。
我找到了一个本指南适用于基于 Arch 的 GNU/Linux,声称可以解决这个问题。但它不适用于基于 Debian 的 GNU/Linux,因为至少其中一个软件包有点不同。本指南的第 11 章解释了如何制作驱动器解锁后内核可以使用的密钥文件。这样,用户就会被提示一次。如何将这些步骤转换为基于 Debian 的发行版?以下是指南。
指导
启动并以 root 或您的用户身份登录。然后生成密钥文件:
# dd bs=512 count=4 if=/dev/urandom of=/etc/mykeyfile iflag=fullblock
将其插入 LUKS 卷:
# cryptsetup luksAddKey /dev/sdX /etc/mykeyfile
...并在出现提示时输入您的 LUKS 密码。编辑/etc/mkinitcpio.conf
以将密钥包含在 FILES 数组中,例如
FILES="/etc/mykeyfile"
从头开始创建 initramfs 映像:
# mkinitcpio -p linux-libre
# mkinitcpio -p linux-libre-lts
# mkinitcpio -p linux-libre-hardened
将以下内容添加到 grub.cfg 中的内核 (linux) 行——您现在知道该怎么做了,请参见上面! --,例如,root=/dev/matrix/rootvol
如果您遵循了本指南:
# cryptkey=rootfs:/etc/mykeyfile
最后,拒绝对密钥文件的读取访问,即使是 root:
# chmod 000 /etc/mykeyfile
答案1
至少在 Debian 11 上,如果您cryptsetup-initramfs
安装了该软件包,它的/usr/share/initramfs-tools/hooks/cryptroot
脚本将解析您的文件/etc/crypttab
,如果我正确地读取了脚本,将自动检测您的根文件系统是否位于应该由密钥文件解锁的加密容器上,并且将自动将密钥文件包含到 initramfs 中。
因此,在该cryptsetup luksAddKey
步骤之后,Debian 11 的等效步骤是确保cryptroot-initramfs
安装了软件包,将密钥文件定义添加到根文件系统的/etc/crypttab
行中,就像为某些非根文件系统设置 LUKS 容器一样。
使用与示例中相同的名称,该crypttab
行将是:
sdX_crypt /dev/sdX /etc/mykeyfile luks
或者更确切地说,为了稳健性,您确实应该使用 LUKS 卷的 UUID:
sdX_crypt UUID=... /etc/mykeyfile luks
然后跑update-initramfs -u -k all
。
这sdX_crypt
是一旦加密解锁后将用于访问加密内容的映射设备的名称。 Debian 安装程序将默认通过采用加密设备的基本名称并添加后缀来创建映射设备名称_crypt
,但我相信它也可以自定义。
由于您的朋友使用 LVM,因此您需要运行lsblk
并查看NAME
用于根和/boot
文件系统的 LVM 设备列:这些名称的形式为VGname-LVname
。您将需要该VGname
部分,然后pvs
以 root 身份运行并找到包含指定 VG 的 PV 的名称。那应该是类似的东西/dev/mapper/sdX_crypt
。
钩子脚本将由 执行update-initramfs
。它将从中获取信息/etc/crypttab
并自动添加密钥文件和必要的脚本片段以将其使用到 initramfs 中。
您无需添加启动选项 - 自动生成的 initramfs 脚本将嵌入所需的所有参数。
这您在评论中发布的链接当然可以使用,但你真的应该使用crypttab(5)
您的发行版的手册页以获得最准确的信息。
将保护设置为/etc/mykeyfile
至chmod 600
或更少是一个好主意。我不确定设置是否chmod 000
有用,但你可以尝试一下;最坏的情况,您只需要在下次启动时输入两次加密密码,然后重新调整权限并update-initramfs -u -k all
再次运行。