验证图片来源

您可以验证自定义操作系统映像的 SLSA(软件制品的供应链等级)构建来源证明,以确保软件供应链的完整性。

如果您将 Image Builder 流水线配置为输出到 Artifact Registry 并启用验证选项,Cloud Build 会自动生成加密证明,其中详细说明了编译期间使用的确切流水线源代码、配置、执行参数和基本映像。验证此构建出处可确认受信任的流水线安全地构建了您的映像,而没有未经授权的篡改。

准备工作

  • 完成准备环境中的环境设置步骤。
  • 如果您尚未设置身份验证,请进行设置。身份验证用于验证您的身份,以便访问 Cloud de Confiance by S3NS 服务和 API。如需从本地开发环境运行代码或示例,您可以通过选择以下选项之一向 Compute Engine 进行身份验证:

    选择标签页以了解您打算如何使用本页面上的示例:

    控制台

    当您使用 Cloud de Confiance 控制台访问 Cloud de Confiance by S3NS 服务和 API 时,无需设置身份验证。

    gcloud

    1. 安装 Google Cloud CLI,然后 使用联合身份登录 gcloud CLI。 登录后,运行以下命令来初始化 Google Cloud CLI:

      gcloud init
  • 设置默认区域和可用区
  • REST

    如需在本地开发环境中使用本页面上的 REST API 示例,请使用您提供给 gcloud CLI 的凭证。

      安装 Google Cloud CLI,然后 使用联合身份登录 gcloud CLI

    如需了解详情,请参阅 Cloud de Confiance 身份验证文档中的使用 REST 时进行身份验证

所需的角色

如需获得查看和验证 build 出处证明所需的权限,请让您的管理员向您授予项目的以下 IAM 角色:

如需详细了解如何授予角色,请参阅管理对项目、文件夹和组织的访问权限

您也可以通过自定义角色或其他预定义角色来获取所需的权限。

配置出处生成

如需生成 build 出处,请确保在 cloudbuild.yaml 文件中配置 substitutionsoptionsresultsartifacts 块,如以下代码段所示:

substitutions:
  # 1. Specify your output path and target Artifact Registry resource URI
  _IMAGE_OUTPUT_PATH: 'image-builder/binaryOut'
  _ARTIFACT_REGISTRY_RESOURCE_URI: 'projects/PROJECT_ID/locations/REGION/repositories/REPOSITORY_NAME/packages/PACKAGE_NAME/versions/v${BUILD_ID}'

steps:
  # 2. Configure step results and base image attestations
  - name: 'REGION-docker.pkg.dev/image-builder-official/release/builder:stable'
    script: |
      #!/usr/bin/env bash
      /build
    id: 'imagebuilder-customize'
    results:
      - name: image_builder_telemetry_metrics
      - name: base_image
        attestationType: "https://cloudbuild.googleapis.com/attestations/build_content_restrictions"
        attestationContent: base_image

options:
  # 3. Enable Cloud Logging and cryptographic provenance generation
  logging: CLOUD_LOGGING_ONLY
  requestedVerifyOption: VERIFIED

artifacts:
  # 4. Upload generic image artifacts and provenance to Artifact Registry
  generic_artifacts:
    - folder: '${_IMAGE_OUTPUT_PATH}'
      registry_path: '${_ARTIFACT_REGISTRY_RESOURCE_URI}'

验证来源数据

您可以使用 Cloud de Confiance 控制台或 Google Cloud CLI 查看和验证 build 出处数据和执行制品:

控制台 (Cloud Build)

如需通过 Cloud Build 构建历史记录查看 build 出处和输出工件,请执行以下操作:

  1. 在 Cloud de Confiance 控制台中,前往 Cloud Build 页面。

    转至 Cloud Build

  2. 点击历史记录,然后选择映像流水线运行的 Build ID。构建详情页面会显示三个流程步骤(imagebuilder-customizeimagebuilder-validateimagebuilder-publish)的日志。

  3. 点击构建制品标签页,查看执行期间创建的确切操作系统映像。

  4. 点击附件标签页,查看已签名的 SLSA 出处证明文件和结果文件。结果文件会记录执行期间使用的源基础映像。

控制台 (Artifact Registry)

如需直接在 Artifact Registry 中查看 build 出处,请执行以下操作:

  1. 在 Cloud de Confiance 控制台中,前往 Artifact Registry 页面。

    转到 Artifact Registry

  2. 在代码库列表中,点击您的通用代码库的名称。

  3. 在软件包列表中,点击您的操作系统映像软件包名称。

  4. 在版本记录列表中,点击流水线运行的版本 ID (v${BUILD_ID})。

  5. 点击附件标签页,查看相应映像版本的已签名 SLSA 出处证明文件和结果文件。结果文件会记录执行期间使用的基本源映像。

gcloud

Artifact Registry 将来源记录作为附件文件与通用映像 tarball 一起存储。

由于证明以 Dead Simple Signing Envelope (DSSE) 格式设置,因此 JSON 中的实际来源声明载荷采用 base64 编码。如需读取详细信息,请使用 gcloud CLI 和 jq 实用程序执行以下步骤:

  1. 列出软件包的版本,找到要验证的特定 build ID 版本,方法是运行 gcloud artifacts versions list 命令

    gcloud artifacts versions list \
        --package=PACKAGE_NAME \
        --repository=REPOSITORY_NAME \
        --location=REPOSITORY_LOCATION \
        --project=PROJECT_ID
    

    替换以下内容:

    • PACKAGE_NAME:Artifact Registry 代码库中的软件包名称,例如 my-custom-image
    • REPOSITORY_NAME:您的通用 Artifact Registry 代码库的名称,例如 custom-os-images
    • REPOSITORY_LOCATION:制品库的区域,例如 us-central1
    • PROJECT_ID:您的项目 ID。
  2. 运行 gcloud artifacts attachments list 命令,查询与目标软件包版本匹配的附件元数据:

    gcloud artifacts attachments list \
        --target=projects/PROJECT_ID/locations/REPOSITORY_LOCATION/repositories/REPOSITORY_NAME/packages/PACKAGE_NAME/versions/vBUILD_ID \
        --repository=REPOSITORY_NAME \
        --location=REPOSITORY_LOCATION \
        --project=PROJECT_ID
    

    BUILD_ID 替换为在第 1 步中返回的版本标识符,例如 12345

    在命令输出中,找到 name 字段包含 build-result(带 type: application/vnd.in-toto+json)的附件条目,然后复制 files: 下列出的路径,例如:

    projects/PROJECT_ID/locations/REPOSITORY_LOCATION/repositories/REPOSITORY_NAME/files/sha256:SHA256_HASH

  3. 运行 gcloud artifacts files download 命令,从您的代码库中下载 JSON 元数据附件载荷:

    gcloud artifacts files download ATTACHMENT_FILE_ID \
        --repository=REPOSITORY_NAME \
        --location=REPOSITORY_LOCATION \
        --project=PROJECT_ID \
        --destination=./provenance.json
    

    ATTACHMENT_FILE_ID 替换为上一步中检索到的 files: 附件路径。

  4. 运行以下命令以隔离 JSON 载荷内容、对其进行 base64 解码并设置格式:

    cat ./provenance.json | jq -r '.payload' | base64 --decode | jq
    

    输出包含标准 SLSA 格式参数,重点突出显示了 build 触发器、配方代码库详细信息、所使用的容器映像、build 哈希和基础映像属性。