Autenticação e Autorização do Kubelet

Tip

Aprenda e pratique AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Aprenda e pratique Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Apoie o HackTricks

Autenticação do Kubelet

From the docss:

Por padrão, solicitações ao endpoint HTTPS do kubelet que não sejam rejeitadas por outros métodos de autenticação configurados são tratadas como solicitações anônimas, e recebem um nome de usuário system:anonymous e um grupo system:unauthenticated.

Os 3 métodos de autenticação são:

  • Anonymous (default): Defina o parâmetro --anonymous-auth=true ou a configuração:
"authentication": {
"anonymous": {
"enabled": true
},
  • Webhook: Isto irá habilitar os API bearer tokens do kubectl como autorização (qualquer token válido será aceito). Permita-o com:
  • certifique-se de que o grupo de API authentication.k8s.io/v1beta1 esteja habilitado no API server
  • inicie o kubelet com as flags --authentication-token-webhook e --kubeconfig ou use a seguinte configuração:
"authentication": {
"webhook": {
"cacheTTL": "2m0s",
"enabled": true
},

Note

O kubelet chama a TokenReview API no API server configurado para determinar informações do usuário a partir de bearer tokens

  • X509 client certificates: Permitem autenticação via X509 client certs
  • veja a apiserver authentication documentation para mais detalhes
  • inicie o kubelet com a flag --client-ca-file, fornecendo um CA bundle para verificar certificados de cliente. Ou com a config:
"authentication": {
"x509": {
"clientCAFile": "/etc/kubernetes/pki/ca.crt"
}
}

Autorização do Kubelet

Qualquer requisição que seja autenticada com sucesso (incluindo uma requisição anônima) é então autorizada. O modo de autorização padrão é AlwaysAllow, que permite todas as requisições.

No entanto, o outro valor possível é webhook (que é o que você principalmente encontrará por aí). Este modo irá verificar as permissões do usuário autenticado para permitir ou negar uma ação.

Warning

Observe que mesmo se a autenticação anônima estiver habilitada, o acesso anônimo pode não ter nenhuma permissão para executar qualquer ação.

A autorização via webhook pode ser configurada usando o param --authorization-mode=Webhook ou via o arquivo de configuração com:

"authorization": {
"mode": "Webhook",
"webhook": {
"cacheAuthorizedTTL": "5m0s",
"cacheUnauthorizedTTL": "30s"
}
},

O kubelet chama a API SubjectAccessReview no API server configurado para determinar se cada requisição está autorizada.

O kubelet autoriza API requests usando a mesma abordagem de request attributes que o apiserver:

  • Ação
Verbo HTTPverbo de requisição
POSTcreate
GET, HEADget (for individual resources), list (for collections, including full object content), watch (for watching an individual resource or collection of resources)
PUTupdate
PATCHpatch
DELETEdelete (for individual resources), deletecollection (for collections)
  • O resource que fala com a Kubelet api é sempre nodes e o subresource é determinado a partir do caminho da requisição de entrada:
Kubelet APIresourcesubresource
/stats/*nodesstats
/metrics/*nodesmetrics
/logs/*nodeslog
/spec/*nodesspec
all othersnodesproxy

Note

WebSocket-based /exec, /run, /attach, and /portforward fall into the default proxy subresource and are authorized using the initial HTTP GET handshake. A principal with only nodes/proxy GET can still exec containers if it connects directly to https://<node_ip>:10250 over WebSockets. See the nodes/proxy GET -> Kubelet /exec verb confusion abuse for details.

Por exemplo, a requisição a seguir tentou acessar as informações dos pods do kubelet sem permissão:

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)
  • Recebemos um Forbidden, então a solicitação passou a verificação de Authentication. Caso contrário, teríamos recebido apenas a mensagem Unauthorised.
  • Podemos ver o username (neste caso a partir do token)
  • Repare como o resource foi nodes e o subresource proxy (o que faz sentido com a informação anterior)

Referências

Tip

Aprenda e pratique AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Aprenda e pratique Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Apoie o HackTricks