带全盘加密的双 Ubuntu 安装

Tek*_*ngu 4 installation encryption grub2 dual-boot ecryptfs

我的目标是我想要一个 Xubuntu/Ubuntu 双启动,但有一个问题 - 我希望使用 dm-crypt (本机提供)整个磁盘加密来完全加密磁盘。现在我知道,开箱即用的 ubuntu 安装程序不会让这对我来说变得简单,也许这是不可行的,因为我不确定我最终能否欺骗这些工具为每个根文件系统创建两个不同的 initrd 配置。

所以问题:

  1. 以前有人这样做过吗?我是否缺少一种简单的方法来做到这一点?

  2. 给定 (1) 是负数... 我应该为每个安装(xubuntu/ubuntu)创建单独的基本加密卷,还是应该只创建 1 个加密卷并在其中单独安装分区?我倾向于后者以使过程更简单。但是我不确定引导加载程序将如何处理这个问题。

b. 一旦我安装了第一个发行版,如果我使用 1 个加密卷,我如何解密它并安装第二个发行版(并正确更新引导加载程序、initrd 等)?

我询问了 Security Stack Exchange 的安全方面的问题。

Aim*_*moE 5

我为 Ubuntu 22.04 Jammy Jellyfish添加了一个新答案。

\n

这是完整的帐户。

\n

我将这些步骤分为重新启动之间的阶段:

\n
    \n
  1. 预赛

    \n
  2. \n
  3. 备份您的数据

    \n
  4. \n
  5. 重新启动至 live-USB 以执行主要任务\na。预安装:在磁盘上腾出空间\nb。安装:手动分区\nc。安装后:补充initramfs

    \n
  6. \n
  7. 重新启动到主 Ubuntu 以更新 grub

    \n
  8. \n
  9. 重新启动到辅助 Ubuntu 以添加密钥文件

    \n
  10. \n
  11. 重新启动到辅助 Ubuntu 进行最后的润色

    \n
  12. \n
  13. 未来安装提醒

    \n
  14. \n
  15. 关于未加密的/boot

    \n
  16. \n
  17. 预赛

    \n
  18. \n
\n
\n

我在具有 BIOS 的笔记本电脑上完成了此操作(有关 UEFI 详细信息,请参阅带有加密 /boot 的 Ubuntu 全盘加密),并且已安装加密的 Ubuntu 15.10(但也可能是 14.04 LTS)。我重复了在早期的 16.04 上安装 Ubuntu 16.10 的过程,然后在早期的 16.10 上安装 18.04。但是,我必须删除用于 Bionic 安装的根 (/) 的逻辑卷的内容。每当我不删除它时,Ubiquity 或 update-initramfs 都会以各种方式失败。

\n

从 Cosmic 开始,默认为 LUKS2,grub 仅支持 LUKS1。因此,您不能从安装 Cosmic 或更高版本开始,并期望能够按照此处所述的方式在同一容器中添加另一个安装。相反,您必须手动进行分区并创建 LUKS1 容器才能以.

\n

我将通过标准 Ubuntu 安装在硬盘 /dev/sda 上创建的名称来引用分区和 LVM 卷:

\n
$ lsblk -o NAME,TYPE,FSTYPE,MOUNTPOINT\nNAME                    TYPE  FSTYPE      MOUNTPOINT\nsda                     disk              \n\xe2\x94\x9c\xe2\x94\x80sda1                  part  ext2        /boot\n\xe2\x94\x9c\xe2\x94\x80sda2                  part              \n\xe2\x94\x94\xe2\x94\x80sda5                  part  crypto_LUKS \n  \xe2\x94\x94\xe2\x94\x80sda5_crypt          crypt LVM2_member \n    \xe2\x94\x9c\xe2\x94\x80ubuntu--vg-root   lvm   ext4        /\n    \xe2\x94\x94\xe2\x94\x80ubuntu--vg-swap_1 lvm   swap        [SWAP]\n
Run Code Online (Sandbox Code Playgroud)\n

LUKS 容器“sda5_crypt”占用逻辑分区上的所有空间。缩小 LUKS 容器对我来说太困难了;我不想通过尝试破坏现有的 Ubuntu 安装。因此,我决定缩小逻辑卷“根”,为新安装腾出空间。

\n

因此,磁盘上唯一未加密的空间是 255M /boot 分区。可以分割这个分区,但是两个相等的一半只能容纳两个内核版本,对我来说这还不够。因此,我决定将新的 /boot 目录放置在新的 / 根目录下(不将其指向任何其他位置)。这会带来一些额外的复杂性,但也为与主 Ubuntu 一起进行多个安装留下了空间。

\n

以下所有命令都要使用 sudo 权限执行,因此我从所有命令行中跳过了 sudo 部分。

\n

另外,我将谈论“次要 Ubuntu”,因为我不知道您想要安装哪个 Linux。将“次要 Ubuntu”(以及任何特定于 Ubiquity 的详细信息)替换为您选择的风格。

\n
    \n
  1. 备份您的数据
  2. \n
\n
\n

除了正常备份之外,您可能还需要将基本设置(例如 /etc/crypttab)创建一个单独的副本到易于访问的位置。如果一切按计划进行,则不需要这样做,但可以帮助您保持冷静。

\n
    \n
  1. 重新启动至 live-USB 以执行主要任务
  2. \n
\n
\n

2.a. 预安装:在磁盘上腾出空间

\n

打开 LUKS 容器并激活 LVM。

\n
cryptsetup luksOpen /dev/sda5 sda5_crypt\nvgscan\nvgchange -ay\n
Run Code Online (Sandbox Code Playgroud)\n

缩小现有根卷。

\n
e2fsck -f /dev/mapper/ubuntu--vg-root\n#resize2fs -p /dev/mapper/ubuntu--vg-root 16G\nlvreduce -L 16G --resizefs /dev/ubuntu-vg/root\n
Run Code Online (Sandbox Code Playgroud)\n
    \n
  • 注释掉的行是为了防止您不信任“lvreduce --resizefs”能够可靠地执行调整大小位。如果它让您感觉好一些,请运行“resize2fs”。
  • \n
\n

添加新的根卷。尺寸由您选择;16G只是一个例子。

\n
lvcreate -L 16G -n root2 ubuntu-vg\n
Run Code Online (Sandbox Code Playgroud)\n

仅当您相信可以让 hibernate 与 LUKS 一起使用时,才创建新的交换。否则,让两个安装共享现有交换空间。

\n
lvcreate -L 4G -n swap2 ubuntu-vg\n
Run Code Online (Sandbox Code Playgroud)\n

创建新的数据卷似乎是一件显而易见的事情,但对于此处所述的安装来说,这并不是必需的。

\n
lvcreate -l 100%FREE -n data ubuntu-vg\n
Run Code Online (Sandbox Code Playgroud)\n

此时,新手可能希望在没有 live-USB 的情况下重新启动并登录到主 Ubuntu,只是为了看看它是否仍然有效。如果这样做,请记住在重新引导回 live-USB 时再次重新打开 LUKS 容器。

\n

另外,要注意使用正确的命令来打开LUKS容器。例如,如果您单击启动器侧栏中看到的图标,容器将以错误的名称打开,这将导致 update-initramfs 稍后无法完成其工作。

\n
cryptsetup luksOpen /dev/sda5 sda5_crypt\n
Run Code Online (Sandbox Code Playgroud)\n

2.b. 安装:手动分区

\n

启动安装程序并选择“其他”作为安装类型。

\n
    \n
  • 将 / 指向新的根卷 (/dev/ubuntu-vg/root2)。
  • \n
  • 不要将 /boot 指向任何地方。
  • \n
  • 如果您创建了交换卷,则将 swap 指向新的交换卷,否则指向旧的交换卷。
  • \n
  • 仔细检查是否没有其他分区或 LVM 卷参与安装。
  • \n
  • 将 grub 放在逻辑卷上。哪个卷并不重要,因为重点是确保 gub-install 失败。第一次,这是最安全的选择。稍后,当您多次这样做时,您就会确切地知道何时选择/dev/sda。
  • \n
\n

继续进行其余的安装。

\n
    \n
  • 如果安装程序询问是否应卸载安装,则说明您已经执行了此处未提及的操作。卸下额外的安装座。
  • \n
\n

安装结束后,选择继续测试。

\n
    \n
  • 当安装程序报告 grub 安装失败时,选择不使用 grub 继续安装。
  • \n
  • 如果弹出窗口卡住,只需最小化安装程序窗口即可。
  • \n
\n

2.c. 安装后:补充initramfs

\n

安装两个根卷。

\n
mkdir /mnt/newroot && mount /dev/mapper/ubuntu--vg-root2 /mnt/newroot\nmkdir /mnt/oldroot && mount /dev/mapper/ubuntu--vg-root /mnt/oldroot\n
Run Code Online (Sandbox Code Playgroud)\n

将文件 /etc/crypttab 从旧根卷复制到新根卷。

\n
cp -p /mnt/oldroot/etc/crypttab /mnt/newroot/etc/\ncat /mnt/newroot/etc/crypttab\n
Run Code Online (Sandbox Code Playgroud)\n

如果您复制的文件已引用密钥文件,请同时复制密钥文件和将密钥加载到 initrd.img 所需的脚本。

\n
cp -p /mnt/oldroot/crypto_keyfile.bin /mnt/newroot/\ncp -p /mnt/oldroot/etc/initramfs-tools/hooks/crypto_keyfile /mnt/newroot/etc/initramfs-tools/hooks/\n
Run Code Online (Sandbox Code Playgroud)\n
    \n
  • 第一次时,密钥尚不存在,最好在稍后的步骤中创建它,因为当不立即进行所有更改时,故障排除会更容易。
  • \n
\n

关键的最后一步是将更改加载到 chroot 监狱中的 initrd.img 中。

\n
for DEV in dev dev/pts sys proc; do mount --bind /$DEV /mnt/newroot/$DEV; done\n\nchroot /mnt/newroot update-initramfs -u\n\n# Note reverse order.\nfor DEV in proc sys dev/pts dev; do umount /mnt/newroot/$DEV; done\n
Run Code Online (Sandbox Code Playgroud)\n
    \n
  • 如果您收到一条错误消息“cryptsetup: WARNING: invalid line in /etc/crypttab”,则表明您没有使用正确的名称打开 LUKS 容器。
  • \n
\n

整理(不是 100% 必要,特别是如果您在创建 live-USB 时没有选择持久性)。

\n
umount /mnt/oldroot && rmdir /mnt/oldroot\numount /mnt/newroot && rmdir /mnt/newroot\n
Run Code Online (Sandbox Code Playgroud)\n

您还可以尝试通过关闭 LUKS 容器来进行整理,但如果您必须最小化安装程序窗口,您将收到一条错误消息,指出“设备或资源繁忙”。别担心,反正关机时它也会关闭。

\n
cryptsetup luksClose sda5_crypt\n
Run Code Online (Sandbox Code Playgroud)\n
    \n
  • 最困难的部分现在已经结束了。
  • \n
\n
    \n
  1. 重新启动到主 Ubuntu 以更新 grub
  2. \n
\n
\n

编辑文件 /etc/default/grub 以使加密的 /boot 包含:

\n
GRUB_ENABLE_CRYPTODISK=y\nGRUB_CMDLINE_LINUX="cryptdevice=/dev/sda5:sda5_crypt"\n
Run Code Online (Sandbox Code Playgroud)\n
    \n
  • 如果将 GRUB_ENABLE_CRYPTODISK 的值设置为“true”或“1”或其他任何值,update-grub 会抱怨该值应该为“1”,但实际上必须为“y”。这是一个已知的错误。
  • \n
  • 像往常一样,请注意不要在文件末尾添加换行符。
  • \n
\n

接下来,更新grub——主要是将新安装的Ubuntu添加到菜单中,同时也用于修改设置。

\n
update-grub\n
Run Code Online (Sandbox Code Playgroud)\n
    \n
  1. 重新启动到辅助 Ubuntu 以添加密钥文件
  2. \n
\n
\n

当您从 grub 菜单中选择辅助 Ubuntu 时,系统会要求您输入密码来打开 LUKS 容器。然后系统会再次要求您输入相同的密码。\n登录后,我们需要解决必须输入两次密码的问题。我们通过向 LUKS 容器添加密钥文件来实现此目的。

\n

首先,我们想知道 LUKS 容器已有多少个密钥。一个 LUKS 容器最多可以有八个密钥(编号为 0..7),因此我们只想创建我们真正需要的密钥。

\n
cryptsetup luksDump /dev/sda5\n
Run Code Online (Sandbox Code Playgroud)\n
    \n
  • 在《狡猾的狼人》中,容器已经拥有三把钥匙。不知道为什么。
  • \n
\n

接下来,我们创建新的密钥文件。

\n
dd bs=512 count=4 if=/dev/urandom of=/crypto_keyfile.bin\nchmod a=,u+r /crypto_keyfile.bin\n
Run Code Online (Sandbox Code Playgroud)\n

然后我们将新密钥添加到容器中。该命令将作为现有密码,因此请输入您知道的密码。

\n
cryptsetup luksAddKey /dev/sda5 /crypto_keyfile.bin\n
Run Code Online (Sandbox Code Playgroud)\n

我们仍然需要一个 update-initramfs 运行的脚本来加载 initrd.img 的密钥。将文件放置在 /etc/initramfs-tools/hooks/ 中,并设置其保护。

\n
chmod +x /etc/initramfs-tools/hooks/crypto_keyfile\n
Run Code Online (Sandbox Code Playgroud)\n

该脚本只需包含一行:

\n
cp /crypto_keyfile.bin "${DESTDIR}"\n
Run Code Online (Sandbox Code Playgroud)\n
    \n
  • 脚本的名称以及密钥文件的名称由您决定。
  • \n
\n

我们还必须添加对 /etc/crypttab 密钥的引用。修改前是这样的:

\n
sda5_crypt UUID=sda5-uuid-here none luks,discard\n
Run Code Online (Sandbox Code Playgroud)\n

修改后应该是这样的:

\n
sda5_crypt UUID=sda5-uuid-here /crypto_keyfile.bin luks,discard,keyscript=/bin/cat\n
Run Code Online (Sandbox Code Playgroud)\n

现在我们终于准备好更新 initramfs 了:

\n
update-initramfs -u\n
Run Code Online (Sandbox Code Playgroud)\n
    \n
  1. 重新启动到辅助 Ubuntu 进行最后的润色
  2. \n
\n
\n

这次,当您从 grub 菜单中选择辅助 Ubuntu 时,您只需输入 LUKS 密码一次。

\n

将密钥文件复制到旧根卷进行备份。

\n
mkdir /mnt/oldroot\nmount /dev/mapper/ububtu--vg-root /mnt/oldroot\ncp /crypto_file /mnt/oldroot/\n
Run Code Online (Sandbox Code Playgroud)\n

还将 grub 设置复制到备份(从旧根卷到新根卷)。由于 grub 菜单由两个安装共享,因此两者的设置相同,并且可以通过任一安装来安装该菜单。因此,即使您现在希望将主 Ubuntu 保留在菜单顶部,稍后您也可能需要设置的备份副本。

\n
cp /mnt/oldroot/etc/default/grub /etc/default/\numount /mnt/oldroot\nrmdir /mnt/oldroot\n
Run Code Online (Sandbox Code Playgroud)\n

您可能还想修改逻辑卷(主要是根卷)的安装选项,以便两个安装不会在 GUI 中暴露彼此的私有部分。我可以给你一个 /etc/fstab 的模式,但幸运的是,Disks 做得很好,我不需要。

\n

最后,您可以开始正常部署辅助 Ubuntu,并在两个安装中部署新的数据卷。

\n
    \n
  1. 未来安装提醒
  2. \n
\n
\n
    \n
  • 覆盖任一 Ubuntu 安装时,您必须始终重复相同的安装后步骤,但为 LUKS 创建新的密钥文件除外。
  • \n
  • 在未来的任何版本中,对密钥文件的需求可能会消失。实际上,我没有找到安装的 cryptsetup 部分的正确文档,所以我担心它的任何内容都可能会改变。谨防!
  • \n
\n
    \n
  1. 关于未加密的/boot
  2. \n
\n
\n

如果您选择拆分未加密的主分区以为新的 /boot 腾出空间,则可以删除我介绍的一些步骤:

\n
    \n
  • 您不需要密钥文件,因此也不需要将密钥加载到 initrd.img 中的脚本,并且不需要将密钥文件的引用添加到 /etc/crypttab 中。即便如此,您仍然需要在安装后阶段添加 /etc/crypttab 文件并在 chroot Jail 中运行 update-initramfs。
  • \n
  • 如果新的 /boot 未加密,则 grub 设置中也不需要 GRUB_ENABLE_CRYPTODISK,并且不需要将启动参数设置为 GRUB_CMDLINE_LINUX。即便如此,您仍然需要运行 update-grub 将二次安装添加到 grub 菜单中。
  • \n
\n