k8s结合jumpserver做kubectl权限控制 用户在多个namespaces的访问权限 rbac权限控制
k8s结合jumpserver做kubectl权限控制 用户在多个namespaces的访问权限 rbac权限控制
其实这个文章就是用户用jumpserver登录到k8s master节点
然后执行kubectl的时候只有自己namespaces的所有权限。
背景
1,k8s 有一天突然kubectl 执行任何命令都报权限不对。
2,最后查明是因为有一个开发不小心把admin的ClusterRoleBinding给删除了。
3,jumpserver给所有开发的权限都是同一个普通用户。
4,因为我们是一个k8s集群,然后用不同的namespaces区分不同的业务小组。每个小组有固定的node机器。
5,kubectl 的配置文件都是用的同一个,权限也是admin的。
要求
1,领导要求业务小组只有自己namespaces的权限。
2,业务小组不能有一个集群的大的权限,比如删除node,不能更新master node的一些信息。
总体思路
1,在jumpserver上面新建各业务方系统用户。
2,把系统用户绑定给各业务方用户组。(关于Jumpserver 系统用户和管理用户介绍,后期出一篇单独的文章。)
3,在k8s master1节点上面的各个业务方系统用户家目录下面 新建不同的.kube/config文件。
一、.kube/config 文件生成
1,这里我就用我这边的需求写了,有关于k8s rbac的分享,我在后期会写一篇单独的文章。https://www.cnblogs.com/fanfanfanlichun/p/15005427.html
2,业务方有:axer,paas。这是我公司这边的两个业务方。
3,其实k8s的rbac确实非常的复杂,难理解,实现权限划分的方式
1.1 权限划分思路
1,首先是各种资源的权限,k8s资源又分两种,一种是集群的资源,一种是ns资源。
2,然后是将权限和谁绑定起来。 大概就是两步:权限和绑定权限。
3,我这里是用了两个ClusterRole,一个是集群的资源的权限,一个是ns资源的权限
4,我选择的是sa来做授权的对象。然后用这个sa的token去做kubectl的权限验证
5,多个RoleBinding,每一个RoleBinding把ns的资源权限固定在一个ns里面。你想要这个sa有哪些ns的权限,就写几个RoleBinding。
6,一个ClusterRoleBinding,用于绑定sa对集群资源的权限。
1.2 创建ClusterRole
1.2.1 集群资源权限
也就是说整个k8s集群的一些权限。比如:get ns,get node,get node status,git ns status......
# 其实这里就是设置对k8s集群的一些权限的
apiVersion: rbac.authorization.k8s.io/v1 # api
kind: ClusterRole # 资源类型
metadata: # 元数据 ClusterRole 不受ns的限制,所以不用写ns
name: business-axer-get-auth # ClusterRole 的名称,能区分就行
rules:
- apiGroups: # apiGroups 就是api资源组,你kubectl get apiservice 就可以看到集群所有的api组
- "" # 我这里代表为空,就是api组里面有一个v1. 这样的
resources: # 就是k8s资源的名称。kubectl api-resources 这个命令可以查看到,第一列是资源名称,就是可以写在这里的。
# 第二列是简写,kubectl get 后面的可以简写。
# 第三列是APIGROUP组
# 第四列是是否属于NAMESPACED资源,就是你可以在ns下面看到的资源
# 第五列是kind的时候写的名称
# 资源还分子资源,后期会写一篇专门的文章介绍
- namespaces/status # 这个是ns状态
- namespaces # 这个是ns
- persistentvolumes # pv
verbs: # verbs是定义动作的
- get # 就是可以查看ns的权限
- list
- watch
- apiGroups:
- ""
resources: # 这里定义的是可以查看node的权限,更新node的权限。
- nodes
- nodes/status
verbs:
- get
- list
- watch
- patch
- update
- apiGroups:
- "storage.k8s.io"
resources: # 这里定义的是可以查看sc的权限,因为我们有后端的存储集群,他们可以对sc的所有权限
- storageclasses
- storageclasses/status
resourceNames: # 因为sc属于集群资源,不同的业务方需要对自己的sc才有 全部权限。
- axersc # 所有这里可以指定对哪一个sc有全部权限
verbs:
- create
- delete
- deletecollection
- get
- list
- patch
- update
- watch
1.2.2 ns资源权限
就是定义业务方对自己ns的所有权限,自己的ns里面的所有资源都要有权限。
点击查看代码
点击查看代码
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: business-axer-admin-auth
rules:
- apiGroups:
- ""
resources: # 对pod的一些权限。
- pods/attach
- pods/exec # exec pod
- pods/portforward # 设置pod的转发
- pods/proxy
- secrets # secrets的权限
- services/proxy
verbs:
- get
- list
- watch
- apiGroups:
- ""
resources:
- serviceaccounts # sa的权限
verbs:
- impersonate
- apiGroups:
- ""
resources:
- pods
- pods/attach
- pods/exec
- pods/portforward
- pods/proxy
verbs:
- create
- delete
- deletecollection
- patch
- update
- apiGroups:
- ""
resources:
- configmaps
- endpoints
- persistentvolumeclaims
- replicationcontrollers
- replicationcontrollers/scale
- secrets
- serviceaccounts
- services
- services/proxy
verbs:
- create
- delete
- deletecollection
- patch
- update
- apiGroups:
- apps
resources:
- daemonsets
- deployments
- deployments/rollback
- deployments/scale
- replicasets
- replicasets/scale
- statefulsets
- statefulsets/scale
verbs:
- create
- delete
- deletecollection
- patch
- update
- apiGroups:
- autoscaling
resources:
- horizontalpodautoscalers
verbs:
- create
- delete
- deletecollection
- patch
- update
- apiGroups:
- batch
resources:
- cronjobs
- jobs
verbs:
- create
- delete
- deletecollection
- patch
- update
- apiGroups:
- extensions
resources:
- daemonsets
- deployments
- deployments/rollback
- deployments/scale
- ingresses
- networkpolicies
- replicasets
- replicasets/scale
- replicationcontrollers/scale
verbs:
- create
- delete
- deletecollection
- patch
- update
- apiGroups:
- policy
resources:
- poddisruptionbudgets
verbs:
- create
- delete
- deletecollection
- patch
- update
- apiGroups:
- networking.k8s.io
resources:
- ingresses
- networkpolicies
verbs:
- create
- delete
-