Стадия жизненного цикла модуля: Экспериментальная версия
У модуля есть требования для установки
Перед включением модуля необходимо разрешить использование экспериментальных модулей в ModuleConfig deckhouse. Для этого установите параметр allowExperimentalModules в true.
v1.1.5
Дата релиза: 2026-09-07
Обновления безопасности образов alert-evaluator, controller и go-hooks: обновлены зависимости, устраняющие известные уязвимости, а OpenVEX-аттестации помечают неиспользуемые пакеты golang.org/x/crypto как not affected.
Ключевые изменения
Изменения в этом релизе:
- В образах alert-evaluator, controller и go-hooks обновлены библиотеки golang.org/x, чтобы устранить уязвимости уровней High и Critical, выявленные при сканировании образов.
- OpenVEX-аттестации для controller и module bundle помечают уязвимости в golang.org/x/crypto/ssh и golang.org/x/crypto/openpgp как not affected, потому что эти пакеты не используются.
Обновления безопасности
Обновления безопасности в этом релизе:
- В образе alert-evaluator обновлены golang.org/x/net до v0.56.0, golang.org/x/text до v0.39.0 и golang.org/x/sys до v0.46.0. Обновление устраняет связанные CVE, в том числе CVE-2025-47911, CVE-2025-58190, CVE-2026-25680, CVE-2026-25681, CVE-2026-27136, CVE-2026-33814, CVE-2026-39821, CVE-2026-39824, CVE-2026-42502, CVE-2026-42506, CVE-2026-46600 и CVE-2026-56852.
- В образах controller и go-hooks обновлён golang.org/x/crypto до v0.55.0. Обновление устраняет уязвимость Critical CVE-2026-56854.
- OpenVEX-утверждения для controller и module bundle помечают CVE-2026-56855, CVE-2026-78662 и GO-2026-5932 как not_affected с обоснованием vulnerable_code_not_in_execute_path. Controller использует golang.org/x/crypto для bcrypt, scrypt и pbkdf2 через sprig; go-hooks — для ocsp и pkcs12 через cfssl. Ни один из компонентов не импортирует golang.org/x/crypto/ssh и golang.org/x/crypto/openpgp.
v1.1.4
Дата релиза: 2026-09-03
Правила алертинга теперь на LogQL и вычисляются напрямую по Loki: ClusterSecurityEventAlertRule переработан по образцу PrometheusRule (группы правил с alert/expr/for/labels/annotations), конвейер алертинга больше не проходит через Vector.
Ключевые изменения
Изменения в этом релизе:
ClusterSecurityEventAlertRuleтеперь устроен какPrometheusRule:spec.groups[].rules[], у каждого правила —alert,for,severityLevel,labels,annotations, а также либо написанный вручную LogQL-запросexpr, либо структурированный блокmatch/aggregation(коды событий, источники, категории, инициаторы, группировка, порог), который компилируется в эквивалентный LogQL. Это несовместимое изменение спецификации ресурса — перепишите существующие правила перед обновлением.- Каждое правило объявляет свою форму в обязательном поле
mode(ExprилиMatch), которое должно совпадать с заполненным блоком. Веб-интерфейс платформы по полюmodeпоказывает только поля выбранной формы. - Новый компонент
alert-evaluatorработает внутри существующего Deploymentaggregator, вычисляет LogQL-запрос каждого правила по Loki кластера по расписанию и публикует сработавшие правила через ту же метрикуsecurity_events_alert_last_firing_timestamp_seconds, что и раньше. Штатный алертD8SecurityEventAlertFiringне изменился. gatewayбольше не пересылает копию подходящих событий наaggregatorпо сети:alert-evaluatorчитает данные напрямую из Loki. TLS-материалы и процесс Vector уaggregatorбольше не нужны.- Для работы правил алертинга должен быть включён
ClusterSecurityEventDestinationcluster-loki— без него LogQL нечего запрашивать.
Улучшения
В этом релизе улучшено:
- Правило теперь может смотреть сколь угодно далеко назад и группировать по любому лейблу, который поддерживает LogQL, а не только по восьми фиксированным полям из прежнего перечисления
aggregation.groupBy. Для этого напишитеexprвручную. - Каждый
ClusterSecurityEventAlertRuleпубликует собственныеstatus.conditions(Ready/Degradedс причиной вродеLogQLQueryError,LokiDestinationMissingилиCardinalityLimitExceeded).
Несовместимые изменения
Изменения, влияющие на обратную совместимость:
- Каждое правило в
ClusterSecurityEventAlertRule.spec.groups[].rules[]должно объявлятьmode: Exprилиmode: Match— в соответствии с заполненным блоком (exprилиmatch). Правило безmodeили сmode, расходящимся с блоком, отклоняется. - Старые поля
spec.match/spec.aggregation/spec.alert(одно правило на объект) удалены. Перепишите каждое правило вspec.groups[].rules[]: используйте либо написанный вручную LogQL-запросexpr, либо те же поляmatch/aggregation, что и раньше (eventCodes,sources,categories,severityMin,actorType,actors,excludeActors,excludeSystemActors,groupBy,threshold,window), теперь вложенные в каждое правило. Примеры приведены в документации модуля. - API-сервер теперь проверяет ограничения полей у
ClusterSecurityEventShipper,PodSecurityEventShipper,ClusterSecurityEventLogTransformation,SecurityEventLogTransformation,SecurityEventDefinition,ClusterSecurityEventEnrichmentPluginиClusterSecurityEventDestination, которые раньше не проверялись. Пустой селектор меток (labelSelector: {}/selector: {}) теперь отклоняется вместо выбора всех объектов, значениеspec.*.buffer.maxEventsуClusterSecurityEventDestinationдолжно быть не меньше 100, а ряд текстовых полей больше не принимает пустую строку. - Для вычисления правил алертинга требуется
ClusterSecurityEventDestinationcluster-loki(включите его черезsecurityEventConfig.destinations). Без него каждыйClusterSecurityEventAlertRuleнаходится в состоянииDegraded, и ни одно правило не вычисляется; сбор и доставка событий в остальные destinations не затрагиваются.
Рекомендации по обновлению
Перед обновлением учтите следующее:
- При переписывании правила добавьте
mode: Exprправилу с написанным вручнуюexprилиmode: Matchправилу, собранному изmatch/aggregation. - Перед обновлением сохраните все существующие
ClusterSecurityEventAlertRule(d8 k get clustersecurityeventalertrule -o yaml). После обновления перепишите каждое правило в новом видеspec.groups[].rules[]— старые поля верхнего уровня спецификации отклоняются обновлённой схемой CRD. - Перед обновлением проверьте существующие ресурсы на соответствие новым ограничениям: выполните
d8 k get clustersecurityeventshipper,podsecurityeventshipper,clustersecurityeventlogtransformation,securityeventlogtransformation,clustersecurityeventdestination -o yamlи найдите пустыеlabelSelector/selectorилиbuffer.maxEventsменьше 100. Существующий объект, нарушающий ограничение, продолжает работать, но следующая запись в него отклоняется. - Прежде чем полагаться на правила алертинга, убедитесь, что включён
cluster-loki(securityEventsManager.securityEventConfig.destinationsсодержитcluster-loki) — иначе каждое правило остаётся в состоянииDegraded.
Известные ограничения
Известные ограничения этого релиза:
- Состояние вычисления (pending/firing) хранится в памяти процесса
alert-evaluator: его перезапуск сбрасывает отсчётforдля каждого правила. - Группировка по LogQL-лейблу с неограниченной кардинальностью ограничена 500 наборами лейблов на правило: остальные отбрасываются, и правило помечается
CardinalityLimitExceeded, но продолжает срабатывать для уже отслеживаемых групп.
Документация
Изменения в документации:
- Раздел про алертинг на странице примеров переписан под ресурс в стиле
PrometheusRuleи описывает формуexprи формуmatch/aggregation, включая line filter, воспроизводящий прежнее поведениеexcludeSystemActors.
v1.1.3
Дата релиза: 2026-08-27
Исправления безопасности в образах модуля: OpenVEX-аттестации помечают golang.org/x/crypto GO-2026-5932 как not affected для controller и go-hooks в module bundle.
Ключевые изменения
Изменения в этом релизе:
- Образы модуля публикуют OpenVEX-аттестации, чтобы CVE-скан подавлял GO-2026-5932 там, где openpgp не на пути выполнения.
Обновления безопасности
Обновления безопасности в этом релизе:
- Добавлены OpenVEX-утверждения для GO-2026-5932 (golang.org/x/crypto/openpgp) для controller и module bundle (go-hooks), статус not_affected / vulnerable_code_not_in_execute_path.
- В сборку модуля подключена cosign OpenVEX-аттестация, чтобы CI CVE-скан читал утверждения из OCI registry.
v1.1.2
Дата релиза: 2026-08-27
Алертинг по событиям безопасности: новый ресурс ClusterSecurityEventAlertRule считает подходящие события по ключу в течение временного окна и поднимает обычный алерт Prometheus, как только достигнут порог. Добавлен тип назначения Http для вебхуков и HTTP-коллекторов и новое событие о нарушении целостности в containerd.
Ключевые изменения
Изменения в этом релизе:
- Новый ресурс
ClusterSecurityEventAlertRule: в нём описывается, за какими событиями следить, как их считать и что должно быть написано в алерте. - Сработавшее правило поднимает алерт Prometheus
D8SecurityEventAlertFiring, поэтому он становится объектом ClusterAlert, виден в консоли рядом со всеми остальными алертами, сохраняет историю и уходит по штатной доставке алертов кластера. Доставку настраивать не нужно. - Новый тип назначения
Httpотправляет события безопасности на любой HTTP-эндпоинт — вебхук или HTTP-коллектор — с аутентификацией, TLS, произвольными заголовками и выбором способа упаковки тела запроса. - Новое событие безопасности
D8_CONTAINERD_INTEGRITY_VIOLATIONсообщает о непройденной проверке целостности в containerd — чаще всего об образе, которому отказано при загрузке из-за неверной подписи.
Новый функционал
В этом релизе добавлено:
ClusterSecurityEventAlertRule(кластерный ресурс, короткое имяcsear).spec.matchотбирает события по коду, минимальной критичности, категории, компоненту-источнику, актору и типу актора;spec.aggregationгруппирует их поgroupByи срабатывает, как только группа достигаетthresholdв пределахwindow;spec.alertнесёт краткое и подробное описание, дополнительные лейблы и уровень критичности DKPseverityLevel. Правило без блокаaggregationалертит на каждое подходящее событие.match.excludeSystemActors(включён по умолчанию) убирает из правила системные личности по тому же списку, что и фильтр «Исключить системные» в консоли. Штатная работа кластера доминирует в потоке событий: на простаивающем кластере один ServiceAccount DKP дал 2617 из 2812 чтений секретов за час, — так что без него первое же написанное правило оказывается алертом про платформу. Для всего, что встроенный список не покрывает, естьmatch.excludeActorsиmatch.actors— глобы, сравниваемые сactor.id.- Алерт гаснет сам примерно через пять минут после последнего срабатывания правила. Настраивать нечего: агрегатор публикует
security_events_alert_last_firing_timestamp_seconds— момент последнего срабатывания, — аD8SecurityEventAlertFiringсмотрит на его давность. Метрика отдаётся на эндпоинте агрегатора/alert-metrics/metricsи годится для дашбордов. - Новый тип назначения
Http:spec.http.endpoint, опциональныеauth,tlsиheaders, а такжеframing—JSONArray(по умолчанию) для приёмников, ожидающих один документ на запрос, иNewlineDelimitedдля коллекторов, читающих NDJSON. Число попыток доставить один набор событий ограничено, поэтому приёмник, раз за разом отклоняющий запрос, который никогда не примет, не задерживает остальную очередь: когда попытки заканчиваются, набор отбрасывается в метрики ошибок sink’а, по которым у модуля уже есть алерт. - Новое событие безопасности
D8_CONTAINERD_INTEGRITY_VIOLATION(категорияRuntime, критичностьHigh, источникcontainerd-integrity). Оно возникает, когда containerd отказывает образу с непройденной проверкой подписи, а также когда контрольная сумма файла на узле не совпадает с ожидаемой. Вobject.nameпопадает ссылка на образ, вobject.namespace— пространство имён, в которое он загружался, вmetadata.extra— сообщение, путь к файлу и ожидаемый и фактический хеши, если событие их содержит. Собирается только на узлах с cri ContainerdV2 в редакции CSE; трафик проб d8-upmeter отфильтровывается. - События kube-audit теперь несут
actor.sourceIP— адрес исходного клиента, взятый из начала цепочки запроса, — рядом с полной цепочкойactor.sourceIPs. По нему можно группировать в правилах (ActorSourceIP): именно так правило про неавторизованные запросы опознаёт клиента, когда группировать не по чему. - В модуле появился отдельный однорепличный компонент
alert-aggregator, который держит счётчики, и свой алертD8SecurityEventsManagerAggregatorNotAvailable. Пока он недоступен, сбор и доставка событий продолжаются — события ждут в буфере gateway, — но окна подсчёта начинаются заново, поэтому частично набранный порог считается с нуля.
Улучшения
В этом релизе улучшено:
- В путях трансформаций можно адресовать элементы массива, например
sourceIPs[0]. Раньше каждый сегмент пути считался ключом map, поэтому любое поле-массив в логе было невозможно отобразить. - Документация модуля, CRD и OpenAPI-схемы теперь попадают в bundle- и release-образы.
Рекомендации по обновлению
Перед обновлением учтите следующее:
- Менять конфигурацию не требуется. Компоненты алертинга создаются при обновлении и простаивают, пока не появится первый
ClusterSecurityEventAlertRule.alert-aggregatorпо замыслу работает в одной реплике со стратегиейRecreate— счётчики живут в одном процессе, — поэтому его обновления и вытеснение с узла дают короткий перерыв в подсчёте.
Известные ограничения
Известные ограничения этого релиза:
- Правило видит только то, что записывает политика аудита кластера. Политика DKP по умолчанию логирует
listсекретов, но неgetодного секрета по имени, и отбрасывает большинство запросов отsystem:authenticated, поэтому правило наK8S_SECRET_ACCESSEDне увидитd8 k get secret <name>. Прежде чем делать вывод, что правило не работает, посмотрите политику аудита. - Счётчики живут в памяти агрегатора. Его рестарт начинает каждое окно с нуля.
- Группировка по значению с неограниченной кардинальностью ограничена: после 500 различных значений лейбл отбрасывается, а алерт всё равно срабатывает — только без одного измерения.
- На кластерах с включённым
update.blockOnAlertsв модуле deckhouse алерт с уровнем не выше настроенного порога (по умолчанию 4) блокирует применение релизов DKP, пока он горит. ЗначениеseverityLevelпо умолчанию — 6 — под порог не попадает; понижайте его осознанно.
Документация
Изменения в документации:
- На странице примеров появился раздел про алертинг с отдельным правилом на каждый сценарий обнаружения: повторные exec в поды от одного актора, всплеск правок RBAC с группировкой по актору и пространству имён, неавторизованные запросы с группировкой по адресу клиента и нарушение целостности containerd как случай, когда достаточно одного события. Там же добавлен пример HTTP-назначения.
v1.0.5
Дата релиза: 2026-08-24
Исправления безопасности в образах модуля: обновлены Go-зависимости batch-хуков и связанных компонентов для устранения известных CVE.
Ключевые изменения
Изменения в этом релизе:
- В образы модуля включены обновления зависимостей, закрывающие известные CVE в Go-компонентах.
Обновления безопасности
Обновления безопасности в этом релизе:
- В hooks/batch и связанных Go-образах подняты golang.org/x/net и golang.org/x/text для устранения CVE.
- В образы компонентов включены исправления безопасности, связанные с CVE.
v1.0.4
Дата релиза: 2026-08-18
Исправлен дедлок обновления: контроллер не мог опубликовать конфиг gateway, а Deployment gateway не мог раскатиться.
Ключевые изменения
Изменения в этом релизе:
- Контроллер снова может публиковать конфиг Vector для gateway — его собственная валидация никогда не могла завершиться на реальных кластерах.
- Deployment gateway теперь раскатывается на кластерах, где системных узлов столько же, сколько реплик, а не застревает на поде в Pending.
- Назначение с нерезолвящимся credential больше не роняет весь конфиг gateway.
- Метрики reloader’а переименованы, чтобы не пересекаться с метриками log-shipper.
Улучшения
В этом релизе улучшено:
- Новый параметр
controller.vectorValidateTimeout(по умолчанию60s) — таймаут запускаvector validate, который контроллер выполняет перед публикацией конфига gateway. - Новые алерты:
D8SecurityEventsManagerControllerConfigNotPublished,D8SecurityEventsManagerDestinationCredentialMissingиD8SecurityEventsManagerControllerValidateUnavailable. Раньше контроллер мог сколь угодно долго не публиковать конфиг, и ни один алерт при этом не срабатывал.
Исправления
В этом релизе исправлено:
- Контроллер больше не замораживает опубликованный конфиг gateway. Его шаг
vector validateвыполнялся с таймаутом 10s в контейнере с лимитом 64Mi и погибал либо по дедлайну, либо от OOM, а сбой трактовался как вердикт «конфиг невалиден» — из-за чего Secret навсегда оставался на прежней ревизии. Теперь валидация запускается с--no-environment(около 2 секунд вместо 5 на конфиге в 256 КБ, без построения топологии и походов по сети), пол по памяти контейнера — 192Mi, таймаут по умолчанию — 60s, а невозможность выполнить проверку больше не блокирует публикацию: конфиг в любом случае валидирует reloader в gateway. - Deployment gateway использует
maxSurge: 0/maxUnavailable: 1. При стандартном surge обновление gateway с двумя репликами запрашивало третий под, а обязательная anti-affinity по узлу оставляла его в Pending навсегда на кластере с двумя системными узлами: модуль рапортовал Deployed, продолжая работать на предыдущем образе. - ClusterSecurityEventDestination, объявивший credential, который контроллер не смог зарезолвить, теперь блокирует публикацию и сообщает конкретное назначение и поле, вместо того чтобы отдать блок
authбез токена. Vector такой блок не принимает, из-за чего весь конфиг gateway переставал загружаться и доставка прекращалась во все назначения сразу, а не только в проблемное. Покрыты Loki, Elasticsearch, Splunk HEC и Kafka SASL. auth.strategy: None(значение по умолчанию в CRD) больше не попадает в сгенерированный конфиг как{"strategy": "none"}, которое Vector не принимает.- У Deployment контроллера появился nodeSelector на
system-узлы; раньше его не было вовсе, и контроллер мог уехать на worker-узел. - CI-тест валидации Vector проверяет тот
defaults.json, который реально едет в образе gateway, а не написанный вручную аналог.
Несовместимые изменения
Изменения, влияющие на обратную совместимость:
- Метрики reloader’а переименованы с префиксом
security_events_manager_gateway_:vector_config_validation_error,vector_config_apply_failures_total,vector_config_periodic_retry_attempts_total,vector_config_reloads_success_total,vector_config_last_reload_success_timestamp_seconds,reloader_validate_duration_seconds,reloader_validate_timeout_seconds,reloader_apply_duration_seconds,reloader_vector_restarts_total,reloader_fsnotify_events_total. Старые имена совпадали с метриками vector-reloader из log-shipper, чьи правила не фильтруют по namespace, поэтому проблемы этого модуля поднимали алертD8LogShipperConfigInvalid. Правила, дашборды и документация модуля обновлены; собственные recording-правила, алерты и панели на старых именах нужно поправить. - Переменная окружения
CONTROLLER_VECTOR_VALIDATE_SKIP_ABOVE_BYTESудалена. Её порог в 256 КиБ находился чуть выше реального размера конфига, из-за чего валидация могла пропускаться случайно, а не намеренно; случай, ради которого она вводилась, теперь покрыт поведением fail-open. - В версии v1.0.3 значение
minimalSeverityпо умолчанию сменилось сMediumнаLowбез записи в release notes. Кластеры, обновляющиеся с v1.0.0 и ранее, отправляют заметно больше событий, что накладывается на дисковые буферы по умолчанию, появившиеся в той же версии. Если нужен прежний объём, задайте значение явно.
Рекомендации по обновлению
Перед обновлением учтите следующее:
- Пол по памяти контейнера контроллера поднимается с 64Mi до 192Mi (потолок VPA — с 256Mi до 512Mi). Столько нужно
vector validate, чтобы отработать вообще; ниже контейнер убивает OOM прямо посреди валидации.
v1.0.3
Дата релиза: 2026-08-17
Настройка буферов gateway, плагины обогащения, SecretRef для назначений, CEF/Socket sink и усиление безопасности API Vector и RBAC контроллера.
Ключевые изменения
Изменения в этом релизе:
- Настраиваемые Disk-буферы для слоёв gateway и log-shipper, с переопределением на назначение.
- Плагины обогащения (
k8s-pod-info,k8s-container-info,k8s-nodeuser-info) черезClusterSecurityEventEnrichmentPlugin. - Учётные данные назначений можно брать из Secret вместо открытого текста в CR.
- Кодирование CEF и назначения Socket для интеграции с SIEM.
- API gateway на loopback; ужесточены RBAC для Secret и проверка SSRF для enrichment endpoint.
Новый функционал
В этом релизе добавлено:
- Параметры буфера
gateway.bufferиgateway.logShipperBufferв значениях модуля; переопределение черезspec.bufferв ClusterSecurityEventDestination; по умолчанию Disk + Block;maxSize— Kubernetes quantity с суффиксом единицы (например512Mi). - Событие
K8S_ADMISSION_POLICY_DENIEDдля отказов admission-policy-engine в audit-логе Kubernetes. - CRD
ClusterSecurityEventEnrichmentPluginдля встроенных Internal enrichment-плагинов сайдкараenrichment-cache(External в схеме есть, в контроллере пока нет). - Плагины обогащения
k8s-pod-info,k8s-container-infoиk8s-nodeuser-info. - Поля
tokenSecretRefиpasswordSecretRefв ClusterSecurityEventDestination для Loki, Elasticsearch, Kafka SASL и Splunk HEC; встроенныйcluster-lokiхранит токен в Secret. - Кодирование CEF для Kafka, Vector, File и Console (
encoding.codec: CEF), опциональная syslog-обёртка и метаданные CEF черезspec.cef/ значения модуля. - Тип назначения Socket (TCP/UDP/Unix) для CEF-over-syslog в SIEM.
Исправления
В этом релизе исправлено:
- Исправлен алерт
D8SecurityEventsManagerControllerReconcileErrorsHigh. - Параметр
gateway.reloaderValidateTimeoutзадаёт таймаутvector validate(по умолчанию 120s). - TLS Secret в
d8-log-shipperудаляются вместе с SecurityEventDefinition. - Ошибки разрешения credential Secret пишутся в warning с путём поля.
- Watcher credential Secret фильтрует по лейблу
security-events-manager.deckhouse.io/credential-secret: true. - Reloader
SaveTo()пишет конфиг Vector с правами0600. resolveDestinationSecretRefs()возвращает глубокую копию объекта CSED.- Lua
extractJSONвозвращает nil и пишет ошибку, еслиcjsonнедоступен. - В комментарии enrichment-cache исправлен порт (9260 → 9261).
- E2E-триггеры для
K8S_CLUSTERROLEBINDING_DELETEDиK8S_CONFIGMAP_MODIFIEDсоздают тестовый namespace и учитывают 404 при удалении CRB. - Ресурсы контроллера получают лейбл
heritage: deckhouse.
Обновления безопасности
Обновления безопасности в этом релизе:
- Устранены CVE в образах модуля.
- API gateway Vector слушает только
127.0.0.1:8686; порт 8686 убран из Service. - Приватный ключ mTLS-клиента хранится в Secret в
d8-log-shipper, а не в ClusterLogDestination. - RBAC Secret ограничен неймспейсами
d8-security-events-managerиd8-log-shipper. - CEL блокирует SSRF для
spec.endpoint.urlв ClusterSecurityEventEnrichmentPlugin. - Secret
gateway-vector-configпомеченsecurity.deckhouse.io/contains-credentials: true.
Несовместимые изменения
Изменения, влияющие на обратную совместимость:
- Форма
enrichв shipper:plugin— свободная строка;args— упорядоченный массив{key,value}; имена плагинов с дефисами (k8s-pod-info). Старые CR с прежней формой не парсятся; Plugin-обогащение раньше не работало. spec.splunkHEC.tokenнеобязателен при заданномtokenSecretRef.- CEL запрещает одновременное использование inline
token/passwordи соответствующих*SecretRefв ClusterSecurityEventDestination.
v1.0.0
Дата релиза: 2026-06-26
Первичный релиз модуля security-events-manager.
Ключевые изменения
Изменения в этом релизе:
- Первый публичный релиз модуля.