使用引導令牌進行認證
Kubernetes v1.18 [stable]
引導令牌是一種簡單的持有者令牌,旨在用於建立新叢集或將新節點加入現有叢集。它旨在支援 kubeadm,但也適用於希望在不使用 kubeadm
的情況下啟動叢集的使用者。它還可以透過 RBAC 策略與 kubelet TLS 引導系統協同工作。
引導令牌概述
引導令牌透過駐留在 kube-system
名稱空間中的特定型別的 Secret(bootstrap.kubernetes.io/token
)進行定義。這些 Secret 隨後由 API 伺服器中的引導認證器讀取。過期令牌由 Controller Manager 中的 TokenCleaner 控制器刪除。這些令牌還用於透過 BootstrapSigner 控制器為“發現”過程中使用的特定 ConfigMap 建立簽名。
令牌格式
引導令牌的形式為 abcdef.0123456789abcdef
。更正式地說,它們必須匹配正則表示式 [a-z0-9]{6}\.[a-z0-9]{16}
。
令牌的第一部分是“令牌 ID”,被視為公共資訊。它用於在不洩露用於認證的秘密部分的情況下引用令牌。第二部分是“令牌秘密”,應僅與受信任方共享。
啟用引導令牌認證
可以透過在 API 伺服器上使用以下標誌來啟用引導令牌認證器
--enable-bootstrap-token-auth
啟用後,引導令牌可用作持有者令牌憑據,以對 API 伺服器進行認證請求。
Authorization: Bearer 07401b.f395accd246ae52d
令牌以使用者名稱 system:bootstrap:<token id>
進行認證,並且是 system:bootstrappers
組的成員。可以在令牌的 Secret 中指定額外的組。
透過在控制器管理器上啟用 tokencleaner
控制器,可以自動刪除過期令牌。
--controllers=*,tokencleaner
引導令牌 Secret 格式
每個有效令牌都由 kube-system
名稱空間中的 Secret 支援。你可以在這裡找到完整的詳細設計文件。
Secret 的示例如下:
apiVersion: v1
kind: Secret
metadata:
# Name MUST be of form "bootstrap-token-<token id>"
name: bootstrap-token-07401b
namespace: kube-system
# Type MUST be 'bootstrap.kubernetes.io/token'
type: bootstrap.kubernetes.io/token
stringData:
# Human readable description. Optional.
description: "The default bootstrap token generated by 'kubeadm init'."
# Token ID and secret. Required.
token-id: 07401b
token-secret: f395accd246ae52d
# Expiration. Optional.
expiration: 2017-03-10T03:22:11Z
# Allowed usages.
usage-bootstrap-authentication: "true"
usage-bootstrap-signing: "true"
# Extra groups to authenticate the token as. Must start with "system:bootstrappers:"
auth-extra-groups: system:bootstrappers:worker,system:bootstrappers:ingress
Secret 的型別必須是 bootstrap.kubernetes.io/token
,名稱必須是 bootstrap-token-<token id>
。它也必須存在於 kube-system
名稱空間中。
usage-bootstrap-*
成員表示此 Secret 的預期用途。必須將其值設定為 true
才能啟用。
usage-bootstrap-authentication
表示令牌可以用作持有者令牌以向 API 伺服器進行認證。usage-bootstrap-signing
表示令牌可用於簽署cluster-info
ConfigMap,如下所述。
expiration
欄位控制令牌的過期時間。過期令牌在使用時會被拒絕認證,並在 ConfigMap 簽名期間被忽略。過期值以 RFC3339 格式的絕對 UTC 時間編碼。啟用 tokencleaner
控制器以自動刪除過期令牌。
使用 kubeadm 進行令牌管理
你可以使用 kubeadm
工具來管理執行中的叢集上的令牌。有關詳細資訊,請參閱 kubeadm 令牌文件。
ConfigMap 簽名
除了認證,令牌還可用於簽署 ConfigMap。這在客戶端信任 API 伺服器之前,在叢集引導過程的早期使用。已簽名的 ConfigMap 可透過共享令牌進行認證。
透過在控制器管理器上啟用 bootstrapsigner
控制器來啟用 ConfigMap 簽名。
--controllers=*,bootstrapsigner
已簽名的 ConfigMap 是 kube-public
名稱空間中的 cluster-info
。典型的流程是,客戶端在未認證且忽略 TLS 錯誤的情況下讀取此 ConfigMap。然後,它透過檢視 ConfigMap 中嵌入的簽名來驗證 ConfigMap 的負載。
ConfigMap 可能如下所示:
apiVersion: v1
kind: ConfigMap
metadata:
name: cluster-info
namespace: kube-public
data:
jws-kubeconfig-07401b: eyJhbGciOiJIUzI1NiIsImtpZCI6IjA3NDAxYiJ9..tYEfbo6zDNo40MQE07aZcQX2m3EB2rO3NuXtxVMYm9U
kubeconfig: |
apiVersion: v1
clusters:
- cluster:
certificate-authority-data: <really long certificate data>
server: https://10.138.0.2:6443
name: ""
contexts: []
current-context: ""
kind: Config
preferences: {}
users: []
ConfigMap 的 kubeconfig
成員是一個僅填充了叢集資訊的配置檔案。這裡傳遞的關鍵資訊是 certificate-authority-data
。將來可能會擴充套件此欄位。
簽名是使用“分離”模式的 JWS 簽名。要驗證簽名,使用者應根據 JWS 規則編碼 kubeconfig
負載(base64 編碼並丟棄任何尾隨的 =
)。然後使用該編碼的負載,透過將其插入到兩個點之間來形成一個完整的 JWS。你可以使用 HS256
方案(HMAC-SHA256)和完整的令牌(例如 07401b.f395accd246ae52d
)作為共享秘密來驗證 JWS。使用者**必須**驗證是否使用了 HS256。
警告
任何擁有引導令牌的一方都可以為該令牌建立有效簽名。當使用 ConfigMap 簽名時,不鼓勵與許多客戶端共享相同的令牌,因為受損的客戶端可能會對另一個依賴簽名引導 TLS 信任的客戶端進行中間人攻擊。有關更多資訊,請查閱 kubeadm 實現細節部分。