1. 程式人生 > 實用技巧 >Kubernetes叢集安全機制

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