本页面介绍了如何使用 Binary Authorization 持续验证 (CV) 简单签名证明检查。 该检查会验证与启用了 CV 的 Google Kubernetes Engine (GKE) 集群中运行的 Pod 关联的容器映像的证明。
费用
本指南使用以下 Google Cloud 服务:
- Binary Authorization,但 CV 在预览阶段可免费使用
- GKE
- Cloud Key Management Service
如需根据您的预计使用量来估算费用,请使用价格计算器。
准备工作
- 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. Roles required to select or create a project - Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
- 
      Create a project: To create a project, you need the Project Creator
      (roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
 - 
        Create a Google Cloud project: gcloud projects create PROJECT_ID Replace PROJECT_IDwith 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_IDwith your Google Cloud project name.
 
- 
  
    Verify that billing is enabled for your Google Cloud project. 
- 
  
  
    
      Enable the Binary Authorization, Cloud Key Management Service, Google Kubernetes Engine APIs: Roles required to enable APIs To enable APIs, you need the Service Usage Admin IAM role ( roles/serviceusage.serviceUsageAdmin), which contains theserviceusage.services.enablepermission. Learn how to grant roles.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. Roles required to select or create a project - Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
- 
      Create a project: To create a project, you need the Project Creator
      (roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
 - 
        Create a Google Cloud project: gcloud projects create PROJECT_ID Replace PROJECT_IDwith 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_IDwith your Google Cloud project name.
 
- 
  
    Verify that billing is enabled for your Google Cloud project. 
- 
  
  
    
      Enable the Binary Authorization, Cloud Key Management Service, Google Kubernetes Engine APIs: Roles required to enable APIs To enable APIs, you need the Service Usage Admin IAM role ( roles/serviceusage.serviceUsageAdmin), which contains theserviceusage.services.enablepermission. Learn how to grant roles.gcloud services enable binaryauthorization.googleapis.com cloudkms.googleapis.com container.googleapis.com 
- 确保 gcloud CLI 已更新到最新版本。
- 安装 kubectl命令行工具。
- 如果您的 Binary Authorization 政策和 GKE 集群位于不同的项目中,请确保两个项目中都启用了 Binary Authorization。
- 
            如果您的集群项目与政策项目不同:针对集群项目 Binary Authorization Service Agent 授予 Binary Authorization Policy Evaluator  (roles/binaryauthorization.policyEvaluator) 角色,以便其访问政策项目
- 
            如果您的证明项目与政策项目不同:针对政策项目 Binary Authorization Service Agent 授予 Container  Analysis Occurrences Viewer  (roles/containeranalysis.occurrences.viewer) 角色,以便其访问证明项目
- 向集群项目的 Binary Authorization Service Agent 授权访问政策项目中的政策。 - 获取集群项目的 Binary Authorization 服务代理: - 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。
 
- 允许政策项目 Binary Authorization Service Agent 访问证明项目中的证明: - 获取政策项目的 Binary Authorization 服务代理: - 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:您的项目 ID
- KMS_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替换为存储使用此 Cloud KMS 密钥创建的证明的项目 ID。- 本地密钥- 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:存储使用您的本地密钥创建的证明的项目 ID
- PUBLIC_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:存储政策的项目的 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
- 创建备注变量: - 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
 
- 部署服务并根据 Binary Authorization 政策检查部署: - 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:集群项目 ID
- CLUSTER_NAME:集群的名称
- LOCATION:集群位置
- CLUSTER_PROJECT_ID:集群项目 ID
- POLICY_ID:政策的 ID
- POLICY_PROJECT_ID:政策项目 ID
所需的角色
本部分介绍如何为此检查设置角色。
概览
如果您在同一项目中运行本指南中提到的所有产品,则无需设置任何权限。启用 Binary Authorization 后,它会正确配置这些角色。如果您在不同项目中运行产品,则必须按照本部分中的说明设置角色。
为确保每个项目中的 Binary Authorization Service Agent 都有评估 CV 简单签名证明检查所需的权限,请让您的管理员为每个项目中的 Binary Authorization Service Agent 授予以下 IAM 角色:
如需详细了解如何授予角色,请参阅管理对项目、文件夹和组织的访问权限。
您的管理员还可以通过自定义角色或其他预定义角色向每个项目中的 Binary Authorization Service Agent 授予所需的权限。
使用 gcloud CLI 授予角色
为确保每个项目中的 Binary Authorization Service Agent 都有评估 CV 简单签名证明检查所需的权限,请为每个项目中的 Binary Authorization Service Agent 授予以下 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 监控的集群
在本部分中,您将创建一个集群,它将 project-singleton 政策强制执行和 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
创建 Artifact Analysis 备注
在本部分中,您将创建 Artifact Analysis 备注示例来关联证明。要创建备注,请执行以下操作:
测试 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 运行时生成日志条目。
查看 CV 条目的日志
您可以搜索 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 Logging 条目示例描述了违反可信目录检查的不符合规则的映像:
{
  "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 监控或 Binary Authorization 和 CV。
在集群中停用 Binary Authorization
如需在集群中同时停用 CV 和 Binary Authorization 强制执行,请运行以下命令:
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"
请替换以下内容: