Контроль целостности — совокупность механизмов проверки контейнеров для обеспечения безопасности и их соответствия заданной конфигурации.
В Deckhouse Platform (DP) доступны следующие механизмы:
- контроль целостности пользовательской нагрузки при запуске — проверка подписи образов на этапе валидации запросов к API Kubernetes;
- контроль целостности работающих контейнеров — рантайм-аудит;
- защита целостности модулей DP — установка модулей в виде неизменяемых образов.
Контроль целостности образов на уровне контейнерного рантайма (CRI) — проверка криптографической подписи образов и защита распакованных слоёв от изменения — реализован только в редакциях DP Certified Core и Certified Pro. В остальных редакциях этот механизм недоступен (подробнее — в разделе «Контроль целостности образов на уровне CRI»).
Ограничение по редакциям относится к этому механизму, а не к DM-Verity как таковому. DM-Verity — механизм ядра Linux, который в DP используется в двух независимых сценариях: для слоёв образов контейнеров (только в Certified Core и Certified Pro) и для образов модулей платформы (во всех редакциях, см. раздел «Защита целостности модулей DP»).
Контроль целостности образов на уровне CRI
Проверка криптографической подписи образов при загрузке и старте контейнера, а также контроль неизменяемости распакованных слоёв образа с помощью DM-Verity, реализованы на уровне containerd и доступны только в редакциях DP Certified Core и Certified Pro. В этих редакциях используется доработанная версия containerd. Корневой хеш DM-Verity рассчитывается для каждого слоя образа на этапе сборки платформы и сверяется containerd при разворачивании образа. Контроль включает проверку при обращении к блокам образа и периодическую перепроверку:
- после разворачивания DM-Verity проверяет блоки образа при каждом обращении к ним во время работы контейнера;
- дополнительно containerd периодически (по умолчанию раз в час) перепроверяет уже запущенные контейнеры в защищаемых неймспейсах. При этом containerd повторно проверяет подпись манифеста образа и полностью сверяет слои образа с корневым хешем DM-Verity (
veritysetup verify). Слои проверяются не все сразу. Очередь обрабатывается по одному контейнеру в минуту, поэтому полный проход по узлу занимает тем больше времени, чем больше на нём контейнеров.
Подписи образов платформы проверяются встроенным в containerd набором публичных сертификатов; закрытый ключ подписи принадлежит поставщику платформы, добавить собственный ключ для проверки нельзя. Подробнее об этом механизме — в документации Certified Core и Certified Pro.
В остальных редакциях DP (CE, BE, SE, SE+, EE, Ultimate, Core) проверки подписи образов на уровне CRI нет:
- При использовании containerd v2 применяется snapshotter EROFS. Каждый слой OCI-образа преобразуется в отдельный файл в формате EROFS и монтируется только для чтения. Это снижает риск подмены данных в уже распакованных на узле образах, но не исключает его полностью и не заменяет проверку подлинности образа. Подробнее о переходе на containerd v2 — в разделе «Миграция container runtime на containerd v2».
- Проверка хеш-суммы SHA-256 при скачивании образа, выполняемая containerd, защищает от повреждения данных при передаче, но не подтверждает подлинность образа, поскольку не позволяет определить, кем был собран образ.
Чтобы контролировать целостность и подлинность образов пользовательских приложений в этих редакциях, используйте проверку подписи на этапе валидации запросов к API Kubernetes (подробнее — в разделе «Контроль целостности пользовательской нагрузки при запуске»).
Контроль целостности пользовательской нагрузки при запуске
Доступно в следующих редакциях DP: SE+, EE, Ultimate, Certified Core, Certified Pro.
Целостность и подлинность образов пользовательских приложений проверяются на этапе валидации запросов к API Kubernetes — до создания пода, а не на уровне CRI. Механизм реализован модулем admission-policy-engine и использует подписи, созданные с помощью Cosign.
Последовательность контроля целостности при запуске:
- На этапе сборки образ подписывается закрытым ключом с помощью Cosign. Подпись публикуется в хранилище образов контейнеров отдельным тегом и не изменяет сам образ.
- В кластере создаётся ресурс SecurityPolicy с параметром
policies.verifyImageSignatures, в котором указываются публичные ключи и шаблоны адресов образов. - При создании или обновлении пода validating-вебхук передаёт запрос Gatekeeper, который обращается к компоненту Ratify.
- Ratify проверяет подпись образа по указанным публичным ключам.
- Если подпись отсутствует или не соответствует указанным ключам, создание пода запрещается.
Дополнительно можно ограничить перечень хранилищ образов контейнеров, из которых разрешён запуск подов, с помощью параметра policies.allowedRepos ресурса OperationPolicy.
Подробнее о настройке — в разделе «Проверка подписи образов».
Контроль целостности работающих контейнеров
Рантайм-аудит в DP включает в себя анализ событий ядра Linux и аудита событий API Kubernetes. Это позволяет отслеживать, что приложения в подах работают в неизменном виде, соответствуют ожидаемому состоянию и не были модифицированы.
Для аудита используются:
- встроенные правила;
- пользовательские правила, которые можно добавлять с использованием синтаксиса условий Falco.
В процессе контроля целостности работающих контейнеров могут выявляться такие угрозы, как запуск оболочек командной строки в контейнерах или подах, обнаружение контейнеров, работающих в привилегированном режиме, монтирование небезопасных путей в контейнеры, попытки чтения секретных данных.
Подробнее о настройке рантайм-аудита — в разделе «Рантайм-аудит».
Защита целостности модулей DP
Начиная с версии 1.74, модули DP устанавливаются не в виде каталога с файлами, а в виде образа в формате EROFS, который подключается только для чтения через механизм ядра DM-Verity. Это защищает содержимое уже установленного модуля от изменения на узле. Перезаписать файлы модуля в смонтированном образе невозможно, а DM-Verity проверяет блоки образа при обращении к ним.
Это отдельный механизм, не связанный с контролем целостности образов на уровне CRI: DM-Verity здесь применяется контроллером DP к образу модуля платформы, а не containerd к слоям образов контейнеров. Поэтому ограничение по редакциям, описанное в разделе «Контроль целостности образов на уровне CRI», на него не распространяется.
Механизм включается автоматически, если на узле, где работает контроллер DP (по умолчанию — master-узел), файловая система erofs зарегистрирована в ядре, то есть соответствующий модуль ядра загружен или встроен в ядро. Проверьте это с помощью команды:
grep -w erofs /proc/filesystems
Если файловая система erofs недоступна, DP продолжит работу и будет устанавливать модули обычным способом, без защиты их целостности. Переключение происходит без отдельного алерта, поэтому проверяйте доступность erofs заранее.
DP загружает модуль ядра erofs и настраивает его автозагрузку только на узлах, где в качестве контейнерного рантайма используется containerd v2. Если на master-узлах используется containerd v1, модуль erofs может оказаться незагруженным, и модули DP будут установлены без защиты целостности — даже если ядро поддерживает erofs.
Чтобы гарантированно задействовать механизм, переведите master-узлы на containerd v2 либо обеспечьте загрузку модуля erofs средствами операционной системы.
При использовании этого механизма следует учитывать следующее:
- Механизм защищает модули от изменения после установки, но не подтверждает их подлинность: проверки криптографической подписи модулей нет. Источником доверия остаётся хранилище образов контейнеров, из которого модуль загружается.
- Механизм относится только к модулям DP и не затрагивает образы пользовательских приложений.
- Механизм доступен во всех редакциях DP и не требует отдельного включения.