验证图片来源

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

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

准备工作

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

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

    控制台

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

    gcloud

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

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

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

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

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

所需的角色

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

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

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

配置来源生成

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

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}'

验证来源数据

您可以使用 控制台或 Google Cloud CLI Google Cloud 查看和验证构建来源数据和执行工件:

控制台 (Cloud Build)

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

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

    转至 Cloud Build

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

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

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

控制台 (Artifact Registry)

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

  1. 在 Google Cloud 控制台中,前往 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. 列出软件包的版本,以找到要验证的特定构建 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 格式参数,突出显示了构建触发器、配方代码库详细信息、使用的容器映像、构建哈希和基础映像属性。