获取 k8s rbac 用户的访问令牌

Get access token for k8s rbac user

拥有:

kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  namespace: default
  name: example-role
rules:
- apiGroups: [""]
  resources: ["pods"]
  verbs: ["get", "watch", "list"]

和角色绑定:

kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: example-rolebinding
  namespace: default
subjects:
- kind: User
  name: example-user
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: Role
  name: example-role
  apiGroup: rbac.authorization.k8s.io

如何获得秘密令牌?

token=$(kubectl get secret/$name -o jsonpath='{.data.token}' | base64 --decode)

但是对于用户来说没有秘密只有“default-token-xxx”。

是否需要绑定服务账号,或者token是否添加到default-token-xxx?

所有 Kubernetes 集群都有两类用户:Kubernetes 管理的服务帐户和普通用户,以及第三类主体:群组。 Kubernetes 没有代表普通用户帐户的对象(种类)。无法通过 API 调用将普通用户添加到集群。普通用户通常通过与其他身份验证协议(如 LDAP、SAML、Azure Active Directory、Kerberos 等)的集成进行管理或身份验证。您可以利用 OIDC 等外部身份提供者通过令牌进行身份验证。

对于服务帐户,正如您正确注意到的那样,如果您没有在命名空间中明确创建 Kubernetes Service Account,您将只能访问默认服务帐户,即 default-token-<hash>.

令牌不会自动为“普通用户”创建,但会自动为服务帐户创建。服务帐户是由 Kubernetes API 管理的用户。它们绑定到特定的命名空间,并由 API 服务器自动创建或通过 API 调用手动创建。服务帐户绑定到一组存储为机密的凭据。

Kubernetes 使用客户端证书、承载令牌、身份验证代理或 HTTP 基本身份验证通过身份验证插件对 API 请求进行身份验证。当向 API 服务器发出 HTTP 请求时,插件会尝试将以下属性与请求相关联:

  • 用户名:标识最终用户的字符串。常用值可能是 kube-admin 或 jane@example.com.
  • UID:标识最终用户并尝试比用户名更一致和唯一的字符串。

如果我们知道所使用的用户身份验证集成是什么,那么用户身份验证的主题就更容易回答了。