本頁面說明如何使用二進位授權持續驗證 (CV) Sigstore 簽章檢查。這項檢查會驗證容器映像檔的 Sigstore 簽章,這些映像檔與在已啟用 CV 的 GKE 叢集中執行的 Pod 相關聯。這項檢查與簡易簽署認證檢查的主要差異,在於 Sigstore 簽署工作流程不會使用 Artifact Analysis 附註將簽章連結至映像檔。所有簽章都會與簽署的映像檔一併儲存。
這項檢查僅支援 Artifact Registry 存放區。
費用
本指南使用下列 Google Cloud 服務:
- 二進位授權,但持續驗證在預先發布版階段可無須支付費用使用
- GKE
- Cloud Key Management Service
- Artifact Registry
您可以使用 Pricing Calculator 根據預測用量估算費用。
事前準備
-
安裝 Google Cloud CLI。
-
設定 gcloud CLI,使用您的聯合身分。
詳情請參閱「使用聯合身分登入 gcloud CLI」。
-
執行下列指令,初始化 gcloud CLI:
gcloud init -
選取或建立專案所需的角色
- 選取專案:選取專案時,不需具備特定 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 專案名稱。
啟用二進位授權、Cloud Key Management Service、Google Kubernetes Engine、Artifact Registry API (如有尚未啟用的 API):
啟用 API 所需的角色
如要啟用 API,您必須具備
serviceusage.services.enable權限。如果您建立了專案,可能已透過「擁有者」角色 (roles/owner) 取得這項權限。否則,您可以透過「Service Usage 管理員」角色 (roles/serviceusage.serviceUsageAdmin) 取得這項權限。瞭解如何授予角色。gcloud services enable binaryauthorization.googleapis.com
cloudkms.googleapis.com container.googleapis.com artifactregistry.googleapis.com - 確認 gcloud CLI 已更新至最新版本。
- 安裝
kubectl指令列工具。 - 如果二進位授權政策和 GKE 叢集位於不同專案,請確認這兩項專案都已啟用二進位授權。
- 安裝
cosign指令列工具。
必要的角色
本節說明如何為這項檢查設定角色。
總覽
如果您在同一個專案中執行本指南提及的所有產品,則不需要設定任何權限。啟用二進位授權時,系統會正確設定角色。如果您在不同專案中執行產品,則必須按照本節所述設定角色。
為確保各專案中的二進位授權服務代理程式具備必要權限,可評估 CV Sigstore 簽章檢查,請要求管理員將下列 IAM 角色授予各專案中的二進位授權服務代理程式:
-
如果叢集專案與政策專案不同:叢集專案二進位授權服務代理上的二進位授權政策評估者 (
roles/binaryauthorization.policyEvaluator) -
如果映像檔存放區專案與政策專案不同:政策專案二進位授權服務代理的 Artifact Registry 讀取者 (
roles/artifactregistry.reader)
如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和組織的存取權」。
管理員或許也能透過自訂角色或其他預先定義的角色,為各專案中的二進位授權服務代理授予必要權限。
使用 gcloud CLI 授予角色
為確保各專案中的二進位授權服務代理具備必要權限,可評估 CV Sigstore 簽章檢查,請將下列 IAM 角色授予各專案中的二進位授權服務代理:
授予叢集專案的二進位授權服務代理權限,以便存取政策專案中的政策。
取得叢集專案的二進位授權服務代理:
PROJECT_NUMBER=$(gcloud projects list --filter="projectId:CLUSTER_PROJECT_ID" \ --format="value(PROJECT_NUMBER)") CLUSTER_SERVICE_ACCOUNT="service-$PROJECT_NUMBER@gcp-sa-binaryauthorization."將
CLUSTER_PROJECT_ID替換為叢集的專案 ID。允許持續驗證評估叢集上的政策:
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."將
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。
建立金鑰組
在本節中,您將建立橢圓曲線數位簽章演算法 (ECDSA) 非對稱金鑰組。
您可以使用私密金鑰簽署映像檔,建立認證。您在平台政策中加入公開金鑰。CV 檢查認證時,會使用公開金鑰驗證認證。
您可以使用 Cloud Key Management Service (Cloud KMS) 或本機金鑰,但建議您在正式環境中使用 Cloud KMS 金鑰。
PKIX Cloud KMS Cosign
設定建立金鑰組所需的環境變數。建議您填寫下列指令中的預留位置,然後執行指令。
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"
PKIX Cloud KMS gcloud
如要在 Cloud KMS 中建立金鑰組,請按照下列步驟操作:
設定建立金鑰組所需的環境變數。建議您填寫下列指令中的預留位置,然後執行指令。
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}
本機金鑰
如要在本機建立金鑰組,請按照下列步驟操作:
cosign generate-key-pair
PUBLIC_KEY_FILE="$(pwd)/cosign.pub"
PRIVATE_KEY_FILE="$(pwd)/cosign.key"
建立平台政策
如要建立具有 Sigstore 簽章檢查功能的 CV 平台政策,請按照下列步驟操作:
建立 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。如果政策位於其他專案,您可以使用完整資源名稱:
啟用 CV
您可以建立新叢集,或更新現有叢集,以便搭配使用 CV 監控功能和檢查型平台政策。
建立使用 CV 監控功能的叢集
在本節中,您將建立僅使用 CV 監控功能和檢查型平台政策的叢集。
使用下列任何指令資料前,請先替換以下項目:
CLUSTER_NAME:叢集名稱。LOCATION:位置,例如us-central1或asia-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 監控功能的叢集
在本節中,您將建立一個叢集,同時使用 project-singleton 政策強制執行功能,以及採用檢查式平台政策的 CV 監控功能:
使用下列任何指令資料前,請先替換以下項目:
CLUSTER_NAME:叢集名稱。LOCATION:位置,例如us-central1或asia-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-central1或asia-south1POLICY_PROJECT_ID:儲存政策的專案 IDPOLICY_ID:政策 IDCLUSTER_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-central1或asia-south1POLICY_PROJECT_ID:儲存政策的專案 IDPOLICY_ID:政策 IDCLUSTER_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 Sigstore 簽章檢查會驗證簽章,且不會產生記錄項目。
接著,您嘗試部署另一個未簽署的映像檔。在這種情況下,CV 檢查找不到有效的簽章,並會將違規事項記錄到 Cloud Logging。
簽署映像檔
映像檔必須具備有效簽章,才能通過檢查。如要建立簽章,請按照下列步驟操作:
建立用於簽署映像檔的變數:
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。只有一個項目應有這個標記。按一下「Manifest」(資訊清單)。
您應該會看到一個 JSON 格式的檔案,其中包含多個欄位。每個簽章都位於
annotations對應中layers清單的一個元素內。簽名位於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 格式的檔案,其中包含多個欄位。每個簽章都位於
annotations對應中layers清單的一個元素內。簽名位於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 相關的記錄項目。
部署未簽署的映像檔
在本節中,您將部署未簽署的映像檔。
由於政策規定需要簽章,而這個映像檔沒有簽章,因此容器執行期間,CV 會定期記錄違規事項。
執行下列指令來部署映像檔:
kubectl run hello-app-unsigned \
--image=UNSIGNED_IMAGE_PATH@UNSIGNED_IMAGE_DIGEST
Pod 已部署完成。由於映像檔沒有認證,因此在 Pod 執行期間,CV 會產生記錄項目。
查看 CV 項目的記錄
您可以搜尋 Cloud Logging 記錄項目,找出持續驗證設定錯誤和持續驗證平台政策驗證違規事項。
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 平台政策驗證違規事項
如果沒有任何圖片違反您啟用的平台政策,記錄中就不會顯示任何項目。
如要查看過去七天的 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 值代表檢查。各項檢查的值如下:
ImageFreshnessCheckSigstoreSignatureCheckSimpleSigningAttestationCheckSlsaCheckTrustedDirectoryCheckVulnerabilityCheck
記錄範例
下列 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
停用叢集中的檢查式政策監控功能
如要停用叢集中採用檢查政策的持續驗證,並使用二進位授權違規處置政策重新啟用強制執行功能,請執行下列指令:
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:政策 IDPOLICY_PROJECT_ID:政策專案 ID