gpt4 book ai didi

kubernetes - kubectl --token=$TOKEN 没有使用 token 的权限运行

转载 作者:行者123 更新时间:2023-12-02 11:53:14 31 4
gpt4 key购买 nike

当我使用命令 kubectl 时与 --token标记并指定 token ,它仍然使用 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

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

我不创建新上下文,我知道kubectl具有使用不记名 token 的能力并想了解如何使用。

我也试过这个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它仍然成功并且应该失败,因为它没有权限。

编辑 2:
根据 kubectl API 正确运行它的选项:

kubectl get pods --token `cat /home/natan/token` -s https://<ip>:8443 --certificate-authority /root/.minikube/ca.crt --all-namespaces

或者没有 TLS:

kubectl get pods --token `cat /home/natan/token` -s https://<ip>:8443 --insecure-skip-tls-verify --all-namespaces

最佳答案

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

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

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

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

关于kubernetes - kubectl --token=$TOKEN 没有使用 token 的权限运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60083889/

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