使用引导令牌进行身份验证
Kubernetes v1.18 [稳定]
引导令牌是简单的承载令牌,用于创建新集群或将新节点加入现有集群。它旨在支持 kubeadm,但也可用于其他场景,供希望在没有 kubeadm
的情况下启动集群的用户使用。它还旨在通过 RBAC 策略与 Kubelet TLS 引导 系统协同工作。
引导令牌概述
引导令牌通过特定类型的秘密 (bootstrap.kubernetes.io/token
) 定义,该秘密位于 kube-system
命名空间中。这些秘密随后被 API 服务器中的引导身份验证器读取。过期令牌将通过控制器管理器中的令牌清理器控制器删除。这些令牌还用于为通过引导签名器控制器执行的“发现”过程中的特定配置映射创建签名。
令牌格式
引导令牌采用 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
的成员。可以在令牌的秘密中指定其他组。
通过在控制器管理器上启用 tokencleaner
控制器,可以自动删除过期令牌。
--controllers=*,tokencleaner
引导令牌秘密格式
每个有效令牌都由 kube-system
命名空间中的一个秘密支持。您可以找到完整的設計文档 here.
以下是秘密的外观。
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
秘密的类型必须为 bootstrap.kubernetes.io/token
,名称必须为 bootstrap-token-<token id>
。它还必须存在于 kube-system
命名空间中。
usage-bootstrap-*
成员指示此秘密的预期用途。必须将值设置为 true
以启用。
usage-bootstrap-authentication
指示令牌可用作承载令牌,以对 API 服务器进行身份验证。usage-bootstrap-signing
指示令牌可用于对cluster-info
配置映射进行签名,如下所述。
expiration
字段控制令牌的到期时间。过期令牌在用于身份验证时会被拒绝,在配置映射签名期间会被忽略。过期值使用 RFC3339 编码为绝对 UTC 时间。启用 tokencleaner
控制器以自动删除过期令牌。
使用 kubeadm 管理令牌
您可以使用 kubeadm
工具来管理运行集群上的令牌。有关详细信息,请参见 kubeadm 令牌文档。
配置映射签名
除了身份验证之外,令牌还可用于对配置映射进行签名。这在集群引导过程的早期使用,此时客户端尚未信任 API 服务器。签名的配置映射可以通过共享令牌进行身份验证。
通过在控制器管理器上启用 bootstrapsigner
控制器来启用配置映射签名。
--controllers=*,bootstrapsigner
要签名的配置映射是 kube-public
命名空间中的 cluster-info
。典型流程是客户端在未经身份验证且忽略 TLS 错误的情况下读取此配置映射。然后,它通过查看嵌入在配置映射中的签名来验证配置映射的有效负载。
配置映射可能如下所示
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: []
配置映射的 kubeconfig
成员是仅填充了集群信息的配置文件。这里传达的关键内容是 certificate-authority-data
。这在将来可能会扩展。
签名是使用“分离”模式的 JWS 签名。要验证签名,用户应根据 JWS 规则(在丢弃所有尾随 =
的情况下进行 Base64 编码)对 kubeconfig
有效负载进行编码。然后,使用编码的有效负载在两个点之间插入它,以形成完整的 JWS。您可以使用 HS256
方案(HMAC-SHA256)和完整的令牌(例如 07401b.f395accd246ae52d
)作为共享密钥来验证 JWS。用户必须验证是否使用 HS256。
警告
任何拥有引导令牌的方都可以为该令牌创建有效的签名。在使用配置映射签名时,不建议将同一个令牌与多个客户端共享,因为被入侵的客户端可能潜在地对依赖签名来引导 TLS 信任的其他客户端进行中间人攻击。有关更多信息,请查阅 kubeadm 实现细节 部分。