在 Standard 集群中强制执行 Autopilot 安全政策

Google Kubernetes Engine (GKE) Autopilot 集群会强制执行各种旨在防止许多常见攻击途径的安全政策。本文档介绍了平台管理员如何在 Standard 集群中强制执行部分或全部 Autopilot 政策。您无法在 Autopilot 集群中停用集群政策实施功能,因为 Autopilot 集群旨在提供更高的基准 GKE 安全状况。

在 Standard 集群中,您可以随时启用和停用特定政策。组织管理员可以通过在组织、文件夹或项目中强制执行自定义限制条件,来控制是否可以停用特定的 Autopilot 政策。您可以使用这些预定义政策来强制实施安全最佳实践,而无需编写复杂的 RBAC 角色和绑定。即使您对为集群或工作负载使用 Autopilot 模式不感兴趣,许多集群级政策也能帮助您提高集群安全性。如需详细了解可用的 Autopilot 集群政策,请参阅支持的政策部分。

强制执行 Autopilot 集群政策的注意事项

虽然 Autopilot 集群始终会强制执行这些政策,但 Standard 集群通常具有可能违反您强制执行的政策的现有工作负载和节点池。在集群中强制执行或停用某项政策之前,请阅读以下注意事项:

  • 更改仅适用于新的工作负载:当您启用适用于工作负载的政策时,更改仅适用于在您启用该政策后创建或修改的 Pod。违反政策的现有 Pod 可以继续运行。在启用政策之前,请查看集群中的现有工作负载,以验证它们是否符合政策的限制条件。
  • 节点池政策适用于所有节点:启用适用于 Standard 集群中节点池的政策后,相应限制会应用于新节点池和现有节点池。如果现有节点池违反了该政策,集群更新操作将失败。例如,如果您尝试在具有现有用户管理的节点池的集群中启用 no-standard-node-pools 政策,则操作会失败。在启用节点池政策之前,请查看集群中的现有节点池。
  • 启用所有政策即可启用 Autopilot 模式:如果您启用所有可用的 Autopilot 政策(包括阻止用户管理的节点池的政策),则集群中的所有工作负载只能在 Autopilot 模式下运行。这意味着您的所有工作负载都必须遵守 Autopilot 安全限制和所有集群政策。借助此方法,您可以让整个 Standard 集群在 Autopilot 模式下运行,并可根据需要选择停用特定政策。

准备工作

在开始之前,请确保您已执行以下任务:

  • 启用 Google Kubernetes Engine API。
  • 启用 Google Kubernetes Engine API
  • 如果您要使用 Google Cloud CLI 执行此任务,请安装初始化 gcloud CLI。如果您之前安装了 gcloud CLI,请通过运行 gcloud components update 命令来获取最新版本。较早版本的 gcloud CLI 可能不支持运行本文档中的命令。

在集群中启用特定的 Autopilot 政策

在创建或更新标准集群时,使用 gcloud CLI 或 GKE API 启用特定政策。如需将特定的 Autopilot 集群政策添加到 GKE 在集群中强制执行的政策列表中,请将 --autopilot-cluster-policies 标志与 gcloud container clusters create 命令或 gcloud container clusters update 命令搭配使用。

以下示例展示了如何在现有集群中启用政策:

gcloud container clusters update CLUSTER_NAME \
    --location=CONTROL_PLANE_LOCATION \
    --autopilot-cluster-policies=AUTOPILOT_POLICIES

替换以下内容:

  • CLUSTER_NAME:Standard 集群的名称。
  • CONTROL_PLANE_LOCATION:集群控制平面所在的区域或可用区,例如 us-central1us-central1-a
  • AUTOPILOT_POLICIES:以英文逗号分隔的 Autopilot 集群政策列表,用于指定要在集群中开始强制执行的政策,例如 no-system-mutation,no-system-impersonation。您必须指定一项或多项受支持的政策。您指定的政策会附加到 GKE 已在集群中强制执行的政策列表中。如需停用政策的强制执行,请参阅在集群中停用特定的 Autopilot 政策部分。

如果命令失败,并显示以 Bad value [invalid policy]: 开头的错误消息,请验证您指定的所有政策名称是否都在受支持的政策列表中。

验证政策执行情况

启用特定政策后,您可以尝试创建违反该政策的资源,以验证强制执行是否有效。例如,如果您启用 no-system-mutation 政策,可以尝试在 kube-system 命名空间中创建 Pod。GKE 会阻止 Pod 创建操作,并显示类似于以下内容的错误消息:

Error from server (Forbidden): pods is forbidden: User cannot create resource "pods" in API group "" in the namespace "kube-system": GKE Warden authz [denied by managed-namespaces-limitation]: the namespace "kube-system" is managed and the request's verb "create" is denied

在集群中停用特定的 Autopilot 政策

您可以随时停用任何 Autopilot 集群政策。 如果您的安全要求发生了变化,或者启用某项政策后现有工作流程中断,那么停用该政策会很有用。如需从 GKE 在集群中强制执行的政策列表中移除某项政策,请将 --remove-autopilot-cluster-policies 标志与 gcloud container clusters update 命令搭配使用:

gcloud container clusters update CLUSTER_NAME \
    --location=CONTROL_PLANE_LOCATION \
    --remove-autopilot-cluster-policies=AUTOPILOT_POLICIES

您必须为 --remove-autopilot-cluster-policies 标志至少指定一个值。如果您指定此标志但未提供值,则操作会失败。

如果命令失败,并显示以 Bad value [invalid policy]: 开头的错误消息,请验证您指定的所有政策名称是否都在受支持的政策列表中。

在组织中强制执行 Autopilot 集群政策

组织管理员可以使用自定义组织政策限制条件,在组织、项目或文件夹中强制执行这些集群政策。这项额外措施有助于防止未经授权或意外地从集群中移除所需的集群政策。在自定义限制中使用 ClusterPolicyConfig 字段,如以下示例所示:

name: organizations/ORGANIZATION_ID/customConstraints/custom.autopilotClusterPolicies
resourceTypes:
-   container.googleapis.com/Cluster
methodTypes:
-   CREATE
-   UPDATE
condition: "resource.ClusterPolicyConfig.no_system_mutation == true && resource.ClusterPolicyConfig.no_system_impersonation == true"
actionType: ALLOW
displayName: Autopilot policies in Standard clusters.
description: For all new and existing Standard clusters, enable the no_system_mutation and no_system_impersonation Autopilot cluster policies. For more information, see https://docs.cloud.google.com/kubernetes-engine/security/autopilot-cluster-policies-standard.

受支持的策略

Standard 集群中提供的每项 Autopilot 政策都在集群级别实现了一项或多项安全最佳实践。no-system-mutationno-system-impersonationno-unsafe-webhooks 等政策有助于提高任何 GKE 集群的安全性,即使您不打算使用 Autopilot 模式也是如此。

下表介绍了您可在 Standard 集群中启用的 Autopilot 政策,并帮助您为政策强制执行做好准备:

政策名称 说明 启用前的准备工作
no-system-mutation 防止在 GKE 系统命名空间(例如 kube-system)中创建或修改资源。 将 Pod 从系统命名空间移至您自己的命名空间。
no-system-impersonation 阻止冒充系统用户的尝试,并防止使用系统正文创建 CertificateSigningRequests。 查找为系统身份生成的任何未经授权的 CertificateSigningRequests。如果您发现任何未经授权的 CertificateSigningRequest 获得批准,请轮替集群凭据以使证书失效。
no-unsafe-webhooks 防止准入 Webhook 和政策拦截关键系统资源,例如 Node 对象、PersistentVolume 或 CertificateSigningRequest。 使用 Recommender 服务来识别拦截系统资源的 webhook。如果您发现任何网络钩子,请修改网络钩子配置。 如需了解详情,请参阅确保使用 Webhook 时控制平面的稳定性
no-standard-node-pools 防止任何由用户管理的节点池(包括手动创建的节点池和自动创建的节点池)存在于集群中。集群中只能存在 Autopilot 节点池。 删除所有现有的非 Autopilot 节点池,包括随集群创建的默认节点池。

后续步骤