gpt4 book ai didi

Kubernetes 安全 : How to check the token of service account?

转载 作者:行者123 更新时间:2023-12-02 01:25:43 25 4
gpt4 key购买 nike

首先,我创建了一个服务帐户jenkins

> kubectl create serviceaccount jenkins
serviceaccount/jenkins created

其次,为此服务帐户创建一个 token 。

> kubectl create token jenkins
eyJhbGc****************iQS-AVXfIzA

然后,我运行 kubectl describe serviceaccount jenkins 命令来检查新创建的服务帐户的 token 。

但输出显示无标记。

> kubectl describe serviceaccount jenkins

Name: jenkins
Namespace: default
Labels: <none>
Annotations: <none>
Image pull secrets: <none>
Mountable secrets: <none>
Tokens: <none> <===== look at this!
Events: <none>

问题

  1. 输出显示“无” token ,我怎么知道有与此服务帐户关联的 token ?

  2. 如果我多次运行kubectl create token jenkins命令,kubernetes会为这个账户创建多个 token 吗?还是最新的会覆盖之前的?

    # first time
    kubectl create token jenkins
    # second time
    kubectl create token jenkins
    # third time
    kubectl create token jenkins
    `

  3. service account和token是什么映射关系?是 1:n 吗?

最佳答案

服务帐户和 token 的机制已更改(在 v1.22 中移至稳定版)。

过去,您创建了一个服务帐户。然后,在您第一次使用该服务帐户运行 pod 时,Kubernetes 创建了一个长期存在的、永不过期的 token ,该 token 位于 kubernetes.io/service-account-token 类型的 secret 中。 Kubernetes 通过卷装载将此 token 附加到 pod。

由于长期 token 的不安全性,这已更改为称为 Bound Service Account Token Volumes 的东西。

简而言之,Kubernetes 不再为服务帐户创建带有 token 的 secret ,而是 Kubelet 向 pod 注入(inject)一个默认时间跨度为 1 小时的短期 token ,并在其过期时刷新它。

当您运行 kubectl describe serviceaccount jenkins 时,您会在 <none> 的部分看到 Tokens,因为它代表“老式”静态 token ,如前所述,默认情况下不再创建。

您可以手动创建这样的静态 token

> cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Secret
type: kubernetes.io/service-account-token
metadata:
name: jenkins
annotations:
kubernetes.io/service-account.name: jenkins
EOF

然后当您再次运行 describe 时,您将获得新 token

> kubectl describe serviceaccount jenkins
Name: jenkins
Namespace: jenkins-demo
Labels: <none>
Annotations: <none>
Image pull secrets: <none>
Mountable secrets: <none>
Tokens: jenkins
Events: <none>

您可以创建多个具有不同名称的 token ,您将在 describe 输出中看到所有 token 。

但是 创建这些静态 token 是一种不好的做法,因为它们永远不会过期。您应该使用可以使用您提到的命令创建的短期 token kubectl create token jenkins

您可以使用 --duration <seconds>s 控制持续时间并创建一个最长 48 小时到期的 token 。默认为 1 小时。

新 token 的创建不会覆盖之前的 token 。这些 token 是 JWT——这意味着它们是经过签名和分发的,不会保留在服务器上。如果您想查看 token 的内容,可以粘贴输出jwt.io 中的 kubectl create token jenkins

与静态 token 相同。你可以跑 kubectl get secret jenkins --output=jsonpath='{.data.token}' | base64 -d并将输出粘贴到 jwt.io 中。您会注意到此 token 没有到期日期。

引用:

  1. https://kubernetes.io/docs/reference/access-authn-authz/service-accounts-admin/
  2. https://kubernetes.io/docs/tasks/configure-pod-container/configure-service-account/#manually-create-an-api-token-for-a-serviceaccount
  3. https://github.com/kubernetes/enhancements/tree/master/keps/sig-auth/1205-bound-service-account-tokens
  4. https://github.com/kubernetes/enhancements/issues/542

关于Kubernetes 安全 : How to check the token of service account?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74738733/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com