本文档介绍如何设置 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: us-docker.pkg.dev/google-samples/containers/gke/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: us-docker.pkg.dev/google-samples/containers/gke/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 事件。
- 监控指标。