天天看點

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)綁定角色:将主體與角色進行綁定,對主體進行通路授權。

Kubernetes中的RBAC

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

由于隻授予了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"
           
Kubernetes中的RBAC

該角色為普通角色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
           
Kubernetes中的RBAC

  此時把角色改為叢集角色:ClusterRole,并重新綁定服務賬戶:

Kubernetes中的RBAC

  此時該服務賬戶已經具備叢集角色權限,通路叢集資源:NameSpace

kubectl get ns --as system:serviceaccount:default:solinx
           
Kubernetes中的RBAC

參考資料:

https://kubernetes.io/docs/reference/access-authn-authz/rbac/

文章首發位址:Solinx

http://www.solinx.co/archives/1233