認證
開啓 TLS 時,所有的請求都需要首先認證。Kubernetes 支持多種認證機制,並支持同時開啓多個認證插件(只要有一個認證通過即可)。如果認證成功,則用戶的 username
會傳入授權模塊做進一步授權驗證;而對於認證失敗的請求則返回 HTTP 401。
Kubernetes 不直接管理用戶
雖然 Kubernetes 認證和授權用到了 user 和 group,但 Kubernetes 並不直接管理用戶,不能創建
user
對象,也不存儲 user。
目前,Kubernetes 支持以下認證插件:
X509 證書
靜態 Token 文件
引導 Token
靜態密碼文件
Service Account
OpenID
Webhook
認證代理
OpenStack Keystone 密碼
X509 證書
使用 X509 客戶端證書只需要 API Server 啓動時配置 --client-ca-file=SOMEFILE
。在證書認證時,其 Common Name(CN)域用作用戶名,而 Organization(O)域則用作 group 名。
創建一個客戶端證書的方法爲:
接着,就可以使用 username.key 和 username.crt 來訪問集群:
靜態 Token 文件
使用靜態 Token 文件認證只需要 API Server 啓動時配置 --token-auth-file=SOMEFILE
。該文件爲 csv 格式,每行至少包括三列 token,username,user id
,後面是可選的 group 名,比如
客戶端在使用 token 認證時,需要在請求頭中加入 Bearer Authorization 頭,比如
引導 Token
引導 Token 是動態生成的,存儲在 kube-system namespace 的 Secret 中,用來部署新的 Kubernetes 集群。
使用引導 Token 需要 API Server 啓動時配置 --experimental-bootstrap-token-auth
,並且 Controller Manager 開啓 TokenCleaner --controllers=*,tokencleaner,bootstrapsigner
。
在使用 kubeadm 部署 Kubernetes 時,kubeadm 會自動創建默認 token,可通過 kubeadm token list
命令查詢。
靜態密碼文件
需要 API Server 啓動時配置 --basic-auth-file=SOMEFILE
,文件格式爲 csv,每行至少三列 password, user, uid
,後面是可選的 group 名,如
客戶端在使用密碼認證時,需要在請求頭重加入 Basic Authorization 頭,如
Service Account
ServiceAccount 是 Kubernetes 自動生成的,並會自動掛載到容器的 /var/run/secrets/kubernetes.io/serviceaccount
目錄中。
在認證時,ServiceAccount 的用戶名格式爲 system:serviceaccount:(NAMESPACE):(SERVICEACCOUNT)
,並從屬於兩個 group:system:serviceaccounts
和 system:serviceaccounts:(NAMESPACE)
。
OpenID
OpenID 提供了 OAuth2 的認證機制,是很多雲服務商(如 GCE、Azure 等)的首選認證方法。
使用 OpenID 認證,API Server 需要配置
--oidc-issuer-url
,如https://accounts.google.com
--oidc-client-id
,如kubernetes
--oidc-username-claim
,如sub
--oidc-groups-claim
,如groups
--oidc-ca-file
,如/etc/kubernetes/ssl/kc-ca.pem
Webhook
API Server 需要配置
配置文件格式爲
Kubernetes 發給 webhook server 的請求格式爲
示例:kubernetes-github-authn 實現了一個基於 WebHook 的 github 認證。
認證代理
API Server 需要配置
OpenStack Keystone 密碼
需要 API Server 在啓動時指定 --experimental-keystone-url=<AuthURL>
,而 https 時還需要設置 --experimental-keystone-ca-file=SOMEFILE
。
不支持 Keystone v3
目前只支持 keystone v2.0,不支持 v3(無法傳入 domain)。
匿名請求
如果使用 AlwaysAllow 以外的認證模式,則匿名請求默認開啓,但可用 --anonymous-auth=false
禁止匿名請求。
匿名請求的用戶名格式爲 system:anonymous
,而 group 則爲 system:unauthenticated
。
Credential Plugin
從 v1.11 開始支持 Credential Plugin(Beta),通過調用外部插件來獲取用戶的訪問憑證。這是一種客戶端認證插件,用來支持不在 Kubernetes 中內置的認證協議,如 LDAP、OAuth2、SAML 等。它通常與 Webhook 配合使用。
Credential Plugin 可以在 kubectl 的配置文件中設置,比如
具體的插件開發及使用方法請參考 kubernetes/client-go。
開源工具
如下的開源工具可以幫你簡化認證和授權的配置:
參考資料
Protect Kubernetes External Endpoints with OAuth2 Proxy by Alen Komljen
Single Sign-On for Internal Apps in Kubernetes using Google Oauth / SSO by William Broach
Single Sign-On for Kubernetes: An Introduction by Joel Speed
Let’s Encrypt, OAuth 2, and Kubernetes Ingress by Ian Chiles
Comparing Kubernetes Authentication Methods by Etienne Dilocker
Effective RBAC by Jordan Liggitt
Configure RBAC In Your Kubernetes Cluster via Bitnami
Using RBAC, Generally Available in Kubernetes v1.8 by Eric Chiang
Last updated