PodSecurityPolicy
类型的对象能够控制,是否可以向 Pod 发送请求,该 Pod 能够影响被应用到 Pod 和容器的 SecurityContext
。
查看 Pod 安全策略建议 获取更多信息。
Pod 安全策略 是集群级别的资源,它能够控制 Pod 运行的行为,以及它具有访问什么的能力。
PodSecurityPolicy
对象定义了一组条件,指示 Pod 必须按系统所能接受的顺序运行。
它们允许管理员控制如下方面:
控制面 | 字段名称 |
---|---|
已授权容器的运行 | privileged |
为容器添加默认的一组能力 | defaultAddCapabilities |
为容器去掉某些能力 | requiredDropCapabilities |
容器能够请求添加某些能力 | allowedCapabilities |
控制卷类型的使用 | volumes |
主机网络的使用 | hostNetwork |
主机端口的使用 | hostPorts |
主机 PID namespace 的使用 | hostPID |
主机 IPC namespace 的使用 | hostIPC |
主机路径的使用 | allowedHostPaths |
容器的 SELinux 上下文 | seLinux |
用户 ID | runAsUser |
配置允许的补充组 | supplementalGroups |
分配拥有 Pod 数据卷的 FSGroup | fsGroup |
必须使用一个只读的 root 文件系统 | readOnlyRootFilesystem |
Pod 安全策略 由设置和策略组成,它们能够控制 Pod 访问的安全特征。这些设置分为如下三类:
range
。使用该范围内的第一个值作为默认值。验证是否不在配置的该范围内。runAsUser
值,或在镜像中定义了 USER
环境变量。不提供默认值。runAsUser
。seLinuxOptions
。默认使用 seLinuxOptions
。验证 seLinuxOptions
。seLinuxOptions
ID。supplementalGroups
ID。fsGroup
ID。通过设置 PSP 卷字段,能够控制具体卷类型的使用。当创建一个卷的时候,与该字段相关的已定义卷可以允许设置如下值:
对新的 PSP,推荐允许的卷的最小集合包括:configMap、downwardAPI、emptyDir、persistentVolumeClaim、secret 和 projected。
empty
。HostPortRange
列表通过 min
(包含) and max
(包含) 来定义,指定了被允许的主机端口。包含 PodSecurityPolicy
的 _许可控制_,允许控制集群资源的创建和修改,基于这些资源在集群范围内被许可的能力。
许可使用如下的方式为 Pod 创建最终的安全上下文: 1. 检索所有可用的 PSP。 1. 生成在请求中没有指定的安全上下文设置的字段值。 1. 基于可用的策略,验证最终的设置。
如果某个策略能够匹配上,该 Pod 就被接受。如果请求与 PSP 不匹配,则 Pod 被拒绝。
Pod 必须基于 PSP 验证每个字段。
下面是一个 Pod 安全策略的例子,所有字段的设置都被允许:
psp.yaml docs/concepts/policy
|
---|
|
下载示例文件可以创建该策略,然后执行如下命令:
$ kubectl create -f ./psp.yaml
podsecuritypolicy "permissive" created
获取已存在策略列表,使用 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]
通过交互方式修改策略,使用 kubectl edit
:
$ kubectl edit psp permissive
该命令将打开一个默认文本编辑器,在这里能够修改策略。
一旦不再需要一个策略,很容易通过 kubectl
删除它:
$ kubectl delete psp permissive
podsecuritypolicy "permissive" deleted
为了能够在集群中使用 Pod 安全策略,必须确保满足如下条件:
extensions/v1beta1/podsecuritypolicy
(仅对 1.6 之前的版本)PodSecurityPolicy
在 Kubernetes 1.5 或更新版本,可以使用 PodSecurityPolicy 来控制,对基于用户角色和组的已授权容器的访问。访问不同的 PodSecurityPolicy 对象,可以基于认证来控制。基于 Deployment、ReplicaSet 等创建的 Pod,限制访问 PodSecurityPolicy 对象,Controller Manager 必须基于安全 API 端口运行,并且不能够具有超级用户权限。
PodSecurityPolicy 认证使用所有可用的策略,包括创建 Pod 的用户,Pod 上指定的服务账户(Service Acount)。当 Pod 基于 Deployment、ReplicaSet 创建时,它是创建 Pod 的 Controller Manager,所以如果基于非安全 API 端口运行,允许所有的 PodSecurityPolicy 对象,并且不能够有效地实现细分权限。用户访问给定的 PSP 策略有效,仅当是直接部署 Pod 的情况。更多详情,查看 PodSecurityPolicy RBAC 示例,当直接部署 Pod 时,应用 PodSecurityPolicy 控制基于角色和组的已授权容器的访问 。