TDX下,event log和RTMR的关系。 及他们的相关知识 --来自kimi
event log和RTMR的关系
在 Intel TDX(Trust Domain Extensions)中,event log 与 RTMR(Run-Time Measurement Register) 的关系可以理解为“日志与度量寄存器之间的记录与验证关系”。
一、RTMR 是什么?
RTMR 是 TDX 提供的运行时度量寄存器,用于在 TD(Trust Domain)运行期间记录动态完整性度量值。它类似于 TPM 中的 PCR(Platform Configuration Register),使用 SHA-384 进行扩展计算:
RTMR[i] = SHA384(RTMR[i] || 新数据)
TD 内部可以通过
TDCALL(TDG.MR.RTMR.EXTEND)
主动将某些数据(如内核、initrd、命令行参数等)的哈希值扩展到 RTMR 中。二、event log 是什么?
event log 是 TD 在启动和运行过程中,所有被度量对象的详细记录。它包括:
-
被度量对象的内容(如内核镜像、initrd、命令行参数等)
-
度量顺序
-
度量值(即哈希)
-
度量来源(哪个组件触发的)
event log 是可读的、结构化的日志文件,通常由固件(如 TDVF/OVMF)或操作系统中的 IMA(Integrity Measurement Architecture)生成。
三、两者的关系:RTMR 是摘要,event log 是明细
项目 | RTMR | event log |
---|---|---|
本质 | 4 个 48 字节的 SHA-384 寄存器 | 结构化的度量日志 |
作用 | 提供一个整体摘要值,供远程验证 | 提供详细度量过程,用于本地或远程审计 |
数据来源 | TD 内部通过 TDCALL 扩展 |
由启动固件、内核、IMA 等记录 |
验证方式 | 与 Quote 中的 RTMR 值比对 | 与 Quote 中的 event log hash 比对 |
是否可重建 | 否(只能扩展) | 是(可重放计算 RTMR) |
简单来说:event log 是 RTMR 的“构建过程记录”,RTMR 是 event log 的“最终哈希摘要”。
四、在远程证明中的作用
在 TDX 的远程证明流程中:
-
TD 使用
TDG.MR.REPORT
获取TDREPORT
,其中包含:-
MRTD(静态度量)
-
RTMR0~3(动态度量)
-
event log 的哈希(可选)
-
-
该报告由 Quoting Enclave 签名生成 Quote。
-
远程验证方收到 Quote 后:
-
用 RTMR 验证 TD 的运行时状态是否可信;
-
用 event log 验证度量过程是否合理、完整、未被篡改。
-
五、一句话总结
RTMR 是 event log 的“指纹”,event log 是 RTMR 的“解释说明书”。两者配合使用,构成了 TDX 中可信启动与运行时完整性验证的核心机制。
Intel TDX的RTMR和event log如何确保系统安全?
在 Intel TDX 中,RTMR(运行时度量寄存器) 与 event log(事件日志) 共同构成了从“度量”到“验证”的完整信任链,确保系统在启动和运行过程中未被篡改、可审计、可远程验证。它们的安全作用可以从以下四个维度理解:
✅ 1. 完整性度量:RTMR 是“信任根”的延伸
-
RTMR 是 TDX 提供的 4 个 48 字节 SHA-384 寄存器,用于记录 TD(Trust Domain)运行时的关键状态。
-
每当 TD 内部发生关键事件(如加载内核、模块、配置文件、IMA 度量等),系统通过
TDCALL[TDG.MR.RTMR.EXTEND]
将其哈希值扩展到 RTMR 中。 -
这个过程是不可逆的(只能扩展,无法回滚),确保攻击者无法伪造或撤销已发生的度量。
✅ 2. 可审计性:event log 是“度量过程的可读记录”
-
event log 是一个结构化的日志文件,记录了每一次 RTMR 扩展的详细信息,包括:
-
被度量对象的内容(如内核、initrd、命令行参数)
-
度量顺序与来源
-
度量值(哈希)
-
-
它是可读的、可重放的,允许本地或远程验证者复现 RTMR 的最终值,从而验证系统完整性。
✅ 3. 远程证明:RTMR + event log 是“远程信任的基石”
在 TDX 的远程证明流程中:
步骤 | 作用 | 涉及组件 |
---|---|---|
① TD 启动 | 固件/内核将启动组件度量写入 event log,并扩展到 RTMR | TDVF、IMA |
② 生成报告 | 使用 TDCALL[TDG.MR.REPORT] 获取 TDREPORT ,内含 RTMR 值 |
TDX Module |
③ 生成 Quote | Quoting Enclave 对 TDREPORT 签名,生成远程可验证的 Quote | Quoting Enclave |
④ 验证 Quote | 验证 RTMR 值是否与预期一致 | 远程验证方 |
⑤ 验证 event log | 校验 event log 是否可重放出 RTMR 值,确认无篡改 | 远程验证方 |
例如,Intel Trust Authority 会将 IMA 运行时度量写入 RTMR,并将 event log 一并上传进行完整性验证。
✅ 4. 防御攻击:防止“伪造度量”与“回滚攻击”
攻击类型 | 防御机制 |
---|---|
伪造度量 | RTMR 只能通过 TDCALL 扩展,且由 TDX Module 控制,防止恶意软件伪造度量值。 |
回滚攻击 | RTMR 扩展不可逆,event log 由可信固件/内核生成,无法被篡改或删除。 |
日志伪造 | event log 的哈希值可被包含在 TDREPORT 中,远程验证者可比对 event log hash 与 Quote 中值是否一致。 |
✅ 总结一句话:
RTMR 是系统运行时状态的“哈希指纹”,event log 是这个指纹的“生成过程记录”。两者配合,构成了 Intel TDX 中从“本地可信启动”到“远程可信验证”的完整安全闭环。
RTMR值怎么计算的
在 Intel TDX 中,RTMR 本身永远只有 48 字节(384 bit),不可能“超过”这个长度。
如果用户觉得“值超过了 48 字节”,大概率是把待度量的原始数据与RTMR 寄存器搞混了。下面把规则和做法一次讲清楚。
如果用户觉得“值超过了 48 字节”,大概率是把待度量的原始数据与RTMR 寄存器搞混了。下面把规则和做法一次讲清楚。
1️⃣ RTMR 寄存器规格
-
每个 RTMR(共 4 条:RTMR0~RTMR3)固定 48 字节
-
只能保存 SHA-384 的最终结果,永远不可能增长或溢出
-
硬件指令
TDCALL[TDG.MR.RTMR.EXTEND]
定义为:RTMR[i] ← SHA-384(RTMR[i] || 待扩展数据)
其中,“待扩展数据”最大支持 64 字节以内(规范上限),但 RTMR 结果始终是 48 字节。
2️⃣ 如果“待度量数据 > 48 字节”怎么办?
把大对象做一次 预哈希(pre-hash),再扩展即可。
典型流程:
典型流程:
步骤 | 操作 | 长度限制 |
---|---|---|
① | 对任意大小的原始对象 Object 做一次 SHA-384 → H = SHA-384(Object) |
无上限 |
② | 调用 TDCALL[TDG.MR.RTMR.EXTEND] 把 48 字节的 H 扩展进 RTMR |
≤ 64 B |
代码示例(Linux 内核 IMA/EVM 路径):
c
u8 hash[SHA384_DIGEST_SIZE]; /* 48 B */
sha384(Object, Object_len, hash); /* 预哈希 */
tdx_extend_rtmr(rtmr_idx, hash, 48); /* 扩展进 RTMR */
这样无论原始对象多大,最终写进 RTMR 的只有 48 字节哈希值。
3️⃣ 别忘了 event log 的配套
-
完整对象写入 event log(event log 大小只受内存限制)。
-
event log 里同时记录:
{ "type": "ima", "boot_aggregate": "...", "template": "d-ng|n-ng", "filedata": "<base64 Object>" }
-
远程证明时,验证端用 event log 重放哈希链,结果应与 Quote 里的 RTMR 值一致,从而确认大文件完整性。
✅ 一句话总结
RTMR 本身永远不会超过 48 字节;大于 48 字节的对象先做一次 SHA-384 预哈希,再把 48 字节摘要扩展进 RTMR,同时把完整对象写进 event log 供审计。
RTMR的值,每次写入,会覆盖之前的数据吗
不会 覆盖,而是 “累加”。
在 Intel TDX 中,RTMR 的工作方式与 TPM 的 PCR 完全一致:
在 Intel TDX 中,RTMR 的工作方式与 TPM 的 PCR 完全一致:
RTMR_new = SHA-384(RTMR_old || 本次待扩展数据)
-
RTMR_old
是寄存器里当前的 48 字节值 -
||
表示字节级拼接 -
结果写回同一个寄存器,长度仍为 48 字节
也就是说,每次扩展都把新数据拼在旧值后面再算一次哈希,旧值被“吸收”进新的哈希结果,不会被直接覆盖掉。
因此 RTMR 只能 单向增长(所谓“扩展”),不能回滚、不能清零,从而保证度量链的完整性。
因此 RTMR 只能 单向增长(所谓“扩展”),不能回滚、不能清零,从而保证度量链的完整性。
RTMR 0,1,2,3 , 每一个的详细作用
Intel TDX 为 TD(Trust Domain)提供了 4 条 48 字节的 RTMR(Run-Time Measurement Registers),编号 0–3。
它们的功能分工在社区文档、固件实现与典型云场景(Azure、Phala、dstack 等)中已基本形成共识,归纳如下:
它们的功能分工在社区文档、固件实现与典型云场景(Azure、Phala、dstack 等)中已基本形成共识,归纳如下:
寄存器 | 官方/社区常见定义 | 典型度量对象(示例) | 远程证明时关注的完整性维度 | 备注 |
---|---|---|---|---|
RTMR0 | TDVF 配置 & 虚拟硬件环境 | TDVF 固件、OVMF 变量、launch-参数、ACPI 表、设备 ROM | 平台 / 虚拟固件完整性 | 也常被映射到 TPM PCR1+PCR7 |
RTMR1 | OS 内核 | Linux kernel 镜像、GRUB loader、内核镜像哈希 | 内核完整性 | 直接启动时度量 kernel+boot params;GRUB 启动时度量 GRUB 本身 |
RTMR2 | Initrd / Kernel 命令行 / 早期用户态 | initrd 镜像、kernel cmdline、boot config、early userspace | 初始根文件系统 & 启动参数完整性 | 部分实现把 initrd+cmdline 分两条链,但最终都落在 RTMR2 |
RTMR3 | 应用级 & 保留扩展 | Docker compose 哈希、应用代码、app-id、实例配置、TLS 证书、策略文件 | 应用/业务负载完整性 | 完全由 TD 内软件自由使用;dstack、Phala 等用它度量容器镜像 |
一张图速记
RTMR0 —— 固件/配置:决定“这台 TD 是不是在干净的虚拟板上启动”
RTMR1 —— 内核:决定“跑的内核是不是我指定的版本”
RTMR2 —— initrd+cmdline:决定“启动参数与早期根文件系统是否被篡改”
RTMR3 —— 应用:决定“真正运行业务的容器/程序是否可信”
使用注意
-
四条寄存器全部初始化为 48 字节 0。
-
任何扩展都通过
TDCALL[TDG.MR.RTMR.EXTEND]
完成,算法为RTMR[i] = SHA-384(RTMR[i] || data)
。 -
远程证明时,验证方先比对 Quote 中的 RTMR 值,再用 event log 重放校验,确保度量链不可伪造、不可回滚
tdvm上怎么生成quote,怎么生成RTMR
有工具的。
在 TDVM(Trust Domain Virtual Machine) 里,生成 Quote 和 RTMR 的流程可以拆成两步:
✅ 第一步:让 RTMR 拥有“真实值”
RTMR 不会像 TPM PCR 那样自动记录,而是 完全由 TD 里的软件主动扩展。
做法只有一句话:
做法只有一句话:
bash
# 在 TD guest 里(root 权限)
echo "my-kernel-vmlinux-$(sha384sum /boot/vmlinuz)" | \
tdx_extend_rtmr -i 1 -r - # 把内核哈希扩展进 RTMR1
-
-i 1
→ RTMR1(内核) -
-r
→ 原始 48 字节哈希;也可以用-s
直接传字符串让工具帮你算 SHA-384 -
工具来自社区包 pytdxmeasure 或 libtdx-attest-devel
RTMR 的 4 条寄存器(0–3)由谁扩展?
寄存器 | 典型扩展者 | 常见用途 |
---|---|---|
RTMR0 | TDVF / OVMF | 平台/固件配置 |
RTMR1 | boot loader / kernel | 内核镜像 |
RTMR2 | initrd / cmdline | 启动参数 |
RTMR3 | 应用/容器 | 业务镜像 |
✅ 第二步:把 RTMR 打包进 Quote
TDX 的远程证明遵循 “两步走” 模型:
-
生成 TDREPORT(在 TD 内)
任何进程都可以调用内核驱动或libtdx-attest
提供的接口:cstruct tdx_report_req req = { .report_data = {0}, // 64 B 任意数据,可放 nonce 或公钥哈希 .tdreport = out_buf, // 1024 B 输出 }; ioctl(tdx_fd, TDX_CMD_GET_REPORT, &req);
返回的TDREPORT
里已经包含 MRTD + 4×RTMR 等度量值。 -
把 TDREPORT 变成 Quote(在主机或 Side-car Enclave)
-
本地 QE(Quoting Enclave)
如果你在同一台物理机上有 SGX QE/DCAP 环境:bash# 阿里云/本地示例 sudo ./app -d $(cat nonce.bin | xxd -p) # 生成 Quote 文件
QE 会用平台 ECDSA-384 密钥给 TDREPORT 签名,产出标准 DCAP Quote。 -
Intel Trust Authority SaaS
不想自己维护 QE,可用 trustauthority-client:bashtrustauthority-client get-quote \ --tee-type tdx \ --report-data $(cat nonce.bin | base64) \ --out quote.json
-
✅ 快速验证:一条命令看 RTMR 与 Quote
bash
# 1. 查看 RTMR 当前值
./tdx_tdreport | jq '.rtmr[0], .rtmr[1], .rtmr[2], .rtmr[3]'
# 2. 生成 Quote
sudo ./app -d 1234567890abcdef... # 产出 quote.bin
# 3. 校验 Quote 里确实包含刚才的 RTMR
./verifier -quote quote.bin | jq '.event_logs[]?.rtmr'
✅ 一句话总结
在 TDVM 里:先“主动扩展 RTMR”把度量写进去,再“调 TDREPORT + QE”把 RTMR 封装成 Quote;整个过程都在 TD 内完成,无需 VMM 额外介入。
RTMR和Quote在TDVM中有哪些用途?
在 TDVM(Trust Domain Virtual Machine) 中,RTMR 和 Quote 是整个 TEE 信任链的两条“主筋”:
前者负责 把系统每一层状态固化成硬件寄存器值;后者负责 把该值和平台签名一起打包成远程可验证的凭证。
具体用途可以拆成 4 个维度来理解:
前者负责 把系统每一层状态固化成硬件寄存器值;后者负责 把该值和平台签名一起打包成远程可验证的凭证。
具体用途可以拆成 4 个维度来理解:
1️⃣ RTMR 在 TDVM 中的用途
场景 | 作用 | 典型例子 |
---|---|---|
完整性度量 | 把“启动/运行”过程中的关键对象哈希写入硬件寄存器,形成不可回滚的度量链 | 固件、内核、initrd、应用镜像依次扩展到 RTMR0/1/2/3 |
本地策略判定 | TD 内部服务可读取 RTMR,发现度量值与预期不符时拒绝后续动作 | init 进程发现 RTMR2 ≠ 期望值,则拒绝挂载加密数据卷 |
事件日志回放 | event log 重放时,用 RTMR 作为最终验证锚点,确保日志未被篡改 | 远程验证方本地重放 event log,结果必须等于 Quote 中的 RTMR |
2️⃣ Quote 在 TDVM 中的用途
场景 | 作用 | 典型例子 |
---|---|---|
远程证明(Remote Attestation) | 向密钥服务器/客户端证明 TDVM 运行在可信硬件且代码未被篡改 | 大模型推理服务在返回结果前先提供 Quote,客户端验证通过后才上传提示词 |
机密数据释放 | 只有 Quote 验证成功,KMS 才释放解密密钥 | 加密容器镜像的密钥托管在 KMS,KMS 验证 Quote 后返回 LUKS 密钥 |
合规审计 | 云厂商/租户定期拉取 Quote,归档到审计系统,满足合规要求 | 金融云每日自动收集所有 TDVM Quote,与基线比对并出报告 |
密钥协商绑定 | 把 Quote 中的 report_data 字段用作 ECDH 公钥哈希,绑定后续通信密钥 | 客户端把自身公钥哈希写进 report_data,TDVM 端验证一致后派生会话密钥 |
3️⃣ RTMR 与 Quote 的协同流程(一句话总结)
RTMR 把“我当前是什么”固化到硬件寄存器;Quote 把“RTMR 值 + 平台签名”封装成可远程校验的“身份证”。二者共同让外部世界确信:这台 TDVM 从固件到应用均没有被篡改,且运行在真正的 Intel TDX 硬件上。
Quote在远程证明中具体是如何工作的?
在 Intel TDX 的体系里,Quote 就是远程证明的“身份证”,它把 TD 内部的度量值(RTMR、MRTD 等)和 平台硬件签名 绑定在一起,供远程验证方一次性完成 “身份 + 完整性” 双校验。下面以 TDVM 为例,用 时间线 + 消息流 的方式拆解 Quote 在远程证明中的完整工作流程:
1️⃣ 阶段总览(一句话)
“TD 内部生成 TDREPORT → QE 签名 → 验证方验签”
全程 3 次握手、5 个核心数据结构。
2️⃣ 详细 7 步流程
步骤 | 所在位置 | 动作 | 关键数据结构 |
---|---|---|---|
① 准备随机数 & 策略 | 客户端/验证方 | 生成 64 B 随机数 nonce 和“期望策略”(如内核版本、调试位为 0 等) |
nonce , policy.json |
② 请求证明 | 客户端 → TDVM | 把 nonce 与策略发给 TDVM |
HTTPS 或 gRPC 请求 |
③ 生成 TDREPORT | TDVM 内部 | 调用 TDCALL[TDG.MR.REPORT] :把 nonce 填入 report_data ,输出 1 KiB 的 TDREPORT |
TDREPORT (内含 4×RTMR + MRTD + 属性位) |
④ 生成 Quote | 主机侧 QE | TDREPORT → Quoting Enclave(SGX QE 或 DCAP)→ ECDSA-384 签名 → 生成 Quote(含证书链) |
Quote (~4 KiB,DER 或 CBOR) |
⑤ 返回 Quote | TDVM → 客户端 | 把 Quote + event log(可选)一起回传 | HTTPS 或 gRPC 响应 |
⑥ 验证 Quote | 验证方/Attestation Service | ① 验签:用 Intel 根证书或云厂商证书链验证签名;② 验度量:比 RTMR、MRTD 与策略;③ 验 nonce 匹配 |
verifier 工具 |
⑦ 结果 & 后续动作 | 验证方 | 通过:释放密钥或建立会话;失败:拒绝或告警 | JWT 结果、session_key |
3️⃣ 数据流示意图
┌────────────┐ ┌────────────┐ ┌──────────────┐
│ Client │ │ TDVM │ │ Attestation│
│ (Verifier) │ │ (Prover) │ │ Service │
└────┬───────┘ └────┬───────┘ └──────┬───────┘
│ ① nonce+policy │ │
│---------------------->│ │
│ │ ② TDCALL → TDREPORT │
│ │--------------------┐ │
│ │ ③ QE → Quote │ │
│ │<-------------------┘ │
│ ④ Quote │ │
│<----------------------│ │
│ ⑤ verify Quote │ │
│---------------------->│ │
│ │ │
│<----------------------│ ⑥ attestation result (JWT) │
4️⃣ 关键细节速查
-
nonce 作用:防止重放攻击,必须原样写进 Quote 的
report_data
字段,验证时比对。 -
event log:可随 Quote 一起上传,验证方用其重算 RTMR 做二次校验。
-
策略示例(阿里云):JSON
{ "environment": { "tdx_attributes": "0000000010000000" }, "reference": { "rtmr1": "d8b1…48B SHA384", "rtmr2": "9f3c…48B SHA384" } }
-
工具链
-
生成:
tdx-quote-generation-sample
(阿里云镜像内置) -
验证:
tdx-quote-verification-sample
或trustauthority-client
-
在线服务:Intel Trust Authority、Azure Attestation、阿里云 DCAP 服务
-
5️⃣ 一句话总结
远程证明 = 把 TDVM 的“硬件指纹”(RTMR/MRTD)+ 平台签名打包成 Quote;验证方验签并比对策略,通过后才能“放行”机密数据或服务会话。
MRTD是什么
在 Intel TDX 的语境里,MRTD 并不是红外行业里说的 “最小可分辨温差”,而是:
Measurement Register for TD – TD 的初始静态度量寄存器
-
位置:TDREPORT 结构体中的固定 48 字节字段
-
作用:把 TD 在加载瞬间(launch 时)的全部初始状态(TD 镜像、内核、initrd、启动参数等)做一次 SHA-384 哈希,写死在 MRTD 中;后续再也无法修改
-
关系:
-
与 4 个 RTMR 并列,都是度量值寄存器
-
与 TDREPORT 是“寄存器值 ⇄ 报告字段”的关系
-
与 Quote 是“报告字段 ⇄ 远程证明凭证”的关系
-
一句话:
MRTD 就是 TD 的“出生指纹”,一次成型,终身不变;远程证明时,它作为 TDREPORT 的组成部分被 Quote 带走,供验证方核对“这台 TD 最初到底跑了什么”。
MRTD 就是 TD 的“出生指纹”,一次成型,终身不变;远程证明时,它作为 TDREPORT 的组成部分被 Quote 带走,供验证方核对“这台 TD 最初到底跑了什么”。
TDREPORT,MRTD, RTME, QUOTE他们的关系
下面用 一句话 + 一张时序图 + 一张对照表 把 TDREPORT、MRTD、RTMR、QUOTE 四者在 Intel TDX 中的职责与衔接关系彻底说清。
🔑 一句话
MRTD 记录“出生指纹”,RTMR 记录“成长轨迹”;TDREPORT 把这两类度量 + 平台信息打包成本地可信摘要;QUOTE 再给这份摘要盖上平台 ECDSA 签名,让它可被远程第三方验证。
🗺️ 时序图
📊 四者对照表
名称 | 全称/本质 | 存储位置 | 大小 | 由谁产生 | 包含内容 | 使用场景 |
---|---|---|---|---|---|---|
MRTD | Measurement Register of TD | TDCS 内 | 48 B | TDX Module | 启动/构建阶段所有初始页、固件、配置哈希 | 静态“出生指纹” |
RTMR | Run-Time Measurement Register | 4×48 B 寄存器 | 4×48 B | TD 软件(TDCALL) | 运行时度量:内核、initrd、cmdline、应用 | 动态“成长轨迹” |
TDREPORT | TD Report Structure | 内存缓冲区 | 1024 B | TDX Module | MRTD + 4×RTMR + CPU/TCB 版本 + REPORTMAC | 本地可信摘要(HMAC 保护) |
QUOTE | Attestation Quote | 文件/网络报文 | ~4 KiB | Quoting Enclave | 对 TDREPORT 的 ECDSA-384 签名 + 证书链 | 远程可验证凭证 |
✅ 一句话记忆
MRTD 是“出生照”,RTMR 是“成长照”;TDREPORT 是“体检表”,QUOTE 是“带钢印的公证书”。
Intel TDX Remote Attestation 所涉及的所有“高频概念”
🧭 1. 核心角色与数据结构
术语 | 中文/含义 | 一句话说明 |
---|---|---|
TD | Trust Domain(信任域) | 被 TDX 隔离的机密虚拟机,远程证明的“被验证方” |
TDREPORT | TD 报告 | CPU 生成的 1024 B 结构体,内含 MRTD + 4×RTMR + TCB 版本 等度量,只能本地验证 |
QUOTE | 远程证明报告 | QE 对 TDREPORT 的 ECDSA-384 签名 + 证书链,可远程验证 |
MRTD | 构建时度量寄存器 | 48 B 哈希,记录 TD 启动瞬间的完整镜像/配置 |
RTMR0-3 | 运行期度量寄存器 | 记录运行时完整性(内核、initrd、应用) |
QE | Quoting Enclave | 本地或主机侧签名模块,把 TDREPORT → QUOTE |
TDX Module | SEAM 模式下的微码 | 生成 TDREPORT 的“根信任” |
PCK | Provisioning Certification Key | 每颗 CPU 的出厂证书,QUOTE 的签名根 |
PCS | Provisioning Certification Service | Intel 在线服务,下发 PCK 证书链 |
Attestation Service | 远程验证服务 | 云厂商或 Intel Trust Authority,验证 QUOTE 有效性 |
🔄 2. 完整工作流程(阿里云/火山/Intel 通用)
-
启动度量
TD 启动 → TDX Module 计算 MRTD → 后续内核/应用通过 IMA 扩展 RTMR -
本地报告
TD 调TDCALL[TDG.MR.REPORT]
→ 输出 TDREPORT(含 MRTD + RTMR) -
生成 Quote
TDREPORT → QE → QUOTE(ECDSA-384 签名 + 证书链) -
远程验证
客户端把 QUOTE + event log 发到 Attestation Service → 验签 + 比对策略 → 返回 JWT 结果
🛠️ 3. 常用工具与策略片段
工具/文件 | 用途 | 示例命令 |
---|---|---|
trustauthority-client | 一键取 Quote 并送 Intel SaaS | trustauthority-client get-quote --tee-type tdx --out quote.json |
tdx-quote-verification-sample | 本地验签 | sudo ./verifier -quote quote.bin -policy policy.jwt |
IMA policy | 把运行时文件哈希写 RTMR | echo 'measure func=BPRM_CHECK mask=MAY_EXEC' >> /etc/ima/ima-policy |
Appraisal Policy | 远程策略文件 | JSON 指定 tdx_attributes、RTMR 期望哈希 |
🧩 4. 一句话记忆
TD 里先“量血压”(MRTD/RTMR),再出“体检表”(TDREPORT),QE 给体检表盖“钢印”(QUOTE),远程医生(Attestation Service)看钢印 + 化验单(event log)决定是否放行。
IMA在这中间的启的作用
IMA 在 TDX 远程证明里就是“把运行时度量源源不断地写进 RTMR,并生成可重放的事件日志”的自动化“度量引擎”。
详细作用拆解
-
度量链延伸
• TD 启动后,IMA 把内核、模块、可执行文件、配置等逐个哈希
• 每算一次就调用TDCALL[TDG.MR.RTMR.EXTEND]
,把 48 B 摘要累加到 RTMR1/2/3,形成不可回滚的运行时度量链。 -
证据留存
• 同时把「文件名→哈希→RTMR 序号」写入 /sys/kernel/security/ima/ascii_runtime_measurements(即 event log)。
• 远程验证方可用该日志重放,验证 Quote 中的 RTMR 值确实由这些文件一步步算得。 -
策略驱动
• 通过/etc/ima/ima-policy
控制“哪些动作需要度量”:measure func=BPRM_CHECK mask=MAY_EXEC # 可执行文件 measure func=FILE_CHECK mask=MAY_READ # 关键配置
• 仅记录不阻断(measure),也可升级为 appraise 强制完整性校验。 -
与远程证明的衔接
• TD 生成 Quote 时,event log 作为附件一起上传。
• 验证服务先验签 Quote,再用 event log 重算 RTMR;两者一致即证明 TD 运行期未被篡改。
→ 因此,IMA 把“静态启动完整性”扩展到“动态运行完整性”,让 TDX 远程证明真正覆盖 “从开机到业务进程” 的完整链路。
如何设置 IMA 策略?
在 Linux(含 TDX 机密虚拟机)里,IMA 策略可以 通过内核启动参数一次性生效,也可以 运行期动态写入。下面给出最常用的三种做法,照抄即可落地。
✅ 方法 1:GRUB 启动参数(一次性全局策略)
编辑
/etc/default/grub
,在 GRUB_CMDLINE_LINUX
追加:bash
# 仅度量(measure)所有可执行文件、共享库、root 只读文件
ima_policy=tcb
# 如果想把度量也扩展到 TDX RTMR,再加下面两行
ima_template=ima-sig # 使用签名模板,字段更长
ima_hash=sha384 # 与 TDX RTMR 的哈希算法一致
保存后执行:
bash
sudo grub2-mkconfig -o /boot/grub2/grub.cfg # RHEL/CentOS
sudo update-grub # Ubuntu/Debian
重启即生效。
度量日志:
度量日志:
cat /sys/kernel/security/ima/ascii_runtime_measurements
✅ 方法 2:运行期动态加载(无需重启)
-
把策略写进文本文件,例如
/etc/ima/ima-policy
:
Text
# 度量所有可执行文件
measure func=BPRM_CHECK
# 度量所有 mmap 可执行文件(共享库)
measure func=MMAP_CHECK mask=MAY_EXEC
# 忽略 securityfs
dont_measure fsmagic=0x73636673
-
动态加载:
bash
sudo echo /etc/ima/ima-policy > /sys/kernel/security/ima/policy
立刻生效,无需重启 。
✅ 方法 3:systemd 自动加载(推荐)
systemd 248+ 已支持:
直接把策略文件放到
直接把策略文件放到
/etc/ima/ima-policy
,启动时 systemd 会自动写入内核接口 。🔍 常见策略关键字速查
关键字 | 含义 |
---|---|
measure |
仅记录度量(不拒绝访问) |
appraise |
强制完整性校验(拒绝篡改) |
func=BPRM_CHECK |
可执行文件加载时触发 |
func=MMAP_CHECK |
共享库 mmap 执行时触发 |
mask=MAY_EXEC |
仅对可执行权限触发 |
dont_measure / dont_appraise |
排除某些文件系统或路径 |
🎯 TDX 场景小贴士
-
度量算法要与 RTMR 对齐:
ima_hash=sha384
(TDX 默认) -
把度量扩展到 RTMR:在内核或用户态工具里,每次度量后调用
TDCALL[TDG.MR.RTMR.EXTEND]
,把 48 B 摘要写进对应 RTMR。 -
event log 同步上传:远程证明时把
/sys/kernel/security/ima/ascii_runtime_measurements
作为附件一起发给验证方。
照以上任一方法配置后,IMA 即可自动完成 “运行时度量 + RTMR 扩展 + 日志留存” 的全链路。