Exposing Services in Kubernetes
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Існує різні способи експонування сервісів у Kubernetes, щоб як внутрішні, так і зовнішні кінцеві точки могли до них отримати доступ. Ця конфігурація Kubernetes є досить критичною, оскільки адміністратор може надати доступ зловмисникам до сервісів, до яких їм не слід мати доступ.
Перед тим, як почати перераховувати способи, які K8s пропонує для експонування сервісів публічно, знайте, що якщо ви можете перерахувати простори імен, сервіси та вхідні точки, ви можете знайти все, що експоновано публічно за допомогою:
Служба ClusterIP є за замовчуванням службою Kubernetes. Вона надає службу всередині вашого кластера, до якої можуть отримати доступ інші додатки всередині вашого кластера. Зовнішнього доступу немає.
Однак, до неї можна отримати доступ за допомогою Kubernetes Proxy:
Тепер ви можете переходити через API Kubernetes, щоб отримати доступ до сервісів, використовуючи цю схему:
http://localhost:8080/api/v1/proxy/namespaces/<NAMESPACE>/services/<SERVICE-NAME>:<PORT-NAME>/
Наприклад, ви можете використовувати наступну URL-адресу:
http://localhost:8080/api/v1/proxy/namespaces/default/services/my-internal-service:http/
щоб отримати доступ до цього сервісу:
Цей метод вимагає, щоб ви запускали kubectl
як авторизований користувач.
Перелічіть всі ClusterIPs:
Коли використовується NodePort, призначений порт стає доступним на всіх вузлах (які представляють віртуальні машини). Трафік, спрямований на цей конкретний порт, систематично перенаправляється на сервіс. Зазвичай цей метод не рекомендується через його недоліки.
Список усіх NodePort:
Приклад специфікації NodePort:
Якщо ви не вкажете nodePort у yaml (це порт, який буде відкритий), буде використано порт у діапазоні 30000–32767.
Відкриває Сервіс зовні за допомогою балансувальника навантаження постачальника хмари. У GKE це запустить Network Load Balancer, який надасть вам одну IP-адресу, що буде пересилати весь трафік до вашого сервісу. У AWS це запустить Load Balancer.
Вам потрібно платити за LoadBalancer за кожен відкритий сервіс, що може бути дорогим.
Список усіх LoadBalancers:
Зовнішні IP відкриваються сервісами типу Load Balancers і зазвичай використовуються, коли використовується зовнішній Load Balancer постачальника хмари.
Щоб їх знайти, перевірте наявність балансувальників навантаження з значеннями у полі EXTERNAL-IP
.
Трафік, який входить у кластер з зовнішнім IP (як цільовий IP), на порту Сервісу, буде направлений на один з кінцевих точок Сервісу. externalIPs
не керуються Kubernetes і є відповідальністю адміністратора кластера.
У специфікації Сервісу externalIPs
можуть бути вказані разом з будь-яким з ServiceTypes
. У наведеному нижче прикладі, "my-service
" може бути доступний клієнтам на "80.11.12.10:80
" (externalIP:port
)
З документації: Сервіси типу ExternalName відображають Сервіс на DNS-ім'я, а не на типовий селектор, такий як my-service
або cassandra
. Ви вказуєте ці Сервіси за допомогою параметра spec.externalName
.
Це визначення Сервісу, наприклад, відображає Сервіс my-service
в просторі імен prod
на my.database.example.com
:
Коли ви шукаєте хост my-service.prod.svc.cluster.local
, служба DNS кластера повертає запис CNAME
зі значенням my.database.example.com
. Доступ до my-service
працює так само, як і з іншими службами, але з вирішальним відмінністю, що перенаправлення відбувається на рівні DNS, а не через проксування або пересилання.
Список усіх ExternalNames:
На відміну від усіх наведених вище прикладів, Ingress НЕ є типом служби. Натомість, він знаходиться попереду кількох служб і діє як “розумний маршрутизатор” або точка входу у ваш кластер.
Ви можете робити багато різних речей з Ingress, і існує багато типів контролерів Ingress, які мають різні можливості.
Контролер Ingress за замовчуванням GKE створить для вас HTTP(S) Load Balancer. Це дозволить вам здійснювати маршрутизацію як на основі шляху, так і на основі піддомену до бекенд-служб. Наприклад, ви можете відправити все на foo.yourdomain.com до служби foo, а все під шляхом yourdomain.com/bar/ до служби bar.
YAML для об'єкта Ingress на GKE з L7 HTTP Load Balancer може виглядати так:
Список усіх вхідних точок:
Хоча в цьому випадку краще отримувати інформацію про кожен окремо, щоб легше її читати:
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)