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

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

首先我要说的是,我对 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”中编写一个用于复制的脚本

相关内容