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

功能状态: Kubernetes v1.18 [稳定]

引导令牌是一种简单的承载令牌,用于创建新集群或将新节点加入现有集群。它旨在支持 kubeadm,但可以在其他情况下用于希望在没有 kubeadm 的情况下启动集群的用户。它还旨在通过 RBAC 策略与 Kubelet TLS 引导 系统一起使用。

引导令牌概述

引导令牌通过特定类型 (bootstrap.kubernetes.io/token) 的秘密定义,该秘密位于 kube-system 命名空间中。然后,这些秘密由 API 服务器中的引导身份验证器读取。已过期的令牌将通过控制器管理器中的 TokenCleaner 控制器删除。这些令牌还用于为通过引导签名器控制器进行的“发现”过程中使用的特定 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 的成员。可以在令牌的秘密中指定其他组。

可以通过在控制器管理器上启用 tokencleaner 控制器来自动删除已过期的令牌。

--controllers=*,tokencleaner

引导令牌秘密格式

每个有效令牌都由 kube-system 命名空间中的一个秘密支持。您可以找到完整的 设计文档

以下是秘密的外观。

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 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。

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

上次修改时间:2022 年 6 月 10 日太平洋标准时间下午 10:49:修复 k/design-proposals-archive 的链接 (34155fed0b)