本页面介绍了如何使用 Binary Authorization 持续验证 (CV) 映像新鲜度检查来检查与启用了 CV 的 Google Kubernetes Engine (GKE) 集群上运行的 Pod 相关联的映像的新鲜度。为此,CV 会检查映像何时上传到映像注册表。
此检查仅支持 Artifact Registry 和 Container Registry 代码库。
费用
本指南使用以下 Google Cloud 服务:
- Binary Authorization,但 CV 在预览阶段可免费使用
- Google Kubernetes Engine
如需根据您的预计使用量来估算费用,请使用价格计算器。
须知事项
- 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.
-
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 Artifact Registry, Binary Authorization, Google Kubernetes Engine APIs:
gcloud services enable artifactregistry.googleapis.com
binaryauthorization.googleapis.com cloudbuild.googleapis.com container.googleapis.com - Install the Google Cloud CLI.
-
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 Artifact Registry, Binary Authorization, Google Kubernetes Engine APIs:
gcloud services enable artifactregistry.googleapis.com
binaryauthorization.googleapis.com cloudbuild.googleapis.com container.googleapis.com - 确保 gcloud CLI 已更新到最新版本。
- 安装
kubectl
命令行工具。 - 如果您的 Binary Authorization 政策和 GKE 集群位于不同的项目中,请确保两个项目中都启用了 Binary Authorization。
所需的角色
本部分介绍如何为此检查设置角色。
概览
如果您在同一项目中运行本指南中提到的所有产品,则无需设置任何权限。启用 Binary Authorization 后,它会正确配置这些角色。如果您在不同项目中运行产品,则必须按照本部分中的说明设置角色。
为了确保政策项目的 Binary Authorization Service Agent 具有评估 CV 映像新鲜度检查所需的必要权限,请让您的管理员向该政策项目的 Binary Authorization Service Agent 授予以下 IAM 角色:
- 如果集群项目与政策项目不同:针对集群项目 Binary Authorization Service Agent 授予 Binary Authorization Policy Evaluator (
roles/binaryauthorization.policyEvaluator
) 角色,以便其访问政策项目 -
如果您的 Artifact Registry 项目(用于存储映像的项目)与政策项目不同:向政策项目 Binary Authorization 服务代理授予 Artifact Registry Reader (
roles/artifactregistry.reader
) 角色,以便其访问证明项目 -
如果您的 Artifact Registry 项目与集群项目不同:针对集群项目 Binary Authorization Service Agent 授予 Artifact Registry Reader (
roles/artifactregistry.reader
) 角色,以便其访问 Artifact Registry 项目中的映像元数据
如需详细了解如何授予角色,请参阅管理对项目、文件夹和组织的访问权限。
您的管理员还可以通过自定义角色或其他预定义角色向政策项目的 Binary Authorization Service Agent 授予所需的权限。
使用 gcloud CLI 授予角色
为确保每个项目中的 Binary Authorization Service Agent 具有评估此检查所需的权限,请为每个项目中的 Binary Authorization Service Agent 授予以下 IAM 角色。
与政策项目不同的集群项目
为集群项目中的 Binary Authorization 服务代理授予政策项目的 Binary Authorization Policy Evaluator (roles/binaryauthorization.policyEvaluator
) 角色。
gcloud projects add-iam-policy-bindingPOLICY_PROJECT_ID
\ --member="serviceAccount:service-$(gcloud projects describeCLUSTER_PROJECT_ID
--format='value(projectNumber)')@gcp-sa-binaryauthorization.iam.gserviceaccount.com" \ --role=roles/binaryauthorization.policyEvaluator
请替换以下内容:
POLICY_PROJECT_ID
:包含政策的项目的 ID。CLUSTER_PROJECT_ID
:集群的项目 ID。
与工件项目不同的政策项目
为政策项目中的 Binary Authorization 服务代理授予工件项目的 Artifact Registry Reader (roles/artifactregistry.reader
) 角色。
gcloud projects add-iam-policy-bindingARTIFACT_PROJECT_ID
\ --member="serviceAccount:service-$(gcloud projects describePOLICY_PROJECT_ID
--format='value(projectNumber)')@gcp-sa-binaryauthorization.iam.gserviceaccount.com" \ --role=roles/artifactregistry.reader
将 ARTIFACT_PROJECT_ID
替换为包含 Artifact Registry 制品库的项目的 ID。
与工件项目不同的集群项目
为集群项目中的 Binary Authorization 服务代理授予工件项目的 Artifact Registry Reader (roles/artifactregistry.reader
) 角色。
gcloud projects add-iam-policy-bindingARTIFACT_PROJECT_ID
\ --member="serviceAccount:service-$(gcloud projects describeCLUSTER_PROJECT_ID
--format='value(projectNumber)')@gcp-sa-binaryauthorization.iam.gserviceaccount.com" \ --role=roles/artifactregistry.reader
请替换以下内容:
ARTIFACT_PROJECT_ID
:包含 Artifact Registry 制品库的项目的 ID。CLUSTER_PROJECT_ID
:运行 GKE 集群的项目的 ID。
创建平台政策
如需创建包含映像新鲜度检查的 CV 平台政策,请执行以下操作:
创建平台政策 YAML 文件:
cat << EOF > /tmp/my-policy.yaml gkePolicy: checkSets: - checks: - imageFreshnessCheck: maxUploadAgeDays: MAX_UPLOAD_AGE_DAYS displayName: CHECK_DISPLAY_NAME displayName: CHECK_SET_DISPLAY_NAME EOF
替换以下内容:
MAX_UPLOAD_AGE_DAYS
:自映像上传到注册表以来经过的最长时间(以天为单位)。CHECK_SET_DISPLAY_NAME
:您为检查集选择的可选显示名称CHECK_DISPLAY_NAME
:您为检查选择的可选显示名称
创建平台政策:
在使用下面的命令数据之前,请先进行以下替换:
- 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-south1
POLICY_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-south1
POLICY_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 条目的日志
您可以搜索 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 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
请替换以下内容:
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
:政策的 IDPOLICY_PROJECT_ID
:政策项目 ID