从 PodSecurityPolicy 迁移到 PodSecurity 准入控制器


本页面介绍如何通过从 PodSecurityPolicy 迁移到 PodSecurity 准入控制器,继续在 Google Kubernetes Engine (GKE) 集群中强制执行许多 Pod 级层安全控制。

概览

PodSecurityPolicy 以前是一个 Kubernetes 准入控制器,可让您强制执行 Pod 级层的安全控制(例如 Kubernetes Pod 安全标准),从而对已部署的工作负载的安全配置进行精细控制。Kubernetes 项目已弃用 PodSecurityPolicy,并在 Kubernetes v1.25 中完全移除了该功能。

如果您目前在 GKE 集群中使用 PodSecurityPolicy,请在升级到 GKE 1.25 及更高版本之前停用该功能。

如需详细了解 PodSecurityPolicy 的弃用和移除,请参阅 PodSecurityPolicy 弃用

PodSecurity 和 PodSecurityPolicy

默认情况下,运行以下 GKE 版本的集群上提供并启用 PodSecurity 准入控制器:

  • 1.25 版或更高版本:稳定版
  • 1.23 版和 1.24 版:Beta 版

PodSecurity 允许您针对已部署的工作负载强制执行 Pod 安全标准中定义的政策。PodSecurity 可让您从 PodSecurityPolicy 迁移后继续在集群中实现推荐的 Pod 级层安全配置。与 PodSecurityPolicy 不同,PodSecurity 不支持自定义配置。

要求和限制

  • PodSecurity 在 GKE 1.23 版和 1.24 版中为 Beta 版,在 GKE 1.25 版及更高版本中为稳定版。
  • PodSecurity 不会终止已在节点上运行的 Pod,即使它们违反了所应用的政策也是如此。
  • PodSecurity 不会更改字段。如果您在 PodSecurityPolicy 中使用任何更改字段,请修改 Pod 规范,以确保在部署工作负载时存在这些字段。

准备工作

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

  • 启用 Google Kubernetes Engine API。
  • 启用 Google Kubernetes Engine API
  • 如果您要使用 Google Cloud CLI 执行此任务,请安装初始化 gcloud CLI。 如果您之前安装了 gcloud CLI,请运行 gcloud components update 以获取最新版本。

在集群中配置 PodSecurity 准入控制器

PodSecurity 准入控制器在命名空间级层强制执行 Pod 安全标准。您必须配置控制器,以在每个命名空间中强制执行 Pod 安全标准定义的其中一项政策。有以下政策可用:

  • 受限:限制性最高的政策。符合 Pod 安全强化的最佳做法。
  • 基准:限制性最低的政策,可防止已知的权限提升。允许 Pod 规范中的字段的所有默认值。
  • 特权:无限制的政策,允许任何权限,包括已知的权限提升。请谨慎应用此政策。

如需将 PodSecurityPolicy 配置迁移到 PodSecurity 准入控制器,请在集群的每个命名空间中执行以下操作。后续部分详细介绍了这些步骤。

  1. dry-run 模式中的受限政策应用于命名空间,并检查其是否存在违规行为。
  2. 如果您的 Pod 违反受限政策,请将 dry-run 模式中限制性较弱的基准政策应用于命名空间并检查违规行为。
  3. 如果您的 Pod 违反基准政策,请修改 Pod 规范以解决违规行为。
  4. 基准政策不再返回违规行为时,请将 enforce 模式下的政策应用于命名空间。

为避免在 PodSecurity 拒绝新 Pod 时可能发生停机,请在预演环境中执行这些步骤。或者,您可以在 audit 模式(而非 enforce 模式)下应用已识别的政策,并查看审核日志以查找可能被拒绝的 Pod。

audit 模式不会强制执行政策。GKE 会部署 pod 并将条目添加到 GKE 审核日志

列出集群中的所有命名空间

获取集群中所有命名空间的列表。对列表中的每个命名空间重复以下步骤:

kubectl get ns

在以下 GKE 版本中,GKE 会忽略您应用于 kube-system 命名空间的政策:

  • 1.23.6-gke.1900 及更高版本
  • 1.24.0-gke.1200 及更高版本

在早期的 GKE 版本中,请避免在 kube-system 中强制执行政策。

在试运行模式下应用 Pod 安全标准的每个政策

在以下步骤中,您将在 dry-run 模式下应用每项政策,从限制性最高的受限政策开始。如果输出显示警告,请修改违规 Pod 规范以符合政策,或者尝试使用限制性较弱的基准政策。如果输出未显示警告,您可以应用不在 dry-run 模式下的基准政策。

  1. 应用 dry-run 模式下的受限政策:

    kubectl label --dry-run=server --overwrite ns NAMESPACE \
        pod-security.kubernetes.io/enforce=restricted
    

    如果命名空间中的 Pod 违反了受限政策,则输出类似于以下内容:

    Warning: existing pods in namespace "NAMESPACE" violate the new PodSecurity enforce level "restricted:latest"
    namespace/NAMESPACE labeled
    

    如果受限政策显示警告,请修改 Pod 以解决违规行为,然后重新尝试运行该命令。或者,请尝试使用以下步骤中限制性较弱的基准政策。

  2. 应用 dry-run 模式下的基准政策:

    kubectl label --dry-run=server --overwrite ns NAMESPACE \
        pod-security.kubernetes.io/enforce=baseline
    

    如果命名空间中的 Pod 违反了基准政策,则输出类似于以下内容:

    Warning: existing pods in namespace "NAMESPACE" violate the new PodSecurity enforce level "baseline:latest"
    namespace/NAMESPACE labeled
    

如果您的 Pod 违反了基准政策,请修改 Pod 以解决违规行为,并重复此步骤,直到 GKE 不再显示警告。

对命名空间强制执行政策

确定适用于命名空间的政策后,请将 enforce 模式下的该政策应用于命名空间:

kubectl label --overwrite ns NAMESPACE \
    pod-security.kubernetes.io/enforce=POLICY

POLICY 替换为政策的名称:restrictedbaselineprivileged 之一。

确保对集群中的每个命名空间重复上述步骤。

停用集群上的 PodSecurityPolicy 功能

为集群中的每个命名空间配置 PodSecurity 准入控制器后,请停用 PodSecurityPolicy 功能:

gcloud beta container clusters update CLUSTER_NAME \
    --no-enable-pod-security-policy

CLUSTER_NAME 替换为 GKE 集群的名称。

当您将集群升级到 GKE 1.25 版时,GKE 会自动移除其余的所有 PodSecurityPolicy 对象,包括由 GKE、Policy Controller 添加的那些对象以及您先前定义的任何 PodSecurityPolicy 对象。

建议

  • 尽量遵守受限政策。审核您的应用以查看是否可以进一步强化配置。
  • 您可以将 Pod 安全模式锁定到特定的 Kubernetes 次要版本,方法是在之前的步骤中向 kubectl label 命令添加 pod-security.kubernetes.io/MODE-version: VERSION 标签。将 VERSION 替换为 Kubernetes 版本号,例如 v1.24
  • 停用 PodSecurityPolicy 功能后,请查看正在运行的应用,检查是否存在安全配置中断或间断问题。
  • 配置 PodSecurity 后,更新命名空间创建过程以自动将 PodSecurity 标签应用于所有新命名空间。如需了解详情,请参阅审核命名空间创建过程

后续步骤