本页面介绍了如何使用 Binary Authorization 持续验证 (CV) 可信目录检查来检查与启用了 CV 的 Google Kubernetes Engine (GKE) 集群上运行的 Pod 相关联的映像是否是从可信目录部署的。
费用
本指南使用以下 Google Cloud 服务:
- Binary Authorization,但 CV 在预览阶段可免费使用
- GKE
如需根据您的预计使用量来估算费用,请使用价格计算器。
须知事项
- 登录您的 Google Cloud 账号。如果您是 Google Cloud 新手,请创建一个账号来评估我们的产品在实际场景中的表现。新客户还可获享 $300 赠金,用于运行、测试和部署工作负载。
- 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.
-
-
Enable the Artifact Registry, Binary Authorization, Google Kubernetes Engine APIs:
gcloud services enable artifactregistry.googleapis.com
binaryauthorization.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.
-
-
Enable the Artifact Registry, Binary Authorization, Google Kubernetes Engine APIs:
gcloud services enable artifactregistry.googleapis.com
binaryauthorization.googleapis.com container.googleapis.com - 确保 gcloud CLI 已更新到最新版本。
- 安装
kubectl
命令行工具。 - 如果您的 Binary Authorization 政策和 GKE 集群位于不同的项目中,请确保两个项目中都启用了 Binary Authorization。
所需的角色
本部分介绍如何为此检查设置角色。
概览
如果您在同一项目中运行本指南中提到的所有产品,则无需设置任何权限。启用 Binary Authorization 后,它会正确配置这些角色。如果您在不同项目中运行产品,则必须按照本部分中的说明设置角色。
如需确保集群项目的 Binary Authorization 服务代理具有评估 CV 可信目录检查所需的权限,请让您的管理员向集群项目的 Binary Authorization 服务代理就该项目授予以下 IAM 角色:
- 如果您的集群项目与政策项目不同:针对集群项目 Binary Authorization Service Agent 授予 Binary Authorization Policy Evaluator (
roles/binaryauthorization.policyEvaluator
) 角色,以便其访问政策项目
如需详细了解如何授予角色,请参阅管理访问权限。
您的管理员还可以通过自定义角色或其他预定义角色向集群项目的 Binary Authorization 服务代理授予所需的权限。
使用 gcloud CLI 授予角色
如果运行集群的项目与政策所在的项目不同,请执行以下操作,向集群项目的 Binary Authorization 服务代理授权访问政策项目中的政策。
获取集群项目的 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。
创建平台政策
如需创建包含可信目录检查的 CV 平台政策,请执行以下操作:
创建可信目录政策 YAML 文件:
cat > /tmp/my-policy.yaml <<EOF gkePolicy: checkSets: checks: trustedDirectoryCheck: trustedDirPatterns: - PATTERN1 - PATTERN2 displayName: CHECK_DISPLAY_NAME displayName: CHECK_SET_DISPLAY_NAME EOF
替换以下内容:
PATTERN1
:采用目录格式的列表项PATTERN2
:采用目录格式的列表项CHECK_DISPLAY_NAME
:可信目录检查的可选显示名称CHECK_SET_DISPLAY_NAME
:可信目录检查的可选显示名称
以下是一些格式示例:
asia-east1-docker.pkg.dev/my-project/my-repo
:仅信任此代码库europe-central1-docker.pkg.dev/my-project/my-repo/test*
:仅信任此代码库及此代码库下一级以test
开头的代码库us-central1-docker.pkg.dev/my-project/my-repo/**
:仅信任此代码库及其下的所有代码库
创建平台政策:
在使用下面的命令数据之前,请先进行以下替换:
- 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