驗證圖片來源

您可以驗證自訂 OS 映像檔的 SLSA (軟體構件供應鏈級別) 建構作業來源資訊認證,確保軟體供應鏈完整性。

將 Image Builder 管道設定為輸出至 Artifact Registry 並啟用驗證選項後,Cloud Build 會自動產生密碼編譯認證,說明編譯期間使用的確切管道原始碼、設定、執行參數和基礎映像檔。驗證這項建構作業來源資訊可確認受信任的管道安全地建構映像檔,未經授權不得竄改。

事前準備

  • 完成「準備環境」一文中的環境設定步驟。
  • 如果尚未設定驗證,請先完成設定。 驗證可確認您的身分,以便存取 Google Cloud 服務和 API。如要從本機開發環境執行程式碼或範例,請選取下列其中一個選項,向 Compute Engine 進行驗證:

    選取這個頁面上您打算如何使用範例的分頁:

    控制台

    使用 Google Cloud 控制台存取 Google Cloud 服務和 API 時,無須設定驗證。

    gcloud

    1. 安裝 Google Cloud CLI。 完成後,執行下列指令來初始化 Google Cloud CLI:

      gcloud init

      若您採用的是外部識別資訊提供者 (IdP),請先使用聯合身分登入 gcloud CLI

  • 設定預設地區和區域
  • REST

    如要在本機開發環境中使用本頁的 REST API 範例,請使用您提供給 gcloud CLI 的憑證。

      安裝 Google Cloud CLI。

      若您採用的是外部識別資訊提供者 (IdP),請先使用聯合身分登入 gcloud CLI

    詳情請參閱 Google Cloud 驗證說明文件中的「使用 REST 進行驗證」。

必要的角色

如要取得查看及驗證建構出處認證所需的權限,請要求管理員在專案中授予您下列 IAM 角色:

如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和組織的存取權」。

您或許也能透過自訂角色或其他預先定義的角色,取得必要權限。

設定來源生成作業

如要產生建構作業來源資訊,請確保在 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}'

驗證出處資料

您可以使用 Google Cloud 控制台或 Google Cloud CLI,查看及驗證建構作業來源資訊和執行構件:

控制台 (Cloud Build)

如要透過 Cloud Build 建構歷史記錄查看建構作業來源資訊和輸出構件,請按照下列步驟操作:

  1. 前往 Google Cloud 控制台的「Cloud Build」頁面。

    前往 Cloud Build

  2. 按一下「記錄」,然後選取映像檔管道執行的「建構 ID」。建構詳細資料頁面會顯示三個程序步驟 (imagebuilder-customizeimagebuilder-validateimagebuilder-publish) 的記錄。

  3. 按一下「建構作業成果」分頁標籤,即可查看執行期間建立的確切 OS 映像檔。

  4. 按一下「附件」分頁標籤,即可查看已簽署的 SLSA 來源認證檔案和結果檔案。結果檔案會記錄執行期間使用的來源基礎映像檔。

主控台 (Artifact Registry)

如要直接在 Artifact Registry 中查看建構作業來源資訊,請按照下列步驟操作:

  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 中傳回的版本 ID,例如 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 酬載內容:

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

    輸出內容包含標準 SLSA 格式參數,重點在於建構觸發條件、配方存放區詳細資料、使用的容器映像檔、建構雜湊和基本映像檔屬性。