Стадия жизненного цикла модуля: General Availability
У модуля есть требования для установки
В кластере DKP сканирование на уязвимости выполняется с помощью оператора Trivy Operator. Он автоматически генерирует Software Bill Of Materials (SBOM) для всех рабочих нагрузок и запускает сканирование для заданных объектов без ручного вмешательства.
Поддерживаемые типы объектов для сканирования
Сканирование поддерживается для следующих типов объектов:
- образы контейнеров, размещённые в хранилище (registry);
- файловые системы узлов кластера.
Архитектура анализа
Независимо от типа объекта сканирование выполняется в три этапа:
| Этап | Описание |
|---|---|
| 1. Сканирование | Сканер обходит целевой объект и применяет анализаторы для извлечения использованных пакетов, манифестов зависимостей и конфигурационных файлов, формируя SBOM. |
| 2. Фильтрация | Собранные данные сопоставляются с базами данных уязвимостей и политиками. Применяются фильтры по серьёзности, статусу исправления и типу пакетных зависимостей. |
| 3. Отчёт | Результаты сохраняются в виде кастомного ресурса VulnerabilityReport и публикуются в кластере в неймспейсе целевого объекта. |
Механизм сканирования уязвимостей
Сканер уязвимостей является центральным компонентом Trivy: он выявляет известные уязвимости на основе специализированных баз данных. Модуль operator-trivy сканирует пакеты и компоненты операционной системы (исполняемые файлы, библиотеки) и зависимости приложений (библиотеки, модули и прочие зависимости).
Оператор автоматически запускает сканирование при обнаружении новых или изменённых рабочих нагрузок в неймспейсах, для которых включено сканирование.
Пакеты операционной системы
Сканер автоматически определяет дистрибутив ОС и применяет соответствующие данные из баз уязвимостей, предоставляемых DKP.
Используются следующие источники данных:
- Банк данных угроз безопасности информации ФСТЭК России (БДУ ФСТЭК);
- AlmaLinux Errata;
- Alpine SecDB;
- ALTRepo Errata OVAL;
- Amazon Linux Security Advisories;
- Arch Linux Security Tracker;
- Debian Security Tracker;
- GitHub Security Advisory Database;
- National Vulnerability Database (NVD);
- Oracle OVAL;
- Photon Security Advisory;
- Red Hat OVAL;
- RED SOFT OVAL;
- Rocky Linux UpdateInfo;
- SUSE Security CVRF;
- Ubuntu CVE Tracker;
- Wolfi SecDB.
Зависимости приложений
Сканер обнаруживает и анализирует файлы манифестов пакетных менеджеров и lock-файлы более чем двадцати экосистем. Для каждого языка используются специализированные базы уязвимостей, преимущественно основанные на GitLab Advisory Database и GitHub Advisory Database.
| Язык / экосистема | Анализируемые файлы |
|---|---|
| Node.js (npm, Yarn) | package.json, package-lock.json, yarn.lock |
| Python (pip, Poetry, Pipenv) | requirements.txt, Pipfile.lock, poetry.lock |
| Java (Maven, Gradle) | pom.xml, build.gradle, *.jar, *.war |
| Go | go.mod, go.sum, бинарные файлы Go |
| .NET (NuGet) | *.csproj, packages.lock.json |
| Ruby (Bundler) | Gemfile.lock |
| PHP (Composer) | composer.lock |
| Rust (Cargo) | Cargo.lock |
| Swift (SwiftPM) | Package.resolved |
| Dart (pub) | pubspec.lock |
Результаты сканирования и ресурс VulnerabilityReport
Результаты сканирования уязвимостей сохраняются в кластере в виде кастомного ресурса VulnerabilityReport группы aquasecurity.github.io. Каждый отчёт создаётся в неймспейсе рабочей нагрузки, именуется по схеме <kind>-<workload-name>-<container-name> и содержит перечень обнаруженных уязвимостей с указанием серьёзности, статуса исправления, затронутого пакета и ссылок на источники.
Отчёт привязывается к родительскому ресурсу через поле ownerReferences. При обновлении образа или удалении рабочей нагрузки устаревший VulnerabilityReport удаляется механизмом сборки мусора Kubernetes и при необходимости пересоздаётся.
Генерация и обработка SBOM
Сгенерированный SBOM сохраняется в кластере в виде CRD SbomReport группы aquasecurity.github.io. Каждый отчёт создаётся в неймспейсе рабочей нагрузки и содержит:
- метаданные контейнерного образа (репозиторий, тег, дайджест);
- компонентный состав в формате CycloneDX (пакеты ОС и зависимости приложений с идентификаторами PURL, лицензиями и информацией о поставщике);
- граф зависимостей между компонентами;
- сводку по количеству компонентов и зависимостей.
Оператор отслеживает изменения ресурсов кластера. При создании или изменении рабочей нагрузки автоматически запускается задание сканирования, по результатам которого одновременно формируются SbomReport и VulnerabilityReport. Оба отчёта именуются по схеме <kind>-<workload-name>-<container-name> и привязываются к родительскому ресурсу через поле ownerReferences. При удалении рабочей нагрузки отчёты удаляются автоматически через механизм сборки мусора Kubernetes.
SbomReport и VulnerabilityReport дополняют друг друга: VulnerabilityReport содержит выявленные уязвимости, а SbomReport фиксирует полный состав компонентов образа.
Сканирование реестров
Помимо сканирования образов, запущенных в кластере, модуль поддерживает периодическое сканирование репозиториев образов, хранящихся во внешних реестрах контейнеров.
Включите функцию в ModuleConfig/operator-trivy:
spec:
settings:
registryScanning:
enabled: trueНастройка сканирования репозиториев в реестрах
Целевой реестр контейнеров для сканирования описывается cluster-scoped ресурсом RegistryScanTarget:
apiVersion: deckhouse.io/v1alpha1
kind: RegistryScanTarget
metadata:
name: preprod-myapp
spec:
registry: preprod.registry.example.com
repositories:
- myapp/backend
- myapp/frontend
rescanPeriod: 1d
tagFilter: "^v[0-9]+" # Опционально: сканировать только теги, соответствующие регулярному выражению.
maxTags: 50 # Опционально: не более 50 тегов на репозиторий (по умолчанию 100).
registrySecretRef: # Опционально: учётные данные для приватного реестра.
name: image-pull-credentialssecret
namespace: myapp| Поле | Обязательное | Описание |
|---|---|---|
registry |
Да | Хост реестра (например, registry.example.com). |
repositories |
Да | Список путей репозиториев для сканирования. |
rescanPeriod |
Да | Период повторного сканирования каждого тега образа. Допустимые значения: 12h, 1d, 2d, 7d. |
tagFilter |
Нет | Регулярное выражение. Сканируются только теги, совпадающие с шаблоном. |
maxTags |
Нет | Максимальное количество тегов на репозиторий после фильтрации. По умолчанию: 100. Выбираются первые N тегов в лексикографическом порядке. |
registrySecretRef |
Нет | Ссылка на секрет типа kubernetes.io/dockerconfigjson с учётными данными реестра. |
insecure |
Нет | Разрешает использовать HTTP или отключает проверку TLS для данного реестра. |
Если реестр требует CA-сертификат, отсутствующий в системном хранилище доверенных сертификатов, добавьте его с помощью параметра additionalRegistryCA.
Результаты сканирования
Результаты сохраняются в cluster-scoped ресурсах RegistryImageVulnerabilityReport, по одному на каждый сканируемый тег образа.
Каждый отчёт принадлежит своему RegistryScanTarget. При удалении объекта RegistryScanTarget связанные с ним отчёты автоматически удаляются механизмом сборки мусора Kubernetes.
# Список всех отчётов.
d8 k get registryimagevulnerabilityreport
# Просмотр конкретного отчёта.
d8 k describe registryimagevulnerabilityreport <name>Отчёт пересоздаётся по истечении периода, заданного параметром rescanPeriod. Чтобы запустить внеплановое сканирование, удалите аннотацию registry-scanner.deckhouse.io/last-scan-time у объекта RegistryScanTarget. Контроллер запустит новый цикл сканирования, не дожидаясь следующего запуска по расписанию.
Состояние сканирования
Статус объекта RegistryScanTarget показывает время последнего цикла и его результат:
d8 k get registryscantarget
d8 k describe registryscantarget my-registryУсловие Ready принимает значение True после успешного завершения цикла сканирования и False во время сканирования или при возникновении ошибки.
Чтобы отличить ошибку от выполняющегося сканирования, проверьте значение поля reason.
Запрет запуска уязвимых контейнеров
Для работы механизма должен быть включён модуль admission-policy-engine (включён по умолчанию в наборах модулей Default и Managed).
Модуль реализует принудительный контроль над запуском контейнеров с уязвимыми образами на уровне admission-контроля Kubernetes. Механизм основан на связке OPA Gatekeeper (модуль admission-policy-engine) и Trivy: Trivy предоставляет результаты сканирования, а Gatekeeper принимает решение о допуске ресурса.
Ограничение применяется к ресурсам Pod, Deployment, StatefulSet и DaemonSet в неймспейсах с лейблом security.deckhouse.io/trivy-provider: "".
Политика применяется только в момент admission при создании или обновлении ресурса. Режим аудита Gatekeeper данное ограничение не оценивает.
Конфигурация
Управление блокировкой осуществляется через параметр denyVulnerableImages в настройках модуля:
| Параметр | Значение по умолчанию | Описание |
|---|---|---|
enabled |
false |
Включить запрет на использование уязвимых образов в помеченных неймспейсах. |
allowedSeverityLevels |
— | Образы, содержащие уязвимости только указанных уровней серьёзности, не блокируются. Допустимые значения: UNKNOWN, LOW, MEDIUM, HIGH, CRITICAL. |
registrySecrets |
[] |
Список дополнительных секретов типа kubernetes.io/dockerconfigjson , содержащих учётные данные для скачивания образов при admission-проверке. Секрет с учётными данными реестра, из которого установлен DKP, добавляется автоматически. Укажите здесь секреты для рабочих нагрузок, использующих образы из других приватных реестров, доступ к которым не обеспечивается этим секретом. |
Пример конфигурации
spec:
settings:
denyVulnerableImages:
enabled: true
allowedSeverityLevels:
- UNKNOWN
- LOW
- MEDIUM
registrySecrets:
- name: my-private-registry-pull-secret
namespace: my-appВ приведённом примере блокируются образы с уязвимостями уровня HIGH или CRITICAL. Образы с уязвимостями уровней UNKNOWN, LOW, MEDIUM допускаются к запуску. Секрет my-private-registry-pull-secret используется чтобы trivy-provider мог скачивать образы из этого реестра при admission-проверке.
registrySecrets влияет только на учётные данные, используемые в admission-проверке. Параметр не затрагивает плановые задания сканирования рабочих нагрузок и сканирование реестров. Секрет должен существовать в кластере до включения denyVulnerableImages.
Подавление уязвимостей с помощью VEX-аттестаций
VEX (Vulnerability Exploitability eXchange) — машиночитаемое утверждение о том, является ли известная CVE реально эксплуатируемой в конкретной версии продукта. Например, VEX-утверждение может указывать, что уязвимость присутствует в библиотеке, поставляемой с образом, однако недостижима, потому что затронутый участок кода никогда не вызывается.
При включённом параметре useVEXFromOCI Trivy получает VEX-аттестации, прикреплённые к сканируемым образам в OCI-реестре (как OCI referrers), и использует их для фильтрации найденных уязвимостей. Уязвимость исключается из VulnerabilityReport или RegistryImageVulnerabilityReport, если VEX-утверждение помечает её как not_affected или fixed для данного образа.
Это работает как при сканировании рабочих нагрузок (образов, запущенных в кластере), так и при сканировании реестров контейнеров (RegistryScanTarget).
VEX-аттестации создаются и публикуются вендором образа — как правило, командой которая его поддерживает. Для подавления уязвимостей к образу в реестре должна быть прикреплена VEX-аттестация. Если аттестация отсутствует, сканирование выполняется в штатном режиме и ничего не фильтруется.
Требования
- Реестр должен поддерживать OCI Referrers API (OCI Distribution Spec v1.1+). Большинство современных реестров (Harbor, Quay, GHCR, ECR) поддерживают его.
- VEX-аттестации должны храниться как OCI referrers образа.
Включение
Добавьте следующий параметр в ModuleConfig/operator-trivy:
spec:
settings:
useVEXFromOCI: trueОтчёты соответствия (compliance)
Модуль создаёт ресурсы ClusterComplianceReport для выбранных фреймворков соответствия. Каждый отчёт обновляется каждые 6 часов и сопоставляет контролы фреймворка с проверками конфигурации и нагрузок, выполняемыми Trivy.
Набор развёртываемых отчётов задаётся параметром complianceReports.enabled.
| Фреймворк | По умолчанию | Описание |
|---|---|---|
CIS |
включён | CIS Kubernetes Benchmark v1.12. |
PCI-DSS |
включён | PCI DSS v4.0 — ключевые контролы для защиты данных платёжных карт. |
NSA |
включён | NSA-CISA Kubernetes Hardening Guidance v1.0. |
GDPR |
отключён | Общий регламент по защите данных — ключевые статьи (ст. 5, 25, 32). |
HIPAA |
отключён | HIPAA Security Rule — ключевые технические меры защиты (§164.308 и §164.312). |
FSTEC-21 |
включён | Приказ ФСТЭК России № 21 — защита персональных данных в ИСПДн. |
FZ-187 |
включён | Приказ ФСТЭК России № 239 — значимые объекты КИИ (187-ФЗ). |
Пример конфигурации
complianceReports:
enabled:
- CIS
- NSA
- FSTEC-21
- FZ-187В приведённом примере развёртываются только четыре отчёта. Для просмотра отчёта используйте:
d8 k get clustercompliancereports
d8 k describe clustercompliancereport fstec-21Что попадает в отчёты соответствия
По умолчанию отчёты соответствия сфокусированы на ваших нагрузках — на том, что владелец кластера может реально исправить. Модуль автоматически исключает из compliance:
- ресурсы, управляемые Deckhouse и его модулями;
- системные компоненты Kubernetes (встроенные RBAC, дефолтные cluster-scoped объекты и т. п.).
Сам control plane при этом продолжает проверяться по соответствующим инфраструктурным контролам (например, раздел 1.x CIS Kubernetes Benchmark для параметров kube-apiserver, etcd, kube-scheduler) — отсекаются только общие workload-проверки для платформенных подов.
Сканирование уязвимостей работает независимо от этих фильтров и продолжает сообщать о CVE и секретах для всех сканируемых образов, включая платформенные.
Чтобы исключить отдельный неймспейс из compliance — например, экспериментальный или временный — повесьте на него метку:
d8 k label namespace my-namespace security.deckhouse.io/skip-compliance=trueРабота с приватными и небезопасными реестрами
По умолчанию модуль ожидает, что все реестры контейнеров используют доверенные TLS-сертификаты. Для окружений с самоподписанными сертификатами, HTTP-реестрами или отключённой проверкой TLS доступны следующие параметры.
Корневые сертификаты для приватных реестров (additionalRegistryCA)
Параметр additionalRegistryCA задаёт корневые CA-сертификаты для частных реестров контейнеров.
Каждая запись содержит поле name (произвольная метка, только для справки) и ca (сертификат или цепочка в формате PEM). При указании цепочки объедините сертификаты последовательно в формате PEM без лишних пустых строк между ними.
spec:
settings:
additionalRegistryCA:
- name: корпоративный CA
ca: |
-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE-----
- name: CA с промежуточным сертификатом
ca: |
-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE-----Небезопасные реестры (insecureRegistries)
Параметр insecureRegistries разрешает сканеру подключаться к указанным реестрам по HTTP или по HTTPS без проверки сертификата. Каждая запись — имя хоста реестра (опционально с портом).
spec:
settings:
insecureRegistries:
- my.internal-registry.example.com
- legacy-registry.example.com:5000Параметр применяется при сканировании рабочих нагрузок (scan jobs), при admission-проверке (denyVulnerableImages) и при сканировании сторонних реестров (RegistryScanTarget).
insecureRegistries отключает проверку сертификата только для указанных хостов. Чтобы отключить проверку TLS для загрузки баз данных уязвимостей Trivy (не реестров образов), используйте отдельный параметр insecureDbRegistry.
Управление базами данных
Модуль автоматически загружает, поддерживает и кеширует необходимые базы данных при выполнении сканирования. Актуальность данных обеспечивается регулярными автообновлениями.
| Образ контейнера базы данных | Назначение |
|---|---|
<deckhouse-repo>/security/trivy-db:2 |
Основная база данных уязвимостей — агрегирует данные из NVD, Red Hat, Alpine, Ubuntu, Debian, GitLab Advisory DB, GitHub Advisory DB и других источников. |
<deckhouse-repo>/security/trivy-java-db:1 |
Специализированная база для Java-артефактов (JAR, WAR, EAR) с привязкой к хешам файлов. |
<deckhouse-repo>/security/trivy-checks:0 |
Набор политик (Rego) для проверки ошибок конфигурации в IaC. |
<deckhouse-repo>/security/trivy-bdu:1 |
Связка идентификаторов уязвимостей сторонних провайдеров баз уязвимостей с идентификаторами БДУ ФСТЭК. |
В изолированных окружениях поддерживается загрузка баз данных и их локальное использование без доступа к интернету с помощью CLI-утилиты d8 (через команду d8 mirror).