本頁說明如何使用二進位授權持續驗證 (CV) Sigstore 簽章檢查。這項檢查會驗證與 Pod 相關聯的容器映像檔的 Sigstore 產生簽章,這些 Pod 會在已啟用 CV 的 GKE 叢集中執行。這項檢查與簡單的簽署認證檢查的主要差異在於,Sigstore 簽署工作流程不會使用構件分析附註,將簽章連結至映像檔。所有簽章都會與簽署的圖片一併儲存。
這項檢查僅支援 Artifact Registry 存放區。
費用
本指南使用下列 Google Cloud 服務:
- 二進位授權,但 CV 在預先發布版階段免費提供
- GKE
- Cloud Key Management Service
- Artifact Registry
如要根據預測用量估算費用,請使用 Pricing Calculator。
事前準備
- 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.
-
Install the Google Cloud CLI.
-
If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
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.
-
-
Make sure that billing is enabled for your Google Cloud project.
-
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 -
Install the Google Cloud CLI.
-
If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
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.
-
-
Make sure that billing is enabled for your Google Cloud project.
-
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 - 確認 gcloud CLI 已更新至最新版本。
- 安裝
kubectl
指令列工具。 - 如果二進位授權政策和 GKE 叢集位於不同專案,請務必在這兩個專案中啟用二進位授權。
- 安裝
cosign
指令列工具。 -
如果叢集專案與政策專案不同:
叢集專案的二進位授權服務代理人二進位授權政策評估者 (
roles/binaryauthorization.policyEvaluator
) -
如果映像檔存放區專案與政策專案不同:
政策專案的二進位授權服務代理程式需要「Artifact Registry 讀取者」 (
roles/artifactregistry.reader
) 角色。 授予叢集專案的二進位授權服務代理程式權限,以存取政策專案中的政策。
取得叢集專案的二進位授權服務代理:
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。允許 CV 評估叢集上的政策:
gcloud projects add-iam-policy-binding POLICY_PROJECT_ID \ --member="serviceAccount:$CLUSTER_SERVICE_ACCOUNT" \ --role='roles/binaryauthorization.policyEvaluator'
將
POLICY_PROJECT_ID
替換為包含政策的專案 ID。
允許政策專案的二進位授權服務代理人存取存放區中的簽章:
取得政策專案的二進位授權服務代理:
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。授予角色:
gcloud projects add-iam-policy-binding REPOSITORY_PROJECT_ID \ --member="serviceAccount:$SERVICE_ACCOUNT" \ --role='roles/artifactregistry.reader'
將
REPOSITORY_PROJECT_ID
替換為包含存放區的專案 ID。
設定建立金鑰組所需的環境變數。如要這麼做,建議您填入下列指令中的預留位置,然後執行該指令。
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
:您的專案 IDKMS_KEYRING_NAME
:Cloud KMS 金鑰環的名稱KMS_KEY_NAME
:Cloud KMS 金鑰的名稱
使用 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}
記錄公開金鑰的位置:
Cosign 會自動將產生的公開金鑰儲存為
cosign.pub
,儲存目錄是執行generate-key-pair
指令的目錄。將這個檔案位置儲存在變數中,以供日後指令使用。PUBLIC_KEY_FILE="$(pwd)/cosign.pub"
設定建立金鑰組所需的環境變數。如要這麼做,建議您填入下列指令中的預留位置,然後執行該指令。
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
:您的專案 IDKMS_KEYRING_NAME
:Cloud KMS 金鑰環的名稱KMS_KEY_NAME
:Cloud KMS 金鑰的名稱
建立金鑰環:
gcloud kms keyrings create ${KMS_KEYRING_NAME} \ --location=${KMS_KEY_LOCATION} \ --project=${KMS_KEY_PROJECT_ID}
建立金鑰:
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}
將公開金鑰內容匯出至檔案:
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}
建立 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
替換為政策檔案的路徑。建立平台政策:
使用下方的任何指令資料之前,請先替換以下項目:
- 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
- POLICY_ID:您選擇的平台政策 ID。如果政策位於其他專案中,可以使用完整資源名稱:
CLUSTER_NAME
:叢集名稱。LOCATION
:位置,例如us-central1
或asia-south1
。POLICY_PROJECT_ID
:儲存政策的專案 ID。POLICY_ID
:政策 ID。CLUSTER_PROJECT_ID
:叢集專案 ID。CLUSTER_NAME
:叢集名稱。LOCATION
:位置,例如us-central1
或asia-south1
。POLICY_PROJECT_ID
:儲存政策的專案 ID。POLICY_ID
:政策 ID。CLUSTER_PROJECT_ID
:叢集專案 ID。CLUSTER_NAME
:叢集名稱LOCATION
:位置,例如:us-central1
或asia-south1
POLICY_PROJECT_ID
:儲存政策的專案 IDPOLICY_ID
:政策 IDCLUSTER_PROJECT_ID
:叢集專案 IDCLUSTER_NAME
:叢集名稱LOCATION
:位置,例如:us-central1
或asia-south1
POLICY_PROJECT_ID
:儲存政策的專案 IDPOLICY_ID
:政策 IDCLUSTER_PROJECT_ID
:叢集專案 ID建立用於簽署映像檔的變數:
IMAGE_PATH=IMAGE_PATH IMAGE_DIGEST=sha256:IMAGE_DIGEST_SHA IMAGE_TO_SIGN="${IMAGE_PATH}@${IMAGE_DIGEST}"
更改下列內容:
IMAGE_PATH
:圖片路徑IMAGE_DIGEST_SHA
:映像檔摘要的 SHA 雜湊值
簽署映像檔並將簽章推送至 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}
回應 Cosign 提示:
執行
cosign sign
指令後,Cosign 會詢問您是否要將簽章上傳至資訊公開記錄 Rekor。在系統提示時回應y
或n
。如要進一步瞭解 Rekor,請參閱 Rekor 說明文件。確認簽章是否存在於 Artifact Registry 中:
Google Cloud 控制台
前往 Google Cloud 控制台的 Artifact Registry 頁面。
在存放區清單中,按一下包含映像檔的存放區名稱。
按一下您簽署的映像檔名稱。
找出含有簽名的項目。這個項目有以下標籤:
sha256-[image digest].sig
。標記的項目只能有一個。按一下「資訊清單」。
您應該會看到 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_LAYERS
:layers
陣列的大小 (以位元組為單位)DIGEST_OF_LAYERS
:layers
陣列的摘要SIZE_OF_ANNOTATIONS
:annotations
字典的大小 (以位元組為單位)DIGEST_OF_ANNOTATIONS
:annotations
字典的摘要BASE64_SIGNATURE
:以 base64 格式編碼的原始簽章。這是用於驗證的簽章BUNDLE
:Sigstore 專屬中繼資料
如要進一步瞭解資訊清單格式,請參閱 Sigstore 的 cosign 簽章規格。
指令列
找出正確的構件:
列出與圖片一起儲存的項目:
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
的構件會在資訊清單中包含簽章。取得資訊清單
如要取得標記為
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
:包含存放區的專案 IDREPOSITORY_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_LAYERS
:layers
陣列的大小 (以位元組為單位)DIGEST_OF_LAYERS
:layers
陣列的摘要SIZE_OF_ANNOTATIONS
:annotations
字典的大小 (以位元組為單位)DIGEST_OF_ANNOTATIONS
:annotations
字典的摘要BASE64_SIGNATURE
:以 base64 格式編碼的原始簽章。這是用於驗證的簽章BUNDLE
:Sigstore 專屬中繼資料
如要進一步瞭解資訊清單格式,請參閱 Sigstore 的 cosign 簽章規格。
手動驗證簽名:
使用
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
。設定「
kubectl
」:gcloud container clusters get-credentials CLUSTER_NAME \ --location=LOCATION \ --project=CLUSTER_PROJECT_ID
更改下列內容:
CLUSTER_NAME
:叢集名稱LOCATION
:叢集位置CLUSTER_PROJECT_ID
:叢集專案 ID
部署映像檔,並根據二進位授權政策檢查部署作業:
kubectl run hello-app-signed --image=${IMAGE_PATH}@${IMAGE_DIGEST}
Pod 已部署完畢,由於映像檔已簽署,CV 不會產生與這個 Pod 相關的記錄檔項目。
ImageFreshnessCheck
SigstoreSignatureCheck
SimpleSigningAttestationCheck
SlsaCheck
TrustedDirectoryCheck
VulnerabilityCheck
CLUSTER_NAME
:叢集名稱LOCATION
:叢集位置CLUSTER_PROJECT_ID
:叢集專案 IDCLUSTER_NAME
:叢集名稱LOCATION
:叢集位置CLUSTER_PROJECT_ID
:叢集專案 IDPOLICY_ID
:政策 IDPOLICY_PROJECT_ID
:政策專案 ID
必要的角色
本節說明如何為這項檢查設定角色。
總覽
如果您在同一個專案中執行本指南提及的所有產品,則不需要設定任何權限。啟用 Binary Authorization 時,系統會正確設定角色。如果您在不同專案中執行產品,則必須按照本節所述設定角色。
為確保每個專案中的 Binary Authorization 服務代理程式具備評估 CV Sigstore 簽章檢查所需的權限,請管理員在每個專案中,將下列 IAM 角色授予 Binary Authorization 服務代理程式:
如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和機構的存取權」。
管理員或許也能透過自訂角色或其他預先定義的角色,授予每個專案中的 Binary Authorization 服務代理程式必要權限。
使用 gcloud CLI 授予角色
為確保每個專案中的二進位授權服務代理程式具有評估 CV Sigstore 簽章檢查的必要權限,請在每個專案中將下列 IAM 角色授予二進位授權服務代理程式:
建立金鑰組
在本節中,您將建立橢圓曲線數位簽章演算法 (ECDSA) 非對稱金鑰組。
您可以使用私密金鑰簽署映像檔,建立認證。您可以在平台政策中加入公開金鑰。CV 檢查認證時,會使用公開金鑰驗證認證。
您可以使用 Cloud Key Management Service (Cloud KMS) 或本機金鑰,但建議您在正式環境中使用 Cloud KMS 金鑰。
PKIX Cloud KMS Cosign
PKIX Cloud KMS gcloud
如要在 Cloud KMS 中建立金鑰組,請按照下列步驟操作:
本機金鑰
如要在本機建立金鑰組,請執行下列步驟:
cosign generate-key-pair
PUBLIC_KEY_FILE="$(pwd)/cosign.pub"
PRIVATE_KEY_FILE="$(pwd)/cosign.key"
建立平台政策
如要建立 CV 平台政策並進行 Sigstore 簽章檢查,請按照下列步驟操作:
啟用 CV
您可以建立新叢集,或更新現有叢集,以使用 CV 監控功能和以檢查為基礎的平台政策。
建立使用 CV 監控的叢集
在本節中,您將建立僅使用 CV 監控的叢集,並採用以檢查為基礎的平台政策。
使用下方的任何指令資料之前,請先替換以下項目:
執行下列指令:
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 監控,以及以檢查為基礎的平台政策:
使用下方的任何指令資料之前,請先替換以下項目:
執行下列指令:
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 監控功能。
使用下方的任何指令資料之前,請先替換以下項目:
執行下列指令:
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 監控,以及以檢查為基礎的平台政策。
使用下方的任何指令資料之前,請先替換以下項目:
執行下列指令:
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。
簽署圖片
如要通過檢查,圖片必須有有效的簽章。如要建立簽章,請執行下列步驟:
手動驗證簽章
如要手動驗證簽章,請按照下列步驟操作:
部署已簽署的映像檔
如要部署已簽署的映像檔,請按照下列步驟操作:
部署未簽署的映像檔
在本節中,您會部署未簽署的映像檔。
由於政策規定必須提供簽章,但這個映像檔沒有,因此容器執行時,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
表示檢查。各項檢查的值如下:
記錄範例
以下 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
更改下列內容:
在叢集中停用以檢查為準的政策監控功能
如要在叢集中停用以檢查為準的 CV 政策,並使用 Binary Authorization 強制執行政策重新啟用強制執行功能,請執行下列指令:
gcloud beta container clusters update CLUSTER_NAME \
--binauthz-evaluation-mode=PROJECT_SINGLETON_POLICY_ENFORCE \
--location=LOCATION \
--project="CLUSTER_PROJECT_ID"
更改下列內容:
請注意,--binauthz-evaluation-mode=PROJECT_SINGLETON_POLICY_ENFORCE
等同於舊版旗標 --enable-binauthz
。
刪除政策
如要刪除政策,請執行下列指令。如要停用以檢查為準的政策稽核功能,不必刪除以檢查為準的平台政策。
gcloud beta container binauthz policy delete POLICY_ID \
--platform=gke \
--project="POLICY_PROJECT_ID"
更改下列內容: