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

Модуль 4.4: Профілі Seccomp

Hands-On Lab Available
Ubuntu advanced 30 min
Launch Lab ↗

Opens in Killercoda in a new tab

Безпека Linux | Складність: [MEDIUM] | Час: 25–30 хв

Перед початком цього модуля:


Що ви зможете робити після цього модуля

Розділ «Що ви зможете робити після цього модуля»

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

  • Написати власні профілі seccomp, що дозволяють лише ті системні виклики, які потрібні контейнеру
  • Застосувати профілі seccomp до подів Kubernetes через security context
  • Дебажити порушення seccomp, відстежуючи заблоковані syscalls за допомогою strace та аудит-логів
  • Оцінити стандартний профіль seccomp Docker/containerd та вирішити, коли потрібен власний профіль

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

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

seccomp (Secure Computing Mode) фільтрує системні виклики (syscalls) на рівні ядра. На відміну від AppArmor чи SELinux, які контролюють доступ до ресурсів (файлів, мережі), seccomp контролює, чи може процес взагалі викликати певні функції ядра.

Розуміння seccomp допоможе вам:

  • Радикально зменшити поверхню атаки — повністю заборонити небезпечні виклики.
  • Зміцнювати контейнери — стандартні профілі Docker/K8s блокують ~44 небезпечні системні виклики.
  • Скласти іспит CKS — робота з профілями seccomp є важливою частиною.
  • Діагностувати помилки “Operation not permitted” — коли навіть прав root замало.

Коли контейнер видає помилку при спробі виконати дію, яку root зазвичай може робити — причиною часто є seccomp, що блокує відповідний виклик до ядра.


Фільтрація системних викликів

Розділ «Фільтрація системних викликів»
┌─────────────────────────────────────────────────────────────┐
│ SECCOMP ФІЛЬТРАЦІЯ │
├─────────────────────────────────────────────────────────────┤
│ │
│ Додаток (User Space) │
│ │ │
│ │ write(fd, buf, size) │
│ │ │
│ ▼ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ SECCOMP BPF ФІЛЬТР │ │
│ │ │ │
│ │ якщо (syscall_nr == SYS_write) → ДОЗВОЛИТИ │ │
│ │ якщо (syscall_nr == SYS_ptrace) → ВБИТИ │ │
│ │ якщо (syscall_nr == SYS_reboot) → ПЕРЕДАТИ ПОМИЛКУ│ │
│ │ │ │
│ └─────────────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ Ядро Linux виконує виклик (якщо дозволено) │
│ │
└─────────────────────────────────────────────────────────────┘

Seccomp у контейнерах та Kubernetes

Розділ «Seccomp у контейнерах та Kubernetes»

Стандартний профіль Docker

Розділ «Стандартний профіль Docker»

Docker автоматично застосовує профіль, який блокує небезпечні виклики, як-от mount, reboot, ptrace (відладка інших процесів) та завантаження модулів ядра.

В Kubernetes ви можете вказати профіль для всього Пода або конкретного контейнера:

apiVersion: v1
kind: Pod
spec:
securityContext:
seccompProfile:
type: RuntimeDefault # Використовувати стандартний профіль рантайму
containers:
- name: secure-app
image: nginx

Варіанти профілів:

Розділ «Варіанти профілів:»
  • RuntimeDefault: Стандартний захист (рекомендовано).
  • Localhost: Ваш власний JSON-профіль, що лежить на вузлі.
  • Unconfined: Жодних фільтрів (небезпечно!).

  1. У чому головна різниця між seccomp та AppArmor?

    Відповідь Seccomp фільтрує самі системні виклики (функції ядра), тоді як AppArmor фільтрує доступ до об'єктів системи (шляхів до файлів, портів тощо).
  2. Яка технологія використовується для реалізації фільтрів seccomp?

    Відповідь BPF (Berkeley Packet Filter) — та сама високоефективна технологія, що використовується для фільтрації мережевих пакетів.
  3. Що станеться з процесом, якщо він спробує виконати системний виклик, заборонений дією SCMP_ACT_KILL?

    Відповідь Ядро Linux миттєво вб'є цей процес або конкретний потік (thread), що зробив виклик.
  4. Де в Kubernetes мають лежати файли кастомних профілів seccomp на вузлі?

    Відповідь За замовчуванням у директорії `/var/lib/kubelet/seccomp/`.

Завдання: Перевірити статус seccomp для процесу.

  1. Перевірте, чи підтримує ваше ядро seccomp:
    Terminal window
    grep SECCOMP /boot/config-$(uname -r)
  2. Подивіться статус seccomp вашої поточної оболонки:
    Terminal window
    grep Seccomp /proc/$$/status
    # 0 = вимкнено, 2 = фільтрація (mode 2)
  3. Запустіть контейнер Docker і перевірте статус seccomp всередині нього:
    Terminal window
    docker run --rm alpine grep Seccomp /proc/1/status

Критерії успіху: Ви бачите, що процеси в контейнерах за замовчуванням працюють під наглядом seccomp (статус 2).


  • seccomp — останній рубіж захисту на рівні ядра.
  • Syscall filtering — блокування функцій ядра, а не файлів.
  • RuntimeDefault — обов’язковий мінімум для будь-якого пода в продакшні.
  • Помилки seccomp зазвичай проявляються як “Operation not permitted”.

Вітаємо! Ви завершили розділ «Безпека та зміцнення». Тепер ви знаєте, як захистити систему на рівні ядра, файлів та системних викликів.

Далі: Розділ 5: Продуктивність (Performance) — навчіться аналізувати та оптимізувати ресурси вашого сервера.