Аутентифікація та авторизація kubelet
Tip
Вивчайте та практикуйте AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Вивчайте та практикуйте Az Hacking:HackTricks Training Azure Red Team Expert (AzRTE)
Підтримайте HackTricks
- Перегляньте the subscription plans!
- Приєднуйтесь до 💬 Discord group або до telegram group або стежте за нами в Twitter 🐦 @hacktricks_live.
- Діліться hacking tricks, надсилаючи PRs до HackTricks та HackTricks Cloud github repos.
Аутентифікація kubelet
За замовчуванням запити до HTTPS-ендпоінта kubelet, які не відхиляються іншими налаштованими методами аутентифікації, вважаються анонімними запитами і отримують ім’я користувача system:anonymous та групу system:unauthenticated.
Існує 3 методи аутентифікації:
- Anonymous (за замовчуванням): встановіть параметр
--anonymous-auth=trueабо в конфігурації:
"authentication": {
"anonymous": {
"enabled": true
},
- Webhook: Це дозволить увімкнути kubectl API bearer tokens як авторизацію (будь-який дійсний токен буде прийнятий). Дозвольте це за допомогою:
- переконайтеся, що група API
authentication.k8s.io/v1beta1увімкнена в API-сервері - запустіть kubelet з флагами
--authentication-token-webhookта--kubeconfigабо використайте наступну настройку:
"authentication": {
"webhook": {
"cacheTTL": "2m0s",
"enabled": true
},
Note
kubelet звертається до
TokenReviewAPI на налаштованому API-сервері, щоб визначити інформацію про користувача з bearer tokens
- X509 client certificates: Дозволяють автентифікуватися за допомогою X509 client certs
- дивіться apiserver authentication documentation для детальнішої інформації
- запустіть kubelet з прапорцем
--client-ca-file, надаючи CA bundle для перевірки client certificates. Або з конфігурацією:
"authentication": {
"x509": {
"clientCAFile": "/etc/kubernetes/pki/ca.crt"
}
}
Авторизація Kubelet
Будь-який запит, який успішно автентифіковано (включно з анонімним запитом), потім авторизується. За замовчуванням режим авторизації — AlwaysAllow, який дозволяє всі запити.
Однак іншим можливим значенням є webhook (саме це ви найчастіше зустрінете). Цей режим перевіряє права автентифікованого користувача, щоб дозволити або заборонити виконання дії.
Warning
Зверніть увагу, що навіть якщо анонімна автентифікація увімкнена, анонімний доступ може не мати жодних прав для виконання жодної дії.
Авторизацію через webhook можна налаштувати за допомогою параметра --authorization-mode=Webhook або через файл конфігурації за допомогою:
"authorization": {
"mode": "Webhook",
"webhook": {
"cacheAuthorizedTTL": "5m0s",
"cacheUnauthorizedTTL": "30s"
}
},
Kubelet викликає API SubjectAccessReview на налаштованому API-сервері, щоб визначити, чи кожен запит авторизований.
Kubelet авторизує API-запити, використовуючи той самий підхід request attributes, що й apiserver:
- Action
| HTTP verb | request verb |
|---|---|
| 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) |
- Ресурс, який опрацьовує Kubelet API, завжди — nodes, а subresource визначається з шляху вхідного запиту:
| Kubelet API | resource | subresource |
|---|---|---|
| /stats/* | nodes | stats |
| /metrics/* | nodes | metrics |
| /logs/* | nodes | log |
| /spec/* | nodes | spec |
| all others | nodes | proxy |
Note
Запити на основі WebSocket
/exec,/run,/attach, and/portforwardпотрапляють у стандартний підресурс proxy і авторизуються з використанням початкового HTTP GET рукопотискання. Принципал, у якого є лишеnodes/proxyGET, все одно може виконувати exec у контейнерах, якщо підключається безпосередньо доhttps://<node_ip>:10250через WebSockets. Див. the nodes/proxy GET -> Kubelet /exec verb confusion abuse для деталей.
Наприклад, наступний запит намагався отримати інформацію про pods kubelet без дозволу:
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)
- Ми отримали Forbidden, тому запит passed the Authentication check. Якби ні, ми б отримали лише повідомлення
Unauthorised. - Ми бачимо username (у цьому випадку з token)
- Зверніть увагу, як resource було nodes і subresource — proxy (що узгоджується з попередньою інформацією)
Посилання
- https://kubernetes.io/docs/reference/access-authn-authz/kubelet-authn-authz/
- nodes/proxy GET -> kubelet exec via WebSocket bypass
Tip
Вивчайте та практикуйте AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Вивчайте та практикуйте Az Hacking:HackTricks Training Azure Red Team Expert (AzRTE)
Підтримайте HackTricks
- Перегляньте the subscription plans!
- Приєднуйтесь до 💬 Discord group або до telegram group або стежте за нами в Twitter 🐦 @hacktricks_live.
- Діліться hacking tricks, надсилаючи PRs до HackTricks та HackTricks Cloud github repos.
HackTricks Cloud

