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

Модуль 3.1: Безпека подів

Складність: [СЕРЕДНЯ] - Основні знання

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

Передумови: Модуль 2.4: PKI та сертифікати


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

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

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

  • Оцінити налаштування SecurityContext для виявлення небезпечних конфігурацій (privileged, hostPID, root)
  • Оцінити рівень ризику профілів Pod Security Standards: privileged, baseline та restricted
  • Пояснити як Pod Security Admission застосовує стандарти безпеки на рівні простору імен
  • Визначити специфікації подів, що дозволяють втечу з контейнера або підвищення привілеїв

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

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

Поди - це місце, де працює ваш код. Вони також є місцем, де атакуючі намагаються отримати доступ та підвищити привілеї. Контролі безпеки подів визначають, чи може контейнер вирватися на хост, отримати доступ до чутливих ресурсів або переміщуватися бічно через ваш кластер.

Розуміння SecurityContext та Pod Security Standards є необхідним як для іспиту KCSA, так і для захисту реальних навантажень Kubernetes.


SecurityContext визначає параметри привілеїв та контролю доступу:

SecurityContext контейнера

Розділ «SecurityContext контейнера»
apiVersion: v1
kind: Pod
metadata:
name: secure-pod
spec:
containers:
- name: app
image: nginx:1.25
securityContext:
# НАЛАШТУВАННЯ КОРИСТУВАЧА
runAsUser: 1000 # Запуск від не-root
runAsGroup: 1000 # Основна група
runAsNonRoot: true # Збій якщо образ від root
# ФАЙЛОВА СИСТЕМА
readOnlyRootFilesystem: true # Запобігти запису
# ПІДВИЩЕННЯ ПРИВІЛЕЇВ
allowPrivilegeEscalation: false # Блокувати setuid/setgid
privileged: false # Не привілейований
# CAPABILITIES
capabilities:
drop:
- ALL # Скинути всі capabilities
add:
- NET_BIND_SERVICE # Додати лише потрібні
# SECCOMP
seccompProfile:
type: RuntimeDefault # Профіль середовища виконання

Ключові поля SecurityContext

Розділ «Ключові поля SecurityContext»
ПолеПризначенняБезпечне значення
runAsNonRootЗапобігти запуску від roottrue
runAsUserКонкретний ID користувачаНенульовий (не root)
readOnlyRootFilesystemЗапобігти записуtrue
allowPrivilegeEscalationБлокувати setuid/setgidfalse
privilegedПовний доступ до хостаfalse
capabilities.dropВидалити Linux capabilities["ALL"]
seccompProfileФільтрація системних викликівRuntimeDefault

Pod Security Standards визначають три профілі безпеки:

┌─────────────────────────────────────────────────────────────┐
│ СТАНДАРТИ БЕЗПЕКИ ПОДІВ │
├─────────────────────────────────────────────────────────────┤
│ │
│ PRIVILEGED (Найдозвільніший) │
│ ├── Без обмежень │
│ ├── Для: Довірені системні навантаження, CNI, логування │
│ └── Ризик: Можливий повний доступ до хоста │
│ │
│ BASELINE (Помірний) │
│ ├── Запобігає відомим підвищенням привілеїв │
│ ├── Блокує: hostNetwork, hostPID, privileged │
│ ├── Дозволяє: root-користувач, більшість capabilities │
│ └── Для: Більшості застосунків │
│ │
│ RESTRICTED (Найбезпечніший) │
│ ├── Сильно обмежений, слідує найкращим практикам │
│ ├── Вимагає: не-root, файлову систему лише для читання │
│ ├── Блокує: Майже все небезпечне │
│ └── Для: Навантажень з вимогами безпеки │
│ │
│ РЕКОМЕНДАЦІЯ: Почніть з Restricted, послабте за потреби │
│ │
└─────────────────────────────────────────────────────────────┘

Що блокує кожен стандарт

Розділ «Що блокує кожен стандарт»
КонтрольPrivilegedBaselineRestricted
hostNetworkДозволеноЗаблокованоЗаблоковано
hostPIDДозволеноЗаблокованоЗаблоковано
privilegedДозволеноЗаблокованоЗаблоковано
runAsRootДозволеноДозволеноЗаблоковано
allowPrivilegeEscalationДозволеноДозволеноЗаблоковано
seccompProfileДозволеноДозволеноОбов’язково

PSA - вбудований механізм впровадження Pod Security Standards:

┌─────────────────────────────────────────────────────────────┐
│ РЕЖИМИ ВПРОВАДЖЕННЯ PSA │
├─────────────────────────────────────────────────────────────┤
│ │
│ ENFORCE │
│ • Блокує поди, що порушують стандарт │
│ • Створення поду не вдається │
│ • Для: Впровадження на продакшн │
│ │
│ AUDIT │
│ • Логує порушення, але дозволяє створення поду │
│ • Записує в лог аудиту │
│ • Для: Виявлення порушень перед впровадженням │
│ │
│ WARN │
│ • Показує попередження, але дозволяє створення поду │
│ • Попередження у відповіді API │
│ • Для: Навчання розробників │
│ │
└─────────────────────────────────────────────────────────────┘

PSA налаштовується через мітки простору імен:

apiVersion: v1
kind: Namespace
metadata:
name: production
labels:
pod-security.kubernetes.io/enforce: baseline
pod-security.kubernetes.io/enforce-version: latest
pod-security.kubernetes.io/warn: restricted
pod-security.kubernetes.io/warn-version: latest
pod-security.kubernetes.io/audit: restricted
pod-security.kubernetes.io/audit-version: latest

  • Pod Security Admission замінив PodSecurityPolicy (PSP), який було видалено у 1.25. PSA простіший, але менш гнучкий.

  • Стандарт restricted PSS базується на CIS Benchmark та практиках зміцнення. Його дотримання значно зменшує поверхню атаки.

  • allowPrivilegeEscalation: false запобігає роботі бінарних файлів setuid. Тому деякі контейнери, що працюють від root, ламаються з цим налаштуванням.


ПомилкаЧому це шкодитьРішення
Запуск від rootВищий привілей при компрометаціїrunAsNonRoot: true
Не скидати capabilitiesБільше привілеїв ніж потрібноcapabilities.drop: [“ALL”]
privileged: trueПовний доступ до хостаКонкретні capabilities замість
Файлова система для записуАтакуючий може зберігати зміниreadOnlyRootFilesystem: true
Без профілю seccompВсі системні виклики доступніtype: RuntimeDefault

  1. Яка різниця між runAsNonRoot та runAsUser?

    Відповідь runAsNonRoot - булеве значення, що змушує контейнер не запускатися, якщо образ працюватиме від root (UID 0). runAsUser явно встановлює UID. Вони працюють разом - runAsUser: 1000 встановлює UID, runAsNonRoot: true перевіряє, що він не 0.
  2. Що запобігає allowPrivilegeEscalation: false?

    Відповідь Запобігає процесам отримувати більше привілеїв, ніж батьківський, блокуючи роботу бінарних файлів setuid та setgid. Це зупиняє поширені техніки підвищення привілеїв.
  3. Який Pod Security Standard підходить для більшості продакшн-застосунків?

    Відповідь Baseline для більшості застосунків (запобігає відомим підвищенням привілеїв), Restricted для навантажень з вимогами безпеки. Починайте з Restricted та послаблюйте за потреби.
  4. Яка різниця між режимами PSA enforce, warn та audit?

    Відповідь Enforce блокує невідповідні поди. Warn дозволяє під, але показує попередження. Audit дозволяє під, але логує порушення. Можна використовувати різні режими на різних рівнях.
  5. Чому privileged: true небезпечний?

    Відповідь Він надає контейнеру всі Linux capabilities та доступ до всіх пристроїв хоста. Скомпрометований привілейований контейнер може монтувати файлову систему хоста, отримати доступ до всіх ресурсів хоста та фактично має root-доступ до хоста.

Безпека подів - це обмеження того, що контейнери можуть робити:

КонтрольПризначенняБезпечне значення
runAsNonRootЗапобігти roottrue
readOnlyRootFilesystemЗапобігти записуtrue
allowPrivilegeEscalationБлокувати setuidfalse
privilegedБлокувати доступ до хостаfalse
capabilitiesОбмежити привілеїdrop: ["ALL"]
seccompProfileФільтрація syscallsRuntimeDefault

Pod Security Standards:

  • Privileged: Без обмежень (системні навантаження)
  • Baseline: Запобігає відомим підвищенням привілеїв
  • Restricted: Сильно зміцнений, найкраща практика

Модуль 3.2: Основи RBAC - Контроль доступу на основі ролей для авторизації Kubernetes.