Kubernetes PodSecurityPolicy 完全指南:Pod 安全准入控制核心

Kubernetes PodSecurityPolicy 完全指南:Pod 安全准入控制核心

一、PodSecurityPolicy(PSP)核心定义

PodSecurityPolicy(PSP)是 Kubernetes 中的 集群级安全资源,用于控制 Pod 的运行行为和访问权限。其核心作用是:

  • 定义 Pod 必须满足的安全条件,确保 Pod 按系统可接受的安全标准运行;

  • 通过准入控制机制,拒绝不符合安全策略的 Pod 创建请求;

  • 间接影响 Pod 和容器的 SecurityContext 配置,强化集群安全边界。

注意:PSP 是集群级资源,而非命名空间级,一旦启用,将对全集群的 Pod 创建生效。

二、PSP 核心控制维度

PSP 覆盖 Pod 安全的关键领域,通过下表中的字段精准控制 Pod 权限:

控制方向 对应字段 / 说明
容器特权模式 priv``ileged(布尔值,控制是否允许特权容器)
容器能力管理 defaultAddCapabilities(默认添加的能力)、requiredDropCapabilities(必须移除的能力)、allowedCapabilities(允许请求的能力)
卷类型限制 volumes(白名单机制,指定允许使用的卷类型,如 secretemptyDir 等)
主机资源访问 hostNetwork(主机网络)、hostPorts(主机端口范围)、hostPID(主机 PID 命名空间)、hostIPC(主机 IPC 命名空间)
主机路径访问 allowedHostPaths(允许的主机路径前缀白名单)
安全上下文配置 seLinux(SELinux 上下文)、runAsUser(运行用户 ID)、supplementalGroups(补充组)、fsGroup(数据卷权限组)
根文件系统权限 readOnlyRootFilesystem(是否强制只读根文件系统)

三、PSP 策略规则类型

PSP 的控制规则分为三类,适配不同安全需求:

  1. 布尔型控制 :默认取最严格值(如 privileged: false 禁止特权容器);

  2. 允许值集合控制 :仅允许指定范围内的值(如 hostPorts: [{min:8000, max:8080}] 限制主机端口);

  3. 策略型控制:通过规则生成或验证值,确保符合安全要求(核心应用于用户 ID、SELinux 等字段)。

核心策略型控制字段详解
字段 支持的策略规则
runAsUser - MustRunAs:必须使用指定 ID 范围,默认取第一个值;MustRunAsNonRoot:禁止root用户(runAsUser≠0或镜像指定USER);>- RunAsAny`:允许任意用户 ID
seLinux - MustRunAs:必须使用指定 SELinux 上下文;>- RunAsAny:允许任意 SELinux 配置
supplementalGroups - MustRunAs:必须使用指定组 ID 范围;- RunAsAny:允许任意补充组
fsGroup - MustRunAs:必须使用指定数据卷权限组范围;RunAsAny`:允许任意组

四、常用卷类型白名单推荐

新创建 PSP 时,推荐允许的最小卷类型集合(兼顾安全与实用性):

configMapdownwardAPIemptyDirpersistentVolumeClaimsecretprojected

如需允许所有卷类型,可配置 volumes: ["*"](生产环境不推荐)。

五、PSP 工作流程(许可机制)

PSP 通过准入控制实现 Pod 安全校验,流程如下:

  1. 当用户创建 Pod 时,Kubernetes 检索所有可用的 PSP 资源;

  2. 对 Pod 未指定的安全上下文字段,按 PSP 规则生成默认值;

  3. 验证 Pod 的最终安全配置是否符合至少一个 PSP 的规则;

  4. 符合规则则允许 Pod 创建,否则拒绝(返回校验失败信息)。

六、PSP 实操命令(核心操作)

1. 创建 PSP

示例:创建一个允许所有配置的宽松策略(仅用于测试)

复制代码
# psp-permissive.yaml

apiVersion: extensions/v1beta1

kind: PodSecurityPolicy

metadata:

name: permissive

spec:

seLinux:

  rule: RunAsAny

supplementalGroups:

  rule: RunAsAny

runAsUser:

  rule: RunAsAny

fsGroup:

  rule: RunAsAny

hostPorts:

\- min: 8000

  max: 8080

volumes:

\- '\*'  # 允许所有卷类型

执行创建命令:

复制代码
kubectl create -f psp-permissive.yaml
2. 查看 PSP 列表
复制代码
kubectl get psp

# 输出示例(PRIV=是否允许特权容器,VOLUMES=允许的卷类型)

NAME        PRIV   CAPS  SELINUX   RUNASUSER         FSGROUP   VOLUMES

permissive  false  \[]    RunAsAny  RunAsAny          RunAsAny  \[\*]

restricted  false  \[]    RunAsAny  MustRunAsNonRoot  RunAsAny  \[emptyDir secret downwardAPI configMap persistentVolumeClaim projected]
3. 编辑 PSP
复制代码
kubectl edit psp permissive

# 进入编辑器修改策略(如添加 requiredDropCapabilities: \["NET\_RAW"] 移除网络原始能力)
4. 删除 PSP
复制代码
kubectl delete psp permissive

七、启用 PSP 的前提条件

要在集群中使用 PSP,必须完成以下配置:

  1. 启用 API 类型 :Kubernetes 1.6 及以上版本默认启用 extensions/v1beta1/podsecuritypolicy(1.6 前需手动启用);

  2. 启用准入控制器 :在 API Server 启动参数中添加 --enable-admission-plugins=PodSecurityPolicy(关键步骤,否则 PSP 不生效);

  3. 定义 PSP 策略:创建符合业务需求的 PSP 资源(如严格策略、宽松策略);

  4. 配置 RBAC 权限 :通过 Role/ClusterRole 授权用户 / 服务账户使用 PSP(例如:允许 default 服务账户使用 restricted 策略)。

注意:如果使用 Deployment、ReplicaSet 等控制器创建 Pod,需确保 Controller Manager 基于安全 API 端口运行,且无超级用户权限,否则无法实现细粒度权限控制。

八、核心安全最佳实践

  1. 遵循最小权限原则 :禁止不必要的特权(privileged: false)、移除危险能力(如 NET_RAW)、限制主机资源访问;

  2. 强制非 root 用户 :配置 runAsUser: {rule: MustRunAsNonRoot},避免 Pod 以 root 身份运行;

  3. 严格限制卷类型 :仅允许必需的卷类型,禁止 hostPath(或仅允许特定路径);

  4. 启用只读根文件系统 :对无写入需求的容器设置 readOnlyRootFilesystem: true

  5. 细粒度 RBAC 授权:不同用户 / 服务账户分配不同 PSP 权限(如开发环境用宽松策略,生产环境用严格策略)。

相关推荐
网络研究院6 分钟前
即将过期的安全启动证书将如何影响 Windows 设备
安全·微软·系统·漏洞·硬件
IT策士7 分钟前
第 34 篇 k8s之存储基础:emptyDir 与 hostPath
云原生·容器·kubernetes
志栋智能11 分钟前
超自动化安全:构建智能安全运营的神经系统
大数据·运维·网络·人工智能·安全·自动化
无风听海11 分钟前
Bearer Token 权威指南:从原理到生产级安全实践
前端·javascript·安全
取经蜗牛39 分钟前
Docker 常用命令全面总结
运维·docker·容器
EasyDSS41 分钟前
安全可控、全场景适配:私有化音视频系统/视频直播点播EasyDSS一站式云平台重构视频协作新模式
安全·重构·音视频
黎阳之光1 小时前
无感定位·智管全域:黎阳之光人员无感定位管理系统,重新定义安全与效率
人工智能·物联网·算法·安全·数字孪生
牛奶1 小时前
黑客是怎么看到你数据的?
前端·安全·黑客
IT策士1 小时前
第31篇 k8s之Ingress 进阶:TLS、重写与认证
云原生·容器·kubernetes
川石课堂软件测试1 小时前
作为一名测试工程师如何学习Kubernetes(k8s)技能
学习·测试工具·容器·职场和发展·kubernetes·测试用例·harmonyos