我正在尝试使用存储在启动分区(解密分区)中的密钥文件来解密 Debian 根目录。这会破坏安全性,但现在没关系。我必须成功地完成这件事,否则就会死去。
我已经创建了挂钩,initramfs
密钥文件位于文件/boot
内的目录中initrd.img-*
。密钥文件 ( ) 的路径/boot/keyfile
位于该/etc/crypttab
文件上。
我更新了但收到了这条消息initramfs
:sudo update-initramfs -u
cryptsetup: WARNING: target sdaX_crypt uses a key file, skipped.
忽略该消息并重新启动会导致磁盘无法启动。该消息Gave up waiting for root device.
将显示并落入initramfs
shell。
在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
您可以改用keyscript
crypttab 中的选项 (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:我本来会对答案发表评论,但我还没有足够的声誉。