第八章讲可信计算。可信不是”加密”也不是”防火墙”——是”用硬件证明系统在某个状态”。本文从 TPM 这颗小芯片讲起。
为什么需要可信计算
1 2 3 4 5 6 7 8 9 10 11 12
| 传统安全: 防火墙 / 杀毒 / 加密 / 权限 缺陷: - 软件防御软件,攻击者一旦进系统就能改一切 - 没有"硬件级根" - 系统启动时无法验证 BIOS / Bootloader / Kernel 是否被篡改 - 加密密钥放在内存里 → 内存 dump 就泄露
可信计算的核心思想: 1. 硬件根: 一颗独立芯片,物理隔离,不可被软件篡改 2. 度量启动链: 每一层启动时哈希下一层,记录到芯片 3. 远程证明: 把启动状态送到远端,远端判断是否可信 4. 密封: 用启动状态作为"密钥派生因子",状态错就解不开
|
TPM:可信平台模块
TPM(Trusted Platform Module)是一颗独立小芯片:
graph TB
CPU[CPU]
CHIPSET[Chipset / PCH]
TPM[TPM Chip
独立芯片]
MB[主板]
CPU --- CHIPSET
CHIPSET --- TPM
TPM --- MB
TPM 的物理形态:
1 2 3 4
| 独立芯片(dTPM): 主板焊一颗 固件 TPM(fTPM): CPU 内 TEE 模拟(Intel PTT、AMD fTPM) 虚拟 TPM(vTPM): VM 用的软件模拟 集成 TPM: 有些 SoC 内集成
|
TPM 的内部架构
1 2 3 4 5 6 7 8 9 10 11 12
| TPM 内部: - 处理器(小 CPU) - 非易失存储(NVRAM) - 易失存储(PCR、密钥句柄) - 加密引擎(RSA / ECC / SHA / AES) - 随机数发生器(RNG) - 唯一身份(EK)
接口: TPM 1.2: LPC(Low Pin Count) TPM 2.0: SPI / I²C / LPC fTPM: 内部接口
|
TPM 1.2 vs 2.0
1 2 3 4 5 6 7 8 9 10 11 12
| TPM 1.2(2003): - 仅 SHA-1 - 单 hash 算法 - 难升级 - 已淘汰
TPM 2.0(2014): - SHA-256 / SHA-384 / SHA-512 - SM3(中国国密)支持 - 算法可扩展 - PCR 数量可配置 - 已是当前标准
|
Windows 11 强制要求 TPM 2.0——这是 2024 年 TPM 2.0 普及的主要推动力。
TCM:国密版 TPM
中国”可信计算 2.0”路线推出的:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| TCM(Trusted Cryptography Module): - 中国主导 - 算法用国密: SM2 / SM3 / SM4 / SM9 - GM/T 0011-2012 等国标 - 与 TPM 1.2 类似的接口 - 兼容 TCG 部分协议
TPCM(Trusted Platform Control Module): - "主动可信" - TCM + 主控制器,可主动度量 / 干预系统 - 不只是被动度量 - 国内独有,类似"安全协处理器"
实现: - 主板 TCM 芯片 - 沈昌祥院士主推
应用: - 党政信创 - 等保 2.0 三级 / 四级 - 关基设施
|
PCR:平台配置寄存器
PCR(Platform Configuration Register)是 TPM 的核心:
graph TB
PCR[PCR 寄存器组
每个 32 字节]
PCR --> PCR0[PCR 0:BIOS]
PCR --> PCR1[PCR 1:BIOS 配置]
PCR --> PCR2[PCR 2:Option ROM]
PCR --> PCR3[PCR 3:Option ROM 配置]
PCR --> PCR4[PCR 4:MBR / Bootloader]
PCR --> PCR5[PCR 5:Bootloader 配置]
PCR --> PCR6[PCR 6:状态变更]
PCR --> PCR7[PCR 7:Secure Boot 状态]
PCR --> PCR8[PCR 8-15:OS 用]
PCR --> PCR16[PCR 16-23:debug / 应用]
PCR 的核心特性:
1 2 3 4 5 6 7
| 1. 不能直接写: 只能 Extend 2. Extend 操作: PCR_new = SHA256( PCR_old || measurement ) 3. 不可逆: 一旦写入,无法撤回 4. 重置: 只在系统重启时清零
→ 任何篡改都会改变最终的 PCR 值 → 启动链状态被"哈希链"忠实记录
|
PCR 的 24 个寄存器各有约定(TCG 规范):
1 2 3 4
| PCR 0-7: 固件(BIOS / Boot 等) PCR 8-15: OS 层度量 PCR 16-22: debug / 自定义 PCR 23: 应用 / 临时
|
度量启动链
graph LR
CRTM[CRTM
核心可信根
BIOS 内只读] --> B[BIOS]
B --> B2[BIOS 度量 Bootloader]
B2 --> BOOT[Bootloader
GRUB]
BOOT --> BOOT2[Bootloader 度量 Kernel]
BOOT2 --> KER[Kernel + initrd]
KER --> APP[OS / 应用]
CRTM -.-> TPM[TPM PCR]
B2 -.-> TPM
BOOT2 -.-> TPM
KER -.-> TPM
整个启动过程:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| 1. 上电 → CRTM(Core Root of Trust for Measurement)开始执行 CRTM 是 BIOS 中的一段不可变代码 / 不可变 mask ROM 它度量自己 + 度量 BIOS 的剩余部分 → Extend PCR 0 2. BIOS 度量 Option ROM(PCI 卡 firmware)→ Extend PCR 2/3 3. BIOS 度量 Bootloader(GRUB)→ Extend PCR 4/5 把控制权交给 Bootloader
4. Bootloader 度量 Kernel + initrd → Extend PCR 8/9 把控制权交给 Kernel 5. Kernel IMA 度量重要文件 → Extend PCR 10 挂载文件系统,启动应用
最终: PCR 0-10 反映了整个启动链的"哈希状态"
|
任意环节被篡改: PCR 就会和”已知好的状态”不一样。
TPM 的密钥层次
graph TB
EK[EK
Endorsement Key
制造时烧死,唯一身份]
SRK[SRK
Storage Root Key
用户拥有,加密其他密钥]
AIK[AIK
Attestation Identity Key
身份证明用]
CHK[Child Keys
用户密钥]
EK -.- AIK
SRK --> CHK
| 密钥 |
用途 |
| EK(Endorsement Key) |
出厂烧入,证明这是真 TPM |
| SRK(Storage Root Key) |
用户绑定的根密钥 |
| AIK(Attestation Identity Key) |
远程证明时用,避免泄露 EK |
| Child Keys |
用户业务密钥 |
EK 由 TPM 厂家签发——内置一张”出厂证书”。这是远程证明能信任 TPM 的根。
远程证明(Remote Attestation)
graph LR
CL[客户端机器]
CL --> Q[Quote 操作
TPM 签名 PCR 状态]
Q --> SR[发到验证方]
SR --> SRV[验证服务器]
SRV --> CMP[比对预期 PCR]
CMP --> RES[可信 / 不可信]
远程证明流程:
1 2 3 4 5 6 7 8 9
| 1. 验证方发起挑战(Nonce) 2. 客户端调用 TPM_Quote(PCRs, Nonce) 3. TPM 用 AIK 签名 PCR 哈希 + Nonce → Quote 4. 客户端把 Quote + AIK 证书发给验证方 5. 验证方: a. 验证 AIK 证书链(来自 EK 厂家) b. 验证 Quote 签名 c. 比对 PCR 值是否匹配预期"好的状态" d. 通过 → 这台机器在可信状态
|
应用场景:
1 2 3 4
| - 网络准入: 设备进网前要 attest - 云租户: 租户验证云上 VM 是真 TEE - 软件更新: 更新前验证当前状态 - 数据访问控制: PCR 错就解密失败
|
密封(Sealing)
TPM 可以把数据”密封”到某个 PCR 状态:
1 2 3 4 5 6 7 8 9 10 11
| 密封 = 用 PCR 当前值作为派生因子加密数据: TPM_Seal(data, PCR_target_values) 解封: TPM_Unseal(sealed_blob) → 仅当 PCR 当前值 == 密封时的值,才能解出 应用: - 全盘加密密钥密封到启动状态 - 业务密钥密封到应用代码 - 任何篡改 → 解封失败 → 数据无法访问
|
LUKS 全盘加密 + TPM 密封是 Linux 上最常用的安全启动方案。
DRTM 与 SRTM
度量根的两种类型:
1 2 3 4 5 6 7 8 9 10
| SRTM(Static Root of Trust for Measurement): - 系统启动时建立 - 从 CRTM 一路度量 - 大部分场景
DRTM(Dynamic Root of Trust for Measurement): - 系统运行时动态建立"信任岛" - Intel TXT / AMD SKINIT - 不需要从开机度量 - 用于安全敏感任务的"临时可信环境"
|
DRTM 应用:
1 2 3
| - 启动 hypervisor 时建立 measure - 银行 / 政务 / 军方关键操作前 DRTM - 现在 TEE 已经吸收大部分 DRTM 场景
|
TPM 的实战命令
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
| ls /dev/tpm*
cat /sys/class/tpm/tpm0/tpm_version_major cat /sys/class/tpm/tpm0/device/description
tpm2_pcrread sha256:0,1,2,3,4,5,6,7
tpm2_getrandom 32 | xxd
tpm2_createprimary -c primary.ctx
tpm2_create -C primary.ctx -u key.pub -r key.priv
tpm2_rsaencrypt -c key.ctx -o cipher.bin plain.txt tpm2_rsadecrypt -c key.ctx -o plain.bin cipher.bin
echo "secret" | tpm2_create -C primary.ctx -u sealed.pub -r sealed.priv -i -
tpm2_quote -c key.ctx -l sha256:0,1,2,3 -q "challenge_nonce"
|
TPM 在系统中的角色
graph TB
TPM[TPM 2.0]
TPM --> SB[Secure Boot 验证]
TPM --> BOOT[Measured Boot 度量]
TPM --> LUKS[LUKS 密封]
TPM --> SSH[SSH 密钥保护]
TPM --> CERT[X.509 证书 / mTLS]
TPM --> WIN[Windows BitLocker / Hello]
TPM --> RA[远程证明]
TPM 不直接做”业务”——它是给上层各种安全子系统提供根。
LUKS + TPM
1 2 3 4 5 6 7 8 9 10 11
| 传统 LUKS: 用户输密码解密 TPM 密封 LUKS: 密码绑定 PCR 启动状态正确 → 自动解密 启动被篡改 → 解密失败
systemd-cryptenroll: 2021+ Linux 标准工具 systemd-cryptenroll --tpm2-device=auto /dev/sda3 GRUB 加 measured boot: → BIOS / GRUB / kernel / initrd 哈希都进 PCR → 任何篡改 → 解不开
|
Windows BitLocker
1 2 3 4 5
| Windows 用 TPM: - BitLocker 全盘加密自动解(密钥密封到 PCR) - Hello 生物识别(密钥保护) - Defender Credential Guard - Win 11 强制 TPM 2.0
|
服务器 TPM 的现状
1 2 3 4 5 6 7 8 9 10 11
| 2026 年现状: - 几乎所有数据中心服务器都带 TPM 2.0 - 政府 / 金融 / 关基采购"必带" - 互联网厂商: 多数采购带 TPM,但实际启用率低(< 20%) - 信创目录: 强制 TPM 2.0 或 TCM 为什么互联网启用率低: 1. 配置复杂 2. 大规模运维难(每机 PCR 不同) 3. 业务团队不熟 4. 收益不明显
|
TPM 的几个老坑
坑 1:fTPM bug 导致系统卡顿
1 2 3 4 5 6
| 2022 年 AMD fTPM 在某些主板上偶发卡死 → 鼠标 / 键盘卡顿几百毫秒 → 桌面用户大量抱怨 → AMD 后续 BIOS 修复
教训: fTPM 性能不如 dTPM 稳定
|
坑 2:BIOS 升级清除 PCR
1 2 3 4 5 6 7 8
| BIOS 升级 → CRTM 改变 → PCR 0 改变 → LUKS 密封基于 PCR 0 → 解不开 → 全盘加密的服务器锁死
防御: - 升级前重新封装密钥 - 用 TPM Recovery Key 备用 - PCR 选择只用 7(Secure Boot 状态)而非 0
|
坑 3:vTPM 状态不持久
1 2 3 4 5
| KVM vTPM 默认存在内存: - VM 重启状态丢失 - 必须用 SWTPM 持久化 正确: swtpm + libvirt 标准模式
|
坑 4:TPM 命令排队
1 2 3 4 5
| TPM 是慢芯片: 单核单队列 → 多并发可能卡 100+ ms → 高并发应用不要频繁调 TPM
应用: 一次启动取出密钥后缓存到 kernel keyring
|
坑 5:TPM 与 Secure Boot 混淆
1 2 3 4 5 6 7 8
| TPM ≠ Secure Boot: Secure Boot = UEFI 验签 TPM = 度量记录
可以独立: - 只 Secure Boot,无 TPM:能验签,但没有"启动状态记录" - 只 TPM,无 Secure Boot:度量记录但允许任何启动 - 两个都开:完整方案
|
TCG 标准
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| TCG(Trusted Computing Group): TPM 标准制定者 AMD / IBM / Intel / HP / Microsoft 等创立 规范: TPM 2.0 Library Spec TCG PC Client Profile Storage Spec(SED) DICE(Device Identifier Composition Engine) SPDM(Security Protocol and Data Model) 中国对应: TCG 中国分会 GB/T 29827-2013 系列国标
|
一些查询命令
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| ls /dev/tpm* cat /sys/class/tpm/tpm0/tpm_version_major
dmesg | grep -i tpm
tpm_tis.driver_args=...
apt install tpm2-tools dnf install tpm2-tools
sudo tpm2_eventlog /sys/kernel/security/tpm0/binary_bios_measurements
apt install swtpm swtpm-tools
qemu-system-x86_64 ... \ -chardev socket,id=chrtpm,path=/tmp/swtpm-sock \ -tpmdev emulator,id=tpm0,chardev=chrtpm \ -device tpm-tis,tpmdev=tpm0
|
一些数字直觉
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| TPM 2.0 性能: 生成 RSA 2048 密钥: 500-1000 ms RSA 签名: 50-100 ms PCR Extend: 1-5 ms Quote: 50-150 ms RNG 32 字节: 5-10 ms
启动时间影响: 完整 measured boot: +1-3 秒 TPM unseal LUKS: +200-500 ms 价格: dTPM 芯片单颗: $1-3 美元 服务器主板支持: 通常含 fTPM 启用: 免费
|
第八章 Roadmap
接下来会展开:
- Secure Boot / Measured Boot / IMA(怎么用 TPM)
- TEE:SGX / TDX / SEV / TrustZone
- 机密计算 Confidential VM/Container
- 国产可信计算(海光 CSV / 鲲鹏 / TPCM)
- 选型与小结
小结
- TPM 是可信计算的硬件根,提供度量、密封、远程证明能力
- TPM 1.2 仅 SHA-1,已淘汰;TPM 2.0 多算法可扩展
- TCM 是中国国密版本,TPCM 是”主动可信”扩展
- PCR 是核心数据结构——用 Extend 操作记录哈希链
- 度量启动链从 CRTM 到应用层,PCR 0-10 各有约定
- Quote 是远程证明,Seal 是状态绑定
- LUKS + TPM、Win BitLocker 是常见的应用
- 数据中心服务器普遍配 TPM 2.0,但启用率有限
下一篇讲 Secure Boot / Measured Boot / IMA——怎么把 TPM 用起来。