大家好!今天我们将深入探讨Kubernetes安全配置的核心——Pod Security Admission (PSA)。
从v1.25版本开始,原有的Pod Security Policy (PSP)已被完全移除,PSA取而代之。打破“安全配置很难”的偏见,我们将详细整理关于PSA的一切,它以Kubernetes原生(Built-in)的方式,可以非常简单地应用。🚀

1. 什么是PSA? 🤔
Pod Security Admission (PSA)是一个准入控制器(Admission Controller),它在Pod创建时检查该Pod是否符合预定义的安全性标准(Pod Security Standards)。
过去的PSP配置复杂且权限管理困难,而PSA无需单独安装CRD(Custom Resource Definition),只需为命名空间添加标签即可立即生效。
2. 核心概念1:安全级别 (Levels) 📊
PSA根据称为Pod Security Standards (PSS)的三种安全级别来检查Pod。您需要根据实际情况选择合适的级别。
| 级别 (Level) | 说明 | 推荐对象 |
|---|---|---|
| Privileged | 没有任何限制。可以访问主机的内核功能。 | 系统管理代理 (CNI, 存储驱动等) |
| Baseline | 防止权限提升的最低限制。 | 通用微服务、Web应用程序 |
| Restricted | 最强的安全级别。包括禁止Root执行、限制卷类型等。 | 安全性非常重要的金融/个人信息处理应用 |
3. 核心概念2:控制模式 (Modes) 🎛️
当违反策略时,可以通过3种模式来决定如何处理。一个命名空间甚至可以同时应用多种模式!
- Enforce (强制): 策略违规时阻止(Reject)Pod创建。
- Audit (审计): 允许Pod创建,但将违规事实记录在审计日志(Audit Log)中。
- Warn (警告): 允许Pod创建,但向用户显示警告消息。
4. 实战!PSA应用指南 🛠️
现在,我们来实际将策略应用到命名空间。最推荐的方式是“先用警告(Warn)模式确认,再切换到强制(Enforce)模式”。
Step 1. 创建测试用命名空间
kubectl create ns psa-test
Step 2. 应用策略(打标签)
我们将对psa-test命名空间应用最严格的restricted安全级别。最初,我们只开启warn模式,以避免阻止。
# 语法: pod-security.kubernetes.io/<MODE>=<LEVEL>
# 1. 设置警告模式 (Restricted违规时警告)
kubectl label ns psa-test pod-security.kubernetes.io/warn=restricted
# 2. 设置强制模式 (Baseline违规时阻止) -> 可双重应用
kubectl label ns psa-test pod-security.kubernetes.io/enforce=baseline
Step 3. 测试策略违规Pod的创建
如果尝试创建一个没有任何安全设置的Nginx Pod,会发生什么?
Bash
kubectl run nginx --image=nginx -n psa-test
输出结果 (Warn模式生效):
Warning: would violate PodSecurity “restricted:latest”: allowPrivilegeEscalation != false (container “nginx” must set securityContext.allowPrivilegeEscalation=false), runAsNonRoot != true (pod or container “nginx” must set securityContext.runAsNonRoot=true), …
>
pod/nginx created
由于enforce=baseline通过,Pod被创建(created),但由于warn=restricted,出现了大量的警告消息。
Step 4. 修改Pod以符合’Restricted’要求
要通过Restricted级别,必须仔细配置securityContext。
YAML
apiVersion: v1
kind: Pod
metadata:
name: secure-nginx
namespace: psa-test
spec:
securityContext:
runAsNonRoot: true
seccompProfile:
type: RuntimeDefault
containers:
- name: nginx
image: nginx
securityContext:
allowPrivilegeEscalation: false
capabilities:
drop:
- ALL
runAsUser: 1001 # 指定非Root(0)用户
5. 高级设置:例外处理 (Exemptions) 🔓
在某些命名空间中,大多数Pod应该被阻止,但可能需要允许特定的管理员或控制器。这并非通过命名空间标签控制,而是通过集群级配置文件(AdmissionConfiguration)进行控制。
注意:此设置需要修改API服务器的配置文件,因此在托管Kubernetes服务(EKS、GKE、AKS)中可能无法直接配置。
YAML
apiVersion: apiserver.config.k8s.io/v1
kind: AdmissionConfiguration
plugins:
- name: PodSecurity
configuration:
apiVersion: pod-security.admission.config.k8s.io/v1beta1
kind: PodSecurityConfiguration
defaults:
enforce: "baseline"
enforce-version: "latest"
exemptions:
# 豁免特定用户名
usernames: ["admin", "system:serviceaccount:kube-system:replicaset-controller"]
# 豁免特定运行时类
runtimeClasses: ["kata-containers"]
# 豁免特定命名空间
namespaces: ["kube-system"]
6. 总结:安全引入的路线图 🗺️
在生产环境中引入PSA时,建议遵循以下顺序,以防止服务中断。
- 现状评估: 确认当前集群版本(建议v1.23及以上),并对各命名空间用途进行分类。
- 应用Audit/Warn模式: 在不强制执行的情况下,首先应用warn=baseline或warn=restricted以收集日志。
- 修改应用程序: 修正产生警告的Pod的securityContext。
- 切换到Enforce: 警告消失后,切换到enforce模式以强制执行安全。
PSA已不再是可选项,而是必需品。无需复杂的第三方工具,即可通过PSA构建强大的安全治理。现在就开始吧!💪
发表回复