使用引导令牌进行认证
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 实现细节部分。