Kubernetes叢集安全機制
概述
當我們訪問K8S叢集時,需要經過三個步驟完成具體操作
- 認證
- 鑑權【授權】
- 准入控制
進行訪問的時候,都需要經過 apiserver, apiserver做統一協調,比如門衛
- 訪問過程中,需要證書、token、或者使用者名稱和密碼
- 如果訪問pod需要serviceAccount
認證
對外不暴露8080埠,只能內部訪問,對外使用的埠6443
客戶端身份認證常用方式
- https證書認證,基於ca證書
- http token認證,通過token來識別使用者
- http基本認證,使用者名稱 + 密碼認證
鑑權
基於RBAC進行鑑權操作
基於角色訪問控制
准入控制
就是准入控制器的列表,如果列表有請求內容就通過,沒有的話 就拒絕
RBAC介紹
基於角色的訪問控制,RBAC將角色和角色繫結分開,角色指的是一組定義好的操作叢集資源的許可權,而角色繫結是將角色和使用者、組或者服務賬號實體繫結,從而賦予這些實體許可權。可以看出 RBAC 這種授權方式很靈活,要賦予某個實體許可權只需要繫結相應的角色即可。針對 RBAC 機制,k8s 提供了四種 API 資源:Role、ClusterRole、RoleBinding、ClusterRoleBinding。
建立角色
- Role: 只能用於授予對某一單一名稱空間中資源的訪問許可權,因此在定義時必須指定 namespace;
以下示例描述了 default 名稱空間中的一個 Role 物件的定義,用於授予對 pod 的讀訪問許可權:
kind: Role apiVersion: rbac.authorization.k8s.io/v1beta1 metadata: namespace: default name: pod-reader rules: - apiGroups: [""] # 空字串""表明使用core API group resources: ["pods"] verbs: ["get", "watch", "list"]
- ClusterRole:針對叢集範圍的角色,能訪問整個叢集的資源;
下面示例中的 ClusterRole 定義可用於授予使用者對某一特定名稱空間,或者所有名稱空間中的 secret(取決於其繫結方式)的讀訪問許可權:
kind: ClusterRole apiVersion: rbac.authorization.k8s.io/v1beta1 metadata: # 鑑於ClusterRole是叢集範圍物件,所以這裡不需要定義"namespace"欄位 name: secret-reader rules: - apiGroups: [""] resources: ["secrets"] verbs: ["get", "watch", "list"]
建立角色繫結
- RoleBinding:將 Role 和使用者實體繫結,從而賦予使用者實體名稱空間內的許可權,同時也支援 ClusterRole 和使用者實體的繫結;
下面示例中定義的 RoleBinding 物件在 default 名稱空間中將 pod-reader 角色授予使用者 jane。 這一授權將允許使用者 jane 從 default 名稱空間中讀取pod:
# 以下角色繫結定義將允許使用者"jane"從"default"名稱空間中讀取pod。 kind: RoleBinding apiVersion: rbac.authorization.k8s.io/v1beta1 metadata: name: read-pods namespace: default subjects: - kind: User name: jane apiGroup: rbac.authorization.k8s.io roleRef: kind: Role name: pod-reader apiGroup: rbac.authorization.k8s.io
- ClusterRoleBinding:將 ClusterRole 和使用者實體繫結,從而賦予使用者實體叢集範圍的許可權;
下面示例中所定義的 ClusterRoleBinding 允許在使用者組 manager 中的任何使用者都可以讀取叢集中任何名稱空間中的 secret:
# 以下`ClusterRoleBinding`物件允許在使用者組"manager"中的任何使用者都可以讀取叢集中任何名稱空間中的secret。 kind: ClusterRoleBinding apiVersion: rbac.authorization.k8s.io/v1beta1 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
關於 RBAC 更詳細的講解見這裡:https://jimmysong.io/kubernetes-handbook/concepts/rbac.html