Синтаксис правил типа Chain

Значение поля condition данного типа правил:

condition:
  type: chain
  chain:
    '0':
      index: alertix-*
      name: Имя первого звена
      priority: 1
      reliability: 1
      severity: 1
      ttl: 200
      query:
        bool:
          must: []
      to_params:
        $param1: field.name
    '1':
      index: alertix-*
      name: Имя второго звена
      priority: 3
      reliability: 2
      severity: 2
      query:
        bool:
          must: []

chain содержит до 5 секций описания условий поиска звена цепи заданного уровня. Каждая секция – JSON-объект, ключ секции – уровень звена цепи. Уровни нумеруются с 0 до 4. Создавать цепи более 5 звеньев не рекомендуется.

Параметр threshold определяет минимальное количество звеньев в обнаруженной цепи для записи в индекс. Значение по умолчанию: 2. Может быть от 1 до 5, но не больше количества звеньев в правиле.

Каждое звено цепочки поддерживает следующие типы:

  • bucket;

  • count;

  • no_events.

Тип no_events по сути является типом count с критерием lt и значением 1. Тип no_events не может быть первым звеном в цепи.

Параметры каждого типа звена указываются в словаре link_condition.

Для типа count поддерживаются параметры:

  • criteria - критерий сравнения (gt, lt, range);

  • value - значение, с которым будем сравнивать (для критерия range будет диапазон в виде массива из двух элементов, например [3, 9]);

Для типа bucket поддерживаются параметры:

  • criteria - критерий сравнения (gt, lt, range)

  • value - значение, с которым будем сравнивать (для критерия range будет диапазон в виде массива из двух элементов, например [3, 9])

  • bucket - название агрегации, по которой происходит сравнение

  • aggs - непосредственно агрегации, передаваемые в запрос

  • order_mode - параметр, отвечающий за то, по какому событию в агрегации (первому/последнему) формировать timestamp, для начала отсчета временной границы следующего звена (актуально только, когда звено типа bucket идет первым).

Для передачи параметров в следующее звено необходимо указать название агрегации из которого будет браться значение.

Для каждого звена задаются следующие параметры:

  • name – описательный параметр, используется для облегчения понимания звеньев цепи;

  • severity, reliability и priority – параметры важности, достоверности и приоритета; назначение и возможные значения описаны в разделе Общие сведения о правилах;

  • ttl – параметр, определяющий время ожидания появления следующего звена в цепи; если за отведенное время следующее звено не будет обнаружено, цепь будет закрыта; время задается в секундах; по умолчанию ttl = 200 секунд;

  • query – произвольный поисковый запрос без агрегаций на языке Query DSL, может содержать вложенные условия поиска, отбора и фильтрации аналогично правилу типа List (см. раздел Синтаксис правил типа List);

  • to_params – JSON-объект, задающий словарь "имя параметра": "значение"; описывает набор параметров, которые следует использовать для присоединения следующего звена цепи; параметры используются для формирования запроса; имена параметров могут быть произвольными, но обязательно начинаться с символов $ или @; в первом случае значение параметра используется, как "переменная" в теле запроса следующего уровня и может быть произвольного типа в том числе массивом; во втором случае строковое представление полученного значения используется как замена подстроки "@param_name" в строковом представлении запроса следующего уровня; "значение" – это имя поля события-источника, значение которого должно быть присвоено параметру.

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

Пример заполнения поля chain c первым звеном типа bucket (длина цепи два звена):

condition:
  type: chain
  chain:
    '0':
      name: Подсчет неудачных попыток аутентификации по пользователям и хостам
      index: alertix-winlogbeat-*
      type: bucket
      ttl: 60
      query:
        bool:
          must:
            - term:
                alertix.event.code: 4625
      priority: 1
      severity: 1
      reliability: 1
      to_params:
        $param1: user
      link_condition:
        aggs:
          hostname:
            aggs:
              user:
                terms:
                  size: 10000
                  field: user.name
            terms:
              size: 10000
              field: host.name
        value: 2
        bucket: user
        criteria: gt
        order_mode: asc
    '1':
      index: alertix-winlogbeat-*
      name: Успешный логин пользователя после нескольких неуспешных
      priority: 3
      reliability: 2
      severity: 2
      query:
        bool:
          must:
            - term:
                alertix.event.code: 4624
            - term:
                user.name: $param1

Пример заполнения поля chain со вторым звеном типа no_events:

condition:
  type: chain
  chain:
    '0':
      index: alertix-winlogbeat-*
      name: Запуск Whoami
      priority: 1
      reliability: 1
      severity: 1
      ttl: 60
      query:
        bool:
          must:
            - term:
                winlog.event_id: '1'
            - term:
                winlog.event_data.NewProcessBareName: whoami.exe
      to_params:
        $param1: agent.name
    '1':
      index: alertix-winlogbeat-*
      name: Запуск notepad++.exe 0 раз
      priority: 3
      reliability: 2
      severity: 2
      type: no_events
      query:
        bool:
          must:
            - term:
                process.name: notepad++.exe
            - term:
                agent.name: $param1

Пример заполнения поля chain со вторым звеном типа bucket:

condition:
  type: chain
  chain:
    '0':
      index: alertix-winlogbeat-*
      name: Запуск Whoami
      priority: 1
      reliability: 1
      severity: 1
      ttl: 60
      query:
        bool:
          must:
            - term:
                winlog.event_id: '1'
            - term:
                winlog.event_data.NewProcessBareName: whoami.exe
      to_params:
        $param1: agent.name
    '1':
      index: alertix-winlogbeat-*
      name: Запуск notepad++.exe 2+ раз
      priority: 3
      reliability: 2
      severity: 2
      type: bucket
      link_condition:
        aggs:
          task:
            terms:
              size: 10000
              field: winlog.task
        value: 2
        bucket: task
        criteria: gt
      query:
        bool:
          must:
            - term:
                process.name: notepad++.exe
            - term:
                agent.name: $param1