我使用 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 的/init
shell 脚本),它负责在将启动过程交给 Ubuntu 安装的实际 init 系统之前使根分区可用。
如果是dropbear
Initramfs 中的,则是由 启动的单独进程/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 的双因素?
当然,问题在于它不是标准的,因此虽然理论上可能更简单,但实际上可能更难设置。