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

Authentification du Kubelet

From the docss:

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=true ou 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/v1beta1 est activĂ© sur le serveur API
  • dĂ©marrez le kubelet avec les --authentication-token-webhook et --kubeconfig flags ou utilisez le rĂ©glage suivant:
"authentication": {
"webhook": {
"cacheTTL": "2m0s",
"enabled": true
},

Note

Le kubelet appelle l’TokenReview API 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 HTTPverbe de requĂȘte
POSTcreate
GET, HEADget (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)
PUTupdate
PATCHpatch
DELETEdelete (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 APIressourcesous-ressource
/stats/*nodesstats
/metrics/*nodesmetrics
/logs/*nodeslog
/spec/*nodesspec
tous les autresnodesproxy

Note

Les connexions WebSocket pour /exec, /run, /attach, et /portforward tombent 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 de nodes/proxy GET peut quand mĂȘme exĂ©cuter des containers s’il se connecte directement Ă  https://<node_ip>:10250 via 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

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