我的目标是能够在紧急情况下轻松破坏带有密钥文件的介质并使系统无法启动,即使潜在的顾问知道系统的正确密码。我会将这个密钥文件存储在安全的地方,并在出现紧急情况后恢复它。我尝试使用命令添加密钥文件# cryptsetup luksAddKey /dev/<device>
,但没有达到我想要的效果。我想要 cryptsetup 需要密钥文件和密码,如果提供的话则不启动系统。我怎样才能在 cryptsetup 中实现这一点?
答案1
您可以创建一个超然的LUKS 标头:LUKS 标头元数据,即分离来自 LUKS 受保护数据,而不是在此数据之前。只需将其放在 USB 密钥等外部设备上即可:如果外部设备被破坏(并且没有可用的备份),即使知道键槽密码,也无法恢复数据。
从卢克斯扩展:
要指定分离标头,该
--header
参数可以在所有 LUKS 命令中使用,并且始终优先于位置参数。
您应该始终使用一些检测到的元数据(见下文)而不是直接引用此设备(例如/dev/sdb
:),以避免明显的致命错误(数据部分可能相同)。例如,假设您有一个 USB 密钥,在插入时标识如下并显示ls
:
lrwxrwxrwx. 1 root root 9 Feb 17 10:46 /dev/disk/by-id/usb-SomeBrand_SOMESERIAL -> ../../sdb
创建具有分离标头的 LUKS 分区,如下所示:
cryptsetup luksFormat /dev/datadevice --header /dev/disk/by-id/usb-SomeBrand_SOMESERIAL --verify-passphrase
将在 USB 设备上存储元数据(包括受密码保护的主密钥)。当然,您可以选择对 USB 闪存盘上的文件系统进行分区和格式化,并将标头作为该文件系统上的文件。我正在尝试最大限度地减少此示例的依赖性。您可能必须在安装时以某种方式手动执行此操作,因为任何安装程序可能都不支持它。
现在至少有一个区别:在这种情况下,默认情况下数据之前不再有空间,因此/dev/datadevice
甚至根本无法被检测为 LUKS,这可能是好的(隐秘的)也可能是坏的(自动脚本将遇到困难)正在努力解锁)。您仍然可以输入一个参数来获取通常的余量(--align-payload 4096
(通常cryptsetup luksDump /dev/... | grep ^Payload
在普通 LUKS 上使用时可以看到)),然后首先创建一个假的(以后从未使用过)LUKS 标头,以便进行检测(如果您确实愿意的话)。
然后您可以将相应的信息放入/etc/crypttab
:
myluksprotecteddata /dev/somedevice none luks,header=/dev/disk/by-id/usb-SomeBrand_SOMESERIAL
和/或直接使用 cryptsetup 命令解锁(只需添加--header=/dev/disk/by-id/usb-SomeBrand_SOMESERIAL
)选项。
警告:不保证与 systemd 的兼容性,尤其是启动方面的兼容性。