如何在下次重新启动时自动解密加密的文件系统?

Tob*_*ias 19 encryption boot luks

目标

我正在寻找非交互式方式来解密根文件分区和下次系统重新启动时使用 LUKS 加密的交换分区。除此之外,我需要一种在重新启动后撤消它的方法,以便在再次重新启动后再次需要密码(甚至是新密码)。

系统使用LVM。

我不想在系统上输入密码,或者使用不同的系统来解锁它,它必须自己解锁一次。

我有它加密的密码,并且愿意将它以明文形式保存在硬盘上。我不关心这一步的安全性。

背景

我有一个部署 Ubuntu 的流程,它基于带有自定义预置和 kickstart 文件的 Ubuntu 服务器安装,kickstart 安装一个在第一次重新启动(并且仅第一次重新启动)后运行的服务,然后再次重新启动。我正在尝试在此流程中实现 LUKS 磁盘加密,但我需要它保持非交互性,因此它必须能够在没有密码的情况下首次重新启动。

安装时设置的密码是临时的,会被第一次重启后运行的服务更改,所以第一个密码可以明文存储。

在发布这个问题之前我已经研究过的事情

我已经做了我相当多的谷歌搜索来尝试解决这个问题,我发现的大部分内容都指向一个交换 initramfs 文件的解决方案。

我找到了多个资源来解释如何使用它来允许远程解锁系统,但我需要在没有交互的情况下进行。这是一个这样的资源:https : //hamy.io/post/0005/remote-unlocking-of-luks-encrypted-root-in-ubuntu-debian/

我认为我找到的最接近解决方案的是这个资源,它被认为是一种实现我想要的 VPS 解决方案的方法,但它只是一堆没有解释的命令,我不知道如何调整它:https : //dradisframework.com/pro/support/guides/customization/auto-unlock-luks-encrypted-drive.html

我还为 ArchLinux https://wiki.archlinux.org/index.php/Dm-crypt/System_configuration#cryptkey找到了这个资源,我尝试添加内核参数,但我也没有任何运气。不知道是不是因为LUKS不支持这些内核参数。

Tob*_*ias 19

解决方案似乎相当简单,在How to configure LVM & LUKS to autodecrypt partition?

这是我设法做到的

我的 /boot 分区是 /dev/sda1

我要解密的 LVM 卷是 /dev/sda3

我是 root 用户,但如果您不将 sudo 附加到所有命令。

首先制作一个带密码的密钥文件(我生成一个伪随机的)

dd if=/dev/urandom of=/boot/keyfile bs=1024 count=4
Run Code Online (Sandbox Code Playgroud)

然后为 root 设置读取权限,其他人没有任何权限

chmod 0400 /boot/keyfile
Run Code Online (Sandbox Code Playgroud)

然后将密钥文件添加为解锁密钥

cryptsetup -v luksAddKey /dev/sda3 /boot/keyfile
Run Code Online (Sandbox Code Playgroud)

(然后会提示您输入加密密码)

找到 /boot 分区的 uuid(这个不需要你是 root)

ls -l /dev/disk/by-uuid/
Run Code Online (Sandbox Code Playgroud)

这是外观的示例(这不是我从另一台机器上获取的实际输出)

test@test:~$ ls -l /dev/disk/by-uuid/
total 0
lrwxrwxrwx 1 root root 10 Jan 15 03:36 025c66a2-c683-42c5-b17c-322c2188fe3f -> ../../sda2
lrwxrwxrwx 1 root root 10 Jan 15 03:36 9e7a7336-3b81-4bbe-9f1a-d43415df1ccb -> ../../sda1
Run Code Online (Sandbox Code Playgroud)

然后用你最喜欢的编辑器编辑 /etc/crypttab

nano /etc/crypttab
Run Code Online (Sandbox Code Playgroud)

内容看起来像(同样,这是来自另一台机器)

sda3_crypt UUID=025c66a2-c683-42c5-b17c-322c2188fe3f none luks,discard
Run Code Online (Sandbox Code Playgroud)

你想要做的是你想用/dev/disk/by-uuid/[/boot 分区的 uuid]替换none并且你想用keyscript=/lib/cryptsetup/scripts/passdev替换丢弃

结果应该是这样的

sda3_crypt UUID=025c66a2-c683-42c5-b17c-322c2188fe3f /dev/disk/by-uuid/9e7a7336-3b81-4bbe-9f1a-d43415df1ccb luks,keyscript=/lib/cryptsetup/scripts/passdev
Run Code Online (Sandbox Code Playgroud)

保存文件并继续更新 initramfs

update-initramfs -u
Run Code Online (Sandbox Code Playgroud)

就是这样,您现在可以重新启动。

reboot
Run Code Online (Sandbox Code Playgroud)

再次删除它(如我所愿)

首先我确认系统只有两个密钥(原始密钥和新密钥文件)

cryptsetup luksDump /dev/sda3 | grep BLED
Run Code Online (Sandbox Code Playgroud)

这将生成与此类似的输出

Key Slot 0: ENABLED
Key Slot 1: ENABLED
Key Slot 2: DISABLED
Key Slot 3: DISABLED
Key Slot 4: DISABLED
Key Slot 5: DISABLED
Key Slot 6: DISABLED
Key Slot 7: DISABLED
Run Code Online (Sandbox Code Playgroud)

删除密钥槽 1 中的密钥(密钥文件)

cryptsetup luksKillSlot /dev/sda3 1
Run Code Online (Sandbox Code Playgroud)

然后系统会提示您输入加密密码(原始密码,而不是密钥文件中的密码)

然后删除实际的密钥文件

rm /boot/keyfile
Run Code Online (Sandbox Code Playgroud)

再次更新 initramfs

update-initramfs -u
Run Code Online (Sandbox Code Playgroud)

现在,当您重新启动时,系统将再次提示您输入密码。你完成了。

reboot
Run Code Online (Sandbox Code Playgroud)

  • 难道禁用密钥槽就足够了,这样我就可以将密钥文件和其他所有东西留在原处,以便我再次需要它吗?然后我只需重新启用密钥插槽进行 1 次重启,然后再禁用。 (2认同)
  • 当我运行 `lsblk /dev/sda` 时,我看到我有一个 `/boot` 分区和一个 `/boot/efi` 分区。如果我遵循此方法,我应该使用哪一种? (2认同)