Проверка целостности контейнерных образов: от подписи до запуска в кластере

Вы завариваете кофе, наливаете его в свою любимую чашку и отпиваете глоток. А там – соль. Кто-то подменил содержимое, пока вы отвернулись. Примерно такое же чувство возникает, когда в production внезапно запускается контейнерный образ, в котором оказалось не ваше приложение, а что-то постороннее. Проверка целостности – это способ убедиться, что в чашке именно ваш кофе, и никто в него ничего не добавил по пути от кухни до стола.

Почему образ может «испортиться» до запуска

Представьте цепочку: разработчик собрал образ, отправил его в реестр, оттуда его скачивает оркестратор Kubernetes и запускает в кластере. На каждом этапе возможна подмена. Злоумышленник мог внедрить вредоносный код в сборку, перехватить образ в реестре или даже подменить его уже в runtime. Последствия – от утечки данных до полного компрометирования кластера.

Задача контейнерной безопасности – разорвать эту цепочку рисков. И начинается она с гарантий подлинности и неизменности. Вы должны быть уверены, что запускаете тот самый бинарный артефакт, который создали и протестировали.

Цифровая подпись: ставим печать на каждый образ

Самый надежный способ доказать целостность – диджитал подпись. Это криптографический штамп, который создатель образа ставит в момент сборки. Если кто-то изменит хотя бы один байт внутри образа после подписания, подпись станет недействительной. Система сразу это заметит и не позволит запустить контейнер.

Инструменты для подписи и проверки

  • Docker Content Trust (DCT) – встроенный механизм в Docker, использующий Notary. Он прост в использовании, но привязывает вас к экосистеме Docker. Для его работы нужен настроенный анчор доверия – ключ, который является корнем доверия для всех подписей.
  • Cosign от Sigstore – современный, быстро набирающий популярность инструмент. Он работает с любыми OCI-образами (не только Docker), интегрируется в конвейер CI/CD и использует прозрачные публичные журналы (Rekor), что упрощает аудит. Подписать образ можно одной командой: cosign sign.
  • Notary – более зрелый проект, лежащий в основе DCT. Он реализует TUF (The Update Framework) – фреймворк для безопасного обновления программного обеспечения, который защищает даже метаданные репозитория.

Выбор инструмента часто зависит от стека. Cosign отлично вписывается в философию DevSecOps, где безопасность внедряется на ранних этапах.

Проверка подлинности в реестре и при запуске

Подписать образ – полдела. Нужно обеспечить его проверку подлинности в ключевых точках.

Современные приватные реестры контейнеров, такие как Harbor или GitLab Container Registry, умеют проверять подписи. Вы можете настроить политику, которая запретит загрузку неподписанных образов или образов, подписанных неизвестным ключом. Это первый рубеж обороны.

Второй, и самый важный рубеж – это момент запуска в Kubernetes. Здесь на помощь приходят Admission Controllers. Например, Gatekeeper на основе Open Policy Agent (OPA) или специализированные контроллеры, такие как sigstore-policy-контроллер, могут проверять каждую попытку создания пода.

Вы описываете политики безопасности на языке Rego: «все образы в namespace ‘production’ должны быть подписаны ключом с определенным fingerprint». Если политика нарушена, пода просто не создастся. Это делает образы по-настоящему иммортабельными после попадания в кластер.

Целостность – это не только подпись

Даже идеально подписанный образ может содержать уязвимости или нежелательные зависимости. Поэтому проверка целостности дополняется другими практиками.

  • SBOM (Software Bill of Materials) – это «список ингредиентов» вашего образа. Cosign, например, умеет прикреплять SBOM к подписи. Вы всегда можете посмотреть, какие библиотеки и в каких версиях вошли в финальный артефакт.
  • Сканирование уязвимостей с помощью Trivy или Clair. Эти инструменты работают как контейнерный сканер, выявляя известные CVE в базовых образах и зависимостях. Интегрируйте сканирование в CI/CD до этапа подписания. Цель – не просто найти проблемы, а получить образ без уязвимостей, который можно смело подписывать и отправлять в production.
  • Проверка метаданных и контроль целостности на протяжении всего пайплайна. Отслеживайте, кто, когда и с каких систем подписал образ. Sigstore предоставляет для этого инструменты аутентификации, такие как Fulcio, которые привязывают подпись к личности разработчика через кратковременные сертификаты.

Собираем пазл: практический конвейер безопасности

Как это выглядит в жизни? Разработчик пушит код. CI/CD пайплайн запускает сборку, запускает тесты, затем – сканирование на уязвимости (Trivy). Если критических проблем нет, система автоматически генерирует SBOM и подписывает финальный образ с помощью Cosign, используя временный ключ, выпущенный для этого запуска пайплайна. Образ с подписью и SBOM отправляется в Harbor.

Harbor проверяет подпись и разрешает попадание образа в реестр. Когда деплоймент пытается запустить этот образ в Kubernetes, Gatekeeper перехватывает запрос, проверяет наличие валидной подписи от доверенного источника и только тогда разрешает создание пода. Kubernetes безопасность превращается из абстрактной цели в работающий механизм.

Настройка такой системы требует усилий, но она превращает ваши контейнеры из потенциальной угрозы в предсказуемые и доверенные единицы развертывания. Вы перестаете надеяться на лучшее и начинаете это контролировать.

➤