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通信兩種類型
- Controller Manager和Scheduler因爲在本機,通常不需要CA
- kubectl、kubelet、kube-proxy訪問API Server需要CA證書進行HTTPS
2、Pod與API Server交互之ServiceAccount
Pod中的容器訪問API Server。因爲Pod的特性,重建、銷燬,所以不採用CA(CA通信成本略高),通過SA方式與API Server交互。
K8S的Secret分爲兩類,
- 用於SA的token、ca.crt、namespace
- 用戶自定義加密信息
認證(Authentication)小結:
k8s組件與API Server交互方式使用了CA的HTTPS通信
Pod中容器與API Server交互方式通過SA訪問
二、鑑權(Authorization)
基於角色的訪問控制(RBAC模式)
RBAC引入4個頂級資源對象,Role、ClusterRole、RoleBinding、ClusterRoleBinding,均可通過kubectl、API操作。
- Role 作用於某個Namespace。
- ClusterRole 作用於整個集羣。
- RoleBinding是將Role中定義的權限賦予subjects (users, groups, or service accounts),。一個RoleBinding可以應用同一Namespace下的Role。同時RoleBinding 可以引用 ClusterRole,對 ClusterRole 所定義的、位於 RoleBinding 命名空間內的資源授權。 管理員可以在集羣定義一組通用Role,然後在多個Namespace中使用。
- 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