TDX CVM 证明和来源

1. 概览

机密虚拟机 (CVM) 是一种 Compute Engine 虚拟机,它使用基于硬件的内存加密和完整性保护。这有助于确保您的数据和应用在使用时无法在内存中读取或修改。在此 Codelab 中,您将学习如何在 CVM 上生成 Intel TDX 证明引用,并出于演示目的在本地对其进行验证。此外,您还将验证 CVM 的 Google Cloud 主机和实例出处。

此 Codelab 包括以下步骤:

  • 设置 Intel TDX 机密虚拟机
  • 提取 TDX 证明引用
  • 验证 TDX 证明引用和 Nonce
  • 验证 GCE 固件 (OVMF) 完整性
  • 验证 GCE TDX 主机和实例出处

学习内容

  • 如何使用 go-tdx-guest 工具在 CVM 上提取 TDX 证明引用
  • 如何验证引用的真实性、新鲜度(随机数)和 GCE 固件完整性 (OVMF)
  • 如何验证 Google Cloud 主机和实例出处(PPID 注册表查询和 PZID 实例绑定)

所需条件

2. 设置和要求

如需启用必要的 API,请在 Google Cloud 控制台或本地开发环境中运行以下命令:

gcloud auth login

gcloud services enable \
    cloudapis.googleapis.com \
    cloudshell.googleapis.com \
    confidentialcomputing.googleapis.com \
    compute.googleapis.com

3. 设置 CVM 并提取 TDX 引用

在此步骤中,您将创建一个 TDX CVM 并从硬件中提取 TDX 证明引用。

  1. 前往 Google Cloud 控制台或本地开发环境。按如下方式创建 CVM:
gcloud config set project <project-id>

gcloud compute instances create tdx-cvm-attestation-codelab \
    --machine-type=c3-standard-4 \
    --zone=us-central1-c \
    --confidential-compute-type=TDX \
    --maintenance-policy=TERMINATE \
    --image-family=ubuntu-2204-lts \
    --image-project=ubuntu-os-cloud \
    --scopes https://www.googleapis.com/auth/cloud-platform

<project-id> 替换为项目的唯一标识符。

  1. 连接到 CVM。
gcloud compute ssh --zone us-central1-c tdx-cvm-attestation-codelab
  1. 在 CVM 上设置 Go 环境:
wget https://go.dev/dl/go1.24.0.linux-amd64.tar.gz
sudo tar -C /usr/local -xzf go1.24.0.linux-amd64.tar.gz
export PATH=$PATH:/usr/local/go/bin
  1. 安装 go-tdx-guest 工具。

克隆代码库并构建 attest 工具,该工具会生成 TDX 引用。

git clone https://github.com/google/go-tdx-guest.git
cd go-tdx-guest/tools/attest
go build
  1. 提取 TDX 证明引用:

使用 attest 工具生成引用。我们将传递随机数(64 字节的 REPORT_DATA)并将输出保存到 quote.bin

nonce=$(head -c 64 /dev/urandom | xxd -p | tr -d '\n' | head -c 128)
sudo ./attest -in $nonce -inform hex -outform bin -out quote.bin

TDX 引用现已保存在 quote.bin 中!

4. 验证 TDX 证明引用

现在,我们已生成 Intel TDX 引用 (quote.bin),可以使用 go-tdx-guest 代码库中提供的 check 工具对其进行验证。此工具会根据 Intel 的规范检查引用,根据从 Intel 的 Provisioning Certification Service (PCS) 下载的附带信息对其进行验证,并验证政策限制(例如随机数)以防止重放攻击。

  1. 前往 check 工具目录并构建该工具:
cd ~/go-tdx-guest/tools/check
go build
  1. 运行该工具以验证加密签名和随机数两者 。我们将使用 -get_collateral=true 标志从 Intel 的 PCS 下载必要的 TEE 证书,使用 -check_crl=true 标志验证证书撤消,并使用 -report_data 标志验证随机数的新鲜度:
./check -in ~/go-tdx-guest/tools/attest/quote.bin -inform bin \
    -get_collateral=true -check_crl=true \
    -report_data $nonce

如果引用在加密方面有效且随机数匹配,该工具将记录类似于以下示例的成功消息,并以代码 0 退出:

INFO : TDX Quote verified successfully

5. 验证 GCE 固件 (OVMF) 完整性

虽然 Intel 的附带信息会验证硬件,但它不会验证虚拟机是否运行的是正版、未经修改的 Google Compute Engine (GCE) 固件。

Google 会针对所有正式 GCE UEFI (OVMF) 固件版本向公共 Google Cloud Storage (GCS) 存储分区发布已签名的启动认可 (包含黄金参考完整性测量值,即 RIM)。

在此步骤中,我们将使用 Google 的公共 gce-tcb-verifier 工具自动从 GCS 提取固件认可,验证 Google 的签名,并根据该认可验证 CVM 的固件测量值 (MRTD)。

1. 构建 GCE TCB 验证程序工具

  1. 从 GitHub 克隆公共 gce-tcb-verifier 代码库:
cd ~
git clone https://github.com/google/gce-tcb-verifier.git
  1. 前往 CLI 工具目录并构建该工具:
cd gce-tcb-verifier/gcetcbendorsement/cli
go build -o gcetcbendorsement
  1. 为方便起见,将构建的工具添加到 PATH:
export PATH=$PATH:$(pwd)

2. 根据 GCE 固件认可验证引用

现在,运行 gcetcbendorsement 工具来验证证明引用。由于该工具在验证成功后会静默成功,因此我们可以将该命令与 && echo "Validation Succeeded!" 链接起来,以获得友好且明确的成功确认:

gcetcbendorsement tdx validate ~/go-tdx-guest/tools/attest/quote.bin && echo "Validation Succeeded!"

输出:

Validation Succeeded!

后台发生了什么?

  1. 提取:该工具会解析 quote.bin 并从 TD 引用正文中提取固件测量值 (MRTD)。
  2. 提取:它使用 MRTD 构建 GCS 网址,并从 Google 的公共存储分区 (gs://gce_tcb_integrity) 下载相应的 VMLaunchEndorsement
  3. 签名验证:它会提取 Google 的公共根 CA 证书 (https://pki.goog/cloud_integrity/GCE-cc-tcb-root_1.crt),并以加密方式验证下载的认可上的 Google 签名。
  4. 测量值验证:它会将引用中由 TDX 硬件签名的 MRTD 与 Google 签名认可中的黄金参考测量值进行比较。

如果所有检查都通过,该命令将以代码 0 静默退出(或使用链接的 echo 输出 Validation Succeeded!),证明您的虚拟机运行的是 Google 认可的正版固件!

6. 验证 GCE TDX 主机和实例出处

虽然证明和固件验证确认您的虚拟机运行的是带有 Google 认可的 UEFI 固件的正版 Intel TDX 硬件,但 GCE TDX 出处验证 会通过两种关键方式将您的证明引用直接连接到 Google Cloud 的基础架构:

  1. 宿主机出处:通过从引用的 PCK 证书中提取平台的唯一 PPID(平台预配 ID),标识运行虚拟机的物理 Google Cloud 宿主机。然后,它会从 Google Cloud Storage (confidential-host-registry) 中检索主机平台的注册表记录,该记录会记录物理可用区以及 Google Cloud 上次预配主机证明证书的时间。
  2. 实例出处(PZID 绑定):Google Cloud 会以加密方式将特定虚拟机的身份 (ProjectNumberZoneInstanceID) 绑定到 TDX 引用的 MR_OWNER 寄存器中。验证此绑定可确保引用专属于您的实例,并防止跨不同虚拟机或项目的引用重放或替换攻击。

gceprovenance CLI 工具(也位于 go-tdx-guest 代码库中)会自动执行完整的出处验证,即在一个命令中检查引用真实性、新鲜度质询、主机注册表记录和实例 PZID 绑定。

  1. 前往 gceprovenance 目录并构建该工具:
cd ~/go-tdx-guest/tools/gceprovenance
go build
  1. 使用 verify 命令运行完整的出处验证。我们将传递之前生成的引用文件 (quote.bin) 和随机数质询 ($nonce):
./gceprovenance verify -quote ~/go-tdx-guest/tools/attest/quote.bin -challenge $nonce
  1. 当所有检查都成功时,该工具会输出类似于以下内容的验证报告:
GCE TDX provenance verification: OK

Instance: projects/123456789012/zones/us-central1-c/instances/987654321098765

Checks
  Quote verification: OK
  REPORT_DATA challenge: OK
  Host registry document: found
  PZID binding: OK

PPID: 0123456789abcdef0123456789abcdef
Quote: tdx_quote.bin
Host registry: host_registry.json

后台发生了什么?

  • 引用和质询 :该工具会根据 Intel 的根证书验证引用的签名链,并确认引用的 REPORT_DATA 与您的 $nonce 质询匹配。
  • 主机出处 (PPID):它会从叶级 PCK 证书中提取 32 个字符的十六进制 PPID,并从 GCS (https://storage.googleapis.com/confidential-host-registry/) 下载主机注册表 JSON 文档。
  • 实例出处 (PZID):它会查询本地 GCE 元数据服务器以获取实例的数字项目 ID、可用区和实例 ID,构建规范 PZID JSON 载荷 ({"instanceId":...,"numericalProjectId":...,"zone":...}),计算其 SHA-384 摘要,并验证它是否与引用中的 MR_OWNER 匹配。
  1. 检查检索到的主机注册表文档:

默认情况下,verify 命令会将提取的主机注册表 JSON 文档保存到 host_registry.json。您可以检查该文档以查看主机平台的元数据:

cat host_registry.json

输出示例:

{
  "zone": "us-central1",
  "timestamp": "2026-02-17T11:25:12Z"
}

此元数据描述了宿主机属性:

  • zone:宿主机所在的物理 Google Cloud 区域/可用区。
  • timestamp:Google Cloud 上次预配和验证此主机的硬件证明证书的 UTC 日期和时间。

7. 清理

在 Cloud 控制台或本地开发环境中运行以下命令:

# Delete the CVM instance
gcloud compute instances delete tdx-cvm-attestation-codelab --zone=us-central1-c

8. 后续步骤

详细了解 机密虚拟机和 Compute Engine