Linux下使用TPM2.0安全解密硬盘——无人值守

信息安全 linux tpm 卢克斯
2021-09-01 05:36:34

我花了几天时间试图弄清楚如何在 Linux 中使用 TPM2.0 安全地解密远程位置的硬盘驱动器。我不是安全专家,这是我与 TPM2.0 的第一次战斗。我学到了很多,但我仍然有疑问。有人可以帮我解决这些问题:

  • 目前 TrustedGRUB2 不支持 TPM2.0,只支持 TPM1.2。我找不到其他支持 TPM2.0 的项目。有吗?
  • TPM2.0 可以停止启动过程吗?

我试图解决的问题是:

  • 我有一个未加密的加密/分区/boot
  • 计算机将在其他人的场所,因此应该不可能窃取硬盘驱动器并读取数据
  • 引导过程应该是无人值守的——机器不应该解密驱动器并在发生变化时自行引导——BIOS 配置、initram文件(/boot未加密,因此可以摆弄initram

我想到了这个解决方案:

  • LUKS 键将是 PCR0 的值
  • PCR0 值应该改变,如果有人要更改 BIOS 中的某些内容,例如重置它(如果有人会窃取整个 PC,而不仅仅是磁盘),启用 USB 引导。
  • 用于解密磁盘的 PCR0 值应该与运行在其上的操作系统一样安全——在不更改 BIOS 的情况下读取这个未更改的 PCR0 的唯一方法是访问操作系统,对吗?

我认为我已经达到了可以就这个问题提出合理问题的水平,但我自己无法进一步评估其中的含义或漏洞。

1个回答

在 Linux 系统上,您可以使用 clevis 将 LUKS 卷“绑定”到 TPM2,并在您的情况下自动解密根文件系统。例如:

clevis luks bind -d /dev/sda3 tpm2 '{"pcr_ids":"0"}'

或者

clevis luks bind -d /dev/sda3 tpm2 '{"pcr_ids":"0,1"}'

你需要它已经被加密并有一个密码,上面的命令会提示你。您可以保留密码作为备份,也可以在之后将其删除。

我不确定是否将 PCR0 值本身用作键,因为根据我有限的经验,该值很容易访问。我不相信这就是针对 PCR 的“密封”数据的工作原理,但我不知道 PCR 值和密封值之间的确切关系。

我使用 clevis 将 LUKS 卷绑定到 TPM2,并在它是根文件系统时在启动时自动解密。我在安装过程中对设备进行了加密,并成功地手动和在 kickstart 脚本中绑定了它。clevis 工具在 2018 年初添加了 TPM2 支持,并在 RHEL 7.6 发布时将其从 RHEL“测试版”存储库中移除。我只让自动解密在完整的 /dev/sd* 卷上工作,而不是任何逻辑卷。我发现这个链接很有帮助: https ://blog.dowhile0.org/2017/10/18/automatic-luks-volumes-unlocking-using-a-tpm2-chip/

我相信如果修改了 BIOS 固件,PCR0 应该会发生变化,并且即使修改了某些设置,PCR1 也会发生变化。我不知道选择最好的 PCR;我的信息来自单个系统和定义 PCR 使用的 PC 客户端规范,位于https://trustedcomputinggroup.org/wp-content/uploads/PC-ClientSpecific_Platform_Profile_for_TPM_2p0_Systems_v51.pdf(第 2.3.4 节,表 1)。