kubernetes--pod安全策略(podSecurityPolicy)

podSecurityPolicy简介:

Kubernetes中pod部署时重要的安全校验手段,能够有效地约束应用运行时行为安全。使用PSP对象定义一组pod在运行时必须遵循的条件及相关字段的默认值,只有Pod满足这些条件才会被K8s接受。

PodSecurityPolicy 在 Kubernetes v1.21 中被弃用, 在 Kubernetes v1.25 中被移除。

pod安全策略限制维度

配置项

描述

privileged

启动特权容器。

hostPID,hostIPC

hostPID,hostIPC

hostNetwork,hostPorts

使用主机网络和端口。

volumes

允许使用的挂载卷类型。

allowedHostPaths

允许hostPath类型挂载卷在主机上挂载的路径,通过pathPrefix字段声 明允许挂载的主机路径前缀组。

allowedFlexVolumes

允许使用的指定FlexVolume驱动。

fsGroup

配置Pod中挂载卷使用的辅组ID。

readOnlyRootFilesystem

约束启动Pod使用只读的root文件系统。

runAsUser,runAsGroup,supplementalGroups

指定Pod中容器启动的用户ID以及主组和辅组ID。

allowPrivilegeEscalation, defaultAllowPrivilegeEscalation

约束Pod中是否允许配置allowPrivilegeEscalation=true,该配置会控 制setuid的使用,同时控制程序是否可以使用额外的特权系统调用。

defaultAddCapabilities, requiredDropCapabilities,allowedCapabilities

控制Pod中使用的Linux Capabilities。

seLinux

控制Pod使用seLinux配置。

allowedProcMountTypes

控制Pod允许使用的ProcMountTypes。

annotations

配置Pod中容器使用的AppArmor或seccomp。

forbiddenSysctls,allowedUnsafeSysctls

控制Pod中容器使用的sysctl配置

PSP的启用

Pod安全策略实现为一个准入控制器,默认没有启用,当启用后会强制实施 Pod安全策略,没有满足的Pod将无法创建。因此,建议在启用PSP之前先添加 策略并对其授权。

启用Pod安全策略:

vi/etc/kubernetes/manifests/kube-apiserver.yaml

...

- --enable-admission-plugins=NodeRestriction,PodSecurityPolicy

...

systemctl restart kubelet

PSP流程

kubernetes--pod安全策略(podSecurityPolicy)_第1张图片

用户使用SA (ServiceAccount)创建了一个Pod,K8s会先验证这个SA是否可以访问PSP资源权限,如果可以进一步验证Pod配置是否满足PSP规则,任 意一步不满足都会拒绝部署。

因此,需要实施需要有这几点:管理员不受限制

• 创建SA服务账号

• 该SA需要具备创建对应资源权限,例如创建Pod、Deployment

• SA使用PSP资源权限:创建Role,使用PSP资源权限,再将SA绑定Role

示例1:禁止创建特权模式的Pod

# 创建SA

kubectl create serviceaccount aliang

# 将SA绑定到系统内置Role

kubectl create rolebinding aliang--clusterrole=edit --serviceaccount=default:aliang

#通过sa创建资源

kubectl--as=system:serviceaccount:default:aliang create deployment web1 --image=nginx

启用psp后即使无策略,默认禁止创建pod,必须配置psp策略

#创建策略

apiVersion: policy/v1beta1 
kind: PodSecurityPolicy
metadata:
  name: psp-example
spec:
  privileged: false  #不允许特权pod,正常pod会允许
#下面是一些必要的字段,都是允许
  seLinux:
    rule: RunAsAny
  supplementalGroups:
    rule: RunAsAny
  runAsUser:
    rule: RunAsAny
  fsGroup:
    rule: RunAsAny
  volumes:
  - '*'

# 创建使用PSP权限的Role

【】kubectl create role psp:unprivileged--verb=use --resource=podsecuritypolicy --resource-name=psp-example

# 将SA绑定到Role

【】kubectl create rolebindingaliang:psp:unprivileged --role=psp:unprivileged --serviceaccount=default:aliang

【】kubectl--as=system:serviceaccount:default:aliang run nginx4 --image=nginx

创建deploy

kubernetes--pod安全策略(podSecurityPolicy)_第2张图片

无法创建,创建deploy成功replicaset无法成功,但replicaset无法成功,因为创建deploy会默认创建replicaset会默认使用default这个sa,需要给这个sa增加psp的授权

2个方案 1deploy创建时指定使用的服务账号sa 2将default这个sa绑定到psp上

kubectl create rolebinding default:psp:unprivileged--role=psp:unprivileged --serviceaccount=default:default

尝试创建特权pod,无法创建。因为psp策略限制了特权容器

【】cat cap.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: pod-psp2
spec:
  containers:
  - name: test
    image: busybox
    command:
    - sleep
    -  24h
    securityContext:
      privileged: true
【】kubectl apply -f cap.yaml

示列2:禁止没指定普通用户运行的容器(runAsUser)

意思是所有创建的pod必须指定普通用户才能运行

apiVersion: policy/v1beta1 
kind: PodSecurityPolicy
metadata:
  name: psp-example
spec:
  privileged: false  #不允许特权pod,正常pod会允许
#下面是一些必要的字段,都是允许
  seLinux:
    rule: RunAsAny
  supplementalGroups:
    rule: RunAsAny
  runAsUser:
    rule: MustRunAsNonRoot
  fsGroup:
    rule: RunAsAny
  volumes:
  - '*'

创建时不指定用户账号则会报

你可能感兴趣的:(kubenetes,kubernetes,docker,容器)