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 是明细

项目RTMRevent log
本质 4 个 48 字节的 SHA-384 寄存器 结构化的度量日志
作用 提供一个整体摘要值,供远程验证 提供详细度量过程,用于本地或远程审计
数据来源 TD 内部通过 TDCALL 扩展 由启动固件、内核、IMA 等记录
验证方式 与 Quote 中的 RTMR 值比对 与 Quote 中的 event log hash 比对
是否可重建 否(只能扩展) 是(可重放计算 RTMR)
简单来说:event log 是 RTMR 的“构建过程记录”,RTMR 是 event log 的“最终哈希摘要”。

四、在远程证明中的作用

在 TDX 的远程证明流程中:
  1. TD 使用 TDG.MR.REPORT 获取 TDREPORT,其中包含:
    • MRTD(静态度量)
    • RTMR0~3(动态度量)
    • event log 的哈希(可选)
  2. 该报告由 Quoting Enclave 签名生成 Quote。
  3. 远程验证方收到 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 寄存器搞混了。下面把规则和做法一次讲清楚。

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 完全一致:

RTMR_new = SHA-384(RTMR_old || 本次待扩展数据)

 
  • RTMR_old 是寄存器里当前的 48 字节值
  • || 表示字节级拼接
  • 结果写回同一个寄存器,长度仍为 48 字节
也就是说,每次扩展都把新数据拼在旧值后面再算一次哈希,旧值被“吸收”进新的哈希结果,不会被直接覆盖掉。
因此 RTMR 只能 单向增长(所谓“扩展”),不能回滚、不能清零,从而保证度量链的完整性。
 

RTMR 0,1,2,3 , 每一个的详细作用

Intel TDX 为 TD(Trust Domain)提供了 4 条 48 字节的 RTMR(Run-Time Measurement Registers),编号 0–3。
它们的功能分工在社区文档、固件实现与典型云场景(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  —— 应用:决定“真正运行业务的容器/程序是否可信”
 

使用注意

    1. 四条寄存器全部初始化为 48 字节 0。
    2. 任何扩展都通过 TDCALL[TDG.MR.RTMR.EXTEND] 完成,算法为
      RTMR[i] = SHA-384(RTMR[i] || data)
    3. 远程证明时,验证方先比对 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
  • 工具来自社区包 pytdxmeasurelibtdx-attest-devel
RTMR 的 4 条寄存器(0–3)由谁扩展?

寄存器典型扩展者常见用途
RTMR0 TDVF / OVMF 平台/固件配置
RTMR1 boot loader / kernel 内核镜像
RTMR2 initrd / cmdline 启动参数
RTMR3 应用/容器 业务镜像

✅ 第二步:把 RTMR 打包进 Quote

TDX 的远程证明遵循 “两步走” 模型
  1. 生成 TDREPORT(在 TD 内)
    任何进程都可以调用内核驱动或 libtdx-attest 提供的接口:
    c
    struct 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 等度量值。
  2. 把 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:
      bash
      trustauthority-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 个维度来理解:

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 等) noncepolicy.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-sampletrustauthority-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 最初到底跑了什么”。

 

TDREPORT,MRTD, RTME, QUOTE他们的关系

下面用 一句话 + 一张时序图 + 一张对照表 把 TDREPORT、MRTD、RTMR、QUOTE 四者在 Intel TDX 中的职责与衔接关系彻底说清。

🔑 一句话

MRTD 记录“出生指纹”,RTMR 记录“成长轨迹”;TDREPORT 把这两类度量 + 平台信息打包成本地可信摘要;QUOTE 再给这份摘要盖上平台 ECDSA 签名,让它可被远程第三方验证。

🗺️ 时序图

image

 

 

📊 四者对照表

名称全称/本质存储位置大小由谁产生包含内容使用场景
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 通用)

  1. 启动度量
    TD 启动 → TDX Module 计算 MRTD → 后续内核/应用通过 IMA 扩展 RTMR
  2. 本地报告
    TD 调 TDCALL[TDG.MR.REPORT] → 输出 TDREPORT(含 MRTD + RTMR)
  3. 生成 Quote
    TDREPORT → QE → QUOTE(ECDSA-384 签名 + 证书链)
  4. 远程验证
    客户端把 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,并生成可重放的事件日志”的自动化“度量引擎”。
详细作用拆解
  1. 度量链延伸
    • TD 启动后,IMA 把内核、模块、可执行文件、配置等逐个哈希
    • 每算一次就调用 TDCALL[TDG.MR.RTMR.EXTEND],把 48 B 摘要累加到 RTMR1/2/3,形成不可回滚的运行时度量链。
  2. 证据留存
    • 同时把「文件名→哈希→RTMR 序号」写入 /sys/kernel/security/ima/ascii_runtime_measurements(即 event log)。
    • 远程验证方可用该日志重放,验证 Quote 中的 RTMR 值确实由这些文件一步步算得。
  3. 策略驱动
    • 通过 /etc/ima/ima-policy 控制“哪些动作需要度量”:
    Copy
    measure func=BPRM_CHECK mask=MAY_EXEC   # 可执行文件
    measure func=FILE_CHECK mask=MAY_READ   # 关键配置
     
    • 仅记录不阻断(measure),也可升级为 appraise 强制完整性校验。
  4. 与远程证明的衔接
    • 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:运行期动态加载(无需重启)

  1. 把策略写进文本文件,例如 /etc/ima/ima-policy
Text
# 度量所有可执行文件
measure func=BPRM_CHECK

# 度量所有 mmap 可执行文件(共享库)
measure func=MMAP_CHECK mask=MAY_EXEC

# 忽略 securityfs
dont_measure fsmagic=0x73636673
 
  1. 动态加载:
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 扩展 + 日志留存” 的全链路。
posted @ 2025-08-19 16:22  云long  阅读(49)  评论(0)    收藏  举报