容器编排技术 -- Pod 安全策略
容器编排技术 -- Pod 安全策略
- 1 什么是 Pod 安全策略?
- 1.1 RunAsUser
- 1.2 SELinux
- 1.3 SupplementalGroups
- 1.4 FSGroup
- 1.5 控制卷
- 1.6 主机网络
- 1.7 允许的主机路径
- 2 许可
- 3 创建 Pod 安全策略
- 4 获取 Pod 安全策略列表
- 5 修改 Pod 安全策略
- 6 删除 Pod 安全策略
- 7 启用 Pod 安全策略
- 8 使用 RBAC
PodSecurityPolicy 类型的对象能够控制,是否可以向 Pod 发送请求,该 Pod 能够影响被应用到 Pod 和容器的 SecurityContext。 查看 Pod 安全策略建议 获取更多信息。
什么是 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 访问的安全特征。这些设置分为如下三类:
- 基于布尔值控制:这种类型的字段默认为最严格限制的值。
- 基于被允许的值集合控制:这种类型的字段会与这组值进行对比,以确认值被允许。
- 基于策略控制:设置项通过一种策略提供的机制来生成该值,这种机制能够确保指定的值落在被允许的这组值中。
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。
控制卷
通过设置 PSP 卷字段,能够控制具体卷类型的使用。当创建一个卷的时候,与该字段相关的已定义卷可以允许设置如下值:
- 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)
对新的 PSP,推荐允许的卷的最小集合包括:configMap、downwardAPI、emptyDir、persistentVolumeClaim、secret 和 projected。
主机网络
- HostPorts, 默认为 empty。HostPortRange 列表通过 min(包含) and max(包含) 来定义,指定了被允许的主机端口。
允许的主机路径
- AllowedHostPaths 是一个被允许的主机路径前缀的白名单。空值表示所有的主机路径都可以使用。
许可
包含 PodSecurityPolicy 的 许可控制,允许控制集群资源的创建和修改,基于这些资源在集群范围内被许可的能力。
许可使用如下的方式为 Pod 创建最终的安全上下文:
- 检索所有可用的 PSP。
- 生成在请求中没有指定的安全上下文设置的字段值。
- 基于可用的策略,验证最终的设置。
如果某个策略能够匹配上,该 Pod 就被接受。如果请求与 PSP 不匹配,则 Pod 被拒绝。
Pod 必须基于 PSP 验证每个字段。
创建 Pod 安全策略
下面是一个 Pod 安全策略的例子,所有字段的设置都被允许:
apiVersion: extensions/v1beta1
kind: PodSecurityPolicy
metadata:name: permissive
spec:seLinux:rule: RunAsAnysupplementalGroups:rule: RunAsAnyrunAsUser:rule: RunAsAnyfsGroup:rule: RunAsAnyhostPorts:- min: 8000max: 8080volumes:- '*'
下载示例文件可以创建该策略,然后执行如下命令:
$ 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 安全策略
为了能够在集群中使用 Pod 安全策略,必须确保如下:
- 启用 API 类型 extensions/v1beta1/podsecuritypolicy(仅对 1.6 之前的版本)
- 启用许可控制器 PodSecurityPolicy
- 定义自己的策略
使用 RBAC
在 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 控制基于角色和组的已授权容器的访问 。
原文地址:https://k8smeetup.github.io/docs/concepts/policy/pod-security-policy/
译者:shirdrn
容器编排技术 -- Pod 安全策略相关推荐
- 容器编排技术 -- kubernetes 通过环境变量向容器暴露 Pod 信息
容器编排技术 -- kubernetes 通过环境变量向容器暴露 Pod 信息 1 Before you begin 2 Downward API 3 使用 Pod 字段作为环境变量的值 4 使用容器 ...
- 容器编排技术 -- Kubernetes DNS Pod 与 Service 介绍
容器编排技术 -- Kubernetes DNS Pod 与 Service 介绍 1 介绍 2 怎样获取 DNS 名字? 3 支持的 DNS 模式 3.1 Service 3.1.1 A 记录 3. ...
- 容器编排技术 -- Kubernetes Pod 优先级和抢占
容器编排技术 -- Kubernetes Pod 优先级和抢占 1 怎么样使用优先级和抢占 2 启用优先级和抢占 3 PriorityClass 3.1 PriorityClass 示例 4 Pod ...
- 容器编排技术 -- Kubernetes 给 Pod 配置服务质量等级
容器编排技术 -- Kubernetes 给 Pod 配置服务质量等级 1 Before you begin 2 QoS 等级 3 创建一个命名空间 4 创建一个 Pod 并分配 QoS 等级为 Gu ...
- 容器编排技术 -- Kubernetes 给容器和Pod分配CPU资源
容器编排技术 -- Kubernetes 给容器和Pod分配CPU资源 1 Before you begin 2 创建一个命名空间 3 声明一个CPU申请和限制 4 CPU 单位 5 请求的CPU超出 ...
- 容器编排技术 -- Kubernetes 给容器和Pod分配内存资源
容器编排技术 -- Kubernetes 给容器和Pod分配内存资源 1 Before you begin 2 创建一个命名空间 3 配置内存申请和限制 4 超出容器的内存限制 5 配置超出节点能力范 ...
- 容器编排技术 -- Kubernetes Pod概述
容器编排技术 -- Kubernetes Pod概述 1 了解Pod 1.1 Pods如何管理多个容器 1.1.1 网络 1.1.2 存储 2 使用Pod 2.1 Pod和Controller 3 P ...
- 容器编排技术 -- Kubernetes Pod 生命周期
容器编排技术 -- Kubernetes Pod 生命周期 1 Pod phase 2 Pod 状态 3 容器探针 3.1 该什么时候使用存活(liveness)和就绪(readiness)探针? 4 ...
- 容器编排技术 -- Kubernetes 为 Namespace 配置Pod配额
容器编排技术 -- Kubernetes 为 Namespace 配置Pod配额 1 Before you begin 2 创建名字空间 3 创建ResourceQuota对象 4 练习环境的清理 5 ...
最新文章
- 微信小程序 view中的image水平垂直居中
- ICLR 2019八大趋势:RNN正在失去光芒,强化学习仍最受欢迎
- linux centos 网络 时间 日期 同步
- POJ1135比较有意思的对短路(多米骨牌)
- 命名规范(1)大小写约定
- 20 Valid Parentheses
- 信息技术与计算机文化达标卷,初中信息技术试卷
- 有没有更好的方法在JavaScript中执行可选的函数参数? [重复]
- SQL:pgsql查询一段时间内每个小时的首条数据,为空返回0
- 二维均匀分布的边缘密度函数_均匀分布
- SQL必知必会【极客时间笔记】
- 神经网络学习小记录59——Pytorch搭建常见分类网络平台(VGG16、MobileNetV2、ResNet50)
- php公众号多域名授权,多个网站用一个微信公众号授权域名的坑
- 文件夹提示文件或目录损坏且无法读取怎么修复
- JMeter性能测试实战
- 打造智慧城市 构建新型城镇化
- 读书文摘卡 -《大秦帝国》
- 用Todd Motto揭秘JavaScript
- gateway配合nacos路由报错:Unable to find instance for XXX
- EPLAN创建3D宏部件