使用引导令牌进行身份验证

功能状态: 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。

有关更多信息,请查阅 kubeadm 实现细节 部分。

上次修改时间:2024 年 5 月 25 日太平洋标准时间下午 11:44:改进引导令牌证书签名请求的格式 (7215e3919f)