验证机密虚拟机实例的固件

所有机密虚拟机实例的固件均为 UEFI,并且基于 Open Virtual Machine Firmware 项目。固件由 Google 管理,以确保安全性、性能和稳定性。

Google 管理的固件还可确保机密虚拟机实例的信任根上存储在度量寄存器中的值保持一致。这有助于防止在机密虚拟机实例的固件更新时,机密计算工作负载因证明验证而被阻止。

为帮助确定机密虚拟机实例是否在 Google 管理的真实固件上运行,您可以执行以下任务:

  • 在启用了 AMD SEV-SNP 或 Intel TDX 的机密虚拟机实例上检索 Google 签名的启动背书。启动背书包含与固件相关的预计算签名测量结果。

  • 通过与特定于架构的测量结果进行比较,验证启动背书。

  • 验证 UEFI 二进制文件是否由 Google 认可且未被修改。

除了远程证明之外,您还可以将固件验证纳入安全政策中,以确定机密虚拟机实例是否应有权访问受保护的资源。

检索发布背书

您可以使用 Google 工具或自己的工具检索发布认可。

使用 Google 工具检索发布背书

如需使用 Google 工具从 AMD SEV-SNP 或 Intel TDX 机密虚拟机实例检索启动背书,请执行以下操作:

  1. 使用 SSH 连接到保密虚拟机实例

  2. 使用 Go-TPM-Tools (AMD SEV-SNP 或 Intel TDX) 或 SEV Guest (AMD SEV-SNP) 检索证明报告和关联的证书。

  3. 使用 gcetcbendorsement 从证明中提取 UEFI 背书并将其存储在文件中。然后,您可以验证背书是否以 Google 为根,以及认证报告的衡量数据是否属于已签名的衡量数据。

使用自有工具检索发布背书

如需使用自己的工具检索发布认可,请完成以下说明。

AMD SEV-SNP

  1. 向 AMD 安全处理器发出扩展访客请求,以检索证明报告。

  2. 提取存储在偏移量 90h 处的报告的 384 位衡量指标。如需了解详情,请参阅 SEV 安全嵌套分页固件 ABI 规范的第 7.3 章(表 22)。

  3. 使用 384 位测量结果从以下 Cloud Storage 存储桶下载序列化的参考启动背书:

    gs://gce_tcb_integrity/ovmf_x64_csm/sevsnp/384_BIT_MEASUREMENT.binarypb
    
  4. 使用 VMLaunchEndorsement 消息定义,通过 protoc 等工具对 BINARYPB 文件进行解码:

    message VMLaunchEndorsement {
      bytes serialized_uefi_golden = 1;
      bytes signature = 2;
    }
    

其他发布认可位置

启动背书也可能通过 AMD SEV-SNP 证书交付机制在 GUID 表中提供。它具有以下 GUID:

9f4116cd-c503-4f5a-8f6f-fb68882f4ce2

GUID 表记录在 AMD Guest-Hypervisor Communication Block 规范的 SNP 扩展客户机请求部分中。

在 Trusted Computing Group PC 客户端事件日志中,可能还会引用启动认可的本地和远程位置,如 TCG PC Client Platform Firmware Profile Specification Version 1.06 Revision 52 中记录的 SP800-155 事件所示。

Intel TDX

  1. 创建 configfs-tsm 报告条目:

    name=/sys/kernel/config/tsm/report/report0
    mkdir "${name}"
    cat "${your_nonce_file}" > "${name}/inblob"
    cat "${name}/outblob" > "${your_quote_destination}"
    
  2. 提取存储在偏移量 b8h 处的引用 384 位信任网域测量 MRTD(适用于 TDX 模块 1.5)。如需了解详情,请参阅 TDX DCAP 引用库

  3. 使用 384 位测量结果从以下 Cloud Storage 存储桶下载序列化的参考启动背书:

    gs://gce_tcb_integrity/ovmf_x64_csm/tdx/384_BIT_MEASUREMENT.binarypb
    
  4. 使用 protoc 等工具,根据 VMLaunchEndorsement 消息定义对启动背书进行解码:

    message VMLaunchEndorsement {
      bytes serialized_uefi_golden = 1;
      bytes signature = 2;
    }
    

发布认可示例

启动背书类似于以下示例:

VMLaunchEndorsement:
serialized_uefi_golden: "SERIALIZED_BYTES"
signature: "LAUNCH_ENDORSEMENT_SIGNATURE_BYTES"

UEFI 黄金测量数据

serialized_uefi_golden 字段包含多个值的序列化版本,如以下协议缓冲区所定义:

message VMGoldenMeasurement {
  google.protobuf.Timestamp timestamp = 1;

  // The changelist number this UEFI was built from.
  uint64 cl_spec = 2;

  // DER format certificate of the key that signed this document.
  bytes cert = 4;

  // SHA-384 digest of the UEFI binary without TEE-specifics about launch.
  bytes digest = 5;

  // A sequence of PEM-encoded certificates of keys used in cert in Root ...
  // final intermediate order. The last certificate will have a signed cert.
  bytes ca_bundle = 6;

  VMSevSnp sev_snp = 7;

  VMTdx tdx = 8;
}

VMGoldenMeasurement 消息中的 VMSevSnp 字段由以下协议缓冲区定义:

message VMSevSnp {
  // The Google-reported security version number of this UEFI on SEV-SNP.
  uint32 svn = 1;

  // Expected MEASUREMENT report field values given [key]-many VMSAs at launch.
  map<uint32, bytes> measurements = 2; // bytes size 48

  // A UUID that Google uses for its CVM UEFIs
  bytes family_id = 3; // size 16

  // A UUID to name this specific release of the UEFI image. This is randomly
  // generated with each build.
  bytes image_id = 4; // size 16

  // The launch policy that verifiers should expect with this UEFI.
  uint64 policy = 5;

  // Optional. PEM-encoded certs for Identity..Author..Root. If a singleton,
  // only an Id-key is used.
  bytes ca_bundle = 6;
}

VMGoldenMeasurement 消息中的 VMTdx 字段由以下协议缓冲区定义:

message VMTdx {
  message Measurement {
    // The amount of RAM in GiB provided to the VM. This is relevant to the
    // construction of the measured TDHOB page that includes memory region
    // resource attributes.
    uint32 ram_gib = 1;
    // If true, EFI_UNACCEPTED_MEMORY not presented to guest.
    // All memory is accepted by the firmware. Relevant to the TDHOB page
    // since the resource attribute will include
    // EFI_RESOURCE_ATTRIBUTE_NEEDS_EARLY_ACCEPT.
    bool early_accept = 2;
    // The SHA-384 digest of the measurement operations for the VM at launch.
    bytes mrtd = 3;
  }
  // The Google-reported security version number of this UEFI on TDX.
  uint32 svn = 1;

  // Expected MRTD report field values given legal configurations.
  repeated Measurement measurements = 2;
}

如需使用您自己的工具从 serialized_uefi_golden field 中解封并解码这些值,请完成以下步骤:

  1. 分配新的 VMGoldenMeasurement 消息。

  2. serialized_uefi_golden 解封到消息中。

或者,您也可以使用 gcetcbendorsement inspect 命令。

验证发布代言

检索启动认可后,验证其签名,然后根据需要将相应测量结果集成到您的安全政策中。

验证启动背书签名

您可以在信任锚中添加 Compute Engine 机密计算可信计算基根密钥证书,以验证启动背书的签名。

启动背书中 VMGoldenMeasurementcert 字段包含背书签名密钥的公钥的 DER 编码 X.509v3 证书。证书由根密钥签名。

您可以使用 gcetcbendorsement 来显示要运行哪些 openssl 命令来验证签名。例如,如果您运行以下命令:

gcetcbendorsement verify --show LAUNCH_ENDORSEMENT_FILENAME.binarypb

您应该收到类似以下示例的响应:

openssl verify -CAfile <(openssl x509 -outform pem -in <(curl https://pki.goog/cloud_integrity/GCE-cc-tcb-root_1.crt)) \
    <(gcetcbendorsement inspect mask "LAUNCH_ENDORSEMENT_FILENAME.binarypb" --path=cert) \
    && \
    openssl pkeyutl -verify -pkeyopt rsa_padding_mode:pss \
        -pkeyopt rsa_pss_saltlen:32 -pkeyopt digest:sha256 -pkeyopt rsa_mgf1_md:sha256 -pubin \
        -inkey <(openssl x509 -pubkey -nocert -outform pem -in <(gcetcbendorsement inspect mask "LAUNCH_ENDORSEMENT_FILENAME.binarypb" --path=cert)) \
        -sigfile <(gcetcbendorsement inspect signature "LAUNCH_ENDORSEMENT_FILENAME.binarypb") -keyform PEM \
        -in <(openssl dgst -sha256 -binary <(gcetcbendorsement inspect payload "LAUNCH_ENDORSEMENT_FILENAME.binarypb")

如果您想使用自己的工具,可以将回答中使用的 gcetcbendorsement inspect 命令替换为您自己的协议缓冲区提取逻辑,以提取反序列化 VMGoldenMeasurement 消息的指定字段。

验证启动背书测量结果

有关如何创建发布认可的示例代码可在 gce-tcb-verifier GitHub 代码库中找到。 您可以使用此功能来了解 Google 如何从 UEFI 中派生出度量,并将相关度量纳入您的安全政策中。

例如,您可以检查固件是否由固件供应商签名,并将特定于架构的度量值与 VMLaunchEndorsement 消息中提供的预计算签名值进行比较。

虽然 Compute Engine 虚拟固件会在重置时升级,但 PCR0 值不会发生变化。因此,签名衡量中的固件的 svn 值可能与衡量到 PCR0 的 EV_S_CRTM_VERSION 不同,并且会跳过固件 blob 摘要中的 EV_POST_CODE 事件。

验证机密虚拟机实例的 UEFI 二进制文件

  1. 启动背书中,将 serialized_uefi_golden 值解封装到 VMGoldenMeasurement 中。如需查看示例,请参阅 Go 中的实现,或针对支持协议缓冲区的其他语言的 endorsement.proto 的 protoc 编译。

  2. VMGoldenMeasurement 中检索摘要值。这是机密虚拟机实例正在运行的 UEFI 二进制文件的 SHA-384 摘要。

  3. 使用 SHA-384 摘要从以下 Cloud Storage 存储桶下载固件二进制文件:

    gs://gce_tcb_integrity/ovmf_x64_csm/UEFI_BINARY_DIGEST.fd

  4. 如果该网址有效且固件下载成功,则对固件二进制文件执行 SHA-384 哈希。如果它与黄金测量结果中的摘要相匹配,则表示机密虚拟机实例上运行的固件未被修改。