Kubernetes中,授權有ABAC(基于屬性的通路控制)、RBAC(基于角色的通路控制)、Webhook、Node、AlwaysDeny(一直拒絕)和AlwaysAllow(一直允許)這6種模式。需要在kube-apiserver設定–authorization-mode=RBAC參數,啟用RABC模式,下面的操作版本為v1.10.1;
當應用沒有指定serviceAccountName,它将使用default服務帳戶。
在RABC API中,通過如下的步驟進行授權:
1)定義角色:定義角色時會指定此角色對于資源的通路控制的規則;
2)定義主體:使用者、組和服務帳戶
3)綁定角色:将主體與角色進行綁定,對主體進行通路授權。

RBAC API中的對象關系圖
Kubernetes中角色包含代表權限集合的規則,權限隻有被授予,沒有被拒絕的設定。
在Kubernetes中有兩類角色:普通角色和叢集角色。
可以通過Role定義在一個命名空間中的角色,或是使用ClusterRole定義叢集範圍的角色。
普通角色隻能被授予通路單一指令空間中的資源。
叢集角色(ClusterRole)能夠被授予資源權限有:叢集範圍資源(Node、NameSpace)、非資源端點(/healthz)、叢集所有命名空間資源(跨名稱空間);
角色綁定和叢集角色綁定
角色綁定用于将角色與一個主體進行綁定,進而實作将對主體授權的目的,主體分為使用者、組和服務帳戶。
角色綁定分為:普通角色綁定和叢集角色綁定
角色綁定中不同主體定義有:
名稱為 demo 使用者:
subjects:
- kind:User
name:"demo"
apiGroup:rbac.authorization.k8s.io
名稱為 demo 組:
subjects:
- kind:Group
name:"demo-group"
apiGroup:rbac.authorization.k8s.io
kube-system命名空間中,名稱為default的服務帳戶
subjects:
- kind:ServiceAccount
name:default
namespace:kube-system
so命名空間中,所有的服務帳戶:
subjects:
- kind:Group
name:system:serviceaccounts:so
apiGroup:rbac.authorization.k8s.io
所有的服務帳戶:
subjects:
- kind:Group
name:system:serviceaccounts
apiGroup:rbac.authorization.k8s.io
所有使用者:
subjects:
- kind:Group
name:system:authenticated #授權使用者
apiGroup:rbac.authorization.k8s.io
- kind:Group
name:system:unauthenticated #未授權使用者
apiGroup:rbac.authorization.k8s.io
授予cluster-admin叢集角色給admin使用者:
kubectl create clusterrolebinding admin-cluster-admin-binding --clusterrole=cluster-admin --user=admin
授予cluster-admin叢集角色給so名稱空間中的app服務帳戶:
kubectl create clusterrolebinding app-admin-binding --clusterrole=cluster-admin --serviceaccount=so:app
RBAC執行個體demo下面建立solinx-service-account.yml檔案包含以下内容:
# 服務賬号
apiVersion: v1
kind: ServiceAccount
metadata:
name: solinx
# 角色
---
kind: Role
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
name: solinx
rules: #規則
- apiGroups: [""] # 所有核心api
resources: ["pods"] # 資源
verbs: ["create","delete","get","list","patch","update","watch"] #操作
- apiGroups: [""]
resources: ["namespaces"]
verbs: ["create","delete","get","list","patch","update","watch"]
# 角色綁定
---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: RoleBinding
metadata:
name: solinx
roleRef: # 上面定義的角色
apiGroup: rbac.authorization.k8s.io
kind: Role
name: solinx
subjects: # 上面定義的服務賬戶
- kind: ServiceAccount
name: solinx
namespace: default
上面定義了一個服務賬戶solinx、普通角色solinx,并将該服務賬戶與角色進行綁定,該角色定義了對了pod的增删查改等操作,是以該服務賬戶也具備了該權限;
這裡使用solinx服務賬戶對資源進行操作:
kubectl get po --as system:serviceaccount:default:solinx
由于隻授予了pod的操作權限,當通路service資源時被拒絕:
kubectl get svc --as system:serviceaccount:default:solinx
Error from server (Forbidden): services is forbidden: User "system:serviceaccount:default:solinx" cannot list services in the namespace "default"
該角色為普通角色Role,當通路叢集資源NameSpace時同樣被拒絕:
kubectl get ns --as system:serviceaccount:default:solinx
Error from server (Forbidden): namespaces is forbidden: User "system:serviceaccount:default:solinx" cannot list namespaces at the cluster scope
此時把角色改為叢集角色:ClusterRole,并重新綁定服務賬戶:
此時該服務賬戶已經具備叢集角色權限,通路叢集資源:NameSpace
kubectl get ns --as system:serviceaccount:default:solinx
參考資料:
https://kubernetes.io/docs/reference/access-authn-authz/rbac/
文章首發位址:Solinx
http://www.solinx.co/archives/1233