使用 Sigstore 簽章檢查

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

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

費用

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

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

如要根據預測用量估算費用,請使用 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. If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.

  4. To initialize the gcloud CLI, run the following command:

    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. Make sure that billing is enabled for your Google Cloud project.

  7. Enable the Binary Authorization, Cloud Key Management Service, Google Kubernetes Engine, Artifact Registry APIs:

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

  9. If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.

  10. To initialize the gcloud CLI, run the following command:

    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. Make sure that billing is enabled for your Google Cloud project.

  13. Enable the Binary Authorization, Cloud Key Management Service, Google Kubernetes Engine, Artifact Registry APIs:

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

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

    總覽

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

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

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

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

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

    使用 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. 按一下「資訊清單」

      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 已部署完畢,由於映像檔沒有認證,因此 CV 會在 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

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

    如要在叢集中停用以檢查為準的 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

    後續步驟