如何远程加密实时根文件系统并通过 ssh 解锁

如何远程加密实时根文件系统并通过 ssh 解锁

我有一个在 VPS 上运行的 Linux Arch 系统。 rootfs 安装在 LVM 分区上。我想在此分区上覆盖一个加密容器,然后在其上重新安装 rootfs 并通过 ssh 在启动时启用 ssh 解锁。我很高兴放弃现有 rootfs 的所有内容并从头开始创建一个新的。

我按如下方式进行:

  1. 在 /tmp/newroot 中创建一个新的临时 rootfs(我在拱门维基
  2. chroot 并设置 pacman,安装一些定义授权密钥的东西,启用但不启动 sshd
  3. 退出回到原来的根目录
  4. 永久切换到新根:以下建议这篇很棒的文章,我运行下面的代码。
  5. 此时,我想重新启动 sshd 和所有其他仍挂在旧根上的服务,该根位于 lvm 分区上
  6. 在lvm分区上创建加密分区
  7. 在其上安装arch Linux并适当修改intrafms

步骤 6 和 7 有详细记录(例如这里)。

以下是步骤 4 的详细信息,效果很好:

# we start after step 2, so that /tmp/newroot contains a minimal temporary root fs 
# with network, sshd and pacman, and the command prompt is from the original root

# move the new root fs to a newly create /tmproot, as per the referenced post
# (perhaps this is redundant, I could have used newroot directly, but it should not harm)
mkdir /tmp/tmproot
mount -t tmpfs none /tmp/tmproot
mv /tmp/newroot/* /tmp/tmproot

# switch to new root
mount -a
mount --make-rprivate / # necessary for pivot_root to work
pivot_root /tmp/tmproot /tmp/tmproot/oldroot

# move some directories to newroot
for i in dev proc sys run; do mount --move /oldroot/$i /$i; done

我被困在步骤 5 中。使用fuser -vm /oldroot我可以看到有很多进程仍然挂在旧的根分区上。如果我尝试使用从 newroot 重新启动它们systemctl,则会收到错误:

# systemctl restart sshd
Failed to restart sshd service: Failed to activate service 'org.freedesktop.systemd1': timed out

我可以手动杀死它们,但是我只剩下 init process systemd,而且似乎没有办法杀死它。systemctl daemon-reexec行不通的。

也许我忘记在文件系统中配置某些内容newroot?也许我应该使用switch_root而不是pivot_root

有什么建议吗?谢谢

答案1

看一眼https://wiki.archlinux.org/index.php/Dm-crypt/Specialties。您可以将 mkninitcpio 加密挂钩切换为 encryptssh,然后将一些内容添加到内核引导行中。我正在使用 dropbear 钩子,效果非常好。

相关内容