当前位置: 首页 > article >正文

使用k8s RBAC和ValidatingAdmissionPolicy 配合来校验用户权限

我先讲一下业务场景:

  1. k8s集群内部有几个重要的命名空间(比如: kube-system, kube-public 等),这些命名空间除了管理员有权限,其他用户不可以操作(编辑,删除)这几个命名空间。
  2. 在k8s集群需要创建一个用户 saas-admin, 有以下权限:
    (1). namespace 的 create, update, delete, get, list, watch 权限。
    (2). rolebindings 的 create, update, delete, get, list 权限。
    (3). serviceaccounts 的 create, update, delete, get, list, watch 权限。
  3. saas-admin 用户可以在集群下创建用户 sass-user 和 用户独有的命名空间 users-ns, 并且把用户 saas-user 绑定到 ClusterRole。
  4. 用户 saas-user 具有命名空间 users-ns 下的所有权限(每个用户都有自己的命名空间)。
  5. 这里重复一下,用户 saas-admin 不可以查看 kube-system 和 kube-public 命名空间下的任务资源, 也不能操作(编辑,删除) kube-system 和 kube-public 命名空间。

这里先抛出一个问题:如果只用 RBAC 如何才能做到上面这种场景?


我想了很久, 发现只有RBAC根本做不到(也可能是我才书浅薄, 如果大家有想法,可以在评论区留言) , 我给出理由就是 saas-admin 有 namespace 操作权限,那么没有办法避免操作 kube-system 等重要命名空间。

那么如何让saas-admin 没有权限操作这些重要命名空间呢?这个时候就要配合 ValidatingAdmissionPolicy 来使用了,如果不熟悉 ValidatingAdmissionPolicy ,可以去官方文档了接一下,我说一下个人想法:

  1. 使用 ValidatingAdmissionPolicy 来判断用户是否saas-admin, 如果是则拒绝。
  2. 使用 ValidatingAdmissionPolicyBinding 来把验证准入策略绑定带有特定标签的命名空间。
  3. 使用RBAC来分配saas-admin的权限。

第1和第2步的目的是防止saas-admin 误操作 kube-system 等命名空间, 这样目的就达到。

下面展示一下配置,噢,对了,如果不知道k8s怎么开启ValidatingAdmissionPolicy,可以参考这篇文章:k8s 启用 ValidatingAdmissionPolicy 特性

配置 ValidatingAdmissionPolicy

apiVersion: admissionregistration.k8s.io/v1beta1
kind: ValidatingAdmissionPolicy
metadata:
  name: deny-inter
spec:
  matchConstraints:
    resourceRules:
      - apiGroups: ["*"]
        apiVersions: ["*"]
        operations: ["*"]
        resources: ["*"]
  validations:
    - expression: "request.userInfo.username != 'system:serviceaccount:saas:saas-admin'"  # 拒绝所有请求
      message: "ServiceAccount 'saas-admin' cannot operate in namespace"
  failurePolicy: Fail

---
apiVersion: admissionregistration.k8s.io/v1beta1
kind: ValidatingAdmissionPolicyBinding
metadata:
  name: deny-inter-binding
spec:
  policyName: deny-inter  # 引用策略名称
  matchResources:
    namespaceSelector:
      matchLabels:
        test-label: inter  # 匹配命名空间的标签, 可以为kube-system和kube-public打上标签
  validationActions: ["Deny"]  # 添加验证动作

配置RBAC

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  # "namespace" 被忽略,因为 ClusterRoles 不受名字空间限制
  name: saas-admin-role
rules:
  - apiGroups: ["*"]
    resources: ["namespace"]
    verbs: ["create", "update", "delete", "get", "list", "watch"]
  - apiGroups: ["rbac.authorization.k8s.io"]
    resources: ["rolebindings"]
    verbs: ["create", "update", "delete", "get", "list"]
  - apiGroups: [""]
    resources: ["serviceaccounts"]
    verbs: ["create", "get", "list", "watch", "update", "delete"]
---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: saas-admin  # 替换为实际用户名
  namespace: saas  # 替换为所需的命名空间
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: saas-admin-role-binding
subjects:
  - kind: ServiceAccount
    name: sass-admin
    namespace: saas
roleRef:
  kind: ClusterRole
  name: saas-admin-role  # 替换为实际权限角色
  apiGroup: rbac.authorization.k8s.io
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: saas-user-role
rules:
  - apiGroups: [""]
    resources: ["pods", "services", "configmaps", "secrets", "persistentvolumeclaims", "persistentvolumes"]
    verbs: ["get", "list", "create", "update", "delete", "watch"]
  - apiGroups: ["apps"]
    resources: ["deployments"]
    verbs: ["get", "list", "create", "update", "delete", "watch"]

http://www.kler.cn/a/387407.html

相关文章:

  • PHP爬虫快速获取京东商品详情(代码示例)
  • 双十一云服务器抢购后,用SD-WAN连通多云网络
  • EDUCODER头哥 基于MVC模式的用户登录
  • uniapp分享功能
  • springboot参数校验
  • 【设计模式】结构型模式(四):组合模式、享元模式
  • Kafka 的一些问题,夺命15连问
  • 简单记录某云创建云主机部署docker,能ping通外网而curl不通的问题
  • 【go从零单排】初探goroutine
  • C# 项目中配置并使用 `log4net` 来输出日志
  • ChatGPT的多面手:日常办公、论文写作与深度学习的结合
  • OpenCV视觉分析之目标跟踪(11)计算两个图像之间的最佳变换矩阵函数findTransformECC的使用
  • MySQL基础-单表查询
  • 【MySQL】数据库整合攻略 :表操作技巧与详解
  • [编译报错]ImportError: No module named _sqlite3解决办法
  • 任天堂闹钟“Alarmo”已被用户破解 可显示自定义图像
  • Linux环境基础和基础开发工具使用
  • 【知识点总结】 Redis 数据类型操作指令
  • GitHub 和 Gitee 的区别和选择指南
  • 【数据集】【YOLO】【目标检测】交通事故识别数据集 8939 张,YOLO道路事故目标检测实战训练教程!
  • js下载excel示例demo
  • Vue keep-alive 深度使用解读
  • 删除conda和 pip 缓存的包
  • 深度剖析RPC框架:为你的分布式应用找到最佳通信方式
  • 每天五分钟深度学习PyTorch:基于全连接神经网络完成手写字体识别
  • 深入Zookeeper节点操作:高级功能与最佳实践