🛡️ Kubernetes安全新标准:Pod Security Admission (PSA) 完整指南

大家好!今天我们将深入探讨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种模式来决定如何处理。一个命名空间甚至可以同时应用多种模式!

  1. Enforce (强制): 策略违规时阻止(Reject)Pod创建。
  2. Audit (审计): 允许Pod创建,但将违规事实记录在审计日志(Audit Log)中。
  3. 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时,建议遵循以下顺序,以防止服务中断。

  1. 现状评估: 确认当前集群版本(建议v1.23及以上),并对各命名空间用途进行分类。
  2. 应用Audit/Warn模式: 在不强制执行的情况下,首先应用warn=baseline或warn=restricted以收集日志。
  3. 修改应用程序: 修正产生警告的Pod的securityContext。
  4. 切换到Enforce: 警告消失后,切换到enforce模式以强制执行安全。

PSA已不再是可选项,而是必需品。无需复杂的第三方工具,即可通过PSA构建强大的安全治理。现在就开始吧!💪



Comments

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注