验证 Intel TDX 虚拟机实例是否在 Google Cloud 上运行

如需确定 Intel TDX 机密虚拟机实例是否在 Google Cloud上运行,您需要确定其provenance。确定来源涉及以下检查:

  • 引用验证和质询绑定:使用嵌入式 Intel 根证书验证 Intel TDX 引用的真实性,并可选择根据引用 REPORT_DATA 字段中的预期质询验证新鲜度。

  • 主机来源验证:从引用的嵌入式 PCK 证书中提取平台配置 ID (PPID)。使用 PPID 从 Cloud Storage 存储桶中提取主机注册 JSON 文档,以验证来源。

  • 实例来源验证:使用保密虚拟机的项目编号、可用区和实例 ID (PZID) 计算 SHA-384 摘要,然后验证该摘要是否与 Intel TDX 引用中的 MR_OWNER 字段值匹配。

远程验证来源

我们建议使用 gceprovenance 工具来确定 Intel TDX 机器的来源。该工具可自动提取所需的值并获取来源文档。

如需使用 gceprovenance 远程验证来源,请完成以下说明:

  1. 将 go-tdx-guest GitHub 代码库克隆到远程验证器:

    git clone https://github.com/google/go-tdx-guest.git
    
  2. 根据您的客户机操作系统,您可能需要安装一些 Go 依赖项才能构建 go-tdx-guest 中的工具。具体操作方法因操作系统而异。例如,以下命令会在 Ubuntu 上安装必要的依赖项:

    sudo apt update
    sudo apt install golang-go build-essential
    
  3. 构建 gceprovenance 工具:

    go build -C go-tdx-guest/tools/gceprovenance .
    
  4. 生成一个 64 字节的质询,Intel TDX 机密虚拟机实例必须将其绑定到其引用:

    head -c 64 /dev/urandom > challenge.bin
    
  5. 将质询文件发送到要验证的 Intel TDX 机密虚拟机实例。

  6. 在 Intel TDX 机密虚拟机实例上,将质询文件作为输入 (inblob) 传递给 /sys/kernel/config/tsm/report/ 处的 Linux ConfigFS:

    sudo mkdir -p /sys/kernel/config/tsm/report/report0
    sudo sh -c 'cat challenge.bin > /sys/kernel/config/tsm/report/report0/inblob'
    

    然后,系统会将该质询写入引用的 REPORT_DATA 字段中。

  7. 从生成的 outblob 文件中检索原始引用字节,并清理 report0 目录:

    sudo cat /sys/kernel/config/tsm/report/report0/outblob > quote.bin
    sudo rmdir /sys/kernel/config/tsm/report/report0
    
  8. 查询本地元数据服务器,以获取机密虚拟机实例的实例 ID、项目编号和可用区:

    PROJECT_NUMBER=$(curl -s "http://metadata.google.internal/computeMetadata/v1/project/numeric-project-id" -H "Metadata-Flavor: Google")
    INSTANCE_ID=$(curl -s "http://metadata.google.internal/computeMetadata/v1/instance/id" -H "Metadata-Flavor: Google")
    ZONE_PATH=$(curl -s "http://metadata.google.internal/computeMetadata/v1/instance/zone" -H "Metadata-Flavor: Google")
    ZONE=$(basename "$ZONE_PATH")
    
  9. 将引用二进制文件 (quote.bin)、项目编号、实例 ID 和可用区发送到远程验证器。

  10. 在远程验证器上,将您的质询转换为 128 字符的十六进制字符串,然后将其传递给 gceprovenance。然后,该工具会验证引用的签名和来源绑定:

    CHALLENGE_HEX=$(hexdump -v -e '/1 "%02x"' challenge.bin)
    ./go-tdx-guest/tools/gceprovenance/gceprovenance verify \
        -quote PATH_TO_QUOTE \
        -instance projects/PROJECT_NUMBER/zones/ZONE/instances/INSTANCE_ID \
        -challenge $CHALLENGE_HEX
    

    提供以下信息:

    • PATH_TO_QUOTE:所提供报价文件的路径。

    • PROJECT_NUMBER:提供的项目编号。

    • ZONE:所提供的可用区。

    • INSTANCE_ID:所提供的机密虚拟机实例 ID。

    成功的响应类似于以下内容:

    GCE TDX provenance verification: OK
    
    Instance
      Zone: ZONE
      Project: PROJECT_NUMBER
      Instance ID: INSTANCE_ID
    
    Checks
      Quote verification: OK
      REPORT_DATA challenge: OK
      Host registry document: found
      PZID binding: OK
    
    PPID: PPID
    Quote: tdx_quote.bin
    Host registry: host_registry.json
    

如需了解其他 gceprovenance 命令,请参阅 GitHub 代码库。