首先我要说的是,我对 LUKS 并不陌生。我曾多次使用密钥脚本设置 LUKS,无论是否使用 LVM。但我不确定这里到底发生了什么。我的系统有一个加密分区。我的驱动器组织如下:
# lsblk 名称 MAJ:MIN RM 大小 RO 类型 安装点 sda 8:0 0 128G 0 磁盘 └─sda1 8:1 0 128G 0部分 ─vg0-root 253:1 0 20G 0 lvm / ─vg0-安全 253:6 0 100M 0 lvm │ └─secure 253:7 0 98M 0 crypt /root/secure └─vg0-swap 253:4 0 1G 0 lvm [交换]
我的/etc/crypttab
文件看起来像这样
# 这里不需要 UUID,因为 LV 的路径不会改变 安全/dev/vg0/secure none luks,keyscript=/lib/cryptsetup/scripts/insecure
我的/lib/cryptsetup/scripts/insecure
文件是可执行的,看起来像这样
#!/bin/sh
# My actual file looks somewhat different because it dumps the key file with dd.
# This accomplishes virtually the same thing though.
echo -n "my-encryption-password"
在配置 crypttab 并将我的 keyscript 文件放到位后,我已运行update-initramfs -k all -u
多次。
据我所知,我的脚本文件甚至没有被复制到 initrd.img 文件中。现在我想起来,我认为它不会被复制到 initrd.img 文件中,因为根分区未加密,脚本文件应该很容易从那里访问。
重新启动后,系统会看到来自 crypttab 的记录并要求输入密码(在我的情况下,密码实际上并不存在,因为唯一的密钥是一个充满随机位的密钥文件),而不是使用密钥脚本来解锁 LUKS 分区。我曾尝试将 LUKS 从 LVM 中取出并将其放在 sda2 上,结果是一样的。我也知道密钥脚本有效,因为它cryptsetup luksOpen /dev/vg0/secure secure -d - <<< "$(/lib/cryptsetup/scripts/insecure)"
运行良好并解密了我的 LUKS 分区。
我在 Ubuntu 16.04.2 和 Ubuntu Mate 16.04.2 中尝试过此操作,结果相同。我以前使用过密钥脚本,没有任何问题。唯一的区别是,过去我的 / 分区始终是加密的。如果有人能提供一些信息,我将不胜感激。我只想要一个非常小的加密分区,因为我计划克隆这个系统,我不想在加密整个 / 分区的情况下克隆它。
更新时间 2017-04-26
在查看日志时,我发现一行包含以下错误,这毫无意义。从什么时候开始,“keyscript=/path/to/script” 成为 crypttab 的未知选项了?
... systemd-cryptsetup[737]: 遇到未知的 /etc/crypttab 选项“keyscript=/lib/cryptsetup/scripts/insecure”,请忽略。
只是为了好玩,我尝试删除 keyscript 选项并使用 keyfile,结果一切都正常!事实上,我尝试了其他选项,例如 keyfile-offset,它们也有效。因此,问题出在 keyscript 选项上。有人知道为什么吗?
答案1
尝试在 /etc/crypttab 中使用选项“initramfs”(根据https://unix.stackexchange.com/a/447676/356711)。/etc/crypttab
然后你的文件将会像这样:
# UUID is not required here since the path to the LV won't change
secure /dev/vg0/secure none luks,keyscript=/lib/cryptsetup/scripts/insecure,initramfs
请注意,您的根文件系统位于 LVM 容器中可能会出现问题。上面链接的文章中也提到了这个问题:“但目前只有当根设备不在 LVM 中时,此功能才可靠地起作用。“幸运的是,似乎已经提供了一种解决方法。
我的系统如下所示:
$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 931.5G 0 disk
└─sda1 8:1 0 931.5G 0 part
└─md1 9:1 0 931.4G 0 raid1
└─md1_crypt 253:3 0 931.4G 0 crypt
└─raid_crypt_vg-data_lv 253:4 0 931.4G 0 lvm /raid
sdb 8:16 0 931.5G 0 disk
└─sdb1 8:17 0 931.5G 0 part
└─md1 9:1 0 931.4G 0 raid1
└─md1_crypt 253:3 0 931.4G 0 crypt
└─raid_crypt_vg-data_lv 253:4 0 931.4G 0 lvm /raid
sdc 8:32 0 465.8G 0 disk
├─sdc1 8:33 0 953M 0 part /boot
└─sdc2 8:34 0 464.8G 0 part
└─sdc2_crypt 253:0 0 464.8G 0 crypt
├─system_crypt_vg-data_lv 253:1 0 447G 0 lvm /
└─system_crypt_vg-swap_lv 253:2 0 17.8G 0 lvm [SWAP]
...下面/etc/crypttab
就是解密的魔法使用密钥脚本(!)在 Ubuntu 18.04.2 LTS 中:
$ cat /etc/crypttab
# <target name> <source device> <key file> <options>
sdc2_crypt UUID=[...] none luks,discard,keyscript=/etc/decryptkeydevice/decryptkeydevice_keyscript.sh
md1_crypt /dev/md1 none luks,discard,keyscript=/etc/decryptkeydevice/decryptkeydevice_keyscript.sh,initramfs
sdc2_crypt
请注意,使用提供的密钥脚本解密有效没有initramfs 选项(因为它包含根 fs,因此在 initramfs 启动阶段“自动”考虑)。md1_crypt
在我添加 initramfs 选项后,它仅在 initramfs 启动阶段(因此根据 crypttab 条目使用密钥脚本)才被解密。在 systemd 启动阶段对 md1_crypt 的后续解密无法使用 crypttab 中给出的密钥脚本,因为“systemd cryptsetup”不支持选项密钥脚本,请参阅https://github.com/systemd/systemd/pull/3007。
答案2
您可以通过更改“/usr/share/initramfs-tools”目录将文件带到 initramfs。请参阅“man initramfs-tools”
例如,我只想在我的 keyscript 文件中使用“/lib/cryptsetup/scripts”中的“passdev”文件,因为此文件不在 initramsfs 中,所以我轻松编辑了“/usr/share/initramfs-tools/hooks/cryptroot”文件并添加了一个新行(“copy_exec /lib/cryptsetup/scripts/passdev”)并且它现在可以工作了。但请考虑通过更新 linux,它可能会消失。所以我认为更好的解决方案是在“/usr/share/initramfs-tools/conf-hooks.d”中编写一个用于复制的脚本