可信平台模块

出自 ArchWiki

此文章或章节需要扩充。

原因: 需要澄清 TPM 1.2 和 2.0 之间的用法差异、Evil Maid 攻击防御和可信启动。PCR 寄存器密封以及与 LUKS 结合使用。(在 Talk:Trusted Platform Module 中讨论)

可信平台模块 (TPM) 是一项安全的密码处理器的国际标准,它是一种专门的微处理器,旨在通过将加密密钥集成到设备中来保护硬件安全。

实际上,TPM 可用于各种不同的安全应用,例如安全启动、密钥存储和随机数生成

TPM 自然只在具有 TPM 硬件支持的设备上受支持。如果您的硬件支持 TPM 但未显示,则可能需要在 BIOS 设置中启用它。

注意: 有两个非常不同的 TPM 规范:2.0 和 1.2,它们也使用不同的软件堆栈。本文仅描述 TPM 2.0,对于旧的 TPM 1.2,请参阅 /1.2

检查 TPM 支持

大多数现代计算机都支持 TPM 2.0,因为它自 2016 年以来一直是 Windows 10 认证的要求。要检查您的系统是否支持,请使用以下任何方法

  • 检查日志,例如,以 root 身份运行 journalctl -k --grep=tpm
  • 读取 /sys/class/tpm/tpm0/device/description[1]/sys/class/tpm/tpm0/tpm_version_major 的值
$ cat /sys/class/tpm/tpm0/device/description
TPM 2.0 Device
  • 使用 systemd-analyze(1) 检查 TPM 2.0 和必要的软件依赖项
    $ systemd-analyze has-tpm2

TPM 2.0 允许通过 /dev/tpm0 直接访问(一次一个客户端),通过 /dev/tpmrm0 进行内核管理的访问,或通过 tpm2-abrmd 资源管理器守护进程进行托管访问。根据 systemd 项目成员的说法,不再建议使用 tpm2-abrmd。用户空间工具有两种选择,Intel 的 tpm2-tools 和 IBM 的 ibm-tssAUR

TPM 2.0 需要 UEFI 启动;BIOS 或 Legacy 启动系统只能使用 TPM 1.2。

某些 TPM 芯片可以通过固件升级在 2.0 和 1.2 之间切换(只能进行有限次数的升级)。

用法

tpm2-software 社区 可以获得许多信息丰富的资源,以学习如何在日常应用中配置和使用 TPM 2.0 服务。

LUKS 加密

可以使用安全存储在 TPM 中的密钥来加密卷。这种方法确保除非 TPM 存在且满足特定条件(例如固件或安全启动状态的完整性(请参阅#访问 PCR 寄存器)),否则您的驱动器将保持锁定状态。

此机制可用于在启动过程中自动解密根卷,类似于 Windows 上的 BitLocker 或 macOS 上的 FileVault 的工作方式。虽然如果从带有 TPM 的计算机中取出驱动器,这可以提供强大的保护,但如果整个 PC 被盗,数据保护将仅依赖于用户密码和系统设置等基本措施。为了缓解这种情况,您可以

  • 考虑使用不同的机制(例如 fscryptsystemd-homed)加密用户数据,例如个人主文件夹。
  • 使用 TPM pin 以受益于 TPM 的安全特性,同时避免完全无人值守的解锁。
警告: 请注意,此方法会使您更容易受到 冷启动攻击

systemd-cryptenrollClevis 允许使用存储在 TPM 中的密钥锁定 LUKS 卷。此外,systemd-cryptenroll 允许将加密绑定到签名策略而不是静态 PCR 值(请参阅 systemd-cryptenroll(1))。

SSH

对于 TPM 密封的 SSH 密钥,有两种选择

  • ssh-tpm-agent — 使用 TPM 支持的密钥的 ssh-agent 兼容代理。
https://github.com/Foxboron/ssh-tpm-agent || ssh-tpm-agent
请参阅 将 ssh 密钥存储在 TPM 中:ssh-tpm-agent
  • tpm2-pkcs11 — 用于可信平台模块 2.0 硬件的 PKCS#11 接口。
https://github.com/tpm2-software/tpm2-pkcs11 || tpm2-pkcs11
请参阅 SSH 配置使用 TPM 进行 SSH 身份验证 (2020-01)。

GnuPG

此文章或章节需要扩充。

原因: 添加探测 TPM 以找出它支持哪些密钥的说明。(在 Talk:Trusted Platform Module 中讨论)

GnuPG 自 2.3 版本起,支持将兼容的密钥移动到 TPM 中。有关说明,请参阅 将 TPM 与 GnuPG 2.3 一起使用

TPM 2.0 用法的其他优秀示例

访问 PCR 寄存器

此文章或章节需要扩充。

原因: 可能更明智的做法是仅列出有用的 PCR,并给出何时使用它们的真实示例,而不是列出所有现有的 PCR。(在 Talk:Trusted Platform Module#PCR 寄存器表 中讨论)

平台配置寄存器 (PCR) 允许将密钥的加密绑定到特定的软件版本和系统状态(通过哈希值),以便只有在使用特定的受信任软件和/或配置时才能访问(可能被“解封”)已注册的密钥。

PCR 旨在用于启动之间的平台硬件和软件完整性验证(例如,防止 Evil Maid 攻击)。

TCG PC 客户端特定平台固件配置文件规范 定义了正在使用的寄存器,Linux TPM PCR 注册表 分配了使用它们的 Linux 系统组件。

寄存器是

PCR 描述 扩展自
PCR0 核心系统固件可执行代码(又名固件)。如果您升级 UEFI,可能会更改。 固件
PCR1 核心系统固件数据(又名 UEFI 设置) 固件
PCR2 扩展或可插拔的可执行代码(又名 Option ROM 固件
PCR3 扩展或可插拔的固件数据。在启动设备选择 UEFI 启动阶段设置。 固件
PCR4 启动管理器代码和启动尝试。测量启动管理器和固件尝试从中启动的设备。 固件
PCR5 启动管理器配置和数据。可以测量启动加载程序的配置;包括 GPT 分区表。 固件
PCR6 从 S4 和 S5 电源状态事件恢复 固件
PCR7 安全启动状态。包含 PK/KEK/db 的完整内容,以及用于验证每个启动应用程序的特定证书[2] 固件,shim(添加 MokList、MokListX 和 MokSBState)
PCR81 内核命令行哈希值 GRUB, systemd-boot
PCR91 initrd 和 EFI 加载选项的哈希值 Linux(测量 initrd 和 EFI 加载选项,本质上是内核 cmdline 选项)
PCR101 为将来使用保留
PCR111 统一内核镜像的哈希值 systemd-stub(7)
PCR121 覆盖的内核命令行,凭据 systemd-stub(7)
PCR131 系统扩展 systemd-stub(7)
PCR141 shim 的 MokList、MokListX 和 MokSBState。[3] shim
PCR151 未使用
PCR161 调试。可以随时使用和重置。可能在官方固件版本中不存在。
PCR23 应用程序支持。操作系统可以设置和重置此 PCR。
  1. 用例由操作系统定义,并且可能在各种 Linux 发行版和 Windows 设备之间有所不同。

在 Windows 上,BitLocker 将 PCR8-11(Legacy)或 PCR11-14(UEFI)用于其自身目的。来自 tianocore 的文档[4]

tpm2-totp 通过人工观察员和专用受信任设备来促进此检查。

当前的 PCR 值可以使用 systemd-analyze(1) 列出

$ systemd-analyze pcrs

或者,也可以使用 tpm2_pcrread(1)tpm2-tools 列出

# tpm2_pcrread

故障排除

TPM2 LUKS2 解锁仍然要求输入密码

如果您按照上面描述的说明使用在 TPM2 硬件模块中注册的密钥自动解锁 luks2 设备,但在 initramfs 启动阶段仍然收到输入密码的提示。您可能需要提前加载负责处理您的特定 TPM2 模块的内核模块(您可以使用 systemd-cryptenroll --tpm2-device=list 获取其名称)。

参见