可信平台模块
可信平台模块 (TPM) 是一项安全的密码处理器的国际标准,它是一种专门的微处理器,旨在通过将加密密钥集成到设备中来保护硬件安全。
实际上,TPM 可用于各种不同的安全应用,例如安全启动、密钥存储和随机数生成。
TPM 自然只在具有 TPM 硬件支持的设备上受支持。如果您的硬件支持 TPM 但未显示,则可能需要在 BIOS 设置中启用它。
检查 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 被盗,数据保护将仅依赖于用户密码和系统设置等基本措施。为了缓解这种情况,您可以
- 考虑使用不同的机制(例如 fscrypt 或 systemd-homed)加密用户数据,例如个人主文件夹。
- 使用 TPM pin 以受益于 TPM 的安全特性,同时避免完全无人值守的解锁。
systemd-cryptenroll 和 Clevis 允许使用存储在 TPM 中的密钥锁定 LUKS 卷。此外,systemd-cryptenroll 允许将加密绑定到签名策略而不是静态 PCR 值(请参阅 systemd-cryptenroll(1))。
SSH
对于 TPM 密封的 SSH 密钥,有两种选择
- ssh-tpm-agent — 使用 TPM 支持的密钥的 ssh-agent 兼容代理。
- tpm2-pkcs11 — 用于可信平台模块 2.0 硬件的 PKCS#11 接口。
- https://github.com/tpm2-software/tpm2-pkcs11 || tpm2-pkcs11
- 请参阅 SSH 配置 和 使用 TPM 进行 SSH 身份验证 (2020-01)。
GnuPG
GnuPG 自 2.3 版本起,支持将兼容的密钥移动到 TPM 中。有关说明,请参阅 将 TPM 与 GnuPG 2.3 一起使用。
TPM 2.0 用法的其他优秀示例
- 配置安全启动 + TPM 2 (2018-06, Debian)
- 使用 TPM - 它不再是火箭科学了 - Johannes Holland & Peter Huewe (2020-11, Youtube):使用 tpm2-tss-engine 的 OpenSSL 示例
访问 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。 |
- 用例由操作系统定义,并且可能在各种 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
获取其名称)。
参见
- Gentoo:Trusted Platform Module
- TPM-JS 测试工具:source - live web version。