本頁說明如何使用二進位授權持續驗證 (CV) 簡易簽署驗證檢查。這項檢查會驗證與 Pod 相關聯的容器映像檔的簽章,這些 Pod 會在啟用 CV 的 Google Kubernetes Engine (GKE) 叢集中執行。
費用
本指南使用下列 Google Cloud 服務:
- 二進位授權,但 CV 在預先發布版階段免費提供
- GKE
- Cloud Key Management Service
如要根據預測用量估算費用,請使用 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.
-
如果您使用外部識別資訊提供者 (IdP),請先 使用聯合身分登入 gcloud CLI。
-
如要初始化 gcloud CLI,請執行下列指令:
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 APIs:
gcloud services enable binaryauthorization.googleapis.com
cloudkms.googleapis.com container.googleapis.com -
Install the Google Cloud CLI.
-
如果您使用外部識別資訊提供者 (IdP),請先 使用聯合身分登入 gcloud CLI。
-
如要初始化 gcloud CLI,請執行下列指令:
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 APIs:
gcloud services enable binaryauthorization.googleapis.com
cloudkms.googleapis.com container.googleapis.com - 確認 gcloud CLI 已更新至最新版本。
- 安裝
kubectl
指令列工具。 - 如果二進位授權政策和 GKE 叢集位於不同專案,請務必在這兩個專案中啟用二進位授權。
-
如果叢集專案與政策專案不同:
在叢集專案的二進位授權服務代理人上,授予二進位授權政策評估者 (
roles/binaryauthorization.policyEvaluator
) 角色,以便存取政策專案。 -
如果驗證專案與政策專案不同:
政策專案的二進位授權服務代理程式需要「容器分析例項檢視者」 (
roles/containeranalysis.occurrences.viewer
) 角色,才能存取驗證專案。 授予叢集專案的二進位授權服務代理程式權限,以存取政策專案中的政策。
取得叢集專案的二進位授權服務代理:
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 ATTESTATION_PROJECT_ID \ --member="serviceAccount:$SERVICE_ACCOUNT" \ --role='roles/containeranalysis.occurrences.viewer'
將
ATTESTATION_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 KEY_FILE=KEY_FILE
更改下列內容:
KMS_KEY_PROJECT_ID
:您的專案 IDKMS_KEYRING_NAME
:Cloud KMS 金鑰環的名稱KMS_KEY_NAME
:Cloud KMS 金鑰的名稱KEY_FILE
:儲存 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}
將公開金鑰內容匯出至檔案:
gcloud kms keys versions get-public-key ${KMS_KEY_VERSION} \ --key=${KMS_KEY_NAME} \ --keyring=${KMS_KEYRING_NAME} \ --location=${KMS_KEY_LOCATION} \ --output-file=${KEY_FILE} \ --project=${KMS_KEY_PROJECT_ID}
建立私密金鑰:
PRIVATE_KEY_FILE="/tmp/ec_private.pem" openssl ecparam -genkey -name prime256v1 -noout -out ${PRIVATE_KEY_FILE}
從私密金鑰取得公開金鑰:
PUBLIC_KEY_FILE="/tmp/ec_public.pem" openssl ec -in ${PRIVATE_KEY_FILE} -pubout -out ${PUBLIC_KEY_FILE}
建立簡單的簽署認證檢查平台政策 YAML 檔案:
PKIX Cloud KMS
cat > /tmp/my-policy.yaml << EOF gkePolicy: checkSets: - checks: - simpleSigningAttestationCheck: containerAnalysisAttestationProjects: - projects/ATTESTATION_PROJECT_ID attestationAuthenticators: pkixPublicKeySet: pkixPublicKeys: publicKeyPem: | $(awk '{printf " %s\n", $0}' ${KEY_FILE}) signatureAlgorithm: ECDSA_P256_SHA256 keyId: |- //cloudkms.googleapis.com/v1/projects/${KMS_KEY_PROJECT_ID}/locations/${KMS_KEY_LOCATION}/keyRings/${KMS_KEYRING_NAME}/cryptoKeys/${KMS_KEY_NAME}/cryptoKeyVersions/${KMS_KEY_VERSION} EOF
將
ATTESTATION_PROJECT_ID
替換為專案 ID,該專案會儲存使用這個 Cloud KMS 金鑰建立的認證。本機金鑰
cat > /tmp/my-policy.yaml <<EOF gkePolicy: checkSets: - checks: - simpleSigningAttestationCheck: containerAnalysisAttestationProjects: - projects/ATTESTATION_PROJECT_ID attestationAuthenticators: pkixPublicKeySet: pkixPublicKeys: publicKeyPem: | $(awk '{printf " %s\n", $0}' /tmp/ec_public.pem) signatureAlgorithm: ECDSA_P256_SHA256 keyId: | PUBLIC_KEY_ID EOF
更改下列內容:
ATTESTATION_PROJECT_ID
:儲存使用本機金鑰建立的認證的專案 IDPUBLIC_KEY_ID
:用來識別本機金鑰的專屬 ID
建立平台政策:
使用下方的任何指令資料之前,請先替換以下項目:
- 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。如果政策位於其他專案中,可以使用完整資源名稱:
儲存 ID 值以供後續使用:
PUBLIC_KEY_ID="PUBLIC_KEY_ID"
將
PUBLIC_KEY_ID
替換為您在本指南稍早的平台政策檔案中,於keyId
欄位指定的 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建立附註變數:
NOTE_PROJECT_ID=NOTE_PROJECT_ID NOTE_ID="test-note" NOTE_URI="projects/${NOTE_PROJECT_ID}/notes/${NOTE_ID}" DESCRIPTION="CV test note"
將
NOTE_PROJECT_ID
替換為包含附註的專案 ID。建立記事內容檔案:
cat > /tmp/note_payload.json << EOM { "name": "${NOTE_URI}", "attestation": { "hint": { "human_readable_name": "${DESCRIPTION}" } } } EOM
建立記事:
curl -X POST \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $(gcloud auth print-access-token)" \ -H "x-goog-user-project: ${NOTE_PROJECT_ID}" \ --data-binary @/tmp/note_payload.json "https://containeranalysis.googleapis.com/v1/projects/${NOTE_PROJECT_ID}/notes/?noteId=${NOTE_ID}"
將
NOTE_PROJECT_ID
替換為包含附註的專案 ID選用:如要確認是否已建立記事,請執行下列步驟:
curl \ -H "Authorization: Bearer $(gcloud auth print-access-token)" \ -H "x-goog-user-project: NOTE_PROJECT_ID" \ "https://containeranalysis.googleapis.com/v1/projects/NOTE_PROJECT_ID/notes/"
將
NOTE_PROJECT_ID
替換為包含附註的專案 ID。使用預先驗證編碼 (PAE) 簽署圖片並建立認證 (建議):
gcloud beta container binauthz attestations sign-and-create \ --artifact-url=${IMAGE_TO_ATTEST} \ --keyversion=${KMS_KEY_VERSION} \ --keyversion-key=${KMS_KEY_NAME} \ --keyversion-keyring=${KMS_KEYRING_NAME} \ --keyversion-location=${KMS_KEY_LOCATION} \ --note=${NOTE_URI} \ --pae-encode-payload \ --dsse-type=DSSE_TYPE
將
DSSE_TYPE
替換為 PAE 編碼的 DSSE 型別。 這個標記預設為application/vnd.dev.cosign.simplesigning.v1+json
。建立簽章酬載檔案:
cat > /tmp/generated_payload.json << EOM { "critical": { "identity": { "docker-reference": "${IMAGE_PATH}" }, "image": { "docker-manifest-digest": "${IMAGE_DIGEST}" }, "type": "Google Cloud BinAuthz container signature" } } EOM
簽署酬載:
gcloud kms asymmetric-sign \ --version=${KMS_KEY_VERSION} \ --key=${KMS_KEY_NAME} \ --keyring=${KMS_KEYRING_NAME} \ --location=${KMS_KEY_LOCATION} \ --digest-algorithm=sha256 \ --input-file=/tmp/generated_payload.json \ --signature-file=/tmp/ec_signature \ --project=${KMS_KEY_PROJECT_ID}
建立認證內容:
cat > /tmp/attestation.json << EOM { "resourceUri": "${IMAGE_TO_ATTEST}", "note_name": "${NOTE_URI}", "attestation": { "serialized_payload": "$(base64 --wrap=0 /tmp/generated_payload.json)", "signatures": [{ "public_key_id": "${PUBLIC_KEY_ID}", "signature": "$(base64 --wrap=0 /tmp/ec_signature)" }] } } EOM
建立認證:
curl -X POST "https://containeranalysis.googleapis.com/v1/projects/${NOTE_PROJECT_ID}/occurrences/" \ -H "Content-Type: application/json" \ -H "X-Goog-User-Project: ${NOTE_PROJECT_ID}" \ -H "Authorization: Bearer $(gcloud auth print-access-token)" \ --data-binary @/tmp/attestation.json
將
NOTE_PROJECT_ID
替換為包含附註的專案 ID。建立簽章酬載檔案:
cat > /tmp/generated_payload.json << EOM { "critical": { "identity": { "docker-reference": "${IMAGE_PATH}" }, "image": { "docker-manifest-digest": "${IMAGE_DIGEST}" }, "type": "Google Cloud BinAuthz container signature" } } EOM
建立簽章酬載檔案:
openssl dgst -sha256 -sign ${PRIVATE_KEY_FILE} /tmp/generated_payload.json > /tmp/ec_signature
建立認證:
gcloud container binauthz attestations create \ --project=ATTESTATION_PROJECT_ID \ --artifact-url=${IMAGE_TO_ATTEST} \ --note=${NOTE_URI} \ --signature-file=/tmp/ec_signature \ --public-key-id=PUBLIC_KEY_ID
建立簽章酬載檔案:
cat > /tmp/generated_payload.json << EOM { "critical": { "identity": { "docker-reference": "${IMAGE_PATH}" }, "image": { "docker-manifest-digest": "${IMAGE_DIGEST}" }, "type": "Google Cloud BinAuthz container signature" } } EOM
建立簽章酬載檔案:
openssl dgst -sha256 -sign ${PRIVATE_KEY_FILE} /tmp/generated_payload.json > /tmp/ec_signature
建立認證內容:
cat > /tmp/attestation.json << EOM { "resourceUri": "${IMAGE_TO_ATTEST}", "note_name": "${NOTE_URI}", "attestation": { "serialized_payload": "$(base64 --wrap=0 /tmp/generated_payload.json)", "signatures": [{ "public_key_id": "${PUBLIC_KEY_ID}", "signature": "$(base64 --wrap=0 /tmp/ec_signature)" }] } } EOM
建立認證:
curl -X POST "https://containeranalysis.googleapis.com/v1/projects/${NOTE_PROJECT_ID}/occurrences/" \ -H "Content-Type: application/json" \ -H "X-Goog-User-Project: ${NOTE_PROJECT_ID}" \ -H "Authorization: Bearer $(gcloud auth print-access-token)" \ --data-binary @/tmp/attestation.json
設定「
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-with-attestation --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 簡單簽署認證檢查所需的權限,請管理員將下列 IAM 角色授予每個專案中的 Binary Authorization 服務代理程式:
如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和機構的存取權」。
管理員或許也能透過自訂角色或其他預先定義的角色,授予每個專案中的 Binary Authorization 服務代理程式必要權限。
使用 gcloud CLI 授予角色
為確保每個專案中的二進位授權服務代理程式具有評估 CV 簡單簽署認證檢查的必要權限,請在每個專案中將下列 IAM 角色授予二進位授權服務代理程式:
建立金鑰組
在本節中,您將建立橢圓曲線數位簽章演算法 (ECDSA) 非對稱金鑰組。
您可以使用私密金鑰簽署映像檔,建立認證。您可以在平台政策中加入公開金鑰。CV 檢查認證時,會使用公開金鑰驗證認證。
您可以使用 Cloud Key Management Service 或本機金鑰,但建議在正式環境中使用 Cloud KMS 金鑰。
PKIX Cloud KMS
如要在 Cloud KMS 中建立金鑰組,請按照下列步驟操作:
本機金鑰
如要在本機建立金鑰組,請執行下列步驟:
建立平台政策
如要建立 CV 平台政策,並進行簡單的簽署認證檢查,請按照下列步驟操作:
啟用 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 簡單簽署認證檢查會驗證認證,且不會產生任何記錄項目。
然後嘗試部署沒有認證的其他映像檔。在這種情況下,CV 檢查找不到認證,並將違規事項記錄到 Cloud Logging。
如要建立用於測試 CV 的變數,請執行下列指令:
IMAGE_PATH="us-docker.pkg.dev/google-samples/containers/gke/hello-app"
IMAGE_DIGEST="sha256:37e5287945774f27b418ce567cd77f4bbc9ef44a1bcd1a2312369f31f9cce567"
IMAGE_TO_ATTEST="${IMAGE_PATH}@${IMAGE_DIGEST}"
建立認證
如要通過簡單簽署認證檢查,圖片必須具備有效認證。
您可以使用 gcloud CLI 或 REST API 建立認證。
PKIX Cloud KMS
gcloud
如要使用 gcloud CLI 建立認證,請執行下列操作:
REST API
如要使用 REST API 建立認證,請按照下列步驟操作:
本機金鑰
gcloud
REST API
部署經過認證的映像檔
如要部署已建立認證的映像檔,請按照下列步驟操作:
部署未經認證的映像檔
在本節中,您會部署沒有相關聯認證的映像檔。
由於政策規定需要認證,但這個映像檔沒有,因此 CV 會在容器執行時定期記錄違規事項。
如要部署映像檔,請執行下列指令:
kubectl run hello-app-without-attestation \
--image=$IMAGE_PATH@$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"
更改下列內容: