当我使用带有--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
它仍然成功并且应该失败,因为它没有权限。
编辑 2:
Option 以基于 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 覆盖令牌将不起作用,因为使用证书进行身份验证发生在 TLS 握手期间的过程早期。即使您在 kubectl 中提供了令牌,它也将被忽略。这就是您能够获取机密的原因,因为客户端证书有权获取机密,而令牌将被忽略。
因此,如果你想使用 kubectl 令牌,kubeconfig 文件不应该有客户端证书,然后你可以在 Kubectl 中使用--token
标志覆盖该令牌。请参阅问题中有关如何为服务帐户令牌创建 kubeconfig 文件的讨论。
您还可以使用命令查看在 kubectl 命令中发送的持有者令牌
kubectl get pods --v=10 2>&1 | grep -i bearer
此命令将帮助您验证服务帐户的授权。
kubectl auth can-i <verb> <resources> --as=system:serviceaccount:<namespace>:<service account name>
kubectl auth can-i get pods --as=system:serviceaccount:default:default