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
- Check the subscription plans!
- Participe do 💬 Discord group ou do telegram group ou siga-nos no Twitter 🐦 @hacktricks_live.
- Compartilhe hacking tricks enviando PRs para os HackTricks e HackTricks Cloud github repos.
Autenticação do Kubelet
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=trueou 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/v1beta1esteja habilitado no API server - inicie o kubelet com as flags
--authentication-token-webhooke--kubeconfigou use a seguinte configuração:
"authentication": {
"webhook": {
"cacheTTL": "2m0s",
"enabled": true
},
Note
O kubelet chama a
TokenReviewAPI 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 HTTP | verbo de requisição |
|---|---|
| POST | create |
| GET, HEAD | get (for individual resources), list (for collections, including full object content), watch (for watching an individual resource or collection of resources) |
| PUT | update |
| PATCH | patch |
| DELETE | delete (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 API | resource | subresource |
|---|---|---|
| /stats/* | nodes | stats |
| /metrics/* | nodes | metrics |
| /logs/* | nodes | log |
| /spec/* | nodes | spec |
| all others | nodes | proxy |
Note
WebSocket-based
/exec,/run,/attach, and/portforwardfall into the default proxy subresource and are authorized using the initial HTTP GET handshake. A principal with onlynodes/proxyGET can still exec containers if it connects directly tohttps://<node_ip>:10250over 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
- https://kubernetes.io/docs/reference/access-authn-authz/kubelet-authn-authz/
- nodes/proxy GET -> kubelet exec via WebSocket bypass
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
- Check the subscription plans!
- Participe do 💬 Discord group ou do telegram group ou siga-nos no Twitter 🐦 @hacktricks_live.
- Compartilhe hacking tricks enviando PRs para os HackTricks e HackTricks Cloud github repos.
HackTricks Cloud

