seccomp (secure computing mode) — механизм ядра Linux, который ограничивает процесс конкретным набором системных вызовов: всё, чего нет в профиле, ядро обрывает ещё до выполнения, обычно возвращая EPERM вместо реального эффекта вызова. В отличие от прав доступа к файлам или capabilities, это фильтр на уровне самого интерфейса ядро-процесс — даже если процесс получил root внутри контейнера, вызов, которого нет в whitelist (например, ptrace или mount), просто не сработает.

Docker вешает дефолтный seccomp-профиль на каждый контейнер автоматически, если не указано иное — из ~300+ syscall’ов он блокирует около 44, в основном связанных с управлением ядром и отладкой (ptrace, add_key, request_key, большая часть mount). Podman и другие рантаймы на базе crun/runc используют концептуально тот же подход с собственным JSON-профилем. Отключить фильтрацию или подставить свой профиль — один флаг:

docker run --security-opt seccomp=unconfined debian:latest
docker run --security-opt seccomp=/path/to/profile.json nginx:alpine

Отключать профиль целиком стоит только для разовой диагностики — в проде это означает, что скомпрометированный процесс внутри контейнера получает доступ ко всем syscall’ам хоста, которые вообще разрешены рантаймом.

Прежде чем писать собственный профиль вместо дефолтного, полезно сначала узнать, какие вызовы приложение реально использует, а не гадать по документации. strace с фильтром по категории даёт именно это:

strace -f -e trace=%process,%network -p 1234

-f обязателен — без него не видно вызовов, сделанных дочерними процессами и воркерами. Дав приложению поработать под трейсом какое-то время (запуск, обычная нагрузка, штатное завершение), получаешь реальный список использованных вызовов — его и переносят в whitelist кастомного профиля ("action": "SCMP_ACT_ALLOW" для каждого, defaultAction: SCMP_ACT_ERRNO для всего остального). Способ грубый — короткий прогон не гарантирует, что не пропущен редкий путь кода (аварийный обработчик, запрос по таймеру раз в час), поэтому профиль, собранный так, стоит обкатать на стейджинге дольше, чем кажется достаточным, прежде чем доверять ему в проде.

#linux #security #containers