使用 Sigstore 簽章檢查

本頁說明如何使用二進位授權持續驗證 (CV) Sigstore 簽章檢查。這項檢查會驗證與 Pod 相關聯的容器映像檔的 Sigstore 產生簽章,這些 Pod 會在已啟用 CV 的 GKE 叢集中執行。這項檢查與簡單簽署驗證檢查的主要差異在於,Sigstore 簽署工作流程不會使用Artifact Analysis 附註,將簽章連結至映像檔。所有簽名都會與簽署的圖片一併儲存。

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

費用

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

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

您可以使用 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. 啟用二進位授權、Cloud Key Management Service、Google Kubernetes Engine 和 Artifact Registry API:

    啟用 API 時所需的角色

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

    gcloud services enable binaryauthorization.googleapis.com cloudkms.googleapis.com container.googleapis.com artifactregistry.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. 啟用二進位授權、Cloud Key Management Service、Google Kubernetes Engine 和 Artifact Registry API:

    啟用 API 時所需的角色

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

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

必要的角色

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

總覽

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

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

  • 如果叢集專案與政策專案不同: 叢集專案的二進位授權服務代理人 二進位授權政策評估者 (roles/binaryauthorization.policyEvaluator)
  • 如果映像檔存放區專案與政策專案不同: 政策專案的二進位授權服務代理程式需要 Artifact Registry 讀取者 (roles/artifactregistry.reader)

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

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

使用 gcloud CLI 授予角色

為確保每個專案中的二進位授權服務代理程式具有評估 CV Sigstore 簽章檢查的必要權限,請在每個專案中將下列 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)")
      SERVICE_ACCOUNT="service-$PROJECT_NUMBER@gcp-sa-binaryauthorization.iam.gserviceaccount.com"
      

      POLICY_PROJECT_ID 替換為包含政策的專案 ID。

    2. 授予角色:

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

      REPOSITORY_PROJECT_ID 替換為包含存放區的專案 ID。

建立金鑰組

在本節中,您將建立橢圓曲線數位簽章演算法 (ECDSA) 非對稱金鑰組。

您可以使用私密金鑰簽署映像檔,建立驗證。您可以在平台政策中加入公開金鑰。CV 檢查驗證時,會使用公開金鑰驗證驗證。

您可以使用 Cloud Key Management Service (Cloud KMS) 或本機金鑰,但建議您在正式環境中使用 Cloud KMS 金鑰。

PKIX Cloud KMS Cosign

  1. 設定建立金鑰組所需的環境變數。如要這麼做,建議您填入下列指令中的預留位置,然後執行該指令。

    KMS_KEY_PROJECT_ID=KMS_KEY_PROJECT_ID
    KMS_KEYRING_NAME=KMS_KEYRING_NAME
    KMS_KEY_NAME=KMS_KEY_NAME
    KMS_KEY_LOCATION=global
    KMS_KEY_PURPOSE=asymmetric-signing
    KMS_KEY_ALGORITHM=ec-sign-p256-sha256
    KMS_PROTECTION_LEVEL=software
    KMS_KEY_VERSION=1
    

    更改下列內容:

    • KMS_KEY_PROJECT_ID:專案 ID
    • KMS_KEYRING_NAME:Cloud KMS 金鑰環的名稱
    • KMS_KEY_NAME:Cloud KMS 金鑰的名稱
  2. 使用 Cosign CLI 生成金鑰:

    cosign generate-key-pair \
      --kms gcpkms://projects/${KMS_KEY_PROJECT_ID}/locations/${KMS_KEY_LOCATION}/keyRings/${KMS_KEYRING_NAME}/cryptoKeys/${KMS_KEY_NAME}
    
  3. 記錄公開金鑰的位置:

    Cosign 會自動將產生的公開金鑰儲存為 cosign.pub,儲存目錄是執行 generate-key-pair 指令的目錄。將這個檔案位置儲存在變數中,以供日後的指令使用。

    PUBLIC_KEY_FILE="$(pwd)/cosign.pub"
    

PKIX Cloud KMS gcloud

如要在 Cloud KMS 中建立金鑰組,請按照下列步驟操作:

  1. 設定建立金鑰組所需的環境變數。如要這麼做,建議您填入下列指令中的預留位置,然後執行該指令。

    KMS_KEY_PROJECT_ID=KMS_KEY_PROJECT_ID
    KMS_KEYRING_NAME=KMS_KEYRING_NAME
    KMS_KEY_NAME=KMS_KEY_NAME
    KMS_KEY_LOCATION=global
    KMS_KEY_PURPOSE=asymmetric-signing
    KMS_KEY_ALGORITHM=ec-sign-p256-sha256
    KMS_PROTECTION_LEVEL=software
    KMS_KEY_VERSION=1
    

    更改下列內容:

    • KMS_KEY_PROJECT_ID:專案 ID
    • KMS_KEYRING_NAME:Cloud KMS 金鑰環的名稱
    • KMS_KEY_NAME:Cloud KMS 金鑰的名稱
  2. 建立金鑰環:

    gcloud kms keyrings create ${KMS_KEYRING_NAME} \
        --location=${KMS_KEY_LOCATION} \
        --project=${KMS_KEY_PROJECT_ID}
    
  3. 建立金鑰:

    gcloud kms keys create ${KMS_KEY_NAME} \
        --location=${KMS_KEY_LOCATION} \
        --keyring=${KMS_KEYRING_NAME}  \
        --purpose=${KMS_KEY_PURPOSE} \
        --default-algorithm=${KMS_KEY_ALGORITHM} \
        --protection-level=${KMS_PROTECTION_LEVEL} \
        --project=${KMS_KEY_PROJECT_ID}
    
  4. 將公開金鑰內容匯出至檔案:

    PUBLIC_KEY_FILE="$(pwd)/cosign.pub"
    gcloud kms keys versions get-public-key 1 \
        --key=${KMS_KEY_NAME} \
        --keyring=${KMS_KEYRING_NAME} \
        --location=${KMS_KEY_LOCATION} \
        --output-file=${PUBLIC_KEY_FILE} \
        --project=${KMS_KEY_PROJECT_ID}
    

本機金鑰

如要在本機建立金鑰組,請執行下列步驟:

  cosign generate-key-pair
  PUBLIC_KEY_FILE="$(pwd)/cosign.pub"
  PRIVATE_KEY_FILE="$(pwd)/cosign.key"

建立平台政策

如要建立 CV 平台政策並進行 Sigstore 簽章檢查,請按照下列步驟操作:

  1. 建立 Sigstore 簽章檢查平台政策檔案:

    cat > POLICY_PATH <<EOF
    gkePolicy:
      checkSets:
      - checks:
        - displayName: sigstore-signature-check
          sigstoreSignatureCheck:
            sigstoreAuthorities:
            - displayName: sigstore-authority
              publicKeySet:
                publicKeys:
                  publicKeyPem: |
    $(awk '{printf "                %s\n", $0}' ${PUBLIC_KEY_FILE})
    EOF
    

    POLICY_PATH 替換為政策檔案的路徑。

  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

測試 CV

在本節中,您將部署已簽署的映像檔,測試 CV。在本例中,CV Sigstore 簽章檢查會驗證簽章,且不會產生任何記錄項目。

然後嘗試部署其他未簽署的映像檔。在這種情況下,CV 檢查無法找到有效簽章,並會將違規事項記錄到 Cloud Logging。

簽署圖片

如要通過檢查,圖片必須有有效的簽名。如要建立簽名,請按照下列步驟操作:

  1. 建立用於簽署映像檔的變數:

    IMAGE_PATH=IMAGE_PATH
    IMAGE_DIGEST=sha256:IMAGE_DIGEST_SHA
    IMAGE_TO_SIGN="${IMAGE_PATH}@${IMAGE_DIGEST}"
    

    更改下列內容:

    • IMAGE_PATH:圖片路徑
    • IMAGE_DIGEST_SHA:映像檔摘要的 SHA 雜湊值
  2. 簽署映像檔,並將簽章推送至 Artifact Registry:

    PKIX Cloud KMS

    使用 Cloud KMS 中代管的金鑰簽署映像檔,然後將簽章推送至 Artifact Registry:

    cosign sign \
        --key gcpkms://projects/${KMS_KEY_PROJECT_ID}/locations/${KMS_KEY_LOCATION}/keyRings/${KMS_KEYRING_NAME}/cryptoKeys/${KMS_KEY_NAME} \
        ${IMAGE_TO_SIGN}
    

    本機金鑰

    使用本機私密金鑰簽署映像檔,然後將簽章推送至 Artifact Registry。

    cosign sign --key ${PRIVATE_KEY_FILE} ${IMAGE_TO_SIGN}
    
  3. 回應 Cosign 提示:

    執行 cosign sign 指令後,Cosign 會詢問您是否要將簽章上傳至透明度記錄 Rekor。在系統提示時回應 yn。如要進一步瞭解 Rekor,請參閱 Rekor 說明文件

手動驗證簽章

如要手動驗證簽章,請按照下列步驟操作:

  1. 確認簽章是否存在於 Artifact Registry 中:

    Google Cloud 控制台

    1. 前往 Google Cloud 控制台的 Artifact Registry 頁面。

      前往 Artifact Registry

    2. 在存放區清單中,按一下含有映像檔的存放區名稱。

    3. 按一下您簽署的映像檔名稱。

    4. 找出含有簽名的項目。這個項目有以下標籤: sha256-[image digest].sig。標記的項目只能有一個。

    5. 按一下「Manifest」(資訊清單)

    6. 您應該會看到 JSON 格式的檔案,內含各種欄位。每個簽章都位於 layers 清單的其中一個元素中,也就是 annotations 對應。簽章位於 dev.cosignproject.cosign/signature 鍵。

      以下是資訊清單範例:

      {
            "schemaVersion": 2,
            "mediaType": "application/vnd.oci.image.manifest.v1+json",
            "config": {
                "mediaType": "application/vnd.oci.image.config.v1+json",
                "size": SIZE_OF_LAYERS,
                "digest": "DIGEST_OF_LAYERS"
            },
            "layers": [
                {
                    "mediaType": "application/vnd.dev.cosign.simplesigning.v1+json",
                    "size": SIZE_OF_ANNOTATIONS,
                    "digest": "DIGEST_OF_ANNOTATIONS",
                    "annotations": {
                        "dev.cosignproject.cosign/signature": "BASE64_SIGNATURE",
                        "dev.sigstore.cosign/bundle": "BUNDLE"
                    }
                }
            ]
      }

    範例資訊清單包含下列項目:

    • SIZE_OF_LAYERSlayers 陣列的大小 (以位元組為單位)
    • DIGEST_OF_LAYERSlayers 陣列的摘要
    • SIZE_OF_ANNOTATIONSannotations 字典的大小 (以位元組為單位)
    • DIGEST_OF_ANNOTATIONSannotations 字典的摘要
    • BASE64_SIGNATURE:以 base64 格式編碼的原始簽章。這是用於驗證的簽章
    • BUNDLE:Sigstore 專屬中繼資料

    如要進一步瞭解資訊清單格式,請參閱 Sigstore 的 cosign 簽章規格

    指令列

    1. 找出正確的構件:

      列出與圖片一起儲存的項目:

      gcloud artifacts docker tags list ${IMAGE_PATH}
      

      輸出範例如下所示:

      Listing items under project PROJECT_ID, location REPOSITORY_LOCATION, repository REPOSITORY_NAME.
      TAG                         IMAGE                                                         DIGEST
      latest                      us-east1-docker.pkg.dev/my-project/my-repo/my-image           sha256:abc123
      sha256-abc123.sig           us-east1-docker.pkg.dev/my-project/my-repo/my-image           sha256:def456
      

      在輸出內容中,標記為 sha256-abc123.sig 的構件會在資訊清單中包含簽章。

    2. 取得資訊清單

      如要取得標記為 sha256-IMAGE_DIGEST_SHA.sig 的構件資訊清單,請執行下列指令:

      curl -X GET -H "Content-Type: application/json" \
                  -H "Authorization: Bearer $(gcloud auth print-access-token)" \
                  -H "X-Goog-User-Project: REPOSITORY_PROJECT_ID" \
                  "https://REPOSITORY_LOCATION-docker.pkg.dev/v2/REPOSITORY_PROJECT_ID/REPOSITORY_NAME/IMAGE_NAME/manifests/sha256-IMAGE_DIGEST_SHA.sig"
      

      更改下列內容:

      • REPOSITORY_PROJECT_ID:包含存放區的專案 ID
      • REPOSITORY_LOCATION:存放區位置
      • REPOSITORY_NAME:存放區名稱
      • IMAGE_NAME:圖片名稱

      您應該會看到 JSON 格式的檔案,內含各種欄位。每個簽章都位於 layers 清單的其中一個元素中,也就是 annotations 對應。簽章位於 dev.cosignproject.cosign/signature 鍵。

      資訊清單範例如下:

      {
          "schemaVersion": 2,
          "mediaType": "application/vnd.oci.image.manifest.v1+json",
          "config": {
              "mediaType": "application/vnd.oci.image.config.v1+json",
              "size": SIZE_OF_LAYERS,
              "digest": "DIGEST_OF_LAYERS"
          },
          "layers": [
              {
                  "mediaType": "application/vnd.dev.cosign.simplesigning.v1+json",
                  "size": SIZE_OF_ANNOTATIONS,
                  "digest": "DIGEST_OF_ANNOTATIONS",
                  "annotations": {
                      "dev.cosignproject.cosign/signature": "BASE64_SIGNATURE",
                      "dev.sigstore.cosign/bundle": "BUNDLE"
                  }
              }
          ]
      }

    範例資訊清單包含下列項目:

    • SIZE_OF_LAYERSlayers 陣列的大小 (以位元組為單位)
    • DIGEST_OF_LAYERSlayers 陣列的摘要
    • SIZE_OF_ANNOTATIONSannotations 字典的大小 (以位元組為單位)
    • DIGEST_OF_ANNOTATIONSannotations 字典的摘要
    • BASE64_SIGNATURE:以 base64 格式編碼的原始簽章。這是用於驗證的簽章
    • BUNDLE:Sigstore 專屬中繼資料

    如要進一步瞭解資訊清單格式,請參閱 Sigstore 的 cosign 簽章規格

  2. 手動驗證簽章:

    使用 cosign verify 驗證上傳的簽名:

    PKIX Cloud KMS

    cosign verify --key gcpkms://projects/${KMS_KEY_PROJECT_ID}/locations/${KMS_KEY_LOCATION}/keyRings/${KMS_KEYRING_NAME}/cryptoKeys/${KMS_KEY_NAME} \
          ${IMAGE_PATH}@${IMAGE_DIGEST}
    

    本機金鑰

    cosign verify --key {PUBLIC_KEY_FILE} ${IMAGE_PATH}@${IMAGE_DIGEST}
    

    如果驗證成功,指令輸出內容會顯示 The signatures were verified against the specified public key

部署已簽署的映像檔

如要部署已簽署的映像檔,請按照下列步驟操作:

  1. 設定 kubectl

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

    更改下列內容:

    • CLUSTER_NAME:叢集名稱
    • LOCATION:叢集位置
    • CLUSTER_PROJECT_ID:叢集專案 ID
  2. 部署映像檔,並根據二進位授權政策檢查部署作業:

    kubectl run hello-app-signed --image=${IMAGE_PATH}@${IMAGE_DIGEST}
    

    Pod 已部署。由於映像檔已簽署,CV 不會產生與這個 Pod 相關的記錄檔項目。

部署未簽署的映像檔

在本節中,您將部署未簽署的映像檔。

由於政策規定需要簽章,但這個映像檔沒有簽章,因此容器執行時,CV 會定期記錄違規事項。

如要部署映像檔,請執行下列指令:

  kubectl run hello-app-unsigned \
      --image=UNSIGNED_IMAGE_PATH@UNSIGNED_IMAGE_DIGEST

Pod 已部署。由於映像檔沒有驗證,因此持續驗證會在 Pod 執行時產生記錄項目

查看履歷表項目的記錄

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

後續步驟