TPM / TCM 基础与可信启动链

第八章讲可信计算。可信不是”加密”也不是”防火墙”——是”用硬件证明系统在某个状态”。本文从 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
# 看 TPM 是否存在
ls /dev/tpm*
# /dev/tpm0
# /dev/tpmrm0

# TPM 版本
cat /sys/class/tpm/tpm0/tpm_version_major
cat /sys/class/tpm/tpm0/device/description

# 看 PCR 值
tpm2_pcrread sha256:0,1,2,3,4,5,6,7

# 输出例:
# sha256:
# 0: 0x...64-hex
# 1: 0x...
# ...

# 取个随机数
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 -

# Quote(远程证明)
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
# TPM 设备
ls /dev/tpm*
cat /sys/class/tpm/tpm0/tpm_version_major

# TPM 设备字符
dmesg | grep -i tpm

# 启用 / 禁用(GRUB)
tpm_tis.driver_args=...

# tpm2-tools 安装
apt install tpm2-tools # Ubuntu
dnf install tpm2-tools # RHEL

# 看 measured boot 事件日志
sudo tpm2_eventlog /sys/kernel/security/tpm0/binary_bios_measurements

# 安装 swtpm(vTPM)
apt install swtpm swtpm-tools

# vTPM 给 KVM
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 用起来。