Seccomp
Базова інформація
Seccomp, що означає Secure Computing mode, є функцією безпеки ядра Linux, призначеною для фільтрації системних викликів. Він обмежує процеси до обмеженого набору системних викликів (exit()
, sigreturn()
, read()
та write()
для вже відкритих файлових дескрипторів). Якщо процес намагається викликати щось інше, він завершується ядром за допомогою SIGKILL або SIGSYS. Цей механізм не віртуалізує ресурси, але ізолює процес від них.
Є два способи активації seccomp: через системний виклик prctl(2)
з PR_SET_SECCOMP
, або для ядер Linux версії 3.17 і вище, системний виклик seccomp(2)
. Старий метод активації seccomp шляхом запису в /proc/self/seccomp
був застарілий на користь prctl()
.
Покращення, seccomp-bpf, додає можливість фільтрувати системні виклики з налаштовуваною політикою, використовуючи правила Berkeley Packet Filter (BPF). Це розширення використовується програмним забезпеченням, таким як OpenSSH, vsftpd та браузери Chrome/Chromium на Chrome OS та Linux для гнучкого та ефективного фільтрування системних викликів, пропонуючи альтернативу тепер не підтримуваному systrace для Linux.
Оригінальний/Строгий режим
У цьому режимі Seccomp дозволяє лише системні виклики exit()
, sigreturn()
, read()
та write()
для вже відкритих файлових дескрипторів. Якщо будь-який інший системний виклик виконується, процес вбивається за допомогою SIGKILL
Seccomp-bpf
Цей режим дозволяє фільтрувати системні виклики за допомогою налаштованої політики, реалізованої за допомогою правил фільтрації пакетів Berkeley.
Seccomp в Docker
Seccomp-bpf підтримується Docker для обмеження syscalls з контейнерів, що ефективно зменшує площу атаки. Ви можете знайти заблоковані syscalls за замовчуванням на https://docs.docker.com/engine/security/seccomp/ та профіль за замовчуванням seccomp можна знайти тут https://github.com/moby/moby/blob/master/profiles/seccomp/default.json. Ви можете запустити контейнер Docker з іншою політикою seccomp за допомогою:
Якщо ви, наприклад, хочете заборонити контейнеру виконувати деякі системні виклики, такі як uname
, ви можете завантажити профіль за замовчуванням з https://github.com/moby/moby/blob/master/profiles/seccomp/default.json і просто видалити рядок uname
зі списку.
Якщо ви хочете переконатися, що деякий виконуваний файл не працює всередині контейнера Docker, ви можете використовувати strace, щоб перерахувати системні виклики, які використовує цей виконуваний файл, а потім заборонити їх.
У наступному прикладі виявлені системні виклики uname
:
Якщо ви використовуєте Docker лише для запуску додатка, ви можете створити профіль за допомогою strace
та дозволити лише необхідні системні виклики.
Приклад політики Seccomp
Щоб проілюструвати функцію Seccomp, давайте створимо профіль Seccomp, який вимикає системний виклик "chmod".
У вищезазначеному профілі ми встановили дію за замовчуванням на "дозвіл" і створили чорний список для вимкнення "chmod". Щоб бути більш безпечним, ми можемо встановити дію за замовчуванням на відмову і створити білий список для вибіркового увімкнення системних викликів. Наведений нижче вивід показує, що виклик "chmod" повертає помилку через його вимкнення в профілі seccomp.
Наступний вивід показує "docker inspect", що відображає профіль:
Вимкніть його в Docker
Запустіть контейнер з прапорцем: --security-opt seccomp=unconfined
З початку версії Kubernetes 1.19, seccomp увімкнено за замовчуванням для всіх Подів. Однак профіль seccomp за замовчуванням, який застосовується до Подів, - це профіль "RuntimeDefault", який надається контейнерним середовищем виконання (наприклад, Docker, containerd). Профіль "RuntimeDefault" дозволяє більшість системних викликів, блокуючи кілька, які вважаються небезпечними або загалом не потрібними для контейнерів.
Last updated