Перейти к основному содержимому
Версия: 4.6.X

Правила агрегации YAML

В версии 4.6 добавлен новый формат правил агрегации на языке YAML, расширяющий возможности агрегации событий в директивах корреляции. Новый формат поддерживает группировку по нескольким полям, дополнительные правила агрегации и пользовательские способы вывода полей.

При создании директивы выберите тип узла Событие и напишите правило агрегации на языке YAML в поле для выражения.

Конфигурация

YAML-конфигурация агрегации состоит из двух основных полей:

  • aggregation -- блок, содержащий правило агрегации
  • expression -- CEL-выражение для отбора событий, подлежащих агрегации

Поля блока aggregation

ПолеОбязательноеОписание
fieldsНетМассив полей группировки
windowДаРазмер временного окна агрегации (5m, 1h и т.п.)
max_eventsНетМаксимальное количество событий для мгновенного закрытия окна
min_eventsНетМинимальное количество событий для создания инцидента при закрытии окна
additional_rulesНетДополнительные правила агрегации
deriveНетБлок определения вывода полей для результата агрегации

Пример конфигурации

aggregation:
fields:
- name: ECS.Event.Code
- name: AssetIPs
unnest: true
window: 30m
max_events: 500
min_events: 50
additional_rules:
- window: 1m
min_events: 25
derive:
fields:
- to: Hashes
deriving_type: distinct
deriving_data:
from: ECS.Event.Hash
all:
enable: true
overwrite: false
deriving_type: last
expression: "ep['ECS.Event.Code'] > 4650 && ep['ECS.Event.Code'] < 4700"

Поля группировки

Новая агрегация поддерживает три режима группировки:

  • Без группировки -- события агрегируются без разделения по полям, исключительно по фильтру
  • Одно поле -- аналог поведения предыдущей версии агрегации
  • Несколько полей -- события разделяются на основе значений нескольких полей

Для указания полей группировки используется поле aggregation.fields.

Формат объектов группировки

Каждое поле группировки задаётся объектом:

fields:
- name: "ECS.Event.Code"
unnest: true
ПараметрОписание
nameНазвание поля для группировки
unnestРежим группировки по полям-массивам (по умолчанию false)

Если unnest равен false, группировка проводится целиком по значению массива -- для попадания в одну группу события должны иметь одинаковые значения в массиве. Если unnest равен true, группировка проводится отдельно по каждому элементу массива.

Сокращённый формат

Поля группировки можно задать массивом строк. В этом случае параметр unnest считается равным false для каждого поля:

fields:
- "ECS.Event.Code"
- "AssetIPs"

Условия завершения агрегации

Основные условия завершения агрегации определяются значениями max_events и min_events:

max_eventsmin_eventsПоведение
> 0> 0Агрегация завершается сразу при достижении max_events событий, либо по окончании окна при наличии минимум min_events событий
0> 0Агрегация завершается только при окончании окна при наличии минимум min_events событий
> 00Агрегация завершается при достижении max_events событий в окне
00Невалидная конфигурация (приводит к ошибке)
warning

Хотя бы одно из полей max_events или min_events должно быть указано.

Дополнительные правила агрегации

Блок additional_rules позволяет определить дополнительные условия успешного завершения агрегации. Это полезно для обнаружения всплесков количества событий и ускорения реакции на них.

Каждое дополнительное правило содержит:

ПолеОбязательноеОписание
windowДаРазмер дополнительного временного окна
max_eventsНетМаксимальное количество событий в дополнительном окне
min_eventsНетМинимальное количество событий в дополнительном окне
immediate_triggerНетНемедленное завершение основной агрегации при срабатывании (по умолчанию false)

Поведение при срабатывании дополнительного правила:

  • Если immediate_trigger равен true, основная агрегация незамедлительно завершается успехом
  • Если immediate_trigger равен false или не указан, агрегация завершится успехом только при закрытии основного окна

Пример дополнительного правила

additional_rules:
- window: 1m
min_events: 25
immediate_trigger: true

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

Вывод полей

Блок derive определяет, какие поля и каким образом будут включены в результат агрегации.

Структура блока derive

derive:
fields:
- to: "ИмяПоля"
deriving_type: "способ_вывода"
deriving_data:
from: "ИсходноеПоле"
all:
enable: true
overwrite: false
deriving_type: last

Поле fields

Массив объектов, определяющих вывод отдельных полей:

ПараметрОписание
toНазвание поля в результате агрегации
deriving_typeСпособ вывода значения поля
deriving_dataДанные для конкретного способа вывода

Поле all

Общее правило вывода полей:

ПараметрОписание
enableАктивация общего вывода полей
overwriteПерезаписывать ли существующие значения полей
deriving_typeСпособ вывода (first или last)

Стандартные способы вывода

Для стандартных способов вывода в блоке deriving_data необходимо указать поле from с названием исходного поля.

СпособОписаниеТипы полей
firstЗначение из первого событияЛюбые
lastЗначение из последнего событияЛюбые
distinctВсе уникальные значения в виде массиваЛюбые
avgСреднее значениеЧисловые
sumСумма значенийЧисловые
minМинимальное значениеЧисловые
maxМаксимальное значениеЧисловые

Пользовательский способ вывода

Способ custom позволяет создавать произвольный вывод полей на основе выражений CEL. Подход аналогичен созданию пользовательских агрегатных функций.

Параметры deriving_data для custom:

ПараметрОписание
init_exprCEL-выражение, инициализирующее начальное состояние агрегации
state_exprCEL-выражение функции состояния, вызываемое для каждого события
finalize_exprCEL-выражение, завершающее агрегацию и возвращающее результат
disable_type_checkingОтключить проверку типов в CEL-выражениях

Алгоритм работы пользовательского вывода:

  1. Вызывается init_expr, результат определяет начальное значение состояния
  2. Для каждого события в закрытом окне вызывается state_expr. Внутри выражения доступна переменная agg_state с текущим состоянием и все переменные события. Результат становится новым состоянием
  3. Вызывается finalize_expr с доступом к agg_state. Результат присваивается целевому полю

Если disable_type_checking равен true, переменная agg_state имеет динамический тип. Если false (значение по умолчанию), тип agg_state определяется результатом init_expr, и типы результатов init_expr и state_expr должны совпадать.

Пример пользовательского вывода

derive:
fields:
- to: HasAdminRights
deriving_type: custom
deriving_data:
init_expr: "false"
state_expr: "agg_state || (has(ep.HasAdminRights) && ep['HasAdminRights'])"
finalize_expr: "agg_state"

В этом примере поле HasAdminRights в результате агрегации будет равно true, если хотя бы одно событие в окне содержало признак наличия прав администратора.