目錄node
在Kubernetes中,受權有ABAC(基於屬性的訪問控制)、RBAC(基於角色的訪問控制)、Webhook、Node、AlwaysDeny(一直拒絕)和AlwaysAllow(一直容許)這6種模式。
從1.6版本起,Kubernetes 默認啓用RBAC訪問控制策略。從1.8開始,RBAC已做爲穩定的功能。經過設置--authorization-mode=RBAC
,啓用RABC。在RABC API中,經過以下的步驟進行受權:
定義角色:在定義角色時會指定此角色對於資源的訪問控制的規則;
綁定角色:將主體與角色進行綁定,對用戶進行訪問受權。api
在 RBAC API 中,角色包含表明權限集合的規則。在這裏,權限只有被授予,而沒有被拒絕的設置。在 Kubernetes 中有兩類角色,即普通角色(Role)和集羣角色(ClusterRole)。能夠經過Role
定義在一個命名空間中的角色,或者可使用ClusterRole
定義集羣範圍的角色。一個Role
只能被用來授予訪問單一命令空間中的資源。下面是在 default 命令空間中定義了一個名爲 pod-reader 的角色,此角色可以對在 default 命名空間中訪問 Pod:安全
kind: Role apiVersion: rbac.authorization.k8s.io/v1 metadata: namespace: default name: pod-reader rules: - apiGroups: [""] # "" indicates the core API group resources: ["pods"] verbs: ["get", "watch", "list"]
ClusterRole
可用於授予與Role
相同的權限。他們可以被授予以下資源的權限:app
下面的ClusterRole
可用於授予對任何特定namespaces
中的祕密的讀取訪問權限,或跨全部命名空間的訪問權限。frontend
kind: ClusterRole apiVersion: rbac.authorization.k8s.io/v1 metadata: # "namespace" omitted since ClusterRoles are not namespaced name: secret-reader rules: - apiGroups: [""] resources: ["secrets"] verbs: ["get", "watch", "list"]
角色綁定用於將角色與一個或一組用戶進行綁定,從而實現將對用戶進行受權的目的。主體分爲用戶、組和服務賬戶。角色綁定也分爲角色普通角色綁定和集羣角色綁定。角色綁定只能引用同一個命名空間下的角色。
在下面的例子中,在 default 命名空間中角色綁定將 jane 用戶和 pod-reader 角色進行了綁定,這就授予了 jane 可以訪問 default 命名空間下的 Pod。工具
# This role binding allows "jane" to read pods in the "default" namespace. kind: RoleBinding apiVersion: rbac.authorization.k8s.io/v1 metadata: name: read-pods namespace: default subjects: - kind: User name: jane # Name is case sensitive apiGroup: rbac.authorization.k8s.io roleRef: kind: Role #this must be Role or ClusterRole name: pod-reader # this must match the name of the Role or ClusterRole you wish to bind to apiGroup: rbac.authorization.k8s.io
角色綁定也能夠經過引用集羣角色授予訪問權限,當主體對資源的訪問僅限與本命名空間,這就容許管理員定義整個集羣的公共角色集合,而後在多個命名空間中進行復用。
例如,下面的角色綁定引用了集羣角色,可是 dave 用戶也僅僅只能讀取 development 命名空間中的 secret s資源:this
# This role binding allows "dave" to read secrets in the "development" namespace. kind: RoleBinding apiVersion: rbac.authorization.k8s.io/v1 metadata: name: read-secrets namespace: development # This only grants permissions within the "development" namespace. subjects: - kind: User name: dave # Name is case sensitive apiGroup: rbac.authorization.k8s.io roleRef: kind: ClusterRole name: secret-reader apiGroup: rbac.authorization.k8s.io
集羣角色能夠被用來在集羣層面和整個命名空間進行受權。下面的示例容許在 manager 組的用戶可以訪問全部命名空間中的保密字典資源。spa
# This cluster role binding allows anyone in the "manager" group to read secrets in any namespace. kind:ClusterRoleBinding apiVersion:rbac.authorization.k8s.io/v1 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
在Kubernets中,主要的資源包括:Pods、Nodes、Services、Deployment、Replicasets、Statefulsets、Namespace、Persistents、Secrets和ConfigMaps等。另外,有些資源下面存在子資源,例如:Pod下就存在log子資源:插件
GET /api/v1/namespaces/{namespace}/pods/{name}/log
下面的例子顯示, pod-and-pod-logs-reader 角色可以對 pods 和 pods/log 進行訪問:命令行
kind:Role apiVersion:rbac.authorization.k8s.io/v1 metadata: namespace:default name:pod-and-pod-logs-reader rules: - apiGroups:[""] resources:["pods","pods/log"] verbs:["get","list"]
也能夠經過 resourceNamess 指定特定的資源實例,以限制角色只可以對實例進行訪問控制:
kind:Role apiVersion:rbac.authorization.k8s.io/v1 metadata: namespace:default name:configmap-updater rules: - apiGroups:[""] resources:["configmaps"] resourceNames:["my-configmap"] verbs:["update","get"]
RBAC受權中的主體能夠是組,用戶或者服務賬戶。用戶經過字符串表示,好比「alice」、 「bob@example.com」等,具體的形式取決於管理員在認證模塊中所配置的用戶名。system: 被保留做爲用來 Kubernetes 系統使用,所以不能做爲用戶的前綴。組也有認證模塊提供,格式與用戶相似。
在角色綁定主體的例子:
名稱爲 「alice@example.com」用戶:
subjects: - kind:User name:"alice@example.com" apiGroup:rbac.authorization.k8s.io
名稱爲「frontend-admins」的組:
subjects: - kind:Group name:"frontend-admins" apiGroup:rbac.authorization.k8s.io
在 kube-system 命名空間中,名稱爲「default」的服務賬戶:
subjects: - kind:ServiceAccount name:default namespace:kube-system
在「qa」命名空間中,全部的服務賬戶:
subjects: - kind:Group name:system:serviceaccounts:qa apiGroup:rbac.authorization.k8s.io
全部的服務賬戶:
subjects: - kind:Group name:system:serviceaccounts apiGroup:rbac.authorization.k8s.io
全部被認證的用戶 (version 1.5+):
subjects: - kind:Group name:system:authenticated apiGroup:rbac.authorization.k8s.io
全部未被認證的用戶 (version 1.5+):
subjects: - kind:Group name:system:unauthenticated apiGroup:rbac.authorization.k8s.io
全部用戶(version 1.5+):
subjects: - kind:Group name:system:authenticated apiGroup:rbac.authorization.k8s.io - kind:Group name:system:unauthenticated apiGroup:rbac.authorization.k8s.io
Kubernetes能夠經過命令工具進行角色綁定。
在指定的命名空間中進行角色綁定:
1)在acme
命名空間中,將admin
集羣角色授予bob
用戶:
$ kubectl create rolebinding bob-admin-binding --clusterrole=admin --user=bob --namespace=acme
2)在acme
命名空間中,將admin
集羣角色授予acme:myapp
服務賬戶:
$ kubectl create rolebinding myapp-view-binding --clusterrole=view --serviceaccount=acme:myapp --namespace=acme
在整個集羣中進行角色綁定:
1)在整個集羣中,授予cluster-admin
集羣角色給root
用戶:
$ kubectl create clusterrolebinding root-cluster-admin-binding --clusterrole=cluster-admin --user=root
2)在整個集羣中,授予system:node
集羣角色給kubelet
用戶:
$ kubectl create clusterrolebinding kubelet-node-binding --clusterrole=system:node --user=kubelet
3)在整個集羣中,授予view
集羣角色給acme:myapp
服務賬戶:
$ kubectl create clusterrolebinding myapp-view-binding --clusterrole=view --serviceaccount=acme:myapp
默認狀況下,RBAC策略授予控制板組件、Node和控制器做用域的權限,可是未授予kube-system
命名空間外服務賬戶的訪問權限。這就容許管理員按照須要將特定角色授予服務賬戶。
從最安全到最不安全的順序,方法以下:
這要求在Pod規格中指定ServiveAccountName
,同時此服務賬戶已被建立(經過API、kubectl create serviceaccount等)。例如,在my-namespace
命名空間內,授予my-sa
服務賬戶view
集羣角色:
kubectl create rolebinding my-sa-view \ --clusterrole=view \ --serviceaccount=my-namespace:my-sa \ --namespace=my-namespace
view
集羣角色給default
服務賬戶若是應用沒有指定serviceAccountName,它將使用default
服務賬戶。例如,例如,在my-namespace
命名空間內,授予default
服務賬戶view
集羣角色:
kubectl create rolebinding default-view \ --clusterrole=view \ --serviceaccount=my-namespace:default \ --namespace=my-namespace
當前,在 kube-system 命名空間中,不少插件做爲 default 服務賬戶進行運行。爲了容許超級用戶訪問這些插件,在 kube-system 命名空間中授予 cluster-admin 角色給 default 賬戶。
$ kubectl create clusterrolebinding add-on-cluster-admin \ --clusterrole=cluster-admin \ --serviceaccount=kube-system:default
若是但願在一個命名空間中的全部應用都擁有一個角色,而無論它們所使用的服務賬戶,能夠授予角色給服務賬戶組。例如,在 my-namespace 命名空間中,將 view 集羣角色授予 system:serviceaccounts:my-namespace 組:
$ kubectl create rolebinding serviceaccounts-view \ --clusterrole=view \ --group=system:serviceaccounts:my-namespace \ --namespace=my-namespace
若是不想按照每一個命名空間管理權限,能夠在整個集羣的訪問進行受權。例如,在整個集羣層面,將 view 集羣角色授予 sytem:serviceaccounts :
$ kubectl create clusterrolebinding serviceaccounts-view \ --clusterrole=view \ --group=system:serviceaccounts
若是對訪問權限不過重視,能夠授予超級用戶訪問全部的服務賬戶。
$ kubectl create clusterrolebinding serviceaccounts-cluster-admin \ --clusterrole=cluster-admin \ --group=system:serviceaccounts
下面的策略容許全部的服務賬戶做爲集羣管理員。在容器中運行的應用將自動的收取到服務賬戶證書,並執行全部的API行爲。包括查看保密字典恩將和修改權限,這是不被推薦的訪問策略。
$ kubectl create clusterrolebinding permissive-binding \ --clusterrole=cluster-admin \ --user=admin \ --user=kubelet \ --group=system:serviceaccounts
官方文檔:https://kubernetes.io/docs/reference/access-authn-authz/rbac/