Kubernetes中的RBAC
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/