Перейти до вмісту

Модуль 4.1: Поверхні атак

Складність: [СЕРЕДНЯ] - Обізнаність щодо загроз

Час на виконання: 25-30 хвилин

Передумови: Модуль 3.5: Мережеві політики


Що ви зможете робити

Розділ «Що ви зможете робити»

Після завершення цього модуля ви зможете:

  • Визначити поверхні атак Kubernetes через API server, kubelet, etcd та container runtime
  • Оцінити які вектори атак становлять найбільший ризик у даній конфігурації кластера
  • Оцінити зовнішніх та внутрішніх зловмисників та їхні ймовірні точки входу
  • Спроєктувати стратегії зменшення поверхні атаки шляхом відключення непотрібних точок доступу та функцій

Чому цей модуль важливий

Розділ «Чому цей модуль важливий»

Щоб захистити систему, потрібно розуміти, як її можуть атакувати. Поверхня атаки — це сума всіх точок, через які зловмисник може спробувати проникнути або витягнути дані. Kubernetes має велику поверхню атаки через свою складність — розуміння цього допомагає визначати пріоритети безпеки.

Моделювання загроз є основною навичкою безпеки, і KCSA перевіряє вашу здатність ідентифікувати та оцінювати вектори атак.


Що таке поверхня атаки?

Розділ «Що таке поверхня атаки?»
┌─────────────────────────────────────────────────────────────┐
│ ВИЗНАЧЕННЯ ПОВЕРХНІ АТАКИ │
├─────────────────────────────────────────────────────────────┤
│ │
│ Поверхня атаки = Усі точки входу, які може │
│ використати зловмисник │
│ │
│ БІЛЬША ПОВЕРХНЯ АТАКИ: │
│ • Більше відкритих сервісів │
│ • Більше відкритих портів │
│ • Більше користувачів з доступом │
│ • Складніші конфігурації │
│ = Більше можливостей для зловмисників │
│ │
│ МЕНША ПОВЕРХНЯ АТАКИ: │
│ • Мінімум відкритих сервісів │
│ • Обмежений мережевий доступ │
│ • Мало привілейованих користувачів │
│ • Прості, зміцнені конфігурації │
│ = Менше можливостей для зловмисників │
│ │
│ МЕТА: Мінімізувати поверхню атаки, зберігаючи │
│ функціональність │
│ │
└─────────────────────────────────────────────────────────────┘

Поверхні атак Kubernetes

Розділ «Поверхні атак Kubernetes»
┌─────────────────────────────────────────────────────────────┐
│ КАРТА ПОВЕРХНІ АТАК KUBERNETES │
├─────────────────────────────────────────────────────────────┤
│ │
│ ЗОВНІШНЯ ПОВЕРХНЯ АТАКИ (ззовні кластера) │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ • API-сервер Kubernetes │ │
│ │ • Ingress/Load Balancers │ │
│ │ • Сервіси NodePort │ │
│ │ • SSH до вузлів │ │
│ │ • API хмарного провайдера │ │
│ │ • Реєстри контейнерів │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
│ ВНУТРІШНЯ ПОВЕРХНЯ АТАКИ (зсередини кластера) │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ • Мережа pod-to-pod │ │
│ │ • Kubernetes API (з подів) │ │
│ │ • kubelet API │ │
│ │ • etcd │ │
│ │ • Токени службових облікових записів │ │
│ │ • Secrets │ │
│ │ • Файлова система хоста (якщо змонтована) │ │
│ │ • Середовище виконання контейнерів │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
│ ПОВЕРХНЯ АТАКИ ЛАНЦЮГА ПОСТАЧАННЯ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ • Образи контейнерів │ │
│ │ • Базові образи │ │
│ │ • Залежності застосунків │ │
│ │ • Конвеєри CI/CD │ │
│ │ • Helm-чарти/маніфести │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘

Зовнішня поверхня атаки

Розділ «Зовнішня поверхня атаки»

Відкритість API-сервера

Розділ «Відкритість API-сервера»
┌─────────────────────────────────────────────────────────────┐
│ ПОВЕРХНЯ АТАКИ API-СЕРВЕРА │
├─────────────────────────────────────────────────────────────┤
│ │
│ ПУБЛІЧНИЙ API-СЕРВЕР │
│ • Доступний з інтернету │
│ • Ціль для брутфорсу │
│ • Ціль для credential stuffing │
│ • Вразливий до експлойтів API │
│ │
│ СЦЕНАРІЇ АТАК: │
│ 1. Вкрадені облікові дані → Повний доступ до кластера │
│ 2. Увімкнений анонімний доступ → Витік інформації │
│ 3. Вразливість API → Віддалене виконання коду │
│ 4. Неправильна конфігурація RBAC → Підвищення привілеїв │
│ │
│ ЗАХОДИ ЗАХИСТУ: │
│ • Приватна точка доступу API (потрібен VPN/bastion) │
│ • Сильна автентифікація (OIDC, сертифікати) │
│ • Вимкнути анонімну автентифікацію │
│ • Правила мережевого брандмауера │
│ • Журналювання аудиту API │
│ │
└─────────────────────────────────────────────────────────────┘

Поверхня атаки Ingress

Розділ «Поверхня атаки Ingress»
┌─────────────────────────────────────────────────────────────┐
│ ПОВЕРХНЯ АТАКИ INGRESS │
├─────────────────────────────────────────────────────────────┤
│ │
│ ЩО ВІДКРИТО: │
│ • Ingress-контролер (nginx, traefik тощо) │
│ • Бекенд-застосунки через ingress │
│ • Точка завершення TLS │
│ │
│ СЦЕНАРІЇ АТАК: │
│ 1. Вразливість ingress-контролера │
│ 2. Вразливості застосунків (OWASP Top 10) │
│ 3. Неправильна маршрутизація (host header атаки) │
│ 4. Проблеми з TLS/сертифікатами │
│ 5. Обхід шляху до непередбачених бекендів │
│ │
│ ЗАХОДИ ЗАХИСТУ: │
│ • Оновлювати ingress-контролер │
│ • WAF (Web Application Firewall) │
│ • Суворі правила ingress │
│ • Сильна конфігурація TLS │
│ • Обмеження швидкості запитів │
│ │
└─────────────────────────────────────────────────────────────┘

Внутрішня поверхня атаки

Розділ «Внутрішня поверхня атаки»

З компрометованого поду

Розділ «З компрометованого поду»
┌─────────────────────────────────────────────────────────────┐
│ ПОВЕРХНЯ АТАКИ НА РІВНІ ПОДУ │
├─────────────────────────────────────────────────────────────┤
│ │
│ СЦЕНАРІЙ: Зловмисник компрометує застосунок у поді │
│ │
│ ДО ЧОГО ВОНИ МАЮТЬ ДОСТУП: │
│ │
│ ЗАВЖДИ ДОСТУПНО: │
│ ├── Файлова система контейнера │
│ ├── Змінні середовища (можуть містити секрети) │
│ ├── Змонтовані томи │
│ └── Мережа (всі поди за замовчуванням) │
│ │
│ ЯКЩО ТОКЕН ЗМОНТОВАНО (за замовчуванням): │
│ ├── Доступ до Kubernetes API │
│ ├── Дозволи службового облікового запису │
│ └── Secrets, доступні через RBAC │
│ │
│ ЯКЩО НЕПРАВИЛЬНО НАЛАШТОВАНО: │
│ ├── privileged: true → Доступ до хоста │
│ ├── Монтування hostPath → Файлова система хоста │
│ ├── hostNetwork → Мережа хоста │
│ ├── hostPID → Процеси хоста │
│ └── Надмірний RBAC → Компрометація кластера │
│ │
└─────────────────────────────────────────────────────────────┘

Поверхня атаки kubelet

Розділ «Поверхня атаки kubelet»
┌─────────────────────────────────────────────────────────────┐
│ ПОВЕРХНЯ АТАКИ KUBELET │
├─────────────────────────────────────────────────────────────┤
│ │
│ KUBELET API (порт 10250) │
│ • /exec - Виконання команд у контейнерах │
│ • /run - Запуск команд │
│ • /pods - Список подів │
│ • /logs - Читання журналів │
│ │
│ СЦЕНАРІЇ АТАК: │
│ 1. Анонімний доступ до kubelet → Виконання в будь-якому │
│ контейнері │
│ 2. Компрометація вузла → Вкрадені облікові дані kubelet │
│ 3. Мережевий доступ до kubelet → Обхід автентифікації │
│ API-сервера │
│ │
│ ЗАХОДИ ЗАХИСТУ: │
│ • Вимкнути анонімну автентифікацію │
│ • Вимкнути порт тільки для читання (10255) │
│ • Мережева ізоляція для kubelet │
│ • Режим авторизації Node │
│ │
└─────────────────────────────────────────────────────────────┘

Поверхня атаки за типом суб’єкта

Розділ «Поверхня атаки за типом суб’єкта»
┌─────────────────────────────────────────────────────────────┐
│ СУБ'ЄКТИ ЗАГРОЗ │
├─────────────────────────────────────────────────────────────┤
│ │
│ ЗОВНІШНІЙ ЗЛОВМИСНИК │
│ • Немає початкового доступу │
│ • Цілі: Відкриті сервіси, вкрадені облікові дані │
│ • Мета: Початковий плацдарм │
│ │
│ КОМПРОМЕТОВАНИЙ ПОД │
│ • Обмежений доступ до контейнера │
│ • Цілі: Інші поди, секрети, API, втеча з контейнера │
│ • Мета: Горизонтальне переміщення, ескалація │
│ │
│ ЗЛОВМИСНИЙ ІНСАЙДЕР │
│ • Легітимні облікові дані │
│ • Цілі: Зловживання дозволами, встановлення бекдорів │
│ • Мета: Крадіжка даних, закріплення │
│ │
│ ЗЛОВМИСНИК ЛАНЦЮГА ПОСТАЧАННЯ │
│ • Компрометує довірені компоненти │
│ • Цілі: Образи, залежності, CI/CD │
│ • Мета: Масова компрометація │
│ │
│ КОЖЕН СУБ'ЄКТ МАЄ РІЗНУ ПОВЕРХНЮ АТАКИ │
│ │
└─────────────────────────────────────────────────────────────┘

Зменшення поверхні атаки

Розділ «Зменшення поверхні атаки»

Принцип: мінімізація відкритості

Розділ «Принцип: мінімізація відкритості»
┌─────────────────────────────────────────────────────────────┐
│ ЗМЕНШЕННЯ ПОВЕРХНІ АТАКИ │
├─────────────────────────────────────────────────────────────┤
│ │
│ МЕРЕЖА │
│ ☐ Приватна точка доступу API-сервера │
│ ☐ Мережеві політики (заборона за замовчуванням) │
│ ☐ Без непотрібних сервісів NodePort/LoadBalancer │
│ ☐ Правила брандмауера для доступу до вузлів │
│ │
│ АВТЕНТИФІКАЦІЯ │
│ ☐ Вимкнути анонімну автентифікацію (API-сервер, kubelet) │
│ ☐ Короткочасні облікові дані │
│ ☐ Сильна автентифікація (MFA, сертифікати) │
│ │
│ НАВАНТАЖЕННЯ │
│ ☐ Без привілейованих контейнерів │
│ ☐ Без спільного доступу до просторів імен хоста │
│ ☐ Кореневий файлова система тільки для читання │
│ ☐ Вимкнути монтування токена службового облікового запису │
│ ☐ Мінімальні образи контейнерів │
│ │
│ ВУЗЛИ │
│ ☐ Мінімальна ОС (Bottlerocket, Flatcar) │
│ ☐ Вимкнути SSH, якщо можливо │
│ ☐ Регулярне оновлення │
│ │
└─────────────────────────────────────────────────────────────┘

  • Медіанний час виявлення порушення у хмарних середовищах перевищує 200 днів. Зменшення поверхні атаки означає менше місць для приховування.

  • 70% порушень включають горизонтальне переміщення після початкового доступу. Зменшення внутрішньої поверхні атаки є таким же важливим, як і захист периметра.

  • Образи контейнерів у середньому містять 400+ пакетів — кожен є частиною вашої поверхні атаки. Мінімальні образи значно зменшують відкритість.

  • API-сервер Kubernetes є однією з найпоширеніших цілей, оскільки надає прямий доступ до кластера.


ПомилкаЧому це шкодитьРішення
Публічний API-серверПряма ціль атакиПриватна точка доступу + VPN
Стандартні токени ServiceAccountНепотрібний доступ до APIВимкнути автомонтування
Мережеві політики “дозволити все”Повне горизонтальне переміщенняЗаборона за замовчуванням
Привілейовані подиМожлива компрометація хостаPod Security Standards
Великі образи контейнерівВелика поверхня атакиМінімальні/distroless образи

  1. Що становить зовнішню поверхню атаки кластера Kubernetes?

    Відповідь Точки входу, доступні ззовні кластера: API-сервер, ingress-контролери, сервіси LoadBalancer, сервіси NodePort, SSH-доступ до вузлів та будь-які інші зовнішньо відкриті точки доступу.
  2. Чому kubelet API є значною поверхнею атаки?

    Відповідь Kubelet API дозволяє виконувати команди в контейнерах, читати журнали та отримувати список подів. Якщо він не захищений належним чином (вимкнена анонімна автентифікація, обмежена мережа), його можна використати для контролю будь-якого контейнера на вузлі.
  3. Як компрометований под зазвичай розширює свою поверхню атаки?

    Відповідь Через доступ до токена ServiceAccount для запитів до Kubernetes API, сканування мережі для пошуку інших сервісів, читання змонтованих секретів/томів, і, якщо неправильно налаштовано, втечу на хост через привілейовані налаштування.
  4. Яка різниця між зовнішньою та внутрішньою поверхнею атаки?

    Відповідь Зовнішня поверхня атаки — це те, що доступно ззовні кластера (з інтернету). Внутрішня поверхня атаки — це те, що доступно зсередини кластера (pod-to-pod, API з подів). Обидві потребують захисту.
  5. Чому мінімальні образи контейнерів зменшують поверхню атаки?

    Відповідь Менше пакетів означає менше потенційних вразливостей, менше інструментів для зловмисників у разі компрометації контейнера та меншу складність для аудиту й оновлення.

Практична вправа: Оцінка поверхні атаки

Розділ «Практична вправа: Оцінка поверхні атаки»

Сценарій: Перегляньте цю конфігурацію кластера та визначте проблеми поверхні атаки:

# API Server flags
--anonymous-auth=true
--authorization-mode=AlwaysAllow
# Kubelet config
authentication:
anonymous:
enabled: true
readOnlyPort: 10255
# Sample pod
apiVersion: v1
kind: Pod
spec:
hostNetwork: true
hostPID: true
containers:
- name: app
image: ubuntu:latest
securityContext:
privileged: true

Перелічіть проблеми поверхні атаки:

Проблеми поверхні атаки

API-сервер:

  1. anonymous-auth=true — будь-хто може отримати доступ до API без автентифікації
  2. authorization-mode=AlwaysAllow — немає авторизації, всі запити дозволені

Kubelet: 3. anonymous.enabled: true — kubelet API доступний без автентифікації 4. readOnlyPort: 10255 — витік інформації, перелік подів

Под: 5. hostNetwork: true — под використовує мережу хоста, може перехоплювати трафік 6. hostPID: true — под може бачити всі процеси хоста 7. privileged: true — повний доступ до хоста, тривіальна втеча з контейнера 8. ubuntu:latest — великий образ з багатьма пакетами, змінний тег

Вплив:

  • Зовнішні зловмисники можуть отримати доступ до API без автентифікації
  • Будь-який компрометований под має повний доступ до хоста
  • Kubelet доступний для виконання команд у контейнерах
  • Інформація легко доступна для розвідки

Поверхня атаки — це сума всіх точок входу:

Тип поверхніПрикладиСтратегія зменшення
ЗовнішняAPI-сервер, Ingress, NodePortПриватні точки доступу, брандмауери
ВнутрішняМережа подів, kubelet, API з подівМережеві політики, вимкнення токенів
Ланцюг постачанняОбрази, залежності, CI/CDСканування, підписування, мінімальні образи

Ключові принципи:

  • Що не відкрито — не може бути атаковано
  • Мінімізуйте привілеї на кожному рівні
  • Припускайте порушення, обмежуйте радіус ураження
  • Різні суб’єкти мають різні поверхні атак

Модуль 4.2: Поширені вразливості — Розуміння CVE та неправильних конфігурацій у Kubernetes.