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

Fra*_*nkM 6 encryption boot luks busybox cryptsetup

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

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

echo -n "passphrase" > /lib/cryptsetup/passfifo
Run Code Online (Sandbox Code Playgroud)

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

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

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

cryptsetup luksOpen /dev/md1 cryptdisk
Run Code Online (Sandbox Code Playgroud)

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

我能做什么,或者我的处理方法有问题吗?

坦率

fro*_*utz 1

抱歉,这更多的是评论而不是答案。但既然你还没有收到任何回复,我还是想写点东西。

至于它是如何工作的:

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

在 Initramfs 中dropbear,这是一个由 启动的单独进程/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?

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