pod-security-policy
weight: 16
title: Pod 安全策略
date: “2022-05-21T00:00:00+08:00”
type: book
PodSecurityPolicy
类型的对象能够控制,是否可以向SecurityContext
。
什么是Pod 安全策略?
PodSecurityPolicy
对象定义了一组条件,指示
控制面 | 字段名称 |
---|---|
已授权容器的运行 | privileged |
为容器添加默认的一组能力 | defaultAddCapabilities |
为容器去掉某些能力 | requiredDropCapabilities |
容器能够请求添加某些能力 | allowedCapabilities |
控制卷类型的使用 | volumes |
主机网络的使用 | hostNetwork |
主机端口的使用 | hostPorts |
主机 |
hostPID |
主机 |
hostIPC |
主机路径的使用 | allowedHostPaths |
容器的 |
seLinux |
用户 |
runAsUser |
配置允许的补充组 | supplementalGroups |
分配拥有 |
fsGroup |
必须使用一个只读的 |
readOnlyRootFilesystem |
- 基于布尔值控制:这种类型的字段默认为最严格限制的值。
- 基于被允许的值集合控制:这种类型的字段会与这组值进行对比,以确认值被允许。
- 基于策略控制:设置项通过一种策略提供的机制来生成该值,这种机制能够确保指定的值落在被允许的这组值中。
RunAsUser
MustRunAs - 必须配置一个range
。使用该范围内的第一个值作为默认值。验证是否不在配置的该范围内。MustRunAsNonRoot - 要求提交的Pod 具有非零runAsUser
值,或在镜像中定义了USER
环境变量。不提供默认值。RunAsAny - 没有提供默认值。允许指定任何runAsUser
。
SELinux
MustRunAs - 如果没有使用预分配的值,必须配置seLinuxOptions
。默认使用seLinuxOptions
。验证seLinuxOptions
。RunAsAny - 没有提供默认值。允许任意指定的seLinuxOptions
ID 。
SupplementalGroups
MustRunAs - 至少需要指定一个范围。默认使用第一个范围的最小值。验证所有范围的值。RunAsAny - 没有提供默认值。允许任意指定的supplementalGroups
ID 。
FSGroup
MustRunAs - 至少需要指定一个范围。默认使用第一个范围的最小值。验证在第一个范围内的第一个ID 。RunAsAny - 没有提供默认值。允许任意指定的fsGroup
ID 。
控制卷
通过设置
- azureFile
- azureDisk
- flocker
- flexVolume
- hostPath
- emptyDir
- gcePersistentDisk
- awsElasticBlockStore
- gitRepo
- secret
- nfs
- iscsi
- glusterfs
- persistentVolumeClaim
- rbd
- cinder
- cephFS
- downwardAPI
- fc
- configMap
- vsphereVolume
- quobyte
- photonPersistentDisk
- projected
- portworxVolume
- scaleIO
- storageos
- * (allow all volumes)
对新的
主机网络
- HostPorts, 默认为
empty
。HostPortRange
列表通过min
( 包含) and max
( 包含) 来定义,指定了被允许的主机端口。
允许的主机路径
AllowedHostPaths 是一个被允许的主机路径前缀的白名单。空值表示所有的主机路径都可以使用。
许可
包含 PodSecurityPolicy
的 许可控制,允许控制集群资源的创建和修改,基于这些资源在集群范围内被许可的能力。
许可使用如下的方式为
- 检索所有可用的
PSP 。 - 生成在请求中没有指定的安全上下文设置的字段值。
- 基于可用的策略,验证最终的设置。
如果某个策略能够匹配上,该
创建Pod 安全策略
下面是一个
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.yaml
podsecuritypolicy "permissive" created
获取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 安全策略
为了能够在集群中使用
- 启用
API 类型extensions/v1beta1/podsecuritypolicy
(仅对1.6 之前的版本) - 启用许可控制器
PodSecurityPolicy
- 定义自己的策略
使用RBAC
在