使用引导分区上的密钥文件解锁 LUKS 加密的 Debian 根目录

使用引导分区上的密钥文件解锁 LUKS 加密的 Debian 根目录

我正在尝试使用存储在启动分区(解密分区)中的密钥文件来解密 Debian 根目录。这会破坏安全性,但现在没关系。我必须成功地完成这件事,否则就会死去。

我已经创建了挂钩,initramfs密钥文件位于文件/boot内的目录中initrd.img-*。密钥文件 ( ) 的路径/boot/keyfile位于该/etc/crypttab文件上。

我更新了但收到了这条消息initramfssudo update-initramfs -ucryptsetup: WARNING: target sdaX_crypt uses a key file, skipped.

忽略该消息并重新启动会导致磁盘无法启动。该消息Gave up waiting for root device.将显示并落入initramfsshell。

initramfs环境中cryptsetup不存在。(应该存在吧?)

看到update-initramfs -u“认为”sdaX_crypt设备将以另一种方式安装,并且不配置为使用密钥文件解密。

我怎样才能做到这一点?

答案1

根据 Debian 的 cryptsetup 文档,与 KEYFILE_PATTERN 中定义的 shell 样式(通配)模式匹配的密钥文件/etc/cryptsetup-initramfs/conf-hook将包含在 initramfs 中,但其他密钥文件不会包含在内:

  • 对于 Debian 9:/usr/share/doc/cryptsetup/README.{initramfs,Debian}.gz
  • 对于 Debian 10 /usr/share/doc/cryptsetup{-initramfs/README.initramfs,-run/README.Debian}.gz:.

我不确定 Debian 的早期版本。

这些文件可以用 读取zless filename.gz,但这里是相关部分,以方便和将来参考。

12. 将密钥文件直接存储在 initrd 中

通常使用密钥文件的设备会被忽略(并发出响亮的警告),并且密钥文件本身不包含在 initrd 中,因为 initramfs 映像通常位于未加密的 /boot 分区上。然而,在某些情况下,需要将密钥文件包含在 initrd 中;例如,最新版本的 GRUB 支持从加密的块设备引导,从而允许加密的 /boot 分区。

在 crypttab(5) 列出的密钥文件中,那些与环境变量 KEYFILE_PATTERN(解释为 shell 模式)的值匹配的文件将包含在 initramfs 映像中。例如,如果 /etc/crypttab 列出了两个密钥文件 /etc/keys/{root,swap}.key,则可以将以下内容添加到 /etc/cryptsetup-initramfs/conf-hook 以将它们添加到 initrd。

KEYFILE_PATTERN="/etc/keys/*.key"

此外,如果 initramfs 映像要包含私钥材料,您将需要使用限制性 umask 来创建它,以阻止非特权用户。这可以通过将以下内容添加到 /etc/initramfs-tools/initramfs.conf 来实现。

乌玛斯克=0077

答案2

您可以改用keyscriptcrypttab 中的选项 (man crypttab)。只需创建一个与您的密码相呼应的脚本并将其设置为 keyscript 参数,然后重新生成您的 ramfs。你不需要任何钩子,也不需要将脚本放在/boot/中。

vg1-root_crypt UUID=94a3b301-123-12-a3-ea0403 none luks,keyscript=/etc/echo-root-luks-pass

我不知道为什么 cryptsetup 的 initramfs 挂钩禁止您只在 crypttab 中列出密钥文件。可能不想纵容这样的行为。

PS 我不认为它破坏了安全性,它只是或多或少地削弱了安全性,具体取决于 /boot 分区的安全性。例如,您可以关闭 USB 驱动器,并将 USB 放在袜子等中。

答案3

要真正忽略该消息并且不跳过分区,您需要(至少)注释掉/删除写入错误消息的行之后的return 1内容/usr/share/initramfs-tools/hooks/cryptroot(大约第 274 行 - 取决于所使用的 cryptsetup 版本)。请注意,该文件默认由程序包管理器管理,因此在 cryptsetup 程序包的任何更新时都会被覆盖。

另请阅读https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=776409 有关该问题的更多信息。

我还没有测试过,除了提到的不考虑密钥文件的大小写之外,可能还有其他原因。

答案4

我赞同@ignis的回答,但我想补充一点,要使其工作,您需要文件initramfs中的选项/etc/crypttab,如下所示:

# <target name> <source device>             <key file>          <options>
mapper-name     /etc/disk/by-id/scsi_xxxxx  /etc/keys/luks.key  luks,initramfs

Obs:我本来会对答案发表评论,但我还没有足够的声誉。

相关内容