本文档介绍如何设置 Google Distributed Cloud 中创建的用于本地集群的 Binary Authorization。并向您展示了如何配置示例 Binary Authorization 政策。
准备工作
确保您的集群具有受支持的 Google Distributed Cloud 版本。Binary Authorization 支持以下环境。
Bare Metal
Google Distributed Cloud 1.14 或 1.15。对于 1.16 版或更高版本,可以在创建或更新集群期间配置 Binary Authorization。
VMware
Distributed Cloud for VMware (Google Distributed Cloud) 1.4 或更高版本。
Binary Authorization 服务使用可通过常规互联网连接访问的外部 IP 地址。针对 HTTPS 配置防火墙规则,以允许用户集群访问端点
binaryauthorization.googleapis.com
。Bare Metal
VMware
如果要使用集中式 Cloud Audit Logs 查看审核日志条目(包括用于 Google Cloud 外部集群的 Binary Authorization 的日志条目),您必须在集群配置中配置 Cloud Audit Logs。
Bare Metal
在 Google Distributed Cloud 中配置 Cloud Audit Logs。
VMware
在 Google Distributed Cloud 中配置 Cloud Audit Logs。
您必须按照以下步骤启用 Binary Authorization API:
转到 Google Cloud 控制台。
在项目下拉列表中,选择您的舰队宿主项目。您可以在用户集群配置文件的
gkeConnect
部分中找到此项目。这是将您的用户集群连接到 Google Cloud 的 Google Cloud 项目。
设置 Binary Authorization
在本部分中,您将设置本地集群中的 Binary Authorization。
指定安装环境变量
如需指定环境变量,请执行以下操作:
使用 Workload Identity
指定舰队宿主项目:
export PROJECT_ID=PROJECT_ID
将舰队会员 ID 设置为您的集群 ID:
运行
gcloud container fleet memberships list
命令时,会员 ID 列在NAME
列中。export MEMBERSHIP_ID=CLUSTER_NAME
使用服务账号密钥
指定舰队宿主项目:
export PROJECT_ID=PROJECT_ID
将 PROJECT_ID 替换为用户集群配置文件的
gkeConnect
部分中的 Google Cloud 项目。指定用户集群的 kubeconfig 文件的路径:
export KUBECONFIG=PATH
将 PATH 替换为用户集群 kubeconfig 文件的路径。
为 Binary Authorization API 访问服务账号选择一个名称:
export SA_NAME=SERVICE_ACCOUNT_NAME
将 SERVICE_ACCOUNT_NAME 替换为您选择的服务账号名称。Binary Authorization 模块使用此服务账号来访问 Binary Authorization API。
指定您在本指南后面部分要下载的服务账号密钥文件的路径:
export SA_JSON_PATH=SA_KEY_FILE_PATH
将 SA_KEY_FILE_PATH 替换为服务账号的 JSON 格式密钥文件的路径。
在用户集群中安装 Binary Authorization 模块
如需安装 Binary Authorization 模块,请执行以下操作:
使用 Workload Identity
舰队 Workload Identity 可让集群中的工作负载向 Google 进行身份验证,而无需下载、手动轮替和常规管理 Google Cloud 服务账号密钥。请参阅使用舰队 Workload Identity,详细了解舰队 Workload Identity 的工作原理以及使用该服务的优势。
将
binaryauthorization.policyEvaluator
角色授予舰队宿主项目的 Kubernetes 服务账号:gcloud projects add-iam-policy-binding ${PROJECT_ID} \ --member="serviceAccount:${PROJECT_ID}.svc.id.goog[binauthz-system/binauthz-admin]" \ --role="roles/binaryauthorization.policyEvaluator"
创建工作目录:
创建名为
binauthz
的目录。切换到目录。
下载
manifest-wi-0.2.6.yaml.tmpl
文件,该文件用于在用户集群中安装 Binary Authorization 模块:裸金属
gcloud storage cp gs://anthos-baremetal-release/binauthz/manifest-wi-0.2.6.yaml.tmpl .
VMware
gcloud storage cp gs://gke-on-prem-release/binauthz/manifest-wi-0.2.6.yaml.tmpl .
替换模板中的环境变量:
envsubst < manifest-wi-0.2.6.yaml.tmpl > manifest-0.2.6.yaml
在您的用户集群中安装 Binary Authorization 模块:
kubectl apply -f manifest-0.2.6.yaml
验证 Deployment 是否已创建:
kubectl get pod --namespace binauthz-system
您会看到列出的 Pod
binauthz-module-deployment-*
,Status
为Running
且有 1/1 个 Pod 准备就绪,类似于如下输出:NAME READY STATUS RESTARTS AGE binauthz-module-deployment-5fddf9594f-qjprz 1/1 Running 0 11s
使用服务账号密钥
设置 Google Cloud CLI 的默认项目:
gcloud config set project ${PROJECT_ID}
创建 Binary Authorization API 访问服务账号:
gcloud iam service-accounts create ${SA_NAME}
将
binaryauthorization.policyEvaluator
角色授予您的舰队宿主项目中的 Binary Authorization API 访问服务账号:gcloud projects add-iam-policy-binding ${PROJECT_ID}\ --member="serviceAccount:${SA_NAME}@${PROJECT_ID}.iam.gserviceaccount.com" \ --role="roles/binaryauthorization.policyEvaluator"
创建工作目录:
创建名为
binauthz
的目录。切换到目录。
下载
manifest-0.2.6.yaml
文件,该文件用于在用户集群中安装 Binary Authorization 模块:裸金属
gcloud storage cp gs://anthos-baremetal-release/binauthz/manifest-0.2.6.yaml .
VMware
gcloud storage cp gs://gke-on-prem-release/binauthz/manifest-0.2.6.yaml .
为
binauthz-system
命名空间创建 YAML 文件。将以下内容复制到名为
namespace.yaml
的文件中:apiVersion: v1 kind: Namespace metadata: labels: control-plane: binauthz-controller name: binauthz-system
在您的用户集群中创建命名空间:
kubectl apply -f namespace.yaml
您将看到类似如下所示的输出:
namespace/binauthz-system created
下载该服务账号的 JSON 密钥文件:
gcloud iam service-accounts keys create ${SA_JSON_PATH} --iam-account ${SA_NAME}@${PROJECT_ID}.iam.gserviceaccount.com
将服务账号密钥作为 Kubernetes Secret 保存到您的用户集群中:
kubectl --namespace binauthz-system create secret generic binauthz-sa --from-file=key.json=${SA_JSON_PATH}
在您的用户集群中安装 Binary Authorization 模块:
kubectl apply -f manifest-0.2.6.yaml
验证 Deployment 是否已创建:
kubectl get pod --namespace binauthz-system
您会看到列出的 Pod
binauthz-module-deployment-*
,Status
为Running
且有 1/1 个 Pod 准备就绪,类似于如下输出:NAME READY STATUS RESTARTS AGE binauthz-module-deployment-5fddf9594f-qjprz 1/1 Running 0 11s
设置和使用 Binary Authorization 政策
本部分介绍如何设置 Binary Authorization 政策并将其用于本地集群。
在每个示例中,您都需要配置政策,然后通过尝试在集群中部署容器映像来测试该政策。
全部允许
本部分演示了一个成功的使用场景。您将配置 Binary Authorization 政策,使容器映像满足该政策并能够成功部署。
在 Google Cloud 中,执行以下操作:
控制台
在 Google Cloud 控制台中,转到 Binary Authorization 页面。
请务必选择舰队宿主项目 ID。
点击修改政策。
在项目默认规则下,选择允许所有映像。
点击保存政策。
gcloud
为舰队宿主项目设置
PROJECT_ID
。您可以在用户集群配置文件的gkeConnect
字段中找到此项目 ID。export PROJECT_ID=PROJECT_ID
设置默认的 Google Cloud 项目。
gcloud config set project ${PROJECT_ID}
将 YAML 格式的政策文件导出到本地系统:
gcloud container binauthz policy export > policy.yaml
您的 YAML 文件如下所示:
defaultAdmissionRule: enforcementMode: ENFORCED_BLOCK_AND_AUDIT_LOG evaluationMode: ALWAYS_ALLOW globalPolicyEvaluationMode: ENABLE name: projects/<var>PROJECT_ID</var>/policy
修改
policy.yaml
。将
evaluationMode
设置为ALWAYS_ALLOW
。如果文件中包含
requireAttestationsBy
块,请删除此块。保存文件。
导入
policy.yaml
,如下所示:gcloud container binauthz policy import policy.yaml
如需将豁免映像添加到许可名单,请在政策文件中添加以下内容:
admissionWhitelistPatterns: - namePattern: EXEMPT_IMAGE_PATH
将 EXEMPT_IMAGE_PATH
替换为要排除的映像的路径。如需豁免其他映像,请添加其他 - namePattern
条目。详细了解 admissionWhitelistPatterns
。
在管理员工作站上,执行以下操作:
为 Pod 创建清单文件。
将以下内容保存到名为
pod.yaml
的文件中:apiVersion: v1 kind: Pod metadata: name: test-pod spec: containers: - name: test-container image: gcr.io/google-samples/hello-app@sha256:c62ead5b8c15c231f9e786250b07909daf6c266d0fcddd93fea882eb722c3be4
创建 Pod:
kubectl apply -f pod.yaml
您会看到 Pod 已成功部署。
删除 Pod:
kubectl delete -f pod.yaml
全都不允许
本部分演示了一个失败的使用场景。在本部分中,您将默认政策配置为禁止部署容器映像。
在 Google Cloud 中,执行以下操作:
控制台
在 Google Cloud 控制台中,转到 Binary Authorization 页面。
确保您的舰队宿主项目处于选中状态。
点击修改政策。
在项目默认规则下,选择禁止所有映像。
点击保存政策。
gcloud
将
PROJECT_ID
设置为您的舰队宿主项目 ID。export PROJECT_ID=PROJECT_ID
设置默认的 Google Cloud 项目。
gcloud config set project ${PROJECT_ID}
导出 YAML 格式的政策文件:
gcloud container binauthz policy export > policy.yaml
修改
policy.yaml
。将
evaluationMode
设置为ALWAYS_DENY
。如果文件中包含
requireAttestationsBy
块,请删除此块。保存文件。
导入
policy.yaml
,如下所示:gcloud container binauthz policy import policy.yaml
在管理员工作站上,执行以下操作:
为 Pod 创建清单文件。
将以下内容保存到名为
pod.yaml
的文件中:apiVersion: v1 kind: Pod metadata: name: test-pod spec: containers: - name: test-container image: gcr.io/google-samples/hello-app@sha256:c62ead5b8c15c231f9e786250b07909daf6c266d0fcddd93fea882eb722c3be4
创建 Pod:
kubectl apply -f pod.yaml
您会看到 Pod 已被禁止部署。输出如下所示:
Error from server (VIOLATES_POLICY): error when creating "pod.yaml": admission webhook "binaryauthorization.googleapis.com" denied the request: Denied by default admission rule. Overridden by evaluation mode
获取用户集群资源 ID
本部分介绍如何为用户集群编写集群资源 ID。在 Binary Authorization 政策中,您可以创建集群特定的规则。您可以将这些规则与集群特定的资源 ID(该资源 ID 将基于集群 ID)相关联。
您可以按如下方式获取该资源 ID:
控制台
在 Google Cloud 控制台中,前往 GKE 集群页面。
选择集群的舰队宿主项目 ID。您可以在用户集群配置文件的
gkeConnect
部分中找到此项目 ID。在集群列表中的名称列下,找到您的集群 ID。
如需创建资源 ID,请将前缀
global.
添加到集群 ID,以使资源 ID 采用以下格式:global.CLUSTER_ID
。
gcloud
使用 SSH 连接到您的管理员工作站。
在管理员工作站上,运行以下命令:
kubectl get membership -o yaml
从输出的
spec.owner.id
字段中获取集群 ID。示例输出如下所示:apiVersion: v1 items: - apiVersion: hub.gke.io/v1 kind: Membership ... spec: owner: id: //gkehub.googleapis.com/projects/PROJECT_NUMBER/locations/global/memberships/my-cluster-id
在示例输出中,集群 ID 为
my-cluster-id
。如需创建资源 ID,请将前缀
global.
添加到集群 ID。在该示例中,资源 ID 为global.my-cluster-id
。
您可以在定义集群特定的规则时使用该资源 ID。了解如何使用 Google Cloud 控制台或 gcloud CLI 设置集群特定的规则。
更新失败政策
Binary Authorization 模块网络钩子可以配置为应急开启或应急关闭。
应急关闭
如需将失败政策更新为应急关闭,请执行以下操作:
修改 manifest-0.2.6.yaml 文件并将 failurePolicy 设置为
Fail
重新启用网络钩子:
kubectl apply -f manifest-0.2.6.yaml
您将看到类似如下所示的输出:
serviceaccount/binauthz-admin unchanged role.rbac.authorization.k8s.io/binauthz-role configured clusterrole.rbac.authorization.k8s.io/binauthz-role configured rolebinding.rbac.authorization.k8s.io/binauthz-rolebinding unchanged clusterrolebinding.rbac.authorization.k8s.io/binauthz-rolebinding unchanged secret/binauthz-tls unchanged service/binauthz unchanged deployment.apps/binauthz-module-deployment unchanged validatingwebhookconfiguration.admissionregistration.k8s.io/binauthz-validating-webhook-configuration configured
应急开启
如需将失败政策更新为应急开启,请执行以下操作:
修改 manifest-0.2.6.yaml 文件并将 failurePolicy 设置为
Ignore
重新启用网络钩子:
kubectl apply -f manifest-0.2.6.yaml
您将看到类似如下所示的输出:
serviceaccount/binauthz-admin unchanged role.rbac.authorization.k8s.io/binauthz-role configured clusterrole.rbac.authorization.k8s.io/binauthz-role configured rolebinding.rbac.authorization.k8s.io/binauthz-rolebinding unchanged clusterrolebinding.rbac.authorization.k8s.io/binauthz-rolebinding unchanged secret/binauthz-tls unchanged service/binauthz unchanged deployment.apps/binauthz-module-deployment unchanged validatingwebhookconfiguration.admissionregistration.k8s.io/binauthz-validating-webhook-configuration configured
如需了解详情,请参阅网络钩子失败政策。
清理
以下代码示例展示了如何停用网络钩子:
kubectl delete ValidatingWebhookConfiguration/binauthz-validating-webhook-configuration
以下代码示例展示了如何重新启用网络钩子:
kubectl apply -f manifest-0.2.6.yaml
以下代码示例展示了如何删除与 Binary Authorization 相关的所有资源:
kubectl delete -f manifest-0.2.6.yaml kubectl delete namespace binauthz-system
后续步骤
- 如需在创建 Pod 时检查政策合规性,而不实际阻止 Pod 的创建,请参阅启用试运行。
- 如需强制创建 Binary Authorization Enforcer 本会禁止创建的 Pod,请参阅使用 Breakglass。
- 使用
built-by-cloud-build
证明者仅部署由 Cloud Build 构建的映像。 - 如需实现基于证明者的 Binary Authorization 政策,请参阅以下内容:
- 使用 Google Cloud 控制台或命令行工具配置政策。将默认规则或集群特定的规则设置为要求提供证明。
- 使用 Google Cloud 控制台或命令行工具创建证明者。
- 创建证明。
- 如需查看与 Binary Authorization for Distributed Cloud 相关的日志事件,请参阅查看 Cloud Audit Logs 事件。
- 监控指标。