使用引导令牌进行身份验证
Kubernetes v1.18 [稳定]
引导令牌是一种简单的持有者令牌,旨在用于创建新集群或将新节点加入现有集群。它旨在支持 kubeadm,但也可以在其他场景下供希望在不使用 kubeadm
的情况下启动集群的用户使用。它还通过 RBAC 策略与 kubelet TLS 引导系统一起工作。
引导令牌概述
引导令牌使用 kube-system
命名空间中具有特定类型 (bootstrap.kubernetes.io/token
) 的 Secret 进行定义。API 服务器中的引导身份验证器会读取这些 Secret。过期的令牌将由控制器管理器中的 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:<令牌 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-<令牌 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
。典型的流程是客户端在未经过身份验证的情况下读取此 ConfigMap 并忽略 TLS 错误。然后,它通过查看嵌入在 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 规则 (base64 编码,同时丢弃任何尾随的 =
) 对 kubeconfig
有效负载进行编码。然后将编码的有效负载插入到 2 个点之间,从而形成一个完整的 JWS。可以使用 HS256
方案 (HMAC-SHA256) 并将完整令牌(例如 07401b.f395accd246ae52d
)作为共享密钥来验证 JWS。用户 *必须* 验证是否使用了 HS256。
警告
任何拥有引导令牌的一方都可以为该令牌创建有效的签名。在使用 ConfigMap 签名时,不建议与多个客户端共享同一个令牌,因为受损的客户端可能会成为中间人,从而影响另一个依赖签名来引导 TLS 信任的客户端。有关更多信息,请查阅 kubeadm 实现详细信息部分。