系列目录
什么是pod安全策略pod安全策略是集群级别的用于控制pod安全相关选项的一种资源.PodSecurityPolicy定义了一系列pod相要进行在系统中必须满足的约束条件,以衣一些默认的约束值.它允许管理员控制以下方面内容
Control Aspect Field Names以特权运行容器 privileged
使用宿主名称空间 hostPID, hostIPC
使用宿主网络和端口 hostNetwork, hostPorts
使用存储卷类型 volumes
使用宿主机文件系统 allowedHostPaths
flex存储卷白名单 allowedFlexVolumes
分配拥有 Pod 数据卷的 FSGroup fsGroup
只读root文件系统 readOnlyRootFilesystem
容器的用户id和组id runAsUser, runAsGroup, supplementalGroups
禁止提升到root权限 allowPrivilegeEscalation, defaultAllowPrivilegeEscalation
Linux能力 defaultAddCapabilities, requiredDropCapabilities, allowedCapabilities
SELinux上下文 seLinux
允许容器加载的proc类型 allowedProcMountTypes
The AppArmor profile used by containers annotations
The seccomp profile used by containers annotations
The sysctl profile used by containers annotations
启用pod安全策略
pod安全策略作为可选的(但强烈建议的)admission controller的实现.pod安全策略通过启用admission controller来实现,但是仅仅启用而没有对策略授权则会导致整个集群无法创建pod!
由于pod安全策略api(policy/v1beta1/podsecuritypolicy)独立于admission controller之外启用,对于已经存在的集群建议在启用admission controller之前添加并授权策略.
授权策略当一个pod安全策略资源被创建(前面说过,psp(PodSecurityPolicy )pod安全策略是一种kubernetes资源),它什么都不会做.为了使用它,请求操作的用户或者目标pod的serviceaccount必须通过策略的use动词来授权.
绝大部分kubernetes pod并不是直接由用户直接创建的.相反,典型使用场景是它们通过Deployment或者ReplicaSet间接被创建,或者通过控制器管理器的其它模板控制器来创建.对控制器进行策略授权也将对它所创建的所有pod进行策略授权.因此首选的授权方法是对pod的serviceaccount进行策略授权(后面有示例).
通过RBAC授权RBAC是kubernetes标准的授权模式,并且很容易用于授权安全策略使用.
首先,一个角色(role)或者集群角色(clusterRole)需要被授权使用(use动词)它想要的策略.对角色的授权类似下面
kind: ClusterRole apiVersion: rbac.authorization.k8s.io/v1 metadata: name: <role name> rules: - apiGroups: ['policy'] resources: ['podsecuritypolicies'] verbs: ['use'] resourceNames: - 一系列要进行授权的资源名称然后把集群角色(或角色)与授权的用户绑定
kind: ClusterRoleBinding apiVersion: rbac.authorization.k8s.io/v1 metadata: name: 绑定名称 roleRef: kind: ClusterRole name: 角色名称 apiGroup: rbac.authorization.k8s.io subjects: # Authorize specific service accounts: - kind: ServiceAccount name: 授权的serviceaccount名称 namespace: <authorized pod namespace> # Authorize specific users (not recommended): - kind: User apiGroup: rbac.authorization.k8s.io name: 授权的用户名如果一个角色绑定(不是集群角色绑定)被使用,它仅对和它处于同一名称空间下的pod才能进行有效策略授权,这样同样适用于用户和用户组
# Authorize all service accounts in a namespace: - kind: Group apiGroup: rbac.authorization.k8s.io name: system:serviceaccounts # Or equivalently, all authenticated users in a namespace: - kind: Group apiGroup: rbac.authorization.k8s.io name: system:authenticated故障排除
控制器管理器必须运行在安全的api端口上,并且不能有超级权限.不然请求就会绕过认证和授权模块,将导致所有的策略均被允许,并且用户可以创建特权pod
策略顺序除了限制pod的创建和更新,pod安全策略还用于提供它所控制的诸多字段的默认值.当有多个策略时,pod安全策略根据以下因素来选择策略
任何成功通过验证没有警告的策略将被使用
如果是请求创建pod,则按通过验证的策略按字母表顺序被选用
否则,如果是一个更新请求,将会返回错误.因为在更新操作过程中不允许pod变化
示例以下示例假定你运行的集群开启了pod安全策略admission controller并且你有集群管理员权限
初始设置