跳转至

集群访问角色设计

概要设计

容器管理权限基于全局权限管理以及 Kubernetes RBAC 权限管理打造的多维度权限管理体系。 支持集群级、命名空间级的权限控制,帮助用户便捷灵活地对租户下的 IAM 用户、用户组(用户的集合)设定不同的操作权限

设计目标

  • 用户可以加入用户组
  • 可以给用户组授权,用户会继承用户组的授权信息
  • 可以单独给用户设置权限,覆盖从用户组继承的授权信息

集群权限

集群权限基于 Kubernetes RBAC 的 ClusterRolebinding 授权,集群权限设置可让用户/用户组具备集群相关权限。 目前的默认集群角色为 Cluster Admin (不具备集群的创建、删除权限)

Cluster Admin

Cluster Admin 具有以下权限:

  • 可管理、编辑、查看对应集群
  • 管理、编辑、查看 命名空间下的所有工作负载及集群内所有资源
  • 可授权用户为集群内角色 (Cluster Admin、NS Admin、NS Editor、NS Viewer)

该集群角色的 YAML 示例如下:

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  annotations:
    kpanda.io/creator: system
  creationTimestamp: "2022-06-16T09:42:49Z"
  labels:
    iam.kpanda.io/role-template: "true"
  name: role-template-cluster-admin
  resourceVersion: "15168"
  uid: f8f86d42-d5ef-47aa-b284-097615795076
rules:
- apiGroups:
  - '*'
  resources:
  - '*'
  verbs:
  - '*'
- nonResourceURLs:
  - '*'
  verbs:
  - '*'

命名空间权限

命名空间权限是基于 Kubernetes RBAC 能力的授权,可以实现不同的用户/用户组对命名空间下的资源具有不同的操作权限(包括 Kubernetes API 权限),目前容器管理的默认角色为:NS Admin、NS Editor、NS Viewer

NS Admin

NS Admin 具有以下权限:

  • 可查看对应命名空间
  • 管理、编辑、查看 命名空间下的所有工作负载,及自定义资源
  • 可授权用户为对应命名空间角色 (NS Editor、NS Viewer)

该集群角色的 YAML 示例如下:

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  annotations:
    iam/creator: system
  labels:
    iam/role-template: "true"
  name: role-template-ns-admin
rules:
- apiGroups:
  - '*'
  resources:
  - '*'
  verbs:
  - '*'
- nonResourceURLs:
  - '*'
  verbs:
  - '*'    

NS Editor

NS Editor 具有以下权限:

  • 可查看对应有权限的命名空间
  • 管理、编辑、查看 命名空间下的所有工作负载
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  annotations:
    iam/creator: system
  labels:
    iam/role-template: "true"
  name: role-template-ns-edit
rules:
- apiGroups:
  - ""
  resources:
  - configmaps
  - endpoints
  - persistentvolumeclaims
  - persistentvolumeclaims/status
  - pods
  - replicationcontrollers
  - replicationcontrollers/scale
  - serviceaccounts
  - services
  - services/status
  verbs:
  - '*'
- apiGroups:
  - ""
  resources:
  - bindings
  - events
  - limitranges
  - namespaces/status
  - pods/log
  - pods/status
  - replicationcontrollers/status
  - resourcequotas
  - resourcequotas/status
  verbs:
  - '*'
- apiGroups:
  - ""
  resources:
  - namespaces
  verbs:
  - '*'
- apiGroups:
  - apps
  resources:
  - controllerrevisions
  - daemonsets
  - daemonsets/status
  - deployments
  - deployments/scale
  - deployments/status
  - replicasets
  - replicasets/scale
  - replicasets/status
  - statefulsets
  - statefulsets/scale
  - statefulsets/status
  verbs:
  - '*'
- apiGroups:
  - autoscaling
  resources:
  - horizontalpodautoscalers
  - horizontalpodautoscalers/status
  verbs:
  - '*'
- apiGroups:
  - batch
  resources:
  - cronjobs
  - cronjobs/status
  - jobs
  - jobs/status
  verbs:
  - '*'
- apiGroups:
  - extensions
  resources:
  - daemonsets
  - daemonsets/status
  - deployments
  - deployments/scale
  - deployments/status
  - ingresses
  - ingresses/status
  - networkpolicies
  - replicasets
  - replicasets/scale
  - replicasets/status
  - replicationcontrollers/scale
  verbs:
  - '*'
- apiGroups:
  - policy
  resources:
  - poddisruptionbudgets
  - poddisruptionbudgets/status
  verbs:
  - '*'
- apiGroups:
  - networking.k8s.io
  resources:
  - ingresses
  - ingresses/status
  - networkpolicies
  verbs:
  - '*'

NS Viewer

NS Viewer 具有以下权限:

  • 可查看对应命名空间
  • 可查看对应命名空间下的所有工作负载,及自定义资源
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  annotations:
    iam/creator: system
  labels:
    iam/role-template: "true"
  name: role-template-ns-view
rules:
- apiGroups:
  - ""
  resources:
  - configmaps
  - endpoints
  - persistentvolumeclaims
  - persistentvolumeclaims/status
  - pods
  - replicationcontrollers
  - replicationcontrollers/scale
  - serviceaccounts
  - services
  - services/status
  verbs:
  - get
  - list
  - watch
- apiGroups:
  - ""
  resources:
  - bindings
  - events
  - limitranges
  - namespaces/status
  - pods/log
  - pods/status
  - replicationcontrollers/status
  - resourcequotas
  - resourcequotas/status
  verbs:
  - get
  - list
  - watch
- apiGroups:
  - ""
  resources:
  - namespaces
  verbs:
  - get
  - list
  - watch
- apiGroups:
  - apps
  resources:
  - controllerrevisions
  - daemonsets
  - daemonsets/status
  - deployments
  - deployments/scale
  - deployments/status
  - replicasets
  - replicasets/scale
  - replicasets/status
  - statefulsets
  - statefulsets/scale
  - statefulsets/status
  verbs:
  - get
  - list
  - watch
- apiGroups:
  - autoscaling
  resources:
  - horizontalpodautoscalers
  - horizontalpodautoscalers/status
  verbs:
  - get
  - list
  - watch
- apiGroups:
  - batch
  resources:
  - cronjobs
  - cronjobs/status
  - jobs
  - jobs/status
  verbs:
  - get
  - list
  - watch
- apiGroups:
  - extensions
  resources:
  - daemonsets
  - daemonsets/status
  - deployments
  - deployments/scale
  - deployments/status
  - ingresses
  - ingresses/status
  - networkpolicies
  - replicasets
  - replicasets/scale
  - replicasets/status
  - replicationcontrollers/scale
  verbs:
  - get
  - list
  - watch
- apiGroups:
  - policy
  resources:
  - poddisruptionbudgets
  - poddisruptionbudgets/status
  verbs:
  - get
  - list
  - watch
- apiGroups:
  - networking.k8s.io
  resources:
  - ingresses
  - ingresses/status
  - networkpolicies
  verbs:
  - get
  - list
  - watch

详细设计

基本对象

包含如下基本对象

集群角色 clusterrole.auth.alphaquant.io

clusterrole.auth.alphaquant.io 对象表示一种 k8s 角色,在整个集群中起作用

集群角色由系统内置,不可变更,固定包含为以下四种角色:

  • 集群管理员 admin:拥有对集群中所有命名空间和节点的管理权限;
  • 集群普通用户 none:不能管理集群,只能访问被分配给自己的命名空间内的资源

clusterrole.auth.alphaquant.io 应该包含以下字段:

  • name:角色的名称,必填
  • rules:授权规则列表,指定该角色可以拥有的权限,必填

用户会按照该权限建立 cluster-role-binding

命名空间角色 namespacerole.auth.alphaquant.io

namespacerole.auth.alphaquant.io 对象表示一种 k8s 角色,在命名空间内起作用

命名空间角色由系统内置,不可变更,固定为以下四种角色:

  • 命名空间-管理员 admin:可以管理该命名空间的授权操作;
  • 命名空间-开发者 editor:可以管理该命名空间除授权外的操作;
  • 命名空间-普通用户 viewer:可以查看或者列出资源操作,但不能新增、删除、更新,也不能管理授权操作;
  • 无权限 anonymous:不能访问指定的命名空间

namespacerole.auth.alphaquant.io 应该包含以下字段:

  • name:角色的名称,必填
  • rules:授权规则列表,指定该角色可以拥有的权限,必填

用户会按照 rules 给出的列表建立 role-binding

用户 users.auth.alphaquant.io

用户是一个 Kubernetes API 对象,这个对象用于记录已经登录过系统的人员信息

用户可以加入至多一个用户组,可以变更用户组,默认属于 system-anonymous

users.auth.alphaquant.io 应该包含以下字段:

  • name:用户的名称,必填
  • email:用户的电子邮件地址
  • groups:该用户所属的用户组(放置于注释信息,不是正式字段)
  • status:用户的状态信息,如创建时间、上次登录时间
  • audit_logs:审计日志,包括历史授权信息(授权时间、授权操作、操作者等)(用于未来扩展)
  • clusterrole:集群角色授权信息,默认为无权限
  • namespacerole:命名空间授权信息,授权信息列表(每个元素为:命名空间名称、命名空间角色)

用户组 groups.auth.alphaquant.io

groups.auth.alphaquant.io 对象表示一组用户,用于方便地进行角色分配和访问控制

每个用户组可以包含多个用户、一个用户或者不包含用户

groups.auth.alphaquant.io 应该包含以下字段:

  • name:用户组的名称,必填
  • users:该用户组所包含的用户列表,可选
  • clusterrole:集群角色授权信息,默认为无权限
  • namespacerole:命名空间授权信息,授权信息列表(每个元素为:命名空间名称、命名空间角色)

功能描述

需要包含如下功能:

(1)用户可以加入用户组、更换用户组,用户始终属于某个用户组,默认是 system-anonymous 组(不包含任何权限)

(2)权限优先级

  • 集群角色与命名空间角色优先级:集群管理员 > 命名空间角色 > 集群普通用户;用户或者用户组若为集群管理员,
  • 命名空间角色优先级:无权限 > 命名空间-普通用户 > 命名空间-开发者 > 命名空间-管理员
  • 用户权限与继承用户组权限的优先级:用户的授权 > 用户从组中继承的授权

(3)用户授权计算方式:

内部实现原理:

(1)更改组权限

需求整理:

(1)用户可以停用(即是否启用),停用后删除所有授权

(2)用户无法手动创建,只能由 idp 验证,登录后完成用户的创建

(2)用户组可以添加用户,一个用户可以加入多个用户组

(3)用户只能看到和自己属于同一个 group 的用户

(4)用户、组都是 k8s 全局资源,也可以增加其他额外的全局 k8s 资源或者命名空间范围的资源

流程图

用户角色授权计算流程:

详细设计

参考资料