您可以验证自定义操作系统映像的 SLSA(软件工件的供应链级别)构建来源证明,以确保软件供应链的完整性。
当您将 Image Builder 流水线配置为输出到 Artifact Registry 并启用验证选项时,Cloud Build 会自动生成加密证明,其中描述了编译期间使用的确切流水线源代码、配置、执行参数和基础映像。验证此 build 出处 可确认受信任的流水线安全地构建了您的映像,而没有未经授权的篡改。
准备工作
- 完成 准备环境中的环境设置步骤。
-
如果您尚未设置身份验证,请进行设置。
身份验证用于验证您的身份,以便访问 Google Cloud 服务和 API。如需从本地开发环境运行
代码或示例,您可以通过选择以下选项之一向
Compute Engine 进行身份验证:
{1
选择标签页以了解您打算如何使用本页面上的示例:
控制台
当您使用 Google Cloud 控制台访问 Google Cloud 服务和 API 时,无需设置身份验证。
gcloud
-
安装 Google Cloud CLI,然后 使用联合身份登录 gcloud CLI。 登录后, 运行以下命令来初始化 Google Cloud CLI:
gcloud init
-
- 设置默认区域和可用区。
REST
如需在本地开发环境中使用本页面上的 REST API 示例,请使用您提供给 gcloud CLI 的 凭证。
安装 Google Cloud CLI,然后 使用联合身份登录 gcloud CLI。
如需了解详情,请参阅 身份验证文档 中的 Google Cloud 使用 REST 时进行身份验证。
所需的角色
如需获得查看和验证构建来源证明所需的权限,请让您的管理员向您授予项目的以下 IAM 角色:
- Artifact Registry Reader (
roles/artifactregistry.reader) - Cloud Build Viewer (
roles/cloudbuild.builds.viewer)
如需详细了解如何授予角色,请参阅管理对项目、文件夹和组织的访问权限。
您也可以通过自定义 角色或其他预定义 角色来获取所需的权限。
配置来源生成
如需生成 build 出处,请确保在 substitutions、
options、results 和 artifacts 代码块中配置您的
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 构建记录查看构建来源和输出工件,请执行以下操作:
在 Google Cloud 控制台中,前往 Cloud Build 页面。
点击记录 ,然后选择映像流水线运行的 Build ID 。构建详情页面会显示三个流程步骤(
imagebuilder-customize、imagebuilder-validate和imagebuilder-publish)的日志。点击构建工件 标签页,查看执行期间创建的确切操作系统映像。
点击附件 标签页,查看已签名的 SLSA 来源证明文件和结果文件。结果文件记录了执行期间使用的来源基础映像。
控制台 (Artifact Registry)
如需直接在 Artifact Registry 中查看 build 出处,请执行以下操作:
在 Google Cloud 控制台中,前往 Artifact Registry 页面。
在仓库列表中,点击通用仓库的名称。
在软件包列表中,点击操作系统映像软件包名称。
在版本记录列表中,点击流水线运行的版本 ID (
v${BUILD_ID})。点击附件 标签页,查看该映像版本的已签名 SLSA 来源证明文件和结果文件。结果文件记录了执行期间使用的基础来源映像。
gcloud
Artifact Registry 会将来源记录作为附件文件与通用映像 tarball 一起存储。
由于证明的格式为 Dead Simple Signing Envelope (DSSE),因此 JSON 中的实际来源声明载荷采用 base64 编码。如需了解详情,请使用 gcloud CLI 和 jq 实用程序执行以下步骤:
列出软件包的版本,以找到要验证的特定构建 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。
运行 运行
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运行 运行
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:附件路径。运行以下命令,以隔离 JSON 载荷内容、对其进行 base64 解码并设置格式:
cat ./provenance.json | jq -r '.payload' | base64 --decode | jq
输出包含标准 SLSA 格式参数,突出显示了构建触发器、配方代码库详细信息、使用的容器映像、构建哈希和基础映像属性。