Нормализация событий

Для того, чтобы можно было осуществлять с данными событий различные манипуляции (сравнивать с помощью фильтров по заданными значениями, извлекать данные в директивах корреляции), необходимо их разобрать на составляющие поля, т.е. нормализовать.

Работа с ненормализованными событиями

В случае, если мы получаем событие с коллектора, для которого не установлен плагин нормализации, либо под данный тип событий отсутствует подходящий плагин или регулярное выражение, то автоматически заполняются следующие поля внутренней структуры события KOMRAD:

  • CTime (время создания) - время создания события, извлечённое из сырого текста события

  • GenerationTime (Время получения) - время получения события агентом/коллектором

  • WTime (Время записи) - время записи в хранилище

  • CollectorType (Тип источника) - тип агента или коллектора событий ИБ

  • Raw (Сырой текст) - исходный текст полученного события

  • CollectorID (ID источника) - уникальный идентификатор агента или коллектора событий ИБ

  • SetupID (ID инсталляции) - идентификатор инсталляции KOMRAD

  • TenantID (ID кластера) - ID кластера в мульти-кластерной инсталляции

  • SL (Метка безопасности) - метка безопасности для управления доступом к событиям ИБ

  • Producer (Место возникновения) - точка генерации события ИБ в KOMRAD - коллектор, коррелятор, Сканер-ВС

  • AggregationName (Метка агрегации) - метка агрегации событий ИБ

  • Count (Число агрегированных) - число агрегированных событий ИБ по метке агрегации

  • AssetIPs (IP активов) - IP связанных с событием активов

  • FwdIP (IP форвардера) - IP узла, с которого поступило событие в коллектор

  • FwdPort (Порт форвардера) - порт, который использовался узлом для направления события в коллектор

  • PluginIDs (ID плагинов) - ID плагинов, сработавших в нормализации события

Некоторые поля событий для коллекторов WMI и SQL (SQL.TaskName) генерируются только при получении события ИБ, для остальных коллекторов набор полей реализуется через Elastic Common Schema (ECS).

Также в KOMRAD реализована функция создания пользовательских полей событий.

Пользовательские поля

Расположение: Администрирование → Настройка коллекторов → Поля событий → Пользовательские

Действия:

  1. создать пользовательские поля, нажав на «Добавить»

  2. задать уникальное название поля события в стиле PascalCase, название поля для отображения, описание

  3. задать тип данных поля из выпадающего списка. Типы данных полей и их описание представлены в следующей таблице

  4. сохранить

Table 1. Типы данных полей
Тип поля Описание

string

представляет строковый тип данных

int

представляет целое число со знаком, которое в зависимости о платформы может соответствовать либо int32, либо int64

int32

представляет целое число от -2 147 483 648 до 2 147 483 647

int64

представляет целое число
от –9 223 372 036 854 775 808 до 9 223 372 036 854 775 807

int_slice

представляет неограниченный int

uint8

представляет целое число от 0 до 255

uint16

представляет целое число от 0 до 65 535

uint32

представляет целое число от 0 до 4 294 967 295

uint64

представляет целое число от 0 до 18 446 744 073 709 551 615

uint64_slice

представляет неограниченный uint64

float32

представляет число с плавающей точкой
от 1.4*10-45 до 3.4*1038 (для положительных)

float64

представляет число с плавающей точкой
от 4.9*10-324 до 1.8*10308 (для положительных)

bytes

синоним типа uint8, представляет целое число от 0 до 255

time

представляет временной тип данных

bool

логический тип, имеет одно из двух значений:
true (истина) или false (ложь)

ip

IPv4 или IPv6

ip_slice

представляет неограниченный IP

string_slice

представляет неограниченный string

Вы не сможете удалить пользовательское поле, которое использовалось в плагине, после удаления этого плагина

Работа с событиями в формате CEF

Если источник событий передает события в формате CEF (Common Event Format), то поля событий будут автоматически нормализованы KOMRAD.

Разработка плагинов

Плагины включают в себя регулярные выражения для разбора событий. Поля, извлекаемые из событий, могут быть добавлены в существующую стандартную структуру события, это осуществляется с помощью настройки маппинга с предварительным добавлением пользовательских полей.

Плагины можно создавать самостоятельно и устанавливать разработанные вендором или третьей стороной.

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

Синтаксис парсера JSON

Пример события:

{
  "source": "zeek-stdout",
  "sensor_id": "cec1da6b-b075-4556-a2b2-001c4fcb7b5c",
  "message": {
    "_path": "weird",
    "_write_ts": 1611835445.742201,
    "ts": 1611835445.742201,
    "uid": "CD9l8s23k0bYTZK0fc",
    "id.orig_h": "10.0.5.70",
    "id.orig_p": 37842,
    "id.resp_h": "10.0.5.152",
    "id.resp_p": 10050,
    "name": "active_connection_reuse",
    "notice": false,
    "peer": "zeek"
  }
}

Расположение: Администрирование → Настройка коллекторов

Действия:

  1. Перейдите на вкладку «Плагины» и создайте плагин, нажав на кнопку «Добавить»

  2. Задайте уникальное имя плагина и нажмите кнопку «Сохранить»

  3. В форму регулярное выражение вставьте конструкцию формата:

json:source;; AND sensor_id;; AND message.name;; AND message.id\.resp_h

Разделителями между json-полями служит конструкция: ;; AND

Для выделения json-поля, которое входит в состав другого поля (в нашем примере это поле name, которое находится внутри поля message), необходимо использовать поле1.поле2/ конструкцию.

  1. Введите описание

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

  1. Нажмите «Проверить выражение и заполнить поля». В результате извлечённые поля будут следующие:
    Name: active_connection_reuse
    RespH: 10.0.5.152
    SensorId: cec1da6b-b075-4556-a2b2-001c4fcb7b5c
    Source: zeek-stdout

  2. Выберите соответствия для полей нормализации и нажмите «Сохранить».

Универсальная нормализация всего события JSON

В системе KOMRAD присутствует возможность автоматического парсинга приходящих событий. Это может быть необходимо в тех случаях, когда исходные данные приходят уже в формате JSON, например.

При создании плагина введите в поле "Регулярное выражение":

json:all

Далее укажите пример исходного события. В качестве примера:

{"resourceType": "Patient", "id": "example", "status": "generated", "use": "usual", "code": "MR", "system": "urn:oid:1.2.36.146.595.217.0.1","value": "12345", "start": "2001-05-06", "display":"Acme Healthcare"}

В поле "Описание" напишите примеры использования вашего правила и любые дополнительные заметки.

Теперь нажмите кнопку "Проверить выражение и заполнить поля".

В столбце "Извлечённые поля" отобразятся полученные результаты. На картинке ниже можно увидеть, как прошёл парсинг для указанного примера.

result json

Эвристический анализ паттерна

Данный вид анализ применяется для определения структуры текста события.

В графу "Регулярное выражение" напишите выражение для извлечения структурированной информации из исходного текста записи лога. Используйте встроенные парсеры: json, jsonschema, regex, grok. По умолчанию используется парсер regex RE2, выбрать другой парсер можно префиксом <имя_парсера>:

Для извлечения сразу нескольких полей используйте разделитель ;; AND.

Примеры: json: .Hostname;; AND .Domain;; AND .fqdn или regex:.*.

Далее в поле «Пример исходного события» необходимо вставить сообщение с примером исходного события.

В поле "Описание" напишите примеры использования вашего правила и любые дополнительные заметки.

Нажмите кнопку "Эвристический анализ паттерна".

Добавьте поля маппинга, сопоставив поле в регулярном выражении с соответствующим созданным пользовательским полем нормализации и нажмите на кнопку «Сохранить».

Синтаксис регулярных выражений

Регулярные выражения являются формальным языком поиска и осуществления манипуляций с подстроками в тексте, основанным на использовании метасимволов.

Для поиска используется строка-образец (англ. pattern, по-русски её часто называют «шаблоном», «маской»), состоящая из символов и метасимволов и задающая правило поиска.

Для манипуляций с текстом дополнительно задаётся строка замены, которая также может содержать в себе специальные символы. Используются следующие метасимволы:

  • ^ — начало строки

  • $ — конец строки

  • . — любой символ

  • * — любое количество предыдущих символов

  • + — 1 или более предыдущих символов

  • ? — 0 или 1 предыдущих символов

  • ( ) — группировка конструкций

  • | — логический оператор «ИЛИ»

  • [ ] — любой из перечисленных внутри скобок символов, диапазон. Если первый символ в этой конструкции ^, то массив работает наоборот – проверяемый символ не должен совпадать с тем, что перечислено в скобках

  • { } — повторение символа несколько раз

  • \ — экранирование служебных символов

Также существуют специальные метасимволы, которыми можно заменить некоторые готовые конструкции:

  • \b — обозначает не символ, а границу между символами

  • \d — цифровой символ

  • \D — нецифровой символ

  • \s — пробел

  • \S — непробельный символ

  • \w — буквенный или цифровой символ, или знак подчеркивания

  • \W — любой символ, кроме буквенного или цифрового символа, или знака подчеркивания

Применение регулярных выражений и создание плагина

Предварительные условия:

  • известен формат событий, которые отправляет источник по Syslog. Как пример возьмем следующие события:

criticality: high: message: device is switching off

criticality: low: message: device configuration was updated

  • для имитации отправки данных сообщений источником можно воспользоваться командой nc:

    echo -n "criticality: high: message: device is switching off" | nc -u IP_адрес_узла_коллектора 49050

Расположение: Администрирование → Настройка коллекторов.

Действия:

  1. На основе анализа событий принимается решение создать два пользовательских поля нормализации: Criticality и Message. Для этого во вкладке «Поля событий» перейдите на вкладку «Пользовательские» и добавьте два поля, определив тип представления данных как «string»

  2. Перейдите на вкладку «Плагины» и создайте плагин, нажав на кнопку «Добавить»

  3. Задайте уникальное имя плагина и нажмите кнопку «Сохранить»

  4. Добавьте регулярное выражение и его краткое описание, которое будет разбирать события, при этом помечая значения поля критичности и сообщения CriticalityField и MessageField, соответственно:

    ^\w*\:\s(?P<CriticalityField>\w*)\:\s\w*\:\s(?P<MessageField>.*)$
  5. Вставьте пример сообщения в форму «Пример сырого текста события», нажмите на кнопку «Проверить выражение и заполнить поля»

  6. Добавьте поля маппинга, сопоставив поле в регулярном выражении с соответствующим созданным пользовательским полем нормализации и нажмите на кнопку «Сохранить»

  7. Перейдите на вкладку «Коллекторы», выберите тип коллектора, с помощью которого осуществляется сбор событий (в примере используется Syslog-коллектор)

  8. В левой панели выберите вкладку «Плагины» и включите созданный плагин

  9. осуществите поиск событий от данного источника и убедитесь, что в карточке события в разделе «Пользовательские поля» появились значения полей Criticality и Message

Дополнительно

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

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

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

Плагины извлекают значения полей в соответствии с набором заданных правил. В каждом правиле можно опционально указать правила приведения имён полей, также называемый "маппинг полей". Рекомендуется приводить названия полей к стандартной схеме события ECS.

Типы плагинов
  • regex

  • json

  • processors

Плагин json

Плагин json извлекает значения полей документа в формате json с помощью синтаксис GJSON

Пример плагина

Исходный текст:

{"timestamp":"2018-10-03T16:45:34.481113+0000","flow_id":116307482565223,"in_iface":"enp0s3","event_type":"alert","src_ip":"192.168.1.146","src_port":32876,"dest_ip":"93.184.216.34","dest_port":80,"proto":"TCP","tx_id":0,"alert":{"action":"allowed","gid":1,"signature_id":2013028,"rev":4,"signature":"ET POLICY curl User-Agent Outbound","category":"Attempted Information Leak","severity":2},"http":{"hostname":"example.org","url":"\/","http_user_agent":"curl\/7.58.0","http_content_type":"text\/html","http_method":"GET","protocol":"HTTP\/1.1","status":200,"length":1121},"app_proto":"http","flow":{"pkts_toserver":4,"pkts_toclient":3,"bytes_toserver":347,"bytes_toclient":1654,"start":"2018-10-03T16:45:34.252519+0000"}}

Плагин:

json:flow_id;; AND src_port

Извлекает в событие поля:

Имя поля Значение

FlowId

116307482565223

SrcPort

32876

Плагин processors

Плагин processors содержит набор конфигурируемых процессоров события. Процессоры события можно конфигурировать, располагать в любой последовательности применения.

Доступные процессоры: