集群访问角色设计
概要设计
容器管理权限基于全局权限管理以及 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 资源或者命名空间范围的资源
流程图
用户角色授权计算流程: