本页面介绍了如何使用 Binary Authorization 持续验证 (CV) 映像新鲜度检查来检查与启用了 CV 的 Google Kubernetes Engine (GKE) 集群上运行的 Pod 相关联的映像的新鲜度。为此,CV 会检查映像何时上传到映像注册表。
此检查仅支持 Artifact Registry 和 Container Registry 代码库。
费用
本指南使用以下 Google Cloud 服务:
- Binary Authorization,但 CV 在预览阶段可免费使用
- Google Kubernetes Engine
如需根据您的预计使用量来估算费用,请使用价格计算器。
须知事项
- 登录您的 Google Cloud 帐号。如果您是 Google Cloud 新手,请创建一个帐号来评估我们的产品在实际场景中的表现。新客户还可获享 $300 赠金,用于运行、测试和部署工作负载。
- 安装 Google Cloud CLI。
-
如需初始化 gcloud CLI,请运行以下命令:
gcloud init
-
创建或选择 Google Cloud 项目。
-
创建 Google Cloud 项目:
gcloud projects create PROJECT_ID
-
选择您创建的 Google Cloud 项目:
gcloud config set project PROJECT_ID
-
-
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 - 安装 Google Cloud CLI。
-
如需初始化 gcloud CLI,请运行以下命令:
gcloud init
-
创建或选择 Google Cloud 项目。
-
创建 Google Cloud 项目:
gcloud projects create PROJECT_ID
-
选择您创建的 Google Cloud 项目:
gcloud config set project PROJECT_ID
-
-
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
) 角色,以便其访问政策项目 -
如果您的工件项目与政策项目不同:针对政策项目 Binary Authorization Service Agent 授予 Artifact Registry Reader (
roles/artifactregistry.reader
) 角色,以便其访问证明项目
如需详细了解如何授予角色,请参阅管理访问权限。
您的管理员还可以通过自定义角色或其他预定义角色向政策项目的 Binary Authorization Service Agent 授予所需的权限。
使用 gcloud CLI 授予角色
为确保每个项目中的 Binary Authorization Service Agent 都有评估此检查所需的权限,请为每个项目中的 Binary Authorization Service Agent 授予以下 IAM 角色:
如需向集群项目的 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。
如需使政策项目的 Google Cloud 项目服务代理能够访问工件项目中的映像元数据,请执行以下操作:
获取与政策项目关联的 Binary Authorization 服务代理:
PROJECT_NUMBER=$(gcloud projects list \ --filter="projectId:POLICY_PROJECT_ID" \ --format="value(PROJECT_NUMBER)") POLICY_PROJECT_SERVICE_ACCOUNT="service-$PROJECT_NUMBER@gcp-sa-binaryauthorization.iam.gserviceaccount.com"
将
POLICY_PROJECT_ID
替换为政策项目 ID。授予权限:
gcloud projects add-iam-policy-binding ARTIFACT_PROJECT_ID \ --member="serviceAccount:$POLICY_PROJECT_SERVICE_ACCOUNT" \ --role='roles/artifactregistry.reader'
将
POLCY_PROJECT_ID
替换为包含平台政策的集群项目的 ID。
创建平台政策
如需使用映像新鲜度检查创建 CV 平台政策,请执行以下操作:
创建一个包含平台政策的文件:
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
:存储政策的项目的 IDPOLICY_ID
:政策 IDCLUSTER_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
:存储政策的项目的 IDPOLICY_ID
:政策 IDCLUSTER_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 条目的日志
CV 会在 24 小时内将平台违反政策的行为记录到 Cloud Logging。您通常会在几个小时内看到这些条目。
如果没有映像违反了您启用的平台政策,则日志中不会显示任何条目。
如需查看过去 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
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