k8s集羣安全機制理解

K8S的安全機制主要圍繞着API Server設計。使用了認證(Authentication)、鑑權(Authorization)、准入控制(Admission Control)來保證API Server安全。
請求流程圖:USER—>Authentication —> Authorization —> Admission Control—> K8S Resource
在這裏插入圖片描述

一、認證(Authentication):

首先通過認證確認身份,才允許互相通信。
認證支持三種類型,不過咱們通常用CA進行認證,畢竟安全性高

  • HTTP Token認證(單向認證)
  • HTTP Base認證:用戶名密碼(單向認證)
  • HTTPS證書認證:基於CA雙向認證(最安全)

1、組件與ApiServer通信兩種類型

  1. Controller Manager和Scheduler因爲在本機,通常不需要CA
  2. kubectl、kubelet、kube-proxy訪問API Server需要CA證書進行HTTPS

2、Pod與API Server交互之ServiceAccount

Pod中的容器訪問API Server。因爲Pod的特性,重建、銷燬,所以不採用CA(CA通信成本略高),通過SA方式與API Server交互。
K8S的Secret分爲兩類,

  1. 用於SA的token、ca.crt、namespace
  2. 用戶自定義加密信息

認證(Authentication)小結:

k8s組件與API Server交互方式使用了CA的HTTPS通信
Pod中容器與API Server交互方式通過SA訪問

二、鑑權(Authorization)

基於角色的訪問控制(RBAC模式)
RBAC引入4個頂級資源對象,Role、ClusterRole、RoleBinding、ClusterRoleBinding,均可通過kubectl、API操作。

  1. Role 作用於某個Namespace。
  2. ClusterRole 作用於整個集羣。
  3. RoleBinding是將Role中定義的權限賦予subjects (users, groups, or service accounts),。一個RoleBinding可以應用同一Namespace下的Role。同時RoleBinding 可以引用 ClusterRole,對 ClusterRole 所定義的、位於 RoleBinding 命名空間內的資源授權。 管理員可以在集羣定義一組通用Role,然後在多個Namespace中使用。
  4. ClusterRoleBinding 可用來在集羣級別或對所有命名空間執行授權。

注:定義user和group時不能使用system:開頭,爲K8S集羣保留的。SA的用戶名前綴爲system:serviceaccount:, 屬於前綴爲 system:serviceaccounts: 的用戶組。

  • API servers創建一組默認爲 ClusterRole 和 ClusterRoleBinding 的對象。以 system: 爲前綴所屬基礎設施“owned” ,對於這些資源的修改可能導致集羣功能失效。所有默認的 ClusterRole 和 ClusterRoleBinding 對象都會被標記爲 kubernetes.io/bootstrapping=rbac-defaults。
    通過命令查看是否屬於默認對象:kubectl describe ClusterRole system:node
  • 在1.6+版本後默認開啓自動更新功能,即在每次啓動時,API Server 都會更新默認 ClusterRole 所缺少的各種權限,同時可以保證升級K8S版本帶來的權限和RoleBinding變化。

參考官網:https://kubernetes.io/zh/docs/reference/access-authn-authz/rbac/

三、准入控制(Admission Controllers)

准入控制是API Serveer的插件集合,通過添加不同插件,實現額外的准入控制。比如SA也是通過Admission Controllers實現的。列舉幾個插件功能便於理解:

  • LimitRanger:確保請求的資源不會超過Namespace的LimitRange限制。
  • NamespaceLifecycle:刪除 Namespace 時刪除所有對象( pod 、 services 等)。強制不能在一個正在被終止的 Namespace 中創建新對象,和確保使用不存在 Namespace 的請求被拒絕。
  • ServiceAccount:實現了 serviceAccounts 的自動化。
  • ResourceQuota:確保請求不會超過 Namespace 中的 ResourceQuota 對象限制。
  • PodSecurityPolicy:確保在創建和修改 pod 時根據請求的安全上下文和可用的 pod 安全策略確定是否應該通過 pod。

參考官網:https://kubernetes.io/zh/docs/reference/access-authn-authz/admission-controllers/
https://www.jianshu.com/p/f77d5d0df58b

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章