API Server的授權管理
API Server 內部通過用戶認證后,然后進入授權流程。對合法用戶進行授權並且隨后在用戶訪問時進行鑒權,是權限管理的重要環節。API Server 目前支持一下幾種授權策略。
- Always Deny: 表示拒絕所有的請求,一般用戶測試。
- Always Allow:允許接收所有請求,如果集群不需要授權流程,則可以采用該策略,這也是Kubernetes的默認配置。
- ABAC: 基於屬性的訪問控制,表示使用用戶配置的授權規則對用戶請求進行匹配和控制。
- Webhook:通過調用外部REST服務對用戶進行授權。
- RBAC:Role-Base Access Control, 基於角色的訪問空。
授權管理配置
我們來看一下kubectl使用的配置文件。
apiVersion: v1 clusters: - cluster: certificate-authority-data: REDACTED server: https://172.16.138.44:8443 name: kubernetes contexts: - context: cluster: kubernetes user: kubernetes-admin name: kubernetes-admin@kubernetes current-context: kubernetes-admin@kubernetes kind: Config preferences: {} users: - name: kubernetes-admin user: client-certificate-data: REDACTED client-key-data: REDACTED
授權管理也是kubernetes的標准資源對象,頂層配置有
- clusters 配置多個集群
- contexts 配置多個上下文
- users 配置多個用戶
- current-context 當前默認上下文
當前配置文件詳解,clusters中有一個集群名字叫kubernetes,users中有一個叫kubernetes-admin的用戶,contexts有一個叫kubernetes-admin@kubernetes的上下文配置,而關聯起來的集群是kubernetes和user名為kubernetes-admin的關系,而前面的上下文配置是使用的kubernetes-admin@kubernetes。
主要講解RBAC
Role和ClusterRole
對某個kubernetes的對象(Objects)上施加的一種行為(get post delete 等),我們稱為Permissions,把Permissions授於Role,就是一個角色了。能夠扮演為主體的就是我們之前講到的serviceAccount。UserAccount和ServiceAccount。
角色可以由命名空間(namespace)內的Role
對象定義,而整個Kubernetes集群范圍內有效的角色則通過ClusterRole
對象實現。一個Role對象只能用於授予對某一單一命名空間中資源的訪問權限。
ClusterRole對象可以授予與Role
對象相同的權限,但由於它們屬於集群范圍對象, 也可以使用它們授予對以下幾種資源的訪問權限:
- 集群范圍資源(例如節點,即node)
- 非資源類型endpoint(例如”/healthz”)
- 跨所有命名空間的命名空間范圍資源(例如pod,需要運行命令
kubectl get pods --all-namespaces
來查詢集群中所有的pod)
定義一個讀取Pods 的Role
apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: name: pods-reader namespace: default rules: - apiGroups: - "" resources: - pods verbs: - get - list - watch
定義一個clusterrole
apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: clusterrole-reader rules: - apiGroups: - "" resources: - pods verbs: - get - list - watch
RoleBinding和ClusterBinding
RoleBinding將定義的Role授權給一個或者一組用戶,RoleBinding就包含了一組相關主體(即subject, 包括用戶——User、用戶組——Group、或者服務賬戶——Service Account)以及對被授權的Role的引用。在命名空間中可以通過RoleBinding
對象授予權限,而集群范圍的權限授予則通過ClusterRoleBinding
對象完成。如下圖:
解釋:NamespaceA中的Role綁定在RoleBinding上並授權給User1,即User1就擁又了NamespaceA的權限。集群ClusterRole通過ClusterRoleBinding授權給User1,即User1擁有集群權限。NamespaceB中的RoleBinding引用了集群中ClusterRole,RoleBinding授權給User2 User3,即User2 User3擁有NamespaceB的權限。這是大家會又給疑問,為什么RoleBinding非要引用了ClusterRole,而不在NamespaceB下創建一個Role呢?因為當我們又很多Namespace的時候,我們這樣需要創建很多的Role,為了重復創建Role,我們可以創建一個ClusterRole來讓各個Namespace來用RoleBinding去引用,這樣就避免重新創建Role了。大大減少運維的工作。
RoleBinding樣例
apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: jaxzhai-rolebinding namespace: default roleRef: apiGroup: rbac.authorization.k8s.io kind: Role name: pods-reader subjects: - apiGroup: rbac.authorization.k8s.io kind: User name: jaxzhai
roleRef
- apiGroup
- kind
- name
subjects
- apiGroup
- kind
- name
- namespace
ClusterRoleBinding樣例
apiVersion: rbac.authorization.k8s.io/v1beta1 kind: ClusterRoleBinding metadata: name: read-pods-all roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: clusterrole-reader subjects: - apiGroup: rbac.authorization.k8s.io kind: User name: jaxzhai
kubectl describe clusterrolebinding read-pods-all Name: read-pods-all Labels: <none> Annotations: kubectl.kubernetes.io/last-applied-configuration={"apiVersion":"rbac.authorization.k8s.io/v1beta1","kind":"ClusterRoleBinding","metadata":{"annotations":{},"name":"read-pods-all","namespace":""},"role... Role: Kind: ClusterRole Name: clusterrole-reader Subjects: Kind Name Namespace ---- ---- --------- User jaxzhai
RoleBind 引用ClusterRole
apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: clusterrole-test roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: clusterrole-reader subjects: - apiGroup: rbac.authorization.k8s.io kind: User name: jaxzhai