• 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可以使用的存储卷类型

    podSecurity资源可以做到定义用户可以在pod中使用哪些类型存储卷。在最低限度上,一个podSecurity需要允许pod使用以下类型的存储卷:emptyDir、configMap、secret、downwardAPI、persistentVolumeClaim。
    如果有多个PodSecurityPolicy资源,pod可以使用PodSecurityPolicy中允许使用的任何一个存储卷类型(实际生效的是所有volume列表的并集)


    5、对不同的用户与组分配不同的podSecurityPolicy
    PodSecurityPolicy是集群级别的资源,不能存储和应用在某一特定命名空间上。
    对不同用户分配不同PodSecurityPolicy。创建你需要的PodSecurityPolicy资源,然后创建ClusterRole资源并通过名称将他们指向不同策略,以此使PodSecurityPolicy资源中的策略对不同的用户或组生效。通过ClusterRoleBinding资源将特定的用户或组绑定到ClusterRole上,当PodSecurityPolicy访问控制插件需要决定是否接纳一个pod时,他只会考虑创建pod的用户可以访问到的PodSecurityPolicy中的策略。
    psp:podSecurityPolicy的缩写
    使用RBAC将不同的PodSecurityPolicy分配给不同的用户
    之前学过,使用RBAC机制来给用户授予特定类型的资源访问权限,RBAC机制也可以通过使用引用其名字来授予对特定资源实例的访问权限,这是为了让不同用户使用不同PodSecurityPolicy的方法。
    创建两个ClusterRole,分别允许使用其中一个策略。将第一个ClusterRole命名为psp-default并允许其使用default PodSecurityPolicy资源。可以使用kubectl creat clusterrole来操作:
    $kubectl create clusterrole psp-default - -verb=use
    注意:使用的动词是use,而非get、list、watch或类似动词
    如上,通过- -resource-name 选项引用了一个PodSecurityPolicy资源的实例。
    现在创建另一个名为psp-privileged ClusterRole,指向privilege策略:
    $kubectl create clusterrole psp-priviledge - -verb =use
    现在把这两个策略绑定到用户上。为了绑定一个ClusterRole资源以授予对集群级别资源(PodSecurityPolicy资源就是集群级别资源)的访问权限,需要使用ClusterRoleBinding资源而非(有命名空间的)RoleBinding
    将psp-default Cluster绑定到所有已认证用户上,这是必需的,否则没有用户可以创建pod,因为PodSecurityPolicy访问控制插件会因为没有找到任何策略而拒绝创建pod。所有已认证用户都属于system:authenticated组,因此需要将该ClusterRole绑定到该组:
    $kubectl create clusterrolebinding psp-all-users
    将psp-privileged ClusteeRole绑带到用户Bob:
    $kubectl create clusterrolebinding ps-bob
    为kubectl 创建不同用户
    有kubectl 的config子命令创建两个新用户:
    $kubectl config set-credentials alice - -usename=alice - -password=password
    $kubectl config set-credentials bob - -username=bob - -password=password

    这些命令对这两个用户使用基础http认证进行认证
    使用不同用户创建pod
    $kubectl - -user alice create -f pod-privileged.yaml 

  • 相关阅读:
    基于两级分解和长短时记忆网络的短期风速多步组合预测模型
    【实战】kubeadmin安装kubernetes集群
    什么是芯片的启动电压与欠压锁定?电源芯片测试如何助力?
    Docker-harbor私有仓库部署与管理
    Verilog初体验
    webpack的插件webpack-dev-server
    63.【c++基础篇.三个文件实现】
    Mac自带apache2搭建服务请求localhost报 403 Forbidden
    MySQL查询成本
    java毕业设计“臻宝”书画竞拍系统mybatis+源码+调试部署+系统+数据库+lw
  • 原文地址:https://blog.csdn.net/wwxsoft/article/details/126603873