Профили Seccomp
Тема дорожной карты · Docker & Containers
Seccomp (secure computing mode) — это механизм ядра Linux, который позволяет фильтровать системные вызовы (syscall'ы) процесса. Docker по умолчанию использует профиль Seccomp, который блокирует несколько десятков потенциально опасных syscall'ов. Пользователи могут загружать кастомные профили через параметр docker run --security-opt seccomp=profile.json. Отключение Seccomp (seccomp=unconfined) допустимо только для отладки и не рекомендуется для использования в продакшне. Часто пользователи сталкиваются с ошибками, когда слишком строгий профиль ломает рантаймы (например, отладчик Node.js или JIT в JVM). Тихие ошибки EPERM также могут быть трудны для диагностики, но помогают инструменты strace и audit-логи. Для продвинутых сценариев можно использовать генерацию профиля под конкретное приложение через oci-seccomp-bpf-hook или eBPF-инструменты.
Как это работает
Профили Seccomp имеют несколько уровней защиты: контент образа (включая CVE в базовых системах, коде и зависимостях), процесс сборки (недоверенные RUN команды, утечки секретов), runtime (использование root внутри контейнера, capabilities, seccomp, AppArmor/SELinux), а также хост (обновления ядра, экспозиция daemon-сокета). Hardening начинается с минимального базового образа (например, distroless, alpine или scratch), запуска не-root (USER 10000:10000), а также сброса capabilities (--cap-drop ALL --cap-add NET_BIND_SERVICE).
Когда применять
Профили Seccomp следует применять с самого начала разработки — ретрофит безопасности в существующие системы может быть болезненным. Сканирование образов каждого CI через инструменты, такие как Trivy или Grype, помогает выявлять критические уязвимости (CRITICAL CVE) и отменять билды, содержащие их. Корневая файловая система (ФС) должна быть в режиме read-only везде, где это возможно, особенно если приложение позволяет это. Docker daemon socket не следует монтировать в контейнер, за исключением явно изолированных CI-раннеров. Для многопользовательских нагрузок следует использовать более глубокую изоляцию (например, gVisor, Kata Containers), так как стандартные namespaces могут оказаться недостаточными.
Типичные ошибки
Типичные ошибки при использовании профилей Seccomp включают запуск всего под root внутри контейнера ("контейнер же изолирован" — до kernel-CVE или docker.sock); игнорирование уязвимостей (CVE) на основе того, что определённый эндпойнт не открыт ("defence-in-depth" — всё равно следует исправлять); использование параметра --privileged, чтобы заставить какую-то библиотеку работать (это предоставляет kernel-level root); использование переменных окружения для хранения API-ключей (они остаются в истории). Аудит образов следует проводить раз в квартал, даже если код приложения не меняется.