client發起apiserver調用時,apiserver先認證(Authentication)用戶,再給用戶受權(Authorization),最後執行准入控制(Admission Control)node
認證就是識別用戶身份的過程後端
基於CA根證書籤名的雙向數字證書認證api
apiserver啓動的時候經過--client-ca-file=XXXX
配置簽發client證書的CA,當client發送證書過來時,apiserver使用CA驗證,若是證書合法,提取Common Name字段做爲用戶名安全
生成一個長串token,並放入header發起http請求,apiserver依據token識別用戶併發
apiserver啓動經過--token-auth-file=XXXXX
加載全部用戶token,client請求的時候Header加上token便可curl
保證token動態生成,可是該方案正在試驗階段,不太成熟測試
將[username:password]進行加密存入http request中的Header Authorization域,併發送給apiserver,apiserver依據這個域中的信息識別用戶ui
apiserver啓動時經過參數--basic-auth-file=XXXX
指定用戶信息的文件路徑,client請求的時候Header帶上base64(user:password)
便可加密
若是是經過kubectl,請參考,帶上用戶名密碼,去除證書認證url
kubectl --server=https://10.20.46.113:6443 --insecure-skip-tls-verify=true --username=xxx --password=xxx get nodes
主要面向pod內部訪問apiserver的鑑權方式。controller manager和apiserver會利用server端的私鑰爲每一個pod建立一個token,並掛載到/run/secrets/kubernetes.io/serviceaccount/
路徑下。pod在訪問apiserver的時候帶上該token就行
備註:當使用pod訪問apiserver的安全端口時,只能採用這種方式
基於OAuth2協議認證,受各大雲提供商青睞
按照規定k8s的接口規範,自定義token認證
openstack提供的認證和受權方案,適合採用openstack體系搭建k8s的團隊,處於試驗階段
當開啓匿名請求時,全部沒有被拒絕的請求都被認爲是匿名請求,在受權階段,這些請求都被統一處理
受權就是授予用戶請求權限,並鑑別用戶的api請求是否合法的過程
目前支持的幾種受權策略:
主要詳解後三個策略
啓動ABAC,須要apiserver指定受權策略文件的路徑和名字(--authorization-policy-file=XXXX),文件中的每一行表明一個策略對象
思路:用戶發送請求到apiserver,用戶識別用戶所擁有的權限策略信息,並與authorization-policy-file中的策略一一匹配,若是至少一行匹配成功,該請求就經過了受權
添加新的ABAC策略,須要重啓apiserver
須要提供一個https接口,並按照指定規規範處理request和響應response
在k8s中比較推薦的實現方式
優點:
啓動RBAC,須要apiserver啓動參數加上-authorization-mode=RBAC
RBAC的四個資源對象:
一個典型的映射關係
通過認證和受權後,還須要通過多個准入控制器的審覈,client到apiserver的請求才能成功獲得相應
目前提供的准入控制器有這些(這些插件並非都啓用了):
經過curl來測試權限是否生效的時候,請確保使用高版本的curl(已知低版本7.19.7)
主要參考資料爲【Kubernetes權威指南:從Docker到Kubernetes實踐全接觸(記念版)】。官方文檔略坑,不少東西只介紹了片斷,很難基於它實踐