kubectl --token = $ TOKEN не запускается с разрешениями токена - PullRequest
1 голос
/ 05 февраля 2020

Когда я использую команду kubectl с флагом --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

Токен имеет права на список модулей, поэтому я ожидаю, что 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 ]

3 голосов
/ 06 февраля 2020

Это сложно, потому что, если вы используете клиентский сертификат для аутентификации на сервере API kubernetes, переопределение токена с kubectl не будет работать, потому что аутентификация с сертификатом происходит в начале процесса во время рукопожатия TLS. Даже если вы предоставляете токен в kubectl будет игнорироваться. Это причина, по которой вы можете получить секреты, потому что у сертификата клиента есть разрешение на получение секретов, а токен игнорируется.

Так что если вы хотите использовать токен kubectl, файл kubeconfig должен не имеет сертификата клиента, и вы можете переопределить этот токен с флагом --token в Kubectl См. Обсуждение в вопрос о том, как создать файл kubeconfig для токена учетной записи службы.

Также вы можете просмотреть токен переноса, отправленный в команде kubectl, с помощью команды

kubectl get pods --v=10 2>&1 | grep -i bearer
1 голос
/ 06 февраля 2020

Эта команда поможет вам проверить авторизацию учетной записи службы.

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

kubectl auth can-i get pods --as=system:serviceaccount:default:default
...