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

所有机密虚拟机实例的固件均为 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 来宾-Hypervisor 通信块规范中的 SNP 扩展来宾请求部分。

Trusted Computing Group PC 客户端事件日志中可能还会引用启动认证的本地和远程位置,这些位置可在 SP800-155 事件中找到,如 TCG PC 客户端平台固件配置规范版本 1.06 修订版 52 中所述。

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. 使用 VMLaunchEndorsement 消息定义,通过 protoc 等工具解码发布认可:

    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 Confidential Computing 可信计算基础根密钥证书来验证启动认证的签名。

发布认证中 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 哈希。如果它与金标准测量结果中的摘要相匹配,则表示机密虚拟机实例上运行的固件未经修改。