跳到主要内容

K8s Pod 安全准入控制:PSS/PSA 完整指南

为什么要关注 Pod 安全

随着 Kubernetes Pod 数量与复杂度增长,容器默认具备宿主机能力(如挂载主机路径、提权、运行特权容器)会带来巨大风险。早期的 PodSecurityPolicy(PSP) 虽然可以约束 Pod,但自 1.25 起已被移除;官方推荐改用 Pod Security Standards (PSS)Pod Security Admission (PSA)。本指南覆盖:

  • PSS 三个安全等级(Privileged/Baseline/Restricted)的差异
  • 如何用 PSA Admission Controller 通过 Namespace 标签启用安全策略
  • 从 PSP 迁移的步骤、验证手段与常见问题
  • 结合审计/警告模式与 Kyverno/OPA 做扩展校验

PSS 三种安全级别

等级适用场景核心限制示例
Privileged需要完全节点访问权限的低级平台组件,如 CNI/CSI DaemonSet几乎无约束,允许特权容器、hostPath、hostNetwork、特权能力Flannel、Cilium Agent
Baseline普通业务工作负载的默认级别禁止特权、限制 hostPath、禁止提权、限制 capabilities简单 Web/Job/Deployment
Restricted零信任/高安全行业,对内核访问最小化进一步禁止 hostNetwork、必须设置 runAsNonRoot、禁止向下 API金融/政企敏感业务

可通过 kubectl explain podsecuritypolicy.spec 对照旧 PSP 规则,选取合适等级。绝大部分业务可使用 Baseline,核心金融/多租户平台建议使用 Restricted

Pod Security Admission (PSA) 机制

  1. 启用 Admission Controller:Kubernetes v1.25+ 默认开启 PodSecurity 控制器;低版本需在 kube-apiserver--enable-admission-plugins 中加上 PodSecurity
  2. Namespace 标签驱动:在命名空间上打上 pod-security.kubernetes.io/{enforce,audit,warn} 标签来指定级别(privileged/baseline/restricted)和版本(例如 baselinebaseline?version=v1.28)。
  3. 三种模式
    • enforce:违规 Pod 会被拒绝
    • audit:允许创建,但在审计日志中记录违规细节
    • warn:允许创建,并向 kubectl/客户端返回 Warning 信息

示例:

kubectl label ns production \
pod-security.kubernetes.io/enforce=restricted \
pod-security.kubernetes.io/enforce-version=v1.30 \
pod-security.kubernetes.io/audit=restricted \
pod-security.kubernetes.io/audit-version=v1.30 \
pod-security.kubernetes.io/warn=baseline \
pod-security.kubernetes.io/warn-version=v1.30

warn 设置为 baseline,可帮助开发在调试阶段看到即将升级到 restricted 时需要调整的字段。

从 PodSecurityPolicy 迁移到 PSA

  1. 梳理 PSP:列出当前集群所有 PSP 及绑定关系,识别实际使用的约束项。
  2. 映射至 PSS 等级:基于上述列表,将 Workload 归类到 Privileged/Baseline/Restricted,必要时拆分命名空间以匹配不同等级。
  3. 创建测试 Namespace:先在沙箱集群或临时命名空间启用 audit/warn 标签,观察日志是否出现违规项。
  4. 逐步启用 enforce:确认无误后,把 pod-security.kubernetes.io/enforce 提升到目标级别。
  5. 自动化:将 kubectl label ns ... 写入 GitOps 或 Terraform,确保集群漂移可追溯。

常见配置示例

1. Baseline 命名空间

apiVersion: v1
kind: Namespace
metadata:
name: web
labels:
pod-security.kubernetes.io/enforce: baseline
pod-security.kubernetes.io/enforce-version: v1.30
pod-security.kubernetes.io/audit: baseline
pod-security.kubernetes.io/warn: baseline

2. Restricted 命名空间 + 自动检测

kubectl create ns finance
kubectl label ns finance \
pod-security.kubernetes.io/enforce=restricted \
pod-security.kubernetes.io/audit=restricted \
pod-security.kubernetes.io/warn=restricted

3. 特权组件白名单

对需要特权的 CNI/CSI 命名空间保留 privileged

kubectl label ns kube-system pod-security.kubernetes.io/enforce=privileged --overwrite

自定义策略与扩展

  • 版本控制:通过 *-version 标签指定语义版本,避免集群升级后策略突变。
  • Granular 校验:PSS 只包含官方规则,若需额外安检(如禁止挂载 /var/run/docker.sock),可以结合 Kyverno/OPA Gatekeeper 添加策略。
  • 豁免机制:使用 pod-security.kubernetes.io/enforce-version 指定更早版本,或通过 Admission webhook 为特定 ServiceAccount 注入豁免标签。
  • CI/CD 阶段校验:在流水线中使用 kubectl apply --dry-run=serverpssctl validate(社区工具)提前发现违规。

审计与故障排查

  1. kubectl Warning:当 warn 模式触发时,命令行会显示 Warning: pod... violates PodSecurity
  2. API Server 审计日志audit 模式会记录 pod-security.kubernetes.io/enforce 的详情,便于 SIEM 分析。
  3. Event 排查
    kubectl describe pod <name> -n <ns>
    # 事件中会包含 "violates PodSecurity" 的原因
  4. 常见错误
    • 忘记打 *-version,导致集群升级后规则自动变化。
    • enforce=restricted 套用到包含特权 DaemonSet 的命名空间,导致组件创建失败。
    • 标签拼写错误(例如 pod-security.kubernetes.io/enforce=restircted),可以用 kubectl get ns --show-labels 排查。

总结

PSS/PSA 提供了官方支持的、可渐进启用的 Pod 安全准入体系。通过合理划分命名空间、配置 enforce/audit/warn 模式、并结合外部策略引擎进行补充,可以在不影响业务交付效率的情况下持续提升集群安全基线。下一篇将介绍如何通过 Network Policy 继续构建微服务间的零信任网络。