Контейнерная сборка НАЙС.ОС для безопасных production-образов
Что такое NiceOS.Container
Обычная серверная ОС проектируется как универсальная среда: в ней много инструментов администрирования, сервисов, shell-утилит, документации, совместимых библиотек, legacy-компонентов и сценариев для разных ролей. В контейнере такая универсальность часто превращается в балласт: больше пакетов, больше CVE-кандидатов, больше непонятных зависимостей и сложнее аудит.
NiceOS.Container решает другую задачу: собрать узкий, контролируемый и регулярно пересобираемый runtime-слой для контейнеров. Это не «полный сервер внутри контейнера», а минимальная база для запуска конкретного процесса: web-сервера, базы данных, экспортёра, CLI-инструмента, прикладного сервиса или совместимого migration-target образа.
Идеология проста: меньше лишнего, новее исправления, чаще пересборки, прозрачнее состав, быстрее закрытие CVE. Поэтому контейнерная ветка НАЙС.ОС живёт отдельно от универсальной серверной системы и сопровождается как специализированный stream для cloud-native инфраструктуры.
Коротко
- Отдельная сборка: NiceOS.Container — самостоятельный облегчённый stream, а не просто профиль обычной ОС.
- Контейнерный runtime: без systemd, без фоновой «серверной ОС», с запуском через entrypoint/foreground-процесс.
- RPM-controlled provenance: состав образа строится из контролируемых RPM-пакетов и spec-файлов.
- Supply chain: SBOM, сканирование Grype/Trivy, immutable tags и digest как обязательная часть релиза.
Почему не обычная ОС в контейнере
Контейнер — это не виртуальная машина. Ему не нужен полный набор серверных ролей, init-система, лишние сервисы и инструменты администрирования. Чем больше внутри образа компонентов, тем шире поверхность атаки и тем больше работы для CVE-процесса.
Проблема универсальных баз
- в образ попадают shell, package manager, документация, debug-утилиты и системные инструменты, которые не нужны приложению;
- каждый лишний пакет добавляет зависимости, CVE-события и работу по анализу ложных/актуальных уязвимостей;
- обновления часто завязаны на жизненный цикл большой ОС, а не на скорость закрытия конкретной уязвимости;
- сложнее доказать, что именно находится внутри образа и почему конкретный компонент там нужен;
- контейнер начинает вести себя как маленькая VM, а не как воспроизводимый runtime-артефакт.
Подход NiceOS.Container
- формируем минимальный runtime под задачу образа: только приложение и обязательные библиотеки;
- удаляем package managers, build tools, кэши, man/info/docs и всё, что не требуется в финальном runtime;
- пересобираем базовые и прикладные слои часто, чтобы быстрее подтягивать исправления upstream;
- фиксируем версию образа, ревизию, stream НАЙС.ОС, digest, SBOM и scan-результаты;
- разделяем build-stage и final runtime: сборка может быть удобной, финальный образ должен быть чистым.
Идеология контейнерной сборки
Новейшее сопровождаемое ПО
Используем актуальные стабильные upstream-релизы и быстро пересобираем пакеты при выходе исправлений. Цель — не «заморозить» runtime на годы, а держать контейнерный слой рядом с текущим безопасным состоянием upstream.
Практически ежедневные пересборки
Базовые и прикладные образы можно пересобирать часто даже без изменения версии приложения: меняются системные библиотеки, CA, tzdata, runtime-зависимости, CVE-метаданные и scan-база.
Near-zero known CVE как процесс
«Near-zero CVE» — это не рекламная гарантия, а операционная модель: минимизация пакетов, быстрые rebuild-циклы, SBOM, сканирование и повторный выпуск образа, когда обнаружена устранимая уязвимость.
Отсутствие лишних пакетов
В финальном runtime не должно быть компиляторов, сборочных систем, package managers, systemd, SSHD, временных файлов, repo metadata и диагностических инструментов, если они не нужны самому workload.
Контроль версий и происхождения
Пакеты проходят через spec-файлы, release-ревизии, теги исходников, immutable image tags, OCI-labels и digest. Это позволяет понять, из чего собран образ и чем он отличается от предыдущего.
SBOM и сканирование
Для релизов формируется состав компонентов, а образы проверяются инструментами Grype и Trivy. Результаты сканирования используются как вход в release-gate и CVE-процесс.
Что мы делаем последовательно
NiceOS.Container строится как повторяемая фабрика образов: от исходников и RPM-пакетов — к минимальному rootfs, OCI-образу, SBOM, сканированию, immutable-тегу и публикации. Это не ручная «сборка Dockerfile на сервере», а контролируемый pipeline с проверяемыми этапами.
Мониторинг upstream, CVE и релизов
Отслеживаем новые версии приложений, системных библиотек, runtime-зависимостей и базы уязвимостей. Для контейнеров важна скорость реакции: исправление должно попадать в новый образ без ожидания большого релиза ОС.
Сборка RPM-пакетов в NiceOS.Container stream
Компоненты собираются как RPM с контролируемыми spec-файлами, зависимостями и changelog. Это даёт управляемую provenance-модель и возможность повторить состав образа.
Формирование минимального container rootfs
В installroot попадают только необходимые runtime-пакеты. Build-only инструменты остаются в сборочном слое и не переходят в финальный образ.
Сборка базовых и прикладных OCI-образов
На базе NiceOS.Container собираются base-слои, compatibility-слои и прикладные образы: NGINX, Redis Open Source, Git, exporters и другие сервисы.
Очистка финального runtime
Удаляются package managers, build tools, кэши, временные файлы, repo metadata, лишние docs/man/info и сервисные компоненты, которые не нужны в production-контейнере.
SBOM, Grype, Trivy и release-gate
Для образа фиксируется состав компонентов, затем выполняется сканирование. Если уязвимость устранима обновлением или пересборкой, образ не должен «лежать месяцами» в старом состоянии.
Публикация immutable tags и digest
Релиз получает предсказуемый тег, ревизию, OCI-labels и digest. В production рекомендуется использовать immutable tag или digest, а не полагаться на плавающий latest.
Повторный цикл пересборки
Даже если приложение не изменилось, образ может быть пересобран ради системных исправлений, обновления CA/tzdata, закрытия CVE или улучшения состава runtime.
Supply chain: контроль состава, версий и уязвимостей
Для контейнерной платформы мало сказать «образ свежий». Нужно показать, что внутри, как он собран, какой digest опубликован, какие проверки прошёл и что изменилось между релизами.
| Контроль | Что фиксируем | Зачем это нужно |
|---|---|---|
| RPM provenance | пакет, версия, release, spec-файл, changelog, зависимости | понять, из каких исходников и правил сборки появился компонент |
| SBOM | перечень компонентов и библиотек в образе | быстро сопоставлять состав образа с CVE-базами и внутренним аудитом |
| Grype / Trivy | результаты сканирования образа на известные уязвимости | не выпускать образ «вслепую» и отслеживать устранимые CVE |
| Immutable tags | <appVersion>-niceos<stream>-r<revision> |
однозначно связать runtime с версией приложения, потоком ОС и ревизией образа |
| Digest | sha256 digest опубликованного OCI-образа | закрепить ровно тот артефакт, который прошёл проверки |
| Runtime cleanup | отсутствие package managers, build tools, лишних сервисов и кэшей | снизить поверхность атаки и количество CVE-кандидатов |
Какие образы строятся на базе NiceOS.Container
Базовые runtime-слои
Минимальная glibc/RPM-база для запуска приложений и сборки более специализированных образов. В ней нет цели заменить полноценную серверную ОС — это фундамент для контейнеров.
- минимальный userspace;
- контролируемые RPM-зависимости;
- предсказуемые теги и ревизии;
- регулярный rebuild под CVE-процесс.
Compatibility-слои
Для миграции популярных контейнерных сценариев нужны не только бинарники, но и привычный runtime contract: пути, env-переменные, UID/GID, entrypoint-поведение, probes и volume-структура.
/opt/bitnamiи совместимые runtime-пути там, где это нужно для миграции;- non-root UID/GID 1001 для совместимых образов;
*_FILEhandling для секретов;- поддержка read-only root filesystem и Kubernetes-паттернов.
Прикладные production-образы
NGINX, Redis Open Source, Git, exporters, WAF/EdgeShield-компоненты и другие образы собираются как отдельные app-репозитории, а не как случайные Dockerfile-форки.
- отдельный app repository и changelog;
- release manifest и digest;
- smoke/regression-тесты;
- публикация в registry с immutable tags.
Marketplace и Helm-сценарии
На той же базе можно собирать контейнерные продукты для облачных маркетплейсов, Docker Compose, Helm chart, Kubernetes и закрытых корпоративных registry.
- единая база для Docker/Kubernetes;
- параметризация через env и secret-файлы;
- образ + chart + SBOM + scan как единый релиз;
- готовность к закрытым контурам и внутренним зеркалам.
Политика версий и тегов
Главный принцип: production должен ссылаться на проверяемый и повторяемый артефакт. Поэтому у образа есть версия приложения, stream NiceOS.Container, revision сборки и digest.
1.31.1-niceos13-r1
Immutable tag. Версия приложения + поток NiceOS.Container + ревизия образа. Рекомендуется для production.
sha256:...
Digest. Максимально точная фиксация конкретного OCI-артефакта после публикации и проверки.
latest
Convenience channel. Удобен для знакомства и тестов, но не должен быть единственной ссылкой в production.
Пример эксплуатационной проверки образа
NiceOS.Container ориентирован на проверяемость. Образ можно подтянуть, запустить smoke-test, просканировать и закрепить в deployment по immutable tag или digest.
docker pull docker.io/niceos/nginx:1.31.1-niceos13-r1
docker run --rm \
docker.io/niceos/nginx:1.31.1-niceos13-r1 \
nginx -v
docker image inspect \
docker.io/niceos/nginx:1.31.1-niceos13-r1 \
--format '{{json .RepoDigests}}'
trivy image \
docker.io/niceos/nginx:1.31.1-niceos13-r1
grype \
docker.io/niceos/nginx:1.31.1-niceos13-r1
# production-рекомендация:
# закреплять deployment на immutable tag или digest
Часто задаваемые вопросы
systemctl, без daemon-reload и без service enable/start внутри образа.
tdnf, dnf, yum,
компиляторов, сборочных систем и repo metadata.
Начните с пилота: один app, один registry, один CVE-регламент
Лучший способ проверить подход — взять один реальный сервис, собрать его на NiceOS.Container, сформировать SBOM, пройти Grype/Trivy, закрепить digest и сравнить состав образа с текущей базой.