使用 TPM2 自动解密您的磁盘

本文演示了如何使用可信平台模块 2 芯片配置 clevis 和 systemd-cryptenroll,以在启动时自动解密 LUKS 加密的分区。

如果您只想进行自动解密,您可以直接跳到先决条件部分。

动机

磁盘加密通过直接访问您的硬件来保护您的数据(私钥和重要文档)。 想想卖掉你的笔记本电脑/智能手机,或者它被一个机会主义的邪恶演员偷走。 任何数据,即使被“删除”,也是可以恢复的,因此可能会落入未知的第三方手中。

磁盘加密 才不是 保护您的数据不被正在运行的系统访问。 为了 example,磁盘加密不能保护您的数据免受以您的用户身份或在内核空间中运行的恶意软件的访问。 那时它已经解密了。

在启动时输入密码来解密磁盘可能会变得非常乏味。 在现代系统中,称为“TPM”(可信平台模块)的安全硬件芯片可以存储秘密并自动解密您的磁盘。 这是个 选择 因素,不是 第二 因素。 记住这一点。 如果做得好,这是一种具有类似于密码短语的安全级别的替代方案。

背景

TPM2 芯片是设备内部的一个小硬件模块,它基本上为只写或只读信息提供 API。 这样你可以在上面写一个秘密,但你以后永远不能读出它(但 TPM 可能稍后在内部使用它)。 或者,您只在某一点写入信息,稍后才读出。 TPM2 提供了一种称为 PCR(平台配置寄存器)的东西。 这些寄存器采用 SHA1 或 SHA256 哈希并包含用于断言完整性的测量值,例如 exampleUEFI 配置。

在系统的 UEFI 中启用或禁用安全引导。 除其他事项外,安全启动计算启动链中每个组件(UEFI 及其配置、引导加载程序等)的哈希值,并将它们链接在一起,以便其中一个组件的更改会更改所有后续 PCR 中计算和存储的哈希值。 通过这种方式,您可以建立对所处环境的信任。衡量环境的可信度很有用,因为 example,解密您的磁盘时。 这 UEFI 安全启动规范 定义 PCRs 0 – 7。除此之外的所有东西都可以免费供操作系统和应用程序使用。

根据规范将什么测量到哪些 PCR 的摘要

  • 聚合酶链反应 0:EFI 固件信息,例如它的版本
  • 聚合酶链反应 1: 与 EFI 固件相关的附加配置和信息
  • 聚合酶链反应 2:来自硬件组件的 EFI 驱动器(如 RAID 控制器)
  • 聚合酶链反应 3:存储在 2 中的驱动程序的附加配置和信息
  • 聚合酶链反应 4: 预操作系统诊断和 EFI 操作系统加载程序
  • 聚合酶链反应 5: EFI OS Loader 和 GPT 表的配置
  • 聚合酶链反应 6: 为主机平台制造商变量保留,不被 EFI 使用
  • 聚合酶链反应 7: 存储安全启动策略配置

关于什么被测量到哪个 PCR 的一些例子

  • 对 initramfs 的更改测量到 PCR 9 和 10。因此,如果您使用 dracut -f 重新生成 initramfs,则必须重新绑定。 这将在每次更新内核时发生。
  • 对 Grub 配置的更改,如添加内核参数、内核等,测量到 PCR 8、9 和 10 中。
  • 存储设备测量到 PCRs 8 和 10。但是,Hubs 和 YubiKeys 似乎没有测量到任何 PCR。
  • 其他操作系统测量到 PCR 1。发生这种情况是因为 example在启动前连接 USB 记忆棒时 Fedora Linux 实时映像。
  • 引导至实时映像会更改 PCR 1、4、5、8、9 和 10。

一个名为 clevis 的工具为 LUKS 加密磁盘生成一个新的解密秘密,将其存储在 TPM2 芯片中,并将 TPM2 配置为仅在 PCR 状态与配置时的状态匹配时才返回秘密。 只有在状态符合预期时,Clevis 才会尝试检索秘密并在启动时自动解密磁盘。

安全隐患

当您仅使用平台的板载硬件建立替代解锁方法时,您必须相信您的平台制造商能够正确完成他们的工作。 这是一个微妙的话题。 人们信任安全的硬件和固件设计。 然后相信 UEFI、引导加载程序、内核、initramfs 等都没有被修改。 结合起来,您期望一个可以自动解密磁盘的可信赖环境。

话虽如此,您必须相信(或者更好的是,验证)制造商在整个平台设计中没有搞砸任何事情,因为这被认为是一种相当安全的解密替代方案。 在很多情况下,事情并没有按计划进行。 为了 example, 什么时候 安全研究表明,联想笔记本电脑上的 BitLocker 将使用未加密的 SPI 通信 TPM2 以明文形式泄露了 LUKS 密码,甚至没有更改系统,或者 BitLocker 使用了 SSD 驱动器的本机加密功能,您可以 绕过恢复出厂设置.

这些示例都是关于 BitLocker 的,但它应该清楚地表明,如果整体设计被破坏,那么秘密是可以访问的,并且这种替代方法的安全性不如仅存在于您脑海中的密码短语(以及像密码管理器这样安全的地方)。 另一方面,请记住,在大多数情况下,为访问驱动器数据而进行的精心研究和攻击对于投机取巧的坏人来说是不值得的。 此外,不必在每次启动时都输入密码短语应该有助于采用这项技术,因为它是透明的,但会为不需要的访问增加额外的障碍。

先决条件

首先检查:

  • 安全启动已启用并正常工作
  • TPM2 芯片可用
  • 安装了 clevis 包

U 形夹是魔法发生的地方。 它是您在运行的操作系统中使用的工具,用于将 TPM2 绑定为 选择 解密方法并在 initramfs 中使用它从 TPM2 读取解密秘密。

检查是否启用了安全启动。 dmesg 的输出应如下所示:

$ dmesg | grep Secure
[    0.000000] secureboot: Secure boot enabled
[    0.000000] Kernel is locked down from EFI Secure Boot mode; see man kernel_lockdown.7
[    0.005537] secureboot: Secure boot enabled
[    1.582598] integrity: Loaded X.509 cert 'Fedora Secure Boot CA: fde32599c2d61db1bf5807335d7b20e4cd963b42'
[   35.382910] Bluetooth: hci0: Secure boot is enabled

检查 dmesg 是否存在 TPM2 芯片:

$ dmesg | grep TPM
[    0.005598] ACPI: TPM2 0x000000005D757000 00004C (v04 DELL   Dell Inc 00000002      01000013)

安装 clevis 依赖项并使用 dracut 重新生成 initramfs。

sudo dnf install clevis clevis-luks clevis-dracut clevis-udisks2 clevis-systemd
sudo dracut -fv --regenerate-all
sudo systemctl reboot

重启重要的 得到正确的PCR 基于用于下一步的新 initramfs 映像的测量。

配置U形夹

将LUKS加密分区与TPM2芯片绑定。 将 U 形夹指向您的(根)LUKS 分区并指定它应该使用的 PCR。

Enter 当被问及你当前的 LUKS 密码时。 该过程使用它来生成一个新的独立秘密,它将把您的 LUKS 分区绑定到 TPM2 以用作 选择 解密方法。 因此,如果它不起作用,您仍然可以选择直接输入解密密码。

sudo clevis luks bind -d /dev/nvme... tpm2 '{"pcr_ids":"1,4,5,7,9"}'

如前所述,当引导到另一个系统(如活动磁盘)时,PCR 1、4 和 5 会发生变化。 PCR 7 跟踪当前的 UEFI 安全启动策略,如果通过 EFI 加载的 initramfs 发生变化,则 PCR 9 会发生变化。

注意:如果您只是想保护 LUKS 密码免受实时图像的影响,但不关心更“复杂”的攻击,例如更改未加密引导分区上未签名的 initramfs,那么您可以省略 PCR 9 并省去重新绑定的麻烦关于更新。

自动解密附加分区

如果是二级加密分区,请使用 /etc/crypttab。

使用 systemd-cryptenroll 注册磁盘以供 systemd 解锁:

sudo systemd-cryptenroll /dev/nvme0n1... --tpm2-device=auto --tpm2-pcrs=1,4,5,7,9

然后通过附加选项 tpm2-device=auto,tpm2-pcrs=1,4,5,7,9 在 /etc/crypttab 中反映该配置。

解除绑定、重新绑定和编辑

列出设备的所有当前绑定:

$ sudo clevis luks list -d /dev/nvme0n1... tpm2
1: tpm2 '{"hash":"sha256","key":"ecc","pcr_bank":"sha256","pcr_ids":"0,1,2,3,4,5,7,9"}'

解绑设备:

sudo clevis luks unbind -d /dev/nvme0n1... -s 1 tpm2

-s 参数指定存储在 TPM 中的此磁盘的备用密钥的插槽。 如果您总是在再次绑定之前解除绑定,则它应该是 1。

重新生成绑定,以防 PCR 发生变化:

sudo clevis luks regen -d /dev/nvme0n1... -s 1 tpm2

编辑设备的配置:

sudo clevis luks edit -d /dev/nvme0n1... -s 1 -c '{"pcr_ids":"0,1,2,3,4,5,7,9"}'

故障排除

磁盘解密密码提示在启动时显示,但一段时间后消失:

使用 systemctl edit 将睡眠命令添加到 systemd-ask-password-playmouth.service 文件,以避免在加载其内核模块之前向 TPM 发出请求:

[Service]
ExecStartPre=/bin/sleep 10

将以下内容添加到配置文件 /etc/dracut.conf.d/systemd-ask-password-plymouth.conf:

install_items+=" /etc/systemd/system/systemd-ask-password-plymouth.service.d/override.conf "

然后通过重新生成dracut sudo dracut -fv –重新生成所有。

重启然后重新生成绑定:

sudo systemctl reboot
...
sudo clevis luks regen -d /dev/nvme0n1... -s 1

资源