【问题标题】:kubectl --token=$TOKEN doesn't run with the permissions of the tokenkubectl --token=$TOKEN 不以令牌的权限运行
【发布时间】:2020-05-21 20:17:22
【问题描述】:

当我使用带有--token 标志的命令kubectl 并指定一个令牌时,它仍然使用来自kubeconfig 文件的管理员凭据。

这就是我所做的:

NAMESPACE="default"
SERVICE_ACCOUNT_NAME="sa1"
kubectl create sa $SERVICE_ACCOUNT_NAME
kubectl create clusterrolebinding list-pod-clusterrolebinding \
     --clusterrole=list-pod-clusterrole \
     --serviceaccount="$NAMESPACE":"$SERVICE_ACCOUNT_NAME"
kubectl create clusterrole list-pod-clusterrole \
     --verb=list \
     --resource=pods

TOKEN=`kubectl get secrets $(kubectl get sa $SERVICE_ACCOUNT_NAME -o json | jq -r '.secrets[].name') -o json | jq -r '.data.token' | base64 -d`

# Expected it will fail but it doesn't because it uses the admin credentials
kubectl get secrets --token $TOKEN

令牌有权列出 pod,所以我预计 kubectl get secrets --token $TOKEN 会失败,但它不会失败,因为它仍然使用管理员的上下文。

我不创建新的上下文,我知道kubectl 有这种使用不记名令牌的能力并且想了解如何做到这一点。

我也试过这个kubectl get secrets --insecure-skip-tls-verify --server https://<master_ip>:6443 --token $TOKEN,它也没有返回Forbidden 结果。

如果你测试它,你可以使用 katacoda:
https://www.katacoda.com/courses/kubernetes/playground

编辑:

我试图用这个来创建上下文:

NAMESPACE="default"
SERVICE_ACCOUNT_NAME="sa1"
CONTEXT_NAME="sa1-context"
USER_NAME="sa1-username"
CLUSTER_NAME="kubernetes"

kubectl create sa "$SERVICE_ACCOUNT_NAME" -n "$NAMESPACE"
SECRET_NAME=`kubectl get serviceaccounts $SERVICE_ACCOUNT_NAME -n $NAMESPACE -o json | jq -r '.secrets[].name'`
TOKEN=`kubectl get secrets $SECRET_NAME -n $NAMESPACE -o json | jq -r '.data | .token' | base64 -d`

# Create user with the JWT token of the service account
echo "[*] Setting credentials for user: $USER_NAME"
kubectl config set-credentials $USER_NAME --token=$TOKEN

# Makue sure the cluster name is correct !!!
echo "[*] Setting context: $CONTEXT_NAME"
kubectl config set-context $CONTEXT_NAME \
--cluster=$CLUSTER_NAME \
--namespace=$NAMESPACE \
--user=$USER_NAME

但是当我尝试kubectl get secrets --context $CONTEXT_NAME 时,它仍然成功并且应该失败,因为它没有权限。

【问题讨论】:

    标签: kubernetes kubectl bearer-token


    【解决方案1】:

    此命令将帮助您验证服务帐户的授权。

    kubectl auth can-i <verb> <resources> --as=system:serviceaccount:<namespace>:<service account name>
    
    kubectl auth can-i get pods --as=system:serviceaccount:default:default
    

    【讨论】:

    • 我看到我的用户 sa1 有权列出 pod 但不能列出机密。所以权限是正确的。
    【解决方案2】:

    这很棘手,因为如果您使用客户端证书对 kubernetes API 服务器进行身份验证,则使用 kubectl 覆盖令牌将不起作用,因为使用证书的身份验证发生在 TLS 握手期间的早期过程中。即使您在kubectl 它将被忽略。这就是您能够获取机密的原因,因为客户端证书有权获取机密并且令牌被忽略。

    因此,如果您想使用 kubectl 令牌,kubeconfig 文件不应具有客户端证书,然后您可以在 Kubectl 中使用 --token 标志覆盖该令牌。请参阅question 中有关如何为服务帐户令牌创建 kubeconfig 文件的讨论。

    您还可以使用命令查看在 kubectl 命令中发送的不记名令牌

    kubectl get pods --v=10 2>&1 | grep -i bearer
    

    【讨论】:

      猜你喜欢
      • 2016-09-06
      • 2022-10-21
      • 1970-01-01
      • 2016-08-31
      • 1970-01-01
      • 1970-01-01
      • 2021-06-06
      • 2016-04-09
      相关资源
      最近更新 更多