譯自 https://kubernetes.io/docs/admin/kubelet-authentication-authorization/
Overview
通過kubelet暴露的https api接口,可以訪問到不同的“敏感”數據,並且允許你在節點和容器內執行不同級別的操作。
本篇文檔描述了kublet https 斷點如何鑑權。
Kubelet 認證
默認情況下,到kubelet HTTPS endpoints
且沒有被其他配置的認證方法拒絕的請求被視爲匿名請求。對於匿名請求會給定system:anonymous
的用戶名和system:unauthenticated
用戶組。
禁止匿名用戶訪問,對不可靠的請求返回401 Unauthorized
:
- 啓動kublet的時候添加--anonymous-auth=false
參數
開啓X509
客戶端證書認證:
- 添加啓動參數--client-ca-file
, 並提供一個驗證客戶端證書的CA。
- 啓動apiserver
時需添加--kubelet-client-certificate
和 --kube-client-key
參數
- 詳情參考 apiserver authentication documentation
要啓動API承載令牌(包括serviceaccount
賬戶令牌)以用於對kublet的HTTPS 端點進行身份驗證:
- 確保authentication.k8s.io/v1beta1
API組在apiserver中被啓用
- 以--authenticatioin-token-webhook
, --kubeconfig
以及--require-kubeconfig
參數啓動kubelet
- kubelet調用事先在apiserver中定義好的TokenReview
API以確定來自承載令牌的用戶信息
Note:
--require-kubeconfig
在1.8中已經過時,未來的版本會移除該參數
Kubelet 授權
每個通過身份認證的請求(包括匿名請求)都會被授權。默認的授權模式是AlwaysAllow
, 這會放行所有的請求。
出於某些原因,可以將對kubelet api的訪問進行細分:
- 開啓anonymous 授權, 但是匿名用戶能夠訪問的kubelet API應該做限制
- 開啓承載令牌認證,但任意API用戶(如服務帳戶)調用kubelet API的能力應該是有限的。
- 客戶端證書身份驗證已啓用,但只有部分由已配置CA簽名的客戶端證書應被允許使用kubelet API
要細分對kubelet API的訪問,請將授權委託給apiserver:
- 確保authentication.k8s.io/v1beta1
API組在apiserver中被啓用
- 以--authenticatioin-token-webhook
, --kubeconfig
以及--require-kubeconfig
參數啓動kubelet
- Kubelet在配置的APIserver上調用SubjectAccessReview
API來確定每個請求是否被授權
kubelet使用與apiserver相同的請求屬性方法來授權API請求。
請求動作由http的請求方法確定:
HTTP verb | request verb |
---|---|
POST | create |
GET,HEAD | get |
PUT | update |
PATCH | patch |
DELETE | delete |
資源和子資源是根據傳入請求的路徑確定的:
Kubelet API | resource | subresource |
---|---|---|
/stats/* | nodes | stats |
/metrics/* | nodes | metrics |
/logs/* | nodes | log |
/spec/* | nodes | spec |
all others | nodes | proxy |
namespace和API組屬性始終是一個空字符串,資源名稱始終是kubelet的Node API對象的名稱。
在此模式下運行時,請確保傳遞給apiserver的--kubelet-client-certificate
和--kubelet-client-key
標誌所標識的用戶具有以下屬性的權限:
- verb=*, resource=nodes, subresource=proxy
- verb=*, resource=nodes, subresource=stats
- verb=*, resource=nodes, subresource=log
- verb=*, resource=nodes, subresource=spec
- verb=*, resource=nodes, subresource=metrics