Kubernetes学习笔记-保障集群内节点和网络安全(3)限制pod使用安全相关的特性20220828
前面讲了如何在部署pod时在任一宿主节点上做任何想做的事,比如部署一个特权模式的pod,但是需要一个机制阻止用户使用其中的部分功能,集群管理人员可以通过创建PodSecurityPolicy资源来限制对以上以上提到的安全相关特性使用
1、PodSecurityPolicy资源介绍
PodSecurityPolicy是一种集群级别(无命名空间)的资源,它定义了用户能否在pod中使用各种安全相关的特性。维护PodSecueityPolicy资源配置策略的工作由集成在api服务器中的PodSecurityPolicy准入控制插件完成
注意:你的集群中不一定启用了PodSecurityPolicy准入控制插件。在运行之前确保它已被启动
当向api服务器发送pod资源时,PodSecurityPolicy准入控制插件会将这个pod与已经配置的PodSecurityPolixy进行校验。如果这个pod符合集群中已有安全策略,它会被接收并存入etcd;否则它会立即被拒绝。这个插件也会根据安全策略中配置的默认值对pos进行修改
了解PodSecurityPolicy可以做的事
一个PodSecurityPolicy资源可以定义以下事项:
- 是否允许pos使用宿主节点的PID、IPC、网络命名空间
- pod允许绑定的宿主节点端口
- 容器运行时允许使用的用户ID
- 是否允许拥有特权模式容器的pod
- 允许添加哪些内核功能,默认添加哪些内核功能,总是禁用哪些内核功能
- 允许容器使用哪些SELinux选项
- 容器是否允许使用可写的根文件系统
- 允许容器在哪些文件系统组下运行
- 允许pod使用哪些类型的存储卷
2、了解runASUser、fsGroup和supplemenntalGroup
如果需要限制容器可以使用的用户和用户组id,可以设置MustRunAS,并指定允许使用的ID范围
使用MustRunAs规则
需要在PodSecurityPolicy资源中设置
如果pod spec试图将其中任一字段设置为指定范围之外的值,可以通过删除之前的PodSecurityContextPolicy,并创建一个新的yaml来实现
注意:修改策略对已经存在的pod无效,因为PodSecurityPolicy资源仅在创建和升级pod时起作用
在runAsUser字段中使用mustRunAsNonRoot规则
runAsUser字段还可以使用一种规则:mustRunAsNonRoot。它将阻止用户部署以root用户运行的容器。在此情况下,spec容器中必须指定runAsUser字段,并且不能为0(0为root用户的id),或容器镜像本身指定一个非0的用户id运行。
3)配置允许、默认添加、禁止使用的内核功能
容器可以运行在特权模式下,也可以对每个容器添加或禁用linux内核功能来定义更细粒度的权限配置。以下三个字段会影响容器可以使用的内核功能:
allowedCapabilities
defaultAddCapabilities
requiredDropXapabilities
指定容器中可以添加的内核功能
allowedCapabilities字段用于指定spec容器的securityContrxt.capabilities中可以添加哪些内核功能。
4、限制pod可以使用的存储卷类型