使用圖片新鮮度檢查

本頁面說明如何使用二進位授權持續驗證 (CV) 映像檔新鮮度檢查,檢查與在已啟用 CV 的 Google Kubernetes Engine (GKE) 叢集上執行的 Pod 相關聯的映像檔新鮮度。為此,CV 會檢查映像檔上傳至映像檔登錄檔的時間。

這項檢查僅支援 Artifact Registry 和 Container Registry 存放區。

費用

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

  • 二進位授權,但 CV 在預先發布版階段免費提供
  • Google Kubernetes Engine

如要根據預測用量估算費用,請使用 Pricing Calculator

事前準備

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. Install the Google Cloud CLI.

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

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

    gcloud init
  5. Create or select a Google Cloud project.

    • Create a Google Cloud project:

      gcloud projects create PROJECT_ID

      Replace PROJECT_ID with a name for the Google Cloud project you are creating.

    • Select the Google Cloud project that you created:

      gcloud config set project PROJECT_ID

      Replace PROJECT_ID with your Google Cloud project name.

  6. Verify that billing is enabled for your Google Cloud project.

  7. Enable the Artifact Registry, Binary Authorization, Google Kubernetes Engine APIs:

    gcloud services enable artifactregistry.googleapis.com binaryauthorization.googleapis.com cloudbuild.googleapis.com container.googleapis.com
  8. Install the Google Cloud CLI.

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

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

    gcloud init
  11. Create or select a Google Cloud project.

    • Create a Google Cloud project:

      gcloud projects create PROJECT_ID

      Replace PROJECT_ID with a name for the Google Cloud project you are creating.

    • Select the Google Cloud project that you created:

      gcloud config set project PROJECT_ID

      Replace PROJECT_ID with your Google Cloud project name.

  12. Verify that billing is enabled for your Google Cloud project.

  13. Enable the Artifact Registry, Binary Authorization, Google Kubernetes Engine APIs:

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

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

    總覽

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

    為確保政策專案的 Binary Authorization 服務代理程式具備評估 CV 映像檔新鮮度檢查的必要權限, 請管理員將下列 IAM 角色授予政策專案的 Binary Authorization 服務代理程式:

    • 如果叢集專案與政策專案不同: 叢集專案的二進位授權服務代理人需要二進位授權政策評估者 (roles/binaryauthorization.policyEvaluator) 角色,才能存取政策專案。
    • 如果 Artifact Registry 專案 (儲存映像檔的專案) 與政策專案不同: 政策專案的 Binary Authorization 服務代理程式需要Artifact Registry 讀取者 (roles/artifactregistry.reader) 角色,才能存取認證專案
    • 如果 Artifact Registry 專案與叢集專案不同: 在叢集專案的 Binary Authorization 服務代理程式上,新增 Artifact Registry 讀取者 (roles/artifactregistry.reader),以便存取 Artifact Registry 專案中的映像檔中繼資料。

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

    管理員或許還可透過自訂角色或其他預先定義的角色,將必要權限授予政策專案的 Binary Authorization 服務代理程式。

    使用 gcloud CLI 授予角色

    為確保每個專案中的 Binary Authorization 服務代理程式都具備評估這項檢查的必要權限,請在每個專案中將下列 IAM 角色授予 Binary Authorization 服務代理程式。

    叢集專案與政策專案不同

    在政策專案中,將「二進位授權政策評估者」(roles/binaryauthorization.policyEvaluator) 角色授予叢集專案中的二進位授權服務代理程式。

    gcloud projects add-iam-policy-binding POLICY_PROJECT_ID \
      --member="serviceAccount:service-$(gcloud projects describe CLUSTER_PROJECT_ID --format='value(projectNumber)')@gcp-sa-binaryauthorization.iam.gserviceaccount.com" \
      --role=roles/binaryauthorization.policyEvaluator

    取代下列項目:

    • POLICY_PROJECT_ID:包含政策的專案 ID。
    • CLUSTER_PROJECT_ID:叢集的專案 ID。

    政策專案與構件專案不同

    在政策專案中,將構件專案的 Artifact Registry Reader (roles/artifactregistry.reader) 角色授予 Binary Authorization 服務代理程式。

    gcloud projects add-iam-policy-binding ARTIFACT_PROJECT_ID \
        --member="serviceAccount:service-$(gcloud projects describe POLICY_PROJECT_ID --format='value(projectNumber)')@gcp-sa-binaryauthorization.iam.gserviceaccount.com" \
        --role=roles/artifactregistry.reader

    ARTIFACT_PROJECT_ID 替換為包含 Artifact Registry 存放區的專案 ID。

    叢集專案與構件專案不同

    在構件專案中,將 Artifact Registry Reader (roles/artifactregistry.reader) 角色授予叢集專案的二進位授權服務代理程式。

    gcloud projects add-iam-policy-binding ARTIFACT_PROJECT_ID \
        --member="serviceAccount:service-$(gcloud projects describe CLUSTER_PROJECT_ID --format='value(projectNumber)')@gcp-sa-binaryauthorization.iam.gserviceaccount.com" \
        --role=roles/artifactregistry.reader

    取代下列項目:

    • ARTIFACT_PROJECT_ID:包含 Artifact Registry 存放區的專案 ID。
    • CLUSTER_PROJECT_ID:執行 GKE 叢集的專案 ID。

    建立平台政策

    如要建立採用圖片新鮮度檢查的 CV 平台政策,請按照下列步驟操作:

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

      cat << EOF > /tmp/my-policy.yaml
      gkePolicy:
        checkSets:
        - checks:
          - imageFreshnessCheck:
              maxUploadAgeDays: MAX_UPLOAD_AGE_DAYS
            displayName: CHECK_DISPLAY_NAME
          displayName: CHECK_SET_DISPLAY_NAME
      EOF
      

      更改下列內容:

      • MAX_UPLOAD_AGE_DAYS:自映像檔上傳至登錄檔後經過的時間上限,以天為單位。
      • CHECK_SET_DISPLAY_NAME:檢查集的可選顯示名稱
      • CHECK_DISPLAY_NAME:檢查的選用顯示名稱
    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

    查看履歷表項目的記錄

    您可以搜尋 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

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

    如要在叢集中停用 CV 檢查政策,並使用 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

    後續步驟