轉 https://blog.qikqiak.com/post/add-authorization-for-kubernetes-dashboard/shell
另外還能夠參考這個 https://mritd.me/2018/03/20/use-rbac-to-control-kubectl-permissions/ , https://gi thub.com/kubernetes/dashboard/issues/1991 , https://jimmysong.io/posts/user-authentication-in-kubernetes/json
前面咱們在kubernetes儀表板升級之路一文中成功的將Dashboard
升級到最新版本了,增長了身份認證功能,以前爲了方便增長了一個admin
用戶,而後授予了cluster-admin
的角色綁定,而該角色綁定是系統內置的一個超級管理員權限,就是也。用該用戶的token
登陸Dashboard
後會很強勢,什麼權限都有,想幹嗎幹嗎,這樣的操做顯然是很是危險的。接下來咱們來爲一個新的用戶添加訪問權限控制。api
Role
表示是一組規則權限,只能累加,Role
能夠定義在一個namespace
中,只能用於授予對單個命名空間中的資源訪問的權限好比咱們新建一個對默認命名空間中。Pods
具備訪問權限的角色:bash
kind: Role apiVersion: rbac.authorization.k8s.io/v1beta1 metadata: namespace: default name: pod-reader rules: - apiGroups: [""] # "" indicates the core API group resources: ["pods"] verbs: ["get", "watch", "list"]
ClusterRole
與具備Role
相同的權限角色控制能力,的不一樣的英文ClusterRole
的英文集羣級別的,能夠用於:app
好比咱們要建立一個受權某個特定命名空間或所有命名空間(取決於綁定方式)訪問祕密的集羣角色:post
kind: ClusterRole apiVersion: rbac.authorization.k8s.io/v1beta1 metadata: # "namespace" omitted since ClusterRoles are not namespaced name: secret-reader rules: - apiGroups: [""] resources: ["secrets"] verbs: ["get", "watch", "list"]
RoloBinding
能夠將角色中定義的權限授予用戶或用戶組,RoleBinding
包含一組權限列表(subjects
),權限列表中包含有不一樣形式的待授予權限資源類型(用戶,羣組,服務賬戶),RoleBinding
適用於某個命名空間內受權,而ClusterRoleBinding
適用於集羣範圍內的受權。jsonp
咱們好比默認將命名空間的pod-reader
角色授予用戶簡,之後這樣用戶該默認在命名空間中將具備pod-reader
的權限:url
# This role binding allows "jane" to read pods in the "default" namespace. kind: RoleBinding apiVersion: rbac.authorization.k8s.io/v1beta1 metadata: name: read-pods namespace: default subjects: - kind: User name: jane apiGroup: rbac.authorization.k8s.io roleRef: kind: Role name: pod-reader apiGroup: rbac.authorization.k8s.io
RoleBinding
一樣能夠引用ClusterRole
來對當前命名空間內用戶,用戶組或ServiceAccount進行受權,這種操做容許集羣管理員在整個集羣內定義一些通用的ClusterRole,而後在不一樣的命名空間中使用RoleBinding來引用spa
例如,如下RoleBinding引用了一個ClusterRole,這個ClusterRole具備整個集羣內對祕密的訪問權限;可是其受權用戶dave只能訪問開發空間中的祕密(由於RoleBinding定義在開發命名空間)code
# This role binding allows "dave" to read secrets in the "development" namespace. kind: RoleBinding apiVersion: rbac.authorization.k8s.io/v1beta1 metadata: name: read-secrets namespace: development # This only grants permissions within the "development" namespace. subjects: - kind: User name: dave apiGroup: rbac.authorization.k8s.io roleRef: kind: ClusterRole name: secret-reader apiGroup: rbac.authorization.k8s.io
最後,使用ClusterRoleBinding能夠對整個集羣中的全部命名空間資源權限進行受權;如下ClusterRoleBinding樣例展現了受權管理器組內全部用戶在所有命名空間中對祕密進行訪問
# This cluster role binding allows anyone in the "manager" group to read secrets in any namespace. kind: ClusterRoleBinding apiVersion: rbac.authorization.k8s.io/v1beta1 metadata: name: read-secrets-global subjects: - kind: Group name: manager apiGroup: rbac.authorization.k8s.io roleRef: kind: ClusterRole name: secret-reader apiGroup: rbac.authorization.k8s.io
有了上面的理論基礎,咱們就能夠來新建一個用戶,爲該用戶指定特定的訪問權限了,好比咱們的需求是:
cnych
kube-system
下面的pods
狀語從句:deployments
進行管理第一步新建一個ServiceAccount
:
$ kubectl create sa cnych -n kube-system
而後咱們新建一個角色role-cnych:(role.yaml)
kind: Role apiVersion: rbac.authorization.k8s.io/v1 metadata: namespace: kube-system name: role-cnych rules: - apiGroups: [""] resources: ["pods"] verbs: ["get", "watch", "list"] - apiGroups: ["extensions", "apps"] resources: ["deployments"] verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]
上面注意的rules
規則:管理pods
狀語從句:deployments
的權限。
而後咱們建立一個角色綁定,上面將角色的role-cnych
綁定到cnych的ServiceAccount
上:(角色bind.yaml)
kind: RoleBinding apiVersion: rbac.authorization.k8s.io/v1 metadata: name: role-bind-cnych namespace: kube-system subjects: - kind: ServiceAccount name: cnych namespace: kube-system roleRef: kind: Role name: role-cnych apiGroup: rbac.authorization.k8s.io
執行分別兩個上面yaml
文件:
$ kubect create -f role.yaml $ kubect create -f role-bind.yaml
接下來該怎麼作和前面同樣的,咱們只須要拿到?cnych
這個ServiceAccount
的token
就能夠登陸Dashboard
了:
$ kubectl get secret -n kube-system |grep cnych cnych-token-nxgqx kubernetes.io/service-account-token 3 47m $ kubectl get secret cnych-token-nxgqx -o jsonpath={.data.token} -n kube-system |base64 -d # 會生成一串很長的base64後的字符串
在而後dashboard
登陸頁面上直接使用上面獲得的token
字符串便可登陸,登陸事後能看到下面的頁面。
的英文這由於當前的這個token
對應的用戶沒有被授予訪問默認命名空間的權限,因此會出現這種提示,咱們而後訪問kube-system
這個命名空間試下看看(https://開頭<dashboard_url>!?/#/莢命名空間= KUBE-系統):
咱們能夠看到能夠訪問pod
列表了,可是也會有一些其餘額外的提示:事件被禁止:用戶「system:serviceaccount:kube-system:cnych」沒法列出名稱空間「kube-system」中的事件,這是由於登陸當前只用被受權了訪問pod
狀語從句:deployment
的權限,一樣的,下訪問deployment
看看能夠了嗎?
一樣的,你能夠根據本身的需求來對訪問用戶的權限進行限制,本身能夠經過Role
定義更加細粒度的權限,也可使用系統內置的一些權限......
歡迎你們加入咱們的知識星球:Kubernetes
。