Authentification et autorisation du Kubelet
Tip
Apprenez & pratiquez AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Apprenez & pratiquez GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Apprenez & pratiquez Az Hacking:HackTricks Training Azure Red Team Expert (AzRTE)
Soutenez HackTricks
- Consultez les subscription plans!
- Rejoignez le đŹ Discord group ou le telegram group ou suivez-nous sur Twitter đŠ @hacktricks_live.
- Partagez des hacking tricks en soumettant des PRs aux HackTricks et HackTricks Cloud github repos.
Authentification du Kubelet
Par dĂ©faut, les requĂȘtes vers le endpoint HTTPS du kubelet qui ne sont pas rejetĂ©es par dâautres mĂ©thodes dâauthentification configurĂ©es sont traitĂ©es comme des requĂȘtes anonymes, et se voient attribuer un nom dâutilisateur system:anonymous et un groupe system:unauthenticated.
Les 3 mĂ©thodes dâauthentification sont :
- Anonymous (par défaut) : régler le paramÚtre
--anonymous-auth=trueou la configuration :
"authentication": {
"anonymous": {
"enabled": true
},
- Webhook: Cela va activer les kubectl API bearer tokens comme autorisation (tout token valide sera valide). Autorisez-le avec:
- assurez-vous que le groupe dâAPI
authentication.k8s.io/v1beta1est activé sur le serveur API - démarrez le kubelet avec les
--authentication-token-webhooket--kubeconfigflags ou utilisez le réglage suivant:
"authentication": {
"webhook": {
"cacheTTL": "2m0s",
"enabled": true
},
Note
Le kubelet appelle lâ
TokenReviewAPI sur lâAPI server configurĂ© pour dĂ©terminer les informations utilisateur Ă partir des bearer tokens
- X509 client certificates : Permettent de sâauthentifier via des certificats clients X509
- voir la apiserver authentication documentation pour plus de détails
- dĂ©marrez le kubelet avec lâoption
--client-ca-file, en fournissant un bundle CA pour vérifier les certificats clients. Ou via la config:
"authentication": {
"x509": {
"clientCAFile": "/etc/kubernetes/pki/ca.crt"
}
}
Autorisation du Kubelet
Toute requĂȘte qui est authentifiĂ©e avec succĂšs (y compris une requĂȘte anonyme) est alors autorisĂ©e. Le mode dâautorisation par dĂ©faut est AlwaysAllow, qui autorise toutes les requĂȘtes.
Cependant, lâautre valeur possible est webhook (câest ce que vous rencontrerez la plupart du temps). Ce mode va vĂ©rifier les permissions de lâutilisateur authentifiĂ© pour autoriser ou refuser une action.
Warning
Notez que mĂȘme si lâauthentification anonyme est activĂ©e, lâaccĂšs anonyme pourrait ne pas disposer de permissions pour effectuer une action.
Lâautorisation via webhook peut ĂȘtre configurĂ©e en utilisant le paramĂštre --authorization-mode=Webhook ou via le fichier de configuration avec :
"authorization": {
"mode": "Webhook",
"webhook": {
"cacheAuthorizedTTL": "5m0s",
"cacheUnauthorizedTTL": "30s"
}
},
Le kubelet appelle lâAPI SubjectAccessReview sur le serveur API configurĂ© pour dĂ©terminer si chaque requĂȘte est autorisĂ©e.
Le kubelet autorise les requĂȘtes API en utilisant la mĂȘme approche des request attributes que lâapiserver :
- Action
| Verbe HTTP | verbe de requĂȘte |
|---|---|
| POST | create |
| GET, HEAD | get (pour les ressources individuelles), list (pour les collections, y compris le contenu complet de lâobjet), watch (pour surveiller une ressource individuelle ou une collection de ressources) |
| PUT | update |
| PATCH | patch |
| DELETE | delete (pour les ressources individuelles), deletecollection (pour les collections) |
- La ressource qui sâadresse Ă lâAPI Kubelet est toujours nodes et la sous-ressource est dĂ©terminĂ©e Ă partir du chemin de la requĂȘte entrante :
| Kubelet API | ressource | sous-ressource |
|---|---|---|
| /stats/* | nodes | stats |
| /metrics/* | nodes | metrics |
| /logs/* | nodes | log |
| /spec/* | nodes | spec |
| tous les autres | nodes | proxy |
Note
Les connexions WebSocket pour
/exec,/run,/attach, et/portforwardtombent dans la sous-ressource proxy par dĂ©faut et sont autorisĂ©es en utilisant la poignĂ©e de main HTTP initiale GET. Un principal disposant uniquement denodes/proxyGET peut quand mĂȘme exĂ©cuter des containers sâil se connecte directement Ăhttps://<node_ip>:10250via WebSockets. See the nodes/proxy GET -> Kubelet /exec verb confusion abuse for details.
Par exemple, la requĂȘte suivante a essayĂ© dâaccĂ©der aux informations des pods du kubelet sans autorisation:
curl -k --header "Authorization: Bearer ${TOKEN}" 'https://172.31.28.172:10250/pods'
Forbidden (user=system:node:ip-172-31-28-172.ec2.internal, verb=get, resource=nodes, subresource=proxy)
- Nous avons reçu un Forbidden, donc la requĂȘte a passĂ© la vĂ©rification dâauthentification. Si ce nâĂ©tait pas le cas, nous aurions obtenu simplement un message
Unauthorised. - On peut voir le username (dans ce cas depuis le token)
- Vérifiez comment la resource était nodes et la subresource proxy (ce qui a du sens avec les informations précédentes)
Références
- https://kubernetes.io/docs/reference/access-authn-authz/kubelet-authn-authz/
- nodes/proxy GET -> kubelet exec via WebSocket bypass
Tip
Apprenez & pratiquez AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Apprenez & pratiquez GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Apprenez & pratiquez Az Hacking:HackTricks Training Azure Red Team Expert (AzRTE)
Soutenez HackTricks
- Consultez les subscription plans!
- Rejoignez le đŹ Discord group ou le telegram group ou suivez-nous sur Twitter đŠ @hacktricks_live.
- Partagez des hacking tricks en soumettant des PRs aux HackTricks et HackTricks Cloud github repos.
HackTricks Cloud

