在无头服务器上使用 LUKS 进行完整系统加密 - 使用 dropbear 和 busybox 解锁。如何操作?

在无头服务器上使用 LUKS 进行完整系统加密 - 使用 dropbear 和 busybox 解锁。如何操作?

我使用 cryptsetup/LUKS 加密了一台无头服务器。2
个硬盘驱动器,/dev/md0 上有 512 MB /boot,/dev/md1 上有 1.61 TB LUKS 加密,LVM 包含 /、swap 和其他内容。
我安装了 dropbear(并且 busybox 已经安装)以在启动过程中解锁所有内容。我使用 GRUB2。

到目前为止一切正常。我可以使用私钥登录监听端口 22 的 dropbear,并使用以下命令解锁 LUKS

echo -n "passphrase" > /lib/cryptsetup/passfifo

一旦我这样做了,服务器就会启动,就好像没有加密一样。这正是我想要的。

现在,虽然这可以正常工作,但这不是我想要的工作方式。
首先,我找不到有关 /lib/cryptsetup/passfifo 的任何文档。它到底是如何工作的?其次,我使用 GPG 生成了一个密钥文件(也是一个使用 cryptsetup 作为环回设备的密钥文件),我想使用它来代替密码。但我找不到任何关于如何在 busybox 中执行此操作的文档。GPG 似乎没有安装,所以我无法使用该密钥(我能否以某种方式让 GPG 可用于 busybox?)

所以目前,我解锁系统的唯一方法是将我的密码传递给我不想使用的 /lib/cryptsetup/passfifo。我尝试直接在其 busybox 路径中使用 cryptsetup,例如

cryptsetup luksOpen /dev/md1 cryptdisk

我没有显示任何错误,但我的系统没有继续启动。

有什么想法我可以做什么,或者我处理这个问题的方法有什么问题吗?

坦率

答案1

抱歉,这更像是评论而不是答案。但由于您尚未收到任何回复,所以我还是想写点什么。

至于它是如何工作的:

在 Initramfs 中,您通常有一个主进程(通常是基于 busybox 的/initshell 脚本),它负责在将启动过程交给 Ubuntu 安装的实际 init 系统之前使根分区可用。

如果是dropbearInitramfs 中的,则是由 启动的单独进程/init。登录 dropbear 后,您将获得一个 shell,这是另一个进程。与此同时,原始进程/init必须一直运行并等待某些东西,在本例中是 LUKS 密码。

因此/init,一旦启动 dropbear,脚本最有可能在此处执行的操作是创建一个命名管道或 fifo,即。然后它从该命名管道读取。此读取将阻塞,直到实际有内容可读取,因此这就是挂起并等待输入的/lib/cryptsetup/passfifo方式。/init

几年后,您登录dropbear并执行echo passphrase > /lib/cryptsetup/passfifo,此时/init它从沉睡中醒来并恢复解锁 LUKS 并继续其余的启动过程。

这就是它的基本工作原理。如果没有相关文档,则必须阅读 shell 脚本。

至于 Initramfs 中的 GPG 加密密钥,我确信这在某种程度上是 Ubuntu 中的标准方法,可能通过 进行设置/etc/crypttab。您是否在 wiki 上查找了操作方法?

它当然需要将 GPG 包含在 Initramfs 中。但我在这里概述了一种替代方法,该方法无需额外的依赖即可工作:

如何将 dm-crypt(LUKS)与 GnuPG 结合使用以实现 FDE 的双因素?

当然,问题在于它不是标准的,因此虽然理论上可能更简单,但实际上可能更难设置。

相关内容