kubernetes authentication - part2
在 Part 1 中,我們介紹了 Kubernetes (K8s) 的兩種帳號類型,並深入探討了主要用於 Pod 內部流程自動化的 ServiceAccount。
這篇文章將聚焦於另一種帳號類型:Normal User Account,也就是專門為「人類」使用者(如開發者、維運人員)設計的帳號。
為什麼需要 Normal User Account?
雖然 ServiceAccount 也可以透過 kubeconfig
給人類使用者使用,但它並非為此設計。在企業環境中,我們通常希望能夠:
- 整合現有的身份驗證系統(如 LDAP, Active Directory, Google Workspace)。
- 實現單一登入 (Single Sign-On, SSO)。
- 集中管理使用者身份和權限,而非在 K8s 中手動建立和分發憑證。
K8s 本身不直接管理 Normal User,而是透過整合外部身份提供者 (Identity Provider, IdP) 來實現認證。本篇將介紹兩種最常見的 Normal User 認證方式。
方法一:X.509 客戶端憑證 (Client Certificates)
這是 K8s 最基礎的認證方式,也是您透過 kubeadm
或 k3s
建立叢集時,預設產生的 kubeconfig
所使用的方式。
它的原理是為每一位使用者產生一對獨一無二的 TLS 私鑰和憑證,並由 K8s 叢集的 CA (憑證授權中心) 簽署。API Server 會驗證客戶端提交的憑證是否由受信任的 CA 簽發,並從憑證的 Subject
欄位中提取使用者名稱 (CN
) 和所屬群組 (O
)。
雖然這種方式安全可靠,但管理起來非常繁瑣,因為您需要為每一位使用者手動產生、簽署、分發和撤銷憑證。
操作流程:為使用者 jane
建立 kubeconfig
以下是為一位名叫 jane
、隸屬於 developers
群組的使用者,手動建立一個僅能讀取 default
namespace 下 Pod 權限的 kubeconfig
的完整流程。
步驟 1:產生私鑰和憑證簽署請求 (CSR)
|
|
步驟 2:透過 K8s 簽署憑證
|
|
步驟 3:建立 RBAC 授權
|
|
步驟 4:產生專屬的 Kubeconfig
|
|
方法二:OpenID Connect (OIDC) - 推薦
手動管理憑證顯然不適合大型團隊。在企業環境中,OpenID Connect (OIDC) 是整合外部身份驗證的推薦方式。
OIDC 是一個基於 OAuth 2.0 的身份驗證協定。K8s API Server 可以配置為信任一個外部的 OIDC IdP (Identity Provider),例如 Google, Okta, Keycloak, 或 GitLab。
運作流程
- 使用者試圖用
kubectl
存取叢集。 kubectl
將使用者導向到 OIDC IdP (例如 Google 登入頁面) 進行登入。- 登入成功後,IdP 會回傳一個
ID Token
給使用者。 kubectl
將這個ID Token
包含在請求中,發送給 K8s API Server。- API Server 會向 IdP 驗證此
ID Token
的有效性。 - 驗證通過後,API Server 從
ID Token
中提取使用者資訊(如 Email 和群組),並根據 RBAC 規則進行授權。
使用 Dex 進行整合
K8s API Server 只支援 OIDC 協定。如果您的公司使用的是 LDAP、SAML 或其他非 OIDC 的認證系統,該怎麼辦?
這時就需要一個中間人,而 Dex 就是最受歡迎的選擇。Dex 是一個開源的身份服務,它可以作為一個橋樑,連接各種後端使用者系統 (稱為 Connectors
),並將它們統一以 OIDC 的形式暴露給 K8s。
graph TD; subgraph Your Company LDAP; SAML; GitHub; end subgraph Kubernetes Cluster subgraph Dex direction LR conn[Connectors] --> dex_core[Dex Core]; dex_core -- OIDC --> api_server[API Server]; end end LDAP --> conn; SAML --> conn; GitHub --> conn; user[User] -- kubectl --> api_server; api_server -- Redirect to Dex --> user; user -- Login via LDAP etc. --> Dex; Dex -- ID Token --> user; user -- Request with ID Token --> api_server;
實作
參考文章 https://geek-cookbook.funkypenguin.co.nz/kubernetes/oidc-authentication/k3s-keycloak/
我這邊設定 github oauth + dex
參考 https://docs.k3s.io/installation/configuration#configuration-file
設定 api server 存取 OIDC
|
|
then restart k3s server
|
|
安裝驗證工具
|
|
執行 OIDC 驗證
|
|
當驗證成功後
會看到 OIDC 提供的資訊, 以及 command for setup kubeconfig
## Authenticated with the OpenID Connect Provider
You got the token with the following claims:
{
"iss": "https://xxx",
"sub": "xxx",
"aud": "k3s-oidc-owanio1992-cloudns-nz",
"exp": 1759057994,
"iat": 1758971594,
"nonce": "dpm-wofsd-BPGNwqv7ZE-UKgbaeab2mEEMCBK5GwLKg",
"at_hash": "cNF083gbIONxp2Lkuca0cQ",
"c_hash": "AJcIrCuV6hKMDY4rlIQ7-A",
"email": "owan.io1992@gmail.com",
"email_verified": true,
"groups": [
"owan-io1992:test"
],
"name": "owan",
"preferred_username": "owanio1992"
}
## Set up the kubeconfig
You can run the following command to set up the kubeconfig:
kubectl config set-credentials oidc \
--exec-api-version=client.authentication.k8s.io/v1 \
--exec-interactive-mode=Never \
--exec-command=kubectl \
--exec-arg=oidc-login \
--exec-arg=get-token \
--exec-arg="--oidc-issuer-url=https://xxx" \
--exec-arg="--oidc-client-id=xxx" \
--exec-arg="--oidc-client-secret=xxx" \
--exec-arg="--oidc-extra-scope=email" \
--exec-arg="--oidc-extra-scope=openid" \
--exec-arg="--oidc-extra-scope=groups" \
--exec-arg="--oidc-extra-scope=profile" \
--exec-arg="--oidc-extra-scope=offline_access"
測試存取,因為還沒有給 RBAC, 失敗會是正常的, 但是能看到 user 為 “owan.io1992@gmail.com”
|
|
設定 RBAC
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: oidc-group-admin-kube-apiserver
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: Group
name: oidc:admin-kube-apiserver
apply 後 就可能存取 cluster 了
最後設定 config default user 為 oidc
|
|
總結
特性 | X.509 憑證 | OpenID Connect (OIDC) |
---|---|---|
管理方式 | 手動,分散式 | 集中式,自動化 |
適用場景 | 小型團隊、測試環境、自動化腳本 | 中大型企業、需要 SSO 的場景 |
優點 | 概念簡單、無需額外服務 | SSO、集中管理、易於擴展、支援多種 IdP |
缺點 | 管理複雜、難以擴展、憑證撤銷困難 | 需要額外部署和維護 IdP (如 Dex) |
對於任何正式的生產環境或多人協作的場景,強烈建議投入時間設定 OIDC 整合。