使用 SLSA 檢查

本頁面說明如何使用二進位授權持續驗證 (CV) SLSA 檢查,檢查與 Pod 相關聯的容器映像檔是否符合 SLSA 規範。Pod 必須在已啟用 CV 的 GKE 叢集上執行。

如要使用這項檢查,您必須使用 Cloud Build 建構映像檔,這會產生符合 SLSA 規範的來源。

本指南中的範例使用 Cloud Source Repositories 做為原始碼存放區、Artifact Registry 做為映像檔存放區,並使用 Cloud Build 建構映像檔及產生來源。

SLSA 檢查僅支援 Cloud Build 做為可信任的建構工具。

費用

本指南使用下列 Google Cloud 服務:

  • Artifact Registry
  • 二進位授權,但持續驗證在預先發布版階段可無須支付費用使用
  • Cloud Build
  • Cloud Source Repositories
  • GKE

您可以使用 Pricing Calculator 根據預測用量估算費用。

事前準備

  1. 安裝 Google Cloud CLI。

  2. 設定 gcloud CLI,使用您的聯合身分。

    詳情請參閱「使用聯合身分登入 gcloud CLI」。

  3. 執行下列指令,初始化 gcloud CLI:

    gcloud init
  4. 建立或選取 Google Cloud 專案。

    選取或建立專案所需的角色

    • 選取專案:選取專案時,不需具備特定 IAM 角色,只要您在專案中獲派角色,即可選取該專案。
    • 建立專案:如要建立專案,您必須具備專案建立者角色 (roles/resourcemanager.projectCreator),其中包含 resourcemanager.projects.create 權限。瞭解如何授予角色。
    • 建立 Google Cloud 專案:

      gcloud projects create PROJECT_ID

      將 PROJECT_ID 替換為您要建立的 Google Cloud 專案名稱。

    • 選取您建立的 Google Cloud 專案:

      gcloud config set project PROJECT_ID

      將 PROJECT_ID 替換為 Google Cloud 專案名稱。

  5. 確認 Google Cloud 專案已啟用計費功能。

  6. 啟用 Artifact Registry、二進位授權、Cloud Build、GKE、Cloud Source Repositories API (如有尚未啟用的 API):

    啟用 API 所需的角色

    如要啟用 API,您必須具備 serviceusage.services.enable 權限。如果您建立了專案,可能已透過「擁有者」角色 (roles/owner) 取得這項權限。否則,您可以透過「Service Usage 管理員」角色 (roles/serviceusage.serviceUsageAdmin) 取得這項權限。瞭解如何授予角色。

    gcloud services enable artifactregistry.googleapis.com binaryauthorization.googleapis.com cloudbuild.googleapis.com container.googleapis.com sourcerepo.googleapis.com
  7. 確認 gcloud CLI 已更新至最新版本。
  8. 安裝 kubectl 指令列工具。
  9. 如果二進位授權政策和 GKE 叢集位於不同專案,請確認這兩項專案都已啟用二進位授權。

必要的角色

本節說明如何為這項檢查設定角色。

總覽

如果您在同一個專案中執行本指南提及的所有產品,則不需設定任何權限。啟用二進位授權時,系統會正確設定角色。如果您在不同專案中執行產品,則必須按照本節所述設定角色。

為確保各專案中的二進位授權服務代理程式具備評估 CV SLSA 檢查所需的權限,請要求管理員將下列 IAM 角色授予各專案中的二進位授權服務代理程式:

  • 叢集專案 Compute Engine 服務帳戶的 Artifact Registry 讀取者 (roles/artifactregistry.reader)
  • 如果叢集專案與政策專案不同: 叢集專案二進位授權服務代理上的二進位授權政策評估者 (roles/binaryauthorization.policyEvaluator),以便存取政策專案
  • 如果認證專案與政策專案不同: 政策專案二進位授權服務代理的容器分析例項檢視者 (roles/containeranalysis.occurrences.viewer),以便存取認證專案

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

管理員或許也能透過自訂角色或其他預先定義的角色,為各專案中的二進位授權服務代理授予必要權限。

使用 gcloud CLI 授予角色

為確保各專案中的服務帳戶具備評估這項檢查所需的權限,請將下列 IAM 角色授予各專案中的服務帳戶:

  1. 如果執行叢集的專案與政策所在的專案不同,您必須授予叢集專案的二進位授權服務代理權限,才能存取政策專案中的政策。

    1. 取得叢集專案的二進位授權服務代理:

      PROJECT_NUMBER=$(gcloud projects list \
        --filter="projectId:CLUSTER_PROJECT_ID" \
        --format="value(PROJECT_NUMBER)")
      CLUSTER_SERVICE_ACCOUNT="service-$PROJECT_NUMBER@gcp-sa-binaryauthorization."
      

      將 CLUSTER_PROJECT_ID 替換為叢集的專案 ID。

    2. 允許持續驗證評估叢集上的政策:

      gcloud projects add-iam-policy-binding POLICY_PROJECT_ID \
          --member="serviceAccount:$CLUSTER_SERVICE_ACCOUNT" \
          --role='roles/binaryauthorization.policyEvaluator'
      

      將 POLICY_PROJECT_ID 替換為政策所在專案的 ID。

  2. 允許政策專案服務代理存取認證:

    1. 取得與政策專案相關聯的二進位授權服務代理:

      PROJECT_NUMBER=$(gcloud projects list \
        --filter="projectId:POLICY_PROJECT_ID" \
        --format="value(PROJECT_NUMBER)")
      POLICY_PROJECT_SERVICE_ACCOUNT="service-$PROJECT_NUMBER@gcp-sa-binaryauthorization."
      

      將 POLICY_PROJECT_ID 替換為政策所在專案的 ID。

    2. 授予角色:

      gcloud projects add-iam-policy-binding ATTESTATION_PROJECT_ID \
          --member="serviceAccount:$POLICY_PROJECT_SERVICE_ACCOUNT" \
          --role='roles/containeranalysis.occurrences.viewer'
      

      將 ATTESTATION_PROJECT_ID 替換為含有認證的專案 ID。

  3. 允許預設 Compute Engine 服務帳戶從存放區提取映像檔:

    1. 取得與叢集專案相關聯的 Compute Engine 服務帳戶:

      PROJECT_NUMBER=$(gcloud projects list \
        --filter="projectId:CLUSTER_PROJECT_ID" \
        --format="value(PROJECT_NUMBER)")
      COMPUTE_ENGINE_SERVICE_ACCOUNT="$PROJECT_NUMBER-compute@"
      

      將 CLUSTER_PROJECT_ID 替換為含有政策的叢集專案 ID。

    2. 授予角色:

      gcloud projects add-iam-policy-binding ARTIFACT_PROJECT_ID \
          --member="serviceAccount:$COMPUTE_ENGINE_SERVICE_ACCOUNT" \
          --role='roles/artifactregistry.reader'
      

      將 ARTIFACT_PROJECT_ID 替換為 Artifact Registry 專案 ID,該專案會儲存要部署的映像檔。

選用:建構及上傳範例映像檔

本節僅供說明,示範如何建構符合 SLSA 規範來源的範例映像檔。本指南稍後會使用來源來示範檢查。瞭解 Cloud Build 建構作業來源資訊 詳情。

建立範例存放區

如要在 Cloud Source Repositories 建立存放區,請按照下列步驟操作:

  1. 建立存放區,並在本機複製:

    gcloud source repos create SOURCE_REPO_NAME \
        --project=SOURCE_REPO_PROJECT_ID && \
    gcloud source repos clone SOURCE_REPO_NAME \
        --project=SOURCE_REPO_PROJECT_ID && \
    cd SOURCE_REPO_NAME
    

    更改下列內容:

    • SOURCE_REPO_NAME:原始碼存放區的名稱,例如:slsa-check-test-repo
    • SOURCE_REPO_PROJECT_ID:存放區專案 ID
  2. 如要建立來源、設定和建構檔案,請按照下列步驟操作:

    1. 建立圖片來源:

      cat > quickstart.sh <<EOF
      #!/bin/sh
      echo "Hello, world! The time is $(date)."
      sleep infinity
      EOF
      
    2. 將檔案設為執行檔:

      chmod +x quickstart.sh
      
    3. 建立 Dockerfile 設定檔:

      cat > Dockerfile <<EOF
      FROM alpine
      COPY quickstart.sh /
      CMD ["/quickstart.sh"]
      EOF
      
    4. 建立 Cloud Build cloudbuild.yaml 檔案,將映像檔推送至 Artifact Registry:

      cat > cloudbuild.yaml <<EOF
      steps:
      - name: 'gcr.io/cloud-builders/docker'
        args: [ 'build', '-t', 'LOCATION-docker.pkg.dev/ARTIFACT_PROJECT_ID/ARTIFACT_REPO_NAME/DIRECTORY/IMAGE', '.' ]
      options:
        requestedVerifyOption: VERIFIED
      images:
      - 'LOCATION-docker.pkg.dev/ARTIFACT_PROJECT_ID/ARTIFACT_REPO_NAME/DIRECTORY/IMAGE'
      EOF
      

      更改下列內容:

      • LOCATION:Artifact Registry 位置,例如 us-west2、europe-central2 或 asia-east1
      • ARTIFACT_PROJECT_ID:儲存 Artifact Registry 構件的專案 ID
      • ARTIFACT_REPO_NAME:Artifact Registry 存放區名稱,例如:slsa-check-test-repo
      • DIRECTORY:目錄,例如:slsa-check
      • IMAGE:圖片路徑,例如:slsa-check-image
    5. 將檔案提交至 Cloud Source Repositories:

      git add .
      git commit -a
      

建構並上傳範例映像檔

為簡化本指南的使用方式,建議您在 SOURCE_REPO_PROJECT_ID 和 ARTIFACT_PROJECT_ID 使用相同的專案。如果使用不同專案,可能需要設定額外的 IAM 權限。進一步瞭解 Artifact Registry 存取控管。如要進一步瞭解 Cloud Build,請參閱「Cloud Build 總覽」。

如要建立存放區,請按照下列步驟操作:

  1. 建立 Artifact Registry 存放區:

    gcloud artifacts repositories create ARTIFACT_REPO_NAME \
        --project=ARTIFACT_PROJECT_ID \
        --repository-format=docker \
        --location=LOCATION \
        --description="Docker repository"
    

    更改下列內容:

    • ARTIFACT_REPO_NAME:存放區名稱
    • ARTIFACT_PROJECT_ID:構件專案 ID
    • LOCATION:Artifact Registry 位置,例如 us-west2、europe-central2 或 asia-east1
  2. 建立 Cloud Build 自動建構觸發條件:

    gcloud beta builds triggers create cloud-source-repositories \
        --project=SOURCE_REPO_PROJECT_ID \
        --repo=SOURCE_REPO_NAME \
        --region=LOCATION \
        --branch-pattern=.* \
        --build-config=cloudbuild.yaml
    

    更改下列內容:

    • SOURCE_REPO_NAME:原始碼存放區名稱
    • SOURCE_REPO_PROJECT_ID:Cloud Build 專案 ID
    • LOCATION:位置
  3. 推送您在本指南稍早建立的檔案,觸發建構作業。

    git push
    

    映像檔建構成功後,Cloud Build 會產生來源,並將映像檔上傳至 Artifact Registry 存放區。

  4. 如要檢查最新映像檔並取得摘要,請按照下列步驟操作:

    1. 確認 Cloud Build 已建構映像檔:

      gcloud artifacts docker images list LOCATION-docker.pkg.dev/ARTIFACT_PROJECT_ID/REPO_NAME/DIRECTORY \
          --project=ARTIFACT_PROJECT_ID \
          --sort-by=create_time
      

      更改下列內容:

      • LOCATION:Artifact Registry 位置
      • ARTIFACT_PROJECT_ID:構件的專案 ID
      • ARTIFACT_REPO_NAME:存放區名稱
      • DIRECTORY:目錄
    2. 複製最新映像檔的摘要。摘要類似如下:sha256:9432f747bd058b33de33bb5314d6eec1ac357d664e04c76824bb7072a9218d59

  5. 選用:查看圖片來源:

    gcloud artifacts docker images describe \
      LOCATION-docker.pkg.dev/ARTIFACT_PROJECT_ID/ARTIFACT_REPO_NAME/DIRECTORY/IMAGE@DIGEST \
        --project=ARTIFACT_PROJECT_ID \
        --show-provenance
    

    更改下列內容:

    • ARTIFACT_PROJECT_ID:構件的專案 ID
    • LOCATION:Artifact Registry 位置
    • ARTIFACT_REPO_NAME:構件存放區名稱
    • DIRECTORY:目錄
    • IMAGE:圖片路徑
    • DIGEST:與映像檔相關聯的摘要

    指令輸出內容大致如下:

    image_summary:
      digest: sha256:9432f747bd058b33de33bb5314d6eec1ac357d664e04c76824bb7072a9218d59
      fully_qualified_digest: us-west2-docker.pkg.dev/my-project/slsa-check-repo/slsa-check-image@sha256:9432f747bd058b33de33bb5314d6eec1ac357d664e04c76824bb7072a9218d59
      registry: us-west2-docker.pkg.dev
      repository: slsa-check-repo
      slsa_build_level: 3
    provenance_summary:
      provenance:
      - build:
          intotoStatement:
            _type: https://in-toto.io/Statement/v0.1
            predicateType: https://slsa.dev/provenance/v0.1
            slsaProvenance:
              builder:
                id: https://cloudbuild.googleapis.com/GoogleHostedWorker
              materials:
              - digest:
                  sha1: de4e4227fff1d00d6f7785a827608627e4a369ea
                uri: git+https://source.cloud.google.com/my-project/slsa-check-source-repo
              metadata:
                ...
    envelope:
      payload: eyJfdHlwZSI6I ... taW1hZ2U6dGFnMSJ9XX0=
      payloadType: application/vnd.in-toto+json
      signatures:
      - keyid: projects/verified-builder/locations/global/keyRings/attestor/cryptoKeys/provenanceSigner/cryptoKeyVersions/1
        sig: MEQCIBCCkho_re4EfAT-NBSSmAXOZlv4lU_vWzEru97tU8KmAiAKcAa99umWngzNQADmPixqYjbKjLOKQEUvrI5chSrf7g==
      - keyid: projects/verified-builder/locations/global/keyRings/attestor/cryptoKeys/builtByGCB/cryptoKeyVersions/1
        sig: MEUCIFOEq_7RpiZAB4vUlit3hkZ2yI0n37-5Y87l0JbU-EZSAiEA9TNZZcv_MnzKffTnswHWZR2DSLmYiklr5twWfIec-zo=
    

    輸出內容必須包含 provenance_summary 區塊,SLSA 檢查才能運作。如果輸出內容不含該區塊,請確認 Cloud Build 是由自動建構觸發條件叫用。手動觸發 Cloud Build 時,不會產生來源資訊。

建立平台政策

如要產生來源,您必須使用 Cloud Build 自動建構觸發條件建構映像檔,如「建構及上傳範例映像檔」一節所述。

如要建立含有 SLSA 檢查的平台政策,請按照下列步驟操作:

  1. 建立平台政策 YAML 檔案:

    cat > POLICY_PATH <<EOF
    gkePolicy:
      checkSets:
      - checks:
        - displayName: My SLSA check
          imageAllowlist:
            # This policy exempts images that are in the following artifact registry
            allowPattern:
            - ARTIFACT_LOCATION-docker.pkg.dev/ARTIFACT_PROJECT_ID/ARTIFACT_REPO_NAME/EXEMPT_IMAGE_PATH/**
          slsaCheck:
            rules:
            - attestationSource:
                containerAnalysisAttestationProjects:
                - projects/ATTESTATION_PROJECT_ID
              configBasedBuildRequired: true
              trustedBuilder: GOOGLE_CLOUD_BUILD
              trustedSourceRepoPatterns:
              - source.cloud.google.com/SOURCE_REPO_PROJECT_ID/SOURCE_REPO_NAME
              customConstraints: CEL_EXPRESSION
        displayName: My check set
    EOF
    

    更改下列內容:

    • POLICY_PATH:政策檔案的路徑。
    • ARTIFACT_LOCATION:Artifact Registry 存放區的位置。
    • ARTIFACT_PROJECT_ID:包含構件的專案 ID。
    • ARTIFACT_REPO_NAME:包含映像檔的存放區。
    • EXEMPT_IMAGE_PATH:一或多個豁免映像檔的選用路徑,例如:not-built-by-cloud-build。這項平台政策包含 imageAllowlist 區塊,因此您可以豁免缺少來源的映像檔,以免違反平台政策。如要改為記錄這些映像檔的違規事項,請省略這個區塊。
    • ATTESTATION_PROJECT_ID:儲存 Cloud Build 所建立認證的專案 ID。
    • SOURCE_REPO_PROJECT_ID:存放原始碼 的專案 ID。
    • SOURCE_REPO_NAME::包含 映像檔的存放區。為方便說明,如要強制違反這項檢查,請將 SOURCE_REPO_NAME 設為映像檔所在位置以外的原始碼存放區。
    • POLICY_PROJECT_ID:CV 政策所在專案的 ID。
    • POLICY_ID:這項政策的 ID。
    • CEL_EXPRESSION:CEL 運算式,可為 SLSA 政策提供額外限制。舉例來說,如要新增自訂限制,進一步要求圖片必須來自特定目錄路徑,請將 CEL_EXPRESSION 替換為下列運算式:

      payload.predicate.externalParameters.buildConfigSource.path != "" && payload.predicate.externalParameters.buildConfigSource.repository.contains("github.com/my-repo/my-production-repo")
      
  2. 建立平台政策:

    使用下列任何指令資料前,請先替換以下項目:

    • POLICY_ID:您選擇的平台政策 ID。如果政策位於其他專案,您可以使用完整資源名稱:projects/POLICY_PROJECT_ID/platforms/gke/policies/POLICY_ID。
    • POLICY_PATH:政策檔案的路徑。
    • POLICY_PROJECT_ID:政策專案 ID。

    執行下列指令:

    Linux、macOS 或 Cloud Shell

    gcloud beta container binauthz policy create POLICY_ID \
        --platform=gke \
        --policy-file=POLICY_PATH \
        --project=POLICY_PROJECT_ID

    Windows (PowerShell)

    gcloud beta container binauthz policy create POLICY_ID `
        --platform=gke `
        --policy-file=POLICY_PATH `
        --project=POLICY_PROJECT_ID

    Windows (cmd.exe)

    gcloud beta container binauthz policy create POLICY_ID ^
        --platform=gke ^
        --policy-file=POLICY_PATH ^
        --project=POLICY_PROJECT_ID

啟用 CV

您可以建立新叢集,或更新現有叢集,以便搭配使用 CV 監控功能和檢查型平台政策。

建立使用 CV 監控功能的叢集

在本節中,您將建立僅使用 CV 監控功能和檢查型平台政策的叢集。

使用下列任何指令資料前,請先替換以下項目:

  • CLUSTER_NAME:叢集名稱。
  • LOCATION:位置,例如 us-central1 或 asia-south1。
  • POLICY_PROJECT_ID:儲存政策的專案 ID。
  • POLICY_ID:政策 ID。
  • CLUSTER_PROJECT_ID:叢集專案 ID。

執行下列指令:

Linux、macOS 或 Cloud Shell

gcloud beta container clusters create CLUSTER_NAME \
    --location=LOCATION \
    --binauthz-evaluation-mode=POLICY_BINDINGS \
    --binauthz-policy-bindings=name=projects/POLICY_PROJECT_ID/platforms/gke/policies/POLICY_ID \
    --project=CLUSTER_PROJECT_ID

Windows (PowerShell)

gcloud beta container clusters create CLUSTER_NAME `
    --location=LOCATION `
    --binauthz-evaluation-mode=POLICY_BINDINGS `
    --binauthz-policy-bindings=name=projects/POLICY_PROJECT_ID/platforms/gke/policies/POLICY_ID `
    --project=CLUSTER_PROJECT_ID

Windows (cmd.exe)

gcloud beta container clusters create CLUSTER_NAME ^
    --location=LOCATION ^
    --binauthz-evaluation-mode=POLICY_BINDINGS ^
    --binauthz-policy-bindings=name=projects/POLICY_PROJECT_ID/platforms/gke/policies/POLICY_ID ^
    --project=CLUSTER_PROJECT_ID

建立使用強制執行和 CV 監控功能的叢集

在本節中,您將建立一個叢集,同時使用 project-singleton 政策強制執行和 CV 監控功能,並採用以檢查為基礎的平台政策:

使用下列任何指令資料前,請先替換以下項目:

  • CLUSTER_NAME:叢集名稱。
  • LOCATION:位置,例如 us-central1 或 asia-south1。
  • POLICY_PROJECT_ID:儲存政策的專案 ID。
  • POLICY_ID:政策 ID。
  • CLUSTER_PROJECT_ID:叢集專案 ID。

執行下列指令:

Linux、macOS 或 Cloud Shell

gcloud beta container clusters create CLUSTER_NAME \
    --location=LOCATION \
    --binauthz-evaluation-mode=POLICY_BINDINGS_AND_PROJECT_SINGLETON_POLICY_ENFORCE \
    --binauthz-policy-bindings=name=projects/POLICY_PROJECT_ID/platforms/gke/policies/POLICY_ID \
    --project=CLUSTER_PROJECT_ID

Windows (PowerShell)

gcloud beta container clusters create CLUSTER_NAME `
    --location=LOCATION `
    --binauthz-evaluation-mode=POLICY_BINDINGS_AND_PROJECT_SINGLETON_POLICY_ENFORCE `
    --binauthz-policy-bindings=name=projects/POLICY_PROJECT_ID/platforms/gke/policies/POLICY_ID `
    --project=CLUSTER_PROJECT_ID

Windows (cmd.exe)

gcloud beta container clusters create CLUSTER_NAME ^
    --location=LOCATION ^
    --binauthz-evaluation-mode=POLICY_BINDINGS_AND_PROJECT_SINGLETON_POLICY_ENFORCE ^
    --binauthz-policy-bindings=name=projects/POLICY_PROJECT_ID/platforms/gke/policies/POLICY_ID ^
    --project=CLUSTER_PROJECT_ID

更新叢集以使用 CV 監控功能

在本節中,您將更新叢集,僅使用以檢查為基礎的平台政策進行 CV 監控。如果叢集已啟用專案單例政策強制執行功能,執行這項指令會停用該功能。建議您改為更新叢集,並啟用強制執行和 CV 監控功能。

使用下列任何指令資料前,請先替換以下項目:

  • CLUSTER_NAME:叢集名稱
  • LOCATION:位置,例如 us-central1 或 asia-south1
  • POLICY_PROJECT_ID:儲存政策的專案 ID
  • POLICY_ID:政策 ID
  • CLUSTER_PROJECT_ID:叢集專案 ID

執行下列指令:

Linux、macOS 或 Cloud Shell

gcloud beta container clusters update CLUSTER_NAME \
    --location=LOCATION \
    --binauthz-evaluation-mode=POLICY_BINDINGS \
    --binauthz-policy-bindings=name=projects/POLICY_PROJECT_ID/platforms/gke/policies/POLICY_ID \
    --project=CLUSTER_PROJECT_ID

Windows (PowerShell)

gcloud beta container clusters update CLUSTER_NAME `
    --location=LOCATION `
    --binauthz-evaluation-mode=POLICY_BINDINGS `
    --binauthz-policy-bindings=name=projects/POLICY_PROJECT_ID/platforms/gke/policies/POLICY_ID `
    --project=CLUSTER_PROJECT_ID

Windows (cmd.exe)

gcloud beta container clusters update CLUSTER_NAME ^
    --location=LOCATION ^
    --binauthz-evaluation-mode=POLICY_BINDINGS ^
    --binauthz-policy-bindings=name=projects/POLICY_PROJECT_ID/platforms/gke/policies/POLICY_ID ^
    --project=CLUSTER_PROJECT_ID

更新叢集,以便使用強制執行和 CV 監控功能

在本節中,您將更新叢集,同時使用專案單例政策強制執行功能,以及採用檢查式平台政策的 CV 監控功能。

使用下列任何指令資料前,請先替換以下項目:

  • CLUSTER_NAME:叢集名稱
  • LOCATION:位置,例如 us-central1 或 asia-south1
  • POLICY_PROJECT_ID:儲存政策的專案 ID
  • POLICY_ID:政策 ID
  • CLUSTER_PROJECT_ID:叢集專案 ID

執行下列指令:

Linux、macOS 或 Cloud Shell

gcloud beta container clusters update CLUSTER_NAME \
    --location=LOCATION \
    --binauthz-evaluation-mode=POLICY_BINDINGS_AND_PROJECT_SINGLETON_POLICY_ENFORCE \
    --binauthz-policy-bindings=name=projects/POLICY_PROJECT_ID/platforms/gke/policies/POLICY_ID \
    --project=CLUSTER_PROJECT_ID

Windows (PowerShell)

gcloud beta container clusters update CLUSTER_NAME `
    --location=LOCATION `
    --binauthz-evaluation-mode=POLICY_BINDINGS_AND_PROJECT_SINGLETON_POLICY_ENFORCE `
    --binauthz-policy-bindings=name=projects/POLICY_PROJECT_ID/platforms/gke/policies/POLICY_ID `
    --project=CLUSTER_PROJECT_ID

Windows (cmd.exe)

gcloud beta container clusters update CLUSTER_NAME ^
    --location=LOCATION ^
    --binauthz-evaluation-mode=POLICY_BINDINGS_AND_PROJECT_SINGLETON_POLICY_ENFORCE ^
    --binauthz-policy-bindings=name=projects/POLICY_PROJECT_ID/platforms/gke/policies/POLICY_ID ^
    --project=CLUSTER_PROJECT_ID

部署映像檔

  1. 設定 kubectl:

    gcloud container clusters get-credentials CLUSTER_NAME \
        --location=LOCATION \
        --project=CLUSTER_PROJECT_ID
    

    更改下列內容:

    • CLUSTER_NAME:叢集名稱
    • LOCATION:叢集位置
    • CLUSTER_PROJECT_ID:叢集專案 ID
  2. 部署 Pod:

    kubectl run hello-app \
        --image='LOCATION-docker.pkg.dev/ARTIFACT_PROJECT_ID/ARTIFACT_REPO_NAME/DIRECTORY/IMAGE@DIGEST'
    

    Pod 已部署。由於映像檔是透過來源建構,且來自受信任的原始碼存放區,因此不會違反 CV SLSA 檢查,也不會產生記錄項目。

    如要強制違反 SLSA 檢查,您可以將 SOURCE_REPO_NAME 設為映像檔所在位置以外的原始碼存放區。您也可以手動觸發建構作業,略過來源產生程序。然後查看記錄項目。

查看 CV 項目的記錄

您可以搜尋 Cloud Logging 記錄項目,找出持續驗證設定錯誤和持續驗證平台政策驗證違規事項。

CV 會在 24 小時內將錯誤和違規事項記錄到 Cloud Logging。通常幾小時內就會顯示。

查看 CV 設定錯誤記錄

如要查看 CV 設定錯誤記錄,請執行下列指令:

gcloud logging read \
     --order="desc" \
     --freshness=7d \
     --project=CLUSTER_PROJECT_ID \
    'logName:"binaryauthorization.googleapis.com%2Fcontinuous_validation" "configErrorEvent"'

下列輸出內容顯示設定錯誤,指出找不到 CV 平台政策:

{
  "insertId": "141d4f10-72ea-4a43-b3ec-a03da623de42",
  "jsonPayload": {
    "@type": "type.googleapis.com/google.cloud.binaryauthorization.v1beta1.ContinuousValidationEvent",
    "configErrorEvent": {
      "description": "Cannot monitor cluster 'us-central1-c.my-cluster': Resource projects/123456789/platforms/gke/policies/my-policy does not exist."
    }
  },
  "resource": {
    "type": "k8s_cluster",
    "labels": {
      "cluster_name": "my-cluster",
      "location": "us-central1-c",
      "project_id": "my-project"
    }
  },
  "timestamp": "2024-05-28T15:31:03.999566Z",
  "severity": "WARNING",
  "logName": "projects/my-project/logs/binaryauthorization.googleapis.com%2Fcontinuous_validation",
  "receiveTimestamp": "2024-05-28T16:30:56.304108670Z"
}

查看 CV 平台政策驗證違規事項

如果沒有任何圖片違反您啟用的平台政策,記錄中就不會顯示任何項目。

如要查看過去七天的 CV 記錄項目,請執行下列指令:

gcloud logging read \
     --order="desc" \
     --freshness=7d \
     --project=CLUSTER_PROJECT_ID \
    'logName:"binaryauthorization.googleapis.com%2Fcontinuous_validation" "policyName"'

將 CLUSTER_PROJECT_ID 替換為叢集專案 ID。

檢查類型

CV 會將檢查違規資訊記錄到 checkResults。在項目中,checkType 值代表檢查。各項檢查的值如下:

  • ImageFreshnessCheck
  • SigstoreSignatureCheck
  • SimpleSigningAttestationCheck
  • SlsaCheck
  • TrustedDirectoryCheck
  • VulnerabilityCheck

記錄範例

下列 CV 記錄項目範例說明違反信任目錄檢查的不符合規範映像檔:

{
  "insertId": "637c2de7-0000-2b64-b671-24058876bb74",
  "jsonPayload": {
    "podEvent": {
      "endTime": "2022-11-22T01:14:30.430151Z",
      "policyName": "projects/123456789/platforms/gke/policies/my-policy",
      "images": [
        {
          "result": "DENY",
          "checkResults": [
            {
              "explanation": "TrustedDirectoryCheck at index 0 with display name \"My trusted directory check\" has verdict NOT_CONFORMANT. Image is not in a trusted directory",
              "checkSetName": "My check set",
              "checkSetIndex": "0",
              "checkName": "My trusted directory check",
              "verdict": "NON_CONFORMANT",
              "checkType": "TrustedDirectoryCheck",
              "checkIndex": "0"
            }
          ],
          "image": "gcr.io/my-project/hello-app:latest"
        }
      ],
      "verdict": "VIOLATES_POLICY",
      "podNamespace": "default",
      "deployTime": "2022-11-22T01:06:53Z",
      "pod": "hello-app"
    },
    "@type": "type.googleapis.com/google.cloud.binaryauthorization.v1beta1.ContinuousValidationEvent"
  },
  "resource": {
    "type": "k8s_cluster",
    "labels": {
      "project_id": "my-project",
      "location": "us-central1-a",
      "cluster_name": "my-test-cluster"
    }
  },
  "timestamp": "2022-11-22T01:44:28.729881832Z",
  "severity": "WARNING",
  "logName": "projects/my-project/logs/binaryauthorization.googleapis.com%2Fcontinuous_validation",
  "receiveTimestamp": "2022-11-22T03:35:47.171905337Z"
}

清除所用資源

本節說明如何清除您稍早設定的 CV 監控。

您可以停用叢集的 CV 監控功能,或同時停用二進位授權和 CV。

停用叢集的二進位授權

如要停用叢集的 CV 和二進位授權強制執行功能,請執行下列指令:

gcloud beta container clusters update CLUSTER_NAME \
    --binauthz-evaluation-mode=DISABLED \
    --location=LOCATION \
    --project=CLUSTER_PROJECT_ID

更改下列內容:

  • CLUSTER_NAME:叢集名稱
  • LOCATION:叢集位置
  • CLUSTER_PROJECT_ID:叢集專案 ID

停用叢集中的檢查式政策監控功能

如要停用叢集中採用檢查政策的持續驗證,並使用二進位授權違規處置政策重新啟用強制執行功能,請執行下列指令:

gcloud beta container clusters update CLUSTER_NAME  \
    --binauthz-evaluation-mode=PROJECT_SINGLETON_POLICY_ENFORCE \
    --location=LOCATION \
    --project="CLUSTER_PROJECT_ID"

更改下列內容:

  • CLUSTER_NAME:叢集名稱
  • LOCATION:叢集位置
  • CLUSTER_PROJECT_ID:叢集專案 ID

請注意,--binauthz-evaluation-mode=PROJECT_SINGLETON_POLICY_ENFORCE 相當於舊版旗標 --enable-binauthz。

刪除政策

執行下列指令,刪除政策。您不必刪除檢查型平台政策,即可停用檢查型政策稽核。

gcloud beta container binauthz policy delete POLICY_ID \
    --platform=gke \
    --project="POLICY_PROJECT_ID"

更改下列內容:

  • POLICY_ID:政策 ID
  • POLICY_PROJECT_ID:政策專案 ID

後續步驟