使用 SLSA 檢查

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

如要使用這項檢查,您必須使用 Cloud Build 建構映像檔,產生符合 SLSA 標準的來源資訊

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

SLSA 檢查支援的唯一可信建構工具是 Cloud Build。

費用

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

  • Artifact Registry
  • 二進位授權,但 CV 在預先發布版階段免費提供
  • Cloud Build
  • Cloud Source Repositories
  • GKE

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

事前準備

  1. 登入 Google Cloud 帳戶。如果您是 Google Cloud新手,歡迎 建立帳戶,親自評估產品在實際工作環境中的成效。新客戶還能獲得價值 $300 美元的免費抵免額,可用於執行、測試及部署工作負載。
  2. 安裝 Google Cloud CLI。

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

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

    gcloud init
  5. 建立或選取 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 專案名稱。

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

  7. 啟用 Artifact Registry、二進位授權、Cloud Build、GKE、Cloud Source Repositories API:

    啟用 API 時所需的角色

    如要啟用 API,您需要具備服務使用情形管理員 IAM 角色 (roles/serviceusage.serviceUsageAdmin),其中包含 serviceusage.services.enable 權限。瞭解如何授予角色

    gcloud services enable artifactregistry.googleapis.com binaryauthorization.googleapis.com cloudbuild.googleapis.com container.googleapis.com sourcerepo.googleapis.com
  8. 安裝 Google Cloud CLI。

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

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

    gcloud init
  11. 建立或選取 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 專案名稱。

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

  13. 啟用 Artifact Registry、二進位授權、Cloud Build、GKE、Cloud Source Repositories API:

    啟用 API 時所需的角色

    如要啟用 API,您需要具備服務使用情形管理員 IAM 角色 (roles/serviceusage.serviceUsageAdmin),其中包含 serviceusage.services.enable 權限。瞭解如何授予角色

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

必要的角色

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

總覽

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

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

  • Artifact Registry 讀取者 (roles/artifactregistry.reader) 叢集專案的 Compute Engine 服務帳戶
  • 如果叢集專案與政策專案不同: 在叢集專案的二進位授權服務代理人上,授予二進位授權政策評估者 (roles/binaryauthorization.policyEvaluator) 角色,以便存取政策專案
  • 如果驗證專案與政策專案不同: 政策專案的二進位授權服務代理程式需要「容器分析例項檢視者」 (roles/containeranalysis.occurrences.viewer) 角色,才能存取驗證專案。

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

管理員或許也能透過自訂角色或其他預先定義的角色,授予每個專案的 Binary Authorization 服務代理必要權限。

使用 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.iam.gserviceaccount.com"
      

      CLUSTER_PROJECT_ID 替換為叢集的專案 ID。

    2. 允許 CV 評估叢集上的政策:

      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.iam.gserviceaccount.com"
      

      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@developer.gserviceaccount.com"
      

      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-west2europe-central2asia-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_IDARTIFACT_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-west2europe-central2asia-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_EXPRESSIONCEL 運算式,可對 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-central1asia-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 監控功能的叢集

在本節中,您將建立叢集,同時使用專案單例政策強制執行和 CV 監控,以及以檢查為準的平台政策:

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

  • CLUSTER_NAME:叢集名稱。
  • LOCATION:位置,例如 us-central1asia-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-central1asia-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-central1asia-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 設為映像檔所在位置以外的原始碼存放區。您也可以手動觸發建構作業,這會略過來源產生作業。然後檢查記錄項目

查看履歷表項目的記錄

您可以搜尋 Cloud Logging 項目,找出 CV 設定錯誤CV 平台政策驗證違規事項

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 平台政策驗證違規事項

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

如要查看過去 7 天的 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

在叢集中停用以檢查為準的政策監控功能

如要在叢集中停用以檢查為準的政策,並使用 Binary Authorization 強制執行政策重新啟用強制執行功能,請執行下列指令:

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

後續步驟