k8s篇之Pod 安全策略

文章介绍了Kubernetes的Pod安全策略(PSP),用于限制Pod的创建和行为,防止特权容器威胁集群安全。PSP通过设定一系列条件,如是否允许特权模式、使用宿主机资源、挂载特定卷等,来控制Pod的创建。启用PSP需配置kube-apiserver和RBAC权限。文章还详细讲解了PSP的配置选项和示例,以及如何创建、修改和删除PSP,并提供了两种典型的安全策略配置示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


前言

默认情况下,Kubernetes 允许创建一个有特权容器的 Pod,这些容器很可能会危机系统安全,而 Pod 安全策略(PSP)则通过确保请求者有权限按配置来创建 Pod,从而来保护集群免受特权 Pod 的影响。

为了更精细地控制Pod对资源的使用方式,Kubernetes从1.4版本开始引入了PodSecurityPolicy资源对象对Pod的安全策略进行管理。

PodSecurityPolicy 是 Kubernetes API 对象,你可以在不对 Kubernetes 进行任何修改的情况下创建它们,但是,默认情况下不会强制执行我们创建的一些策略,我们需要一个准入控制器、kube-controller-manager 配置以及 RBAC 权限配置。

PodSecurityPolicy 类型的对象能够控制,是否可以向 Pod 发送请求,该 Pod 能够影响被应用到 Pod 和容器的 SecurityContext。


什么是 Pod 安全策略?

Pod 安全策略 是集群级别的资源,它能够控制 Pod 运行的行为,以及它具有访问什么的能力。 PodSecurityPolicy 对象定义了一组Pod运行时必须遵循的条件及相关字段的默认值,只有 Pod 满足这些条件才会被系统接受。 它们允许管理员控制如下方面:

控制面 字段名称
特权容器 privileged
使用宿主名字空间 hostPID,hostIPC
使用宿主的网络和端口 hostNetwork,hostPorts
控制卷类型的使用 wolumes
使用宿主文件系统 allowHostPaths
允许使用特定的FlesVolume驱动 allowFlexVolumes
分配拥有Pod卷的FSGroup fsGroup
以只读的方式访问根文件系统 readOnlyRootFilesystem
设置容器的用户和组ID runAsUser,runAsGroup,supplementalGroups
限制root账号特提升 allowPrivilegeEscalation,defaultAllowPrivateEscalation
设置容器的 SELinux 上下文 seLinux
指定容器可以挂载的proc类型 alloweProcMountTypes
指定容器使用的AppArmor模板 annotations
指定容器使用的seccomp annotations
指定容器使用的sysctl模板 forbiddenSysctls,allowedUnsafeSysctls

Pod 安全策略 由设置和策略组成,它们能够控制 Pod 访问的安全特征。这些设置分为如下三类:

  • 基于布尔值控制 :这种类型的字段默认为最严格限制的值
  • 基于被允许的值集合控制 :这种类型的字段会与这组值进行对比,以确认值被允许
  • 基于策略控制 :设置项通过一种策略提供的机制来生成该值,这种机制能够确保指定的值落在被允许的这组值中。

许可控制

包含 PodSecurityPolicy 的 许可控制,允许控制集群资源的创建和修改,基于这些资源在集群范围内被许可的能力。

许可使用如下的方式为 Pod 创建最终的安全上下文:

  • 检索所有可用的 PSP。
  • 生成在请求中没有指定的安全上下文设置的字段值。
  • 基于可用的策略,验证最终的设置。

如果某个策略能够匹配上,该 Pod 就被接受。如果请求与 PSP 不匹配,则 Pod 被拒绝。

Pod 必须基于 PSP 验证每个字段。

开启

如果需要开启PodSecurityPolicy,需要在kube-apiserver的启动参数中设置如下参数

--enable-admission-plugins=PodSecurityPolicy

在开启PodSecurityPolicy准入控制器后,k8s默认不允许创建任何Pod,需要创建PodSecurityPolicy和RBAC授权策略,Pod才能创建成功。

注:修改kube-apiserver配置文件/etc/kubernetes/manifests/kube-apiserver.yaml,由于是static
pod,所以修改就会生效。

系统默认此参数为:

--enable-admission-plugins=NodeRestriction

操作Pod 安全策略

创建PodSecurityPolicy对象之后,就可以成功创建pod资源了

创建 Pod 安全策略

下列PodSecurityPolicy表示是不允许创建特权模式的Pod

apiVersion: policy/v1beta1 
kind: PodSecurityPolicy
metadata:
  name: psp-non-privileged
spec:
  privileged: false  #不允许特权模式的Pod
  seLinux:
    rule: RunAsAny
  supplementalGroups:
    rule: RunAsAny
  runAsUser:
    rule: RunAsAny
  fsGroup:
    rule: RunAsAny
  volumes:
  - '*'

获取 Pod 安全策略列表

获取已存在策略列表,使用 kubectl get:

$ kubectl get psp
NAME        PRIV   CAPS  SELINUX   RUNASUSER         FSGROUP   SUPGROUP  READONLYROOTFS  VOLUMES
permissive  false  []    RunAsAny  RunAsAny          RunAsAny  RunAsAny  false           [*]
privileged  true   []    RunAsAny  RunAsAny          RunAsAny  RunAsAny  false           [*]
restricted  false  []    RunAsAny  MustRunAsNonRoot  RunAsAny  RunAsAny  false           [emptyDir secret downwardAPI configMap persistentVolumeClaim projected]

修改 Pod 安全策略

通过交互方式修改策略,使用 kubectl edit:

$ kubectl edit psp permissive

该命令将打开一个默认文本编辑器,在这里能够修改策略。

删除 Pod 安全策略

一旦不再需要一个策略,很容易通过 kubectl 删除它:

$ kubectl delete psp permissive
podsecuritypolicy "permissive" deleted

根据安全策略创建pod

上面的PodSecurytiPolicy是设置了不允许创建特权模式的Pod,例如,在下面的YAML配置文件pod-privileged.yaml中为Pod设置了特权模式:

apiVersion: v1
kind: Pod
metadata:
  name: nginx
spec:
  containers:
  - name
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值