LUKS 密钥脚本被忽略...要求输入密码

b_l*_*shi 10 encryption boot luks 16.04

首先让我说我对 LUKS 并不陌生。无论有没有 LVM,我已经多次使用 keyscripts 设置了 LUKS。我不确定这里到底发生了什么。我有一个具有单个加密分区的系统。我的驱动器组织如下:

# lsblk

名称 MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
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   
  ? ??安全 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"
Run Code Online (Sandbox Code Playgroud)

update-initramfs -k all -u在配置 crypttab 并将我的 keyscript 文件放置到位后,我已经运行了很多次。

据我所知,我的脚本文件甚至没有被复制到 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 中尝试过,结果相同。我以前使用过keyscripts,没有任何问题。唯一的区别是,在过去,我的 / 分区始终是加密的。如果有人能阐明一些观点,我将不胜感激。我只想要一个很小的加密分区,因为我打算克隆这个系统,我不想在整个 / 分区加密的情况下克隆它。


更新 2017-04-26

在挖掘日志时,我发现一行带有以下毫无意义的错误。从什么时候开始,“keyscript=/path/to/script”是 crypttab 的未知选项?

... systemd-cryptsetup[737]:遇到未知的 /etc/crypttab 选项“keyscript=/lib/cryptsetup/scripts/insecure”,忽略。

只是为了好玩,我尝试删除 keyscript 选项并使用密钥文件,并且一切正常!事实上,我尝试了其他选项,如 keyfile-offset,它们也有效。因此,问题出在 keyscript 选项的某个地方。有谁知道为什么?

小智 6

尝试 /etc/crypttab 中的选项“initramfs”(根据https://unix.stackexchange.com/a/447676/356711)。你的/etc/crypttab会看起来像这样:

\n\n
# UUID is not required here since the path to the LV won\'t change\nsecure      /dev/vg0/secure       none      luks,keyscript=/lib/cryptsetup/scripts/insecure,initramfs\n
Run Code Online (Sandbox Code Playgroud)\n\n

请注意,您的根文件系统位于 LVM 容器中可能会出现问题。上面链接的文章中也提到了这个问题:“但目前只有当根设备不在 LVM 中时,此方法才有效(可靠)。 ”幸运的是,似乎提供了一种解决方法。

\n\n

我的系统看起来像这样:

\n\n
$ lsblk\nNAME                          MAJ:MIN RM   SIZE RO TYPE  MOUNTPOINT\nsda                             8:0    0 931.5G  0 disk\n\xe2\x94\x94\xe2\x94\x80sda1                          8:1    0 931.5G  0 part\n  \xe2\x94\x94\xe2\x94\x80md1                         9:1    0 931.4G  0 raid1\n    \xe2\x94\x94\xe2\x94\x80md1_crypt               253:3    0 931.4G  0 crypt\n      \xe2\x94\x94\xe2\x94\x80raid_crypt_vg-data_lv 253:4    0 931.4G  0 lvm   /raid\nsdb                             8:16   0 931.5G  0 disk\n\xe2\x94\x94\xe2\x94\x80sdb1                          8:17   0 931.5G  0 part\n  \xe2\x94\x94\xe2\x94\x80md1                         9:1    0 931.4G  0 raid1\n    \xe2\x94\x94\xe2\x94\x80md1_crypt               253:3    0 931.4G  0 crypt\n      \xe2\x94\x94\xe2\x94\x80raid_crypt_vg-data_lv 253:4    0 931.4G  0 lvm   /raid\nsdc                             8:32   0 465.8G  0 disk\n\xe2\x94\x9c\xe2\x94\x80sdc1                          8:33   0   953M  0 part  /boot\n\xe2\x94\x94\xe2\x94\x80sdc2                          8:34   0 464.8G  0 part\n  \xe2\x94\x94\xe2\x94\x80sdc2_crypt                253:0    0 464.8G  0 crypt\n    \xe2\x94\x9c\xe2\x94\x80system_crypt_vg-data_lv 253:1    0   447G  0 lvm   /\n    \xe2\x94\x94\xe2\x94\x80system_crypt_vg-swap_lv 253:2    0  17.8G  0 lvm   [SWAP]\n
Run Code Online (Sandbox Code Playgroud)\n\n

...下面使用密钥脚本/etc/crypttab执行解密魔法(!)在 Ubuntu 18.04.2 LTS 中

\n\n
$ cat /etc/crypttab\n# <target name> <source device>                           <key file> <options>\nsdc2_crypt      UUID=[...]                                none       luks,discard,keyscript=/etc/decryptkeydevice/decryptkeydevice_keyscript.sh\nmd1_crypt       /dev/md1                                  none       luks,discard,keyscript=/etc/decryptkeydevice/decryptkeydevice_keyscript.sh,initramfs\n
Run Code Online (Sandbox Code Playgroud)\n\n

请注意,sdc2_crypt使用提供的密钥脚本进行解密无需initramfs 选项(因为它包含根 fs,因此在 initramfs 引导阶段“自动”考虑)。md1_crypt在我添加 initramfs 选项之后,仅在 initramfs 启动阶段(因此根据 crypttab 条目使用密钥脚本)才被解密。稍后在 systemd 启动阶段对 md1_crypt 的解密不适用于 crypttab 中给出的密钥脚本,因为“systemd cryptsetup”不支持选项密钥脚本,请参阅https://github.com/systemd/systemd/pull/3007

\n