Pod Security Admission

参考官方 Kubernetes 文档:Pod Security Admission

Pod Security Admission(PSA)是一个 Kubernetes 的 admission controller,通过验证 Pod 规范是否符合预定义标准,在命名空间级别强制执行安全策略。

目录

安全模式

PSA 定义了三种模式来控制如何处理策略违规:

模式行为使用场景
Enforce拒绝创建/修改不合规的 Pod。需要严格安全执行的生产环境。
Audit允许创建 Pod,但在审计日志中记录违规行为。监控和分析安全事件而不阻止工作负载。
Warn允许创建 Pod,但向客户端返回违规警告。测试环境或策略调整的过渡阶段。

关键说明

  • Enforce 仅作用于 Pod(例如,拒绝 Pod,但允许非 Pod 资源如 Deployment)。
  • AuditWarn 适用于 Pod 及其控制器(例如 Deployment)。

安全标准

PSA 定义了三种安全标准来限制 Pod 权限:

标准描述主要限制
Privileged不受限制的访问。适用于受信任的工作负载(例如系统组件)。不验证 securityContext 字段。
Baseline最小限制以防止已知的权限提升。阻止使用 hostNetworkhostPID、特权容器以及不受限制的 hostPath 卷。
Restricted最严格的策略,强制执行安全最佳实践。要求:
- runAsNonRoot: true
- seccompProfile.type: RuntimeDefault
- 丢弃 Linux 能力。

配置

命名空间标签

通过给命名空间应用标签来定义 PSA 策略。

YAML 文件示例

apiVersion: v1
kind: Namespace
metadata:
  name: example-namespace
  labels:
    pod-security.kubernetes.io/enforce: restricted
    pod-security.kubernetes.io/audit: baseline
    pod-security.kubernetes.io/warn: baseline

CLI 命令

# 第一步:更新 Pod Admission 标签
kubectl label namespace <namespace-name> \
  pod-security.kubernetes.io/enforce=baseline \
  pod-security.kubernetes.io/audit=restricted \
  --overwrite

# 第二步:验证标签
kubectl get namespace <namespace-name> --show-labels

例外

对特定用户、命名空间或 runtime class 免除 PSA 检查。

示例配置

apiVersion: pod-security.admission.config.k8s.io/v1
kind: PodSecurityConfiguration
exemptions:
  usernames: ['admin']
  runtimeClasses: ['nvidia']
  namespaces: ['kube-system']