从未加密的 Ubuntu 16.04 迁移到 16.04 的 LUKS 加密安装

Bre*_*222 4 linux encryption clone luks ubuntu-16.04

我的公司正在努力在一些新的测试工作中实施一些 Ubuntu 系统,我的任务是为它们提供加密解决方案。作为一名主要使用 Windows 的用户,通常只了解 Ubuntu 和 Linux/Unix 的工作知识,这有点具有挑战性,但很有趣。我知道许多就地加密服务可以在 Windows 上使用,但注意到 Ubuntu 缺乏这些服务,在阅读了 20 多篇关于它的文章后,决定全新安装带全盘加密是唯一现实的选择。话虽这么说,一些系统已经在使用中,并且不能仅仅被擦除并通过加密重新安装。我需要所有设置和更改以及复制/备份的现有文件。因此,它并不像复制/home那么简单。我很好奇对我来说最好的做法是什么,我有一个完整的分区副本(使用 gparted 快速复制到外部),用于我的测试机,并全新安装了 Ubuntu w/LUKS。我熟悉 Clonezilla 的基础知识,但我不认为这对我收集的信息有帮助。

tldr:我需要将 Ubuntu 16.04 的完整安装移动到加密磁盘。有些机器将启用 TPM,而有些则不会,我需要知道每种机器的最佳操作方案。感谢您帮助新管理员。

如果您可以描述一种不需要外部网络访问但不是必需的方法,那就更好了。即,如果需要软件包,我可以在测试 PC 上将其下载到 USB/CD/DVD 并离线安装该软件包。

gro*_*taj 5

下面描述的是我多次成功使用的过程。它适用于 Ubuntu 16.04 和 18.04。与 @Arno 在其答案中提出的解决方案不同,它不需要手动编辑内核启动选项。相反,它依赖于基于更规范(双关语无意)的解决方案update-grub生成正确的配置,Ubuntu 在安装默认的基于 LVM 的加密时也使用该解决方案。/etc/crypttab(此解决方案不使用 LVM 也不加密/boot

对于遵循本指南造成的任何数据丢失或其他潜在的不愉快后果,我不承担任何责任。在做任何事情之前,请确保您有可靠的备份。

我在打字时并不是在测试本指南。它基于我自己撰写的一篇(经过测试的)博客文章,其中涉及一些类似的案例和我记得的一些细节。

本指南假设:

  • Ubuntu已经安装好了
  • 系统使用 (U)EFI 启动,而不是 BIOS/CSM
  • /boot位于单独的分区1上
  • 您可以启动 Ubuntu 16.04/18.04 或 Pop!_OS 18.04 的实时媒体(从 USB、PXE、DVD 等)2

如果您/boot不在单独的分区上,则提取它非常简单:在任何地方创建一个 200-500 MB 的分区,将其格式化为 ext4,复制当前/boot内容,添加/etc/fstab条目,update-grub然后重新启动。


1. 备份

您必须备份当前的系统分区。最简单的方法是使用 Clonezilla。它是用户安全的,无需手册 - 只需按照说明操作即可。

2. 缩小分区

LUKS 标头占用分区上的一些空间。Clonezilla/partclone 无法将映像恢复到小于源设备的设备,因此您无法将未加密分区的映像恢复到加密容器,因为它要小一些。

然后我们必须稍微缩小要加密的分区。为了安全起见,请将它们缩小 10 MB 或更多。最简单的方法是使用 GParted。它可以在 Ubuntu 实时媒体上使用。

3. 制作缩小分区的镜像

要么再次使用 Clonezilla 执行此操作,要么已经熟悉Clonezilla 默认使用的partclone 。稍后我们将使用 Partclone 手动恢复图像。

使用partclone克隆到图像:

sudo partclone.ext4 -c -s /dev/sda2 | pigz -0 > /mnt/backup/sda2.ext4.ptcl.gz
Run Code Online (Sandbox Code Playgroud)
  1. partclone.ext4是partclone 专用于使用ext4 的二进制文件之一。每个受支持的文件系统都有自己的部分克隆二进制文件。

  2. /dev/sda2显然是您要克隆的分区。我更喜欢通过部分标签来引用分区,例如。/dev/disk/by-partlabel/os- IMO 更干净。/dev/sda2不过,更容易辨认。

  3. Pigz是多核 gzip。-0告诉它优先考虑速度而不是有效压缩。

  4. /mnt/backup这里代表您想要存储图像的一些外部位置。如果您之前刚刚使用过 Clonezilla,它仍然可以安装在/home/partimag. 如果您想挂载 SMB 共享:(sudo mount -t cifs -o username=gronostaj //192.168.1.90/Backup /mnt/backup交互式要求输入密码)

4. 将分区放大至原始大小

我们希望为 LUKS 标头保留额外的空间,不是吗?将分区大小调整回原始大小。

5. 格式化为LUKS

这是您丢失原始数据的时刻。确保您的备份没问题。

将系统分区(除了 )格式化/boot为 LUKS:

sudo cryptsetup luksFormat --type luks2 /dev/sda2
Run Code Online (Sandbox Code Playgroud)

打开创建的容器:

sudo cryptsetup open /dev/sda2 os
Run Code Online (Sandbox Code Playgroud)

确保整个加密容器看起来像随机垃圾,并且您的旧数据仍然不可读:

sudo dd if=/dev/zero of=/dev/mapper/os bs=1M
Run Code Online (Sandbox Code Playgroud)

(这将用零覆盖容器的解密内容,但加密内容将看起来像随机垃圾)

6. 恢复图像

手动运行partclone来恢复镜像:

cat /mnt/backup/sda2.ext4.ptcl.gz | pigz -d | sudo partclone.ext4 -r -o /dev/mapper/os
Run Code Online (Sandbox Code Playgroud)

如果您采取了简单的方法并使用 Clonezilla 进行了“缩小”备份,请查看其输出文件,您将轻松找出哪些是部分克隆源。除非你设置巨大的块大小,否则它们将被碎片化,你必须cat在通过管道传输到 Pigz 之前将它们组合在一起。

您还应该调整文件系统几何结构以适合整个分区:

sudo resize2fs /dev/mapper/os
Run Code Online (Sandbox Code Playgroud)

7. 启用加密支持

首先,chroot 进入刚刚恢复的操作系统:

mkdir /mnt/os
sudo mount /dev/mapper/os /mnt/os
cd /mnt/os
mount --bind /etc/resolv.conf etc/resolv.conf
mount --bind /dev dev
mount -t tmpfs tmpfs tmp
mount -t sysfs sys sys
mount -t proc proc proc
sudo chroot .
mount -a
Run Code Online (Sandbox Code Playgroud)

该终端现在正在您安装的 Ubuntu 实例上运行,而不是实时实例。

安装cryptsetup

apt update
apt install cryptsetup -y
Run Code Online (Sandbox Code Playgroud)

它应该创建一个文件/etc/crypttab。如果没有,请不要担心,手动创建它。编辑此文件并添加分区条目:

os /dev/sda2 none luks
Run Code Online (Sandbox Code Playgroud)

保存并退出编辑器。重建 initramfs:

update-initramfs -u -k all
Run Code Online (Sandbox Code Playgroud)

更新 GRUB 条目:

update-grub
Run Code Online (Sandbox Code Playgroud)

8.删除多余的密码提示

如果您有多个加密分区,则必须在启动时为每个分区输入密码。然而,LUKS 允许您添加额外的密钥文件,这些文件可用于解锁分区而不是密码。您可以将这些密钥文件存储在加密/分区上,并用它来解锁后续的密钥文件。

创建随机密钥文件:

dd if=/dev/urandom of=/luks.key bs=4096 count=1
Run Code Online (Sandbox Code Playgroud)

将其添加到非根分区:

cryptsetup luksAddKey /dev/sda3 /luks.key
Run Code Online (Sandbox Code Playgroud)

添加crypttab条目:

home /dev/sda3 /luks.key luks
Run Code Online (Sandbox Code Playgroud)

重建 initramfs:

update-initramfs -u -k all
Run Code Online (Sandbox Code Playgroud)

1为什么我使用单独的/boot

  • 这样更容易;)
  • GRUB 尚不支持 LUKS2,因此/boot不能位于 LUKS2 加密分区上
  • 如果你想要 LUKS 加密/boot和 LUKS2 加密/,那么你必须输入密码两次或在 initramfs 中嵌入密钥文件- 在我看来太麻烦了,因为......
  • 单独加密/boot并不会让您更容易受到攻击,因为即使您/boot已加密,您的 EFI 系统分区也不能加密,因此攻击者可以篡改它,例如。使用他们的自定义恶意内核/initramfs 而不是您的/boot. (要解决此问题,您必须构建一个自容器 GRUB 二进制文件并使用您的私钥对其进行签名,然后使用 UEFI 安全启动来验证它)

定义您自己的威胁模型并决定您需要什么级别的安全性(以及针对什么)。

2您可以尝试使用其他 Ubuntu 版本或救援 CD(例如GRML),但您的成功率可能会有所不同。我经历过此过程失败的情况,只是因为实时媒体与系统不匹配。