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

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

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

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

В случае, если мы получаем событие с коллектора, для которого не установлен плагин нормализации, либо под данный тип событий отсутствует подходящий плагин или регулярное выражение, то автоматически заполняются следующие поля внутренней структуры события 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 реализована функция создания пользовательских полей событий.

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

Расположение: manage ⇒ Настройка коллекторов ⇒ Поля событий ⇒ Пользовательские

Действия:

  1. Создать пользовательские поля, нажав на «Добавить»
  2. Задать уникальное название поля события в стиле PascalCase, название поля для отображения, описание
  3. Задать тип данных поля из выпадающего списка. Типы данных полей и их описание представлены в следующей таблице
  4. Сохранить

Таблица 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.410^-45^ до 3.410^38^ (для положительных)
float64представляет число с плавающей точкой от 4.910^-324^ до 1.810^308^ (для положительных)
bytesсиноним типа uint8, представляет целое число от 0 до 255
timeпредставляет временной тип данных
boolлогический тип, имеет одно из двух значений: true (истина) или false (ложь)
ipIPv4 или 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"
}
}

Расположение: manage ⇒ Настройка коллекторов

Действия:

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

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

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

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

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

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

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

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

  5. Нажмите Проверить выражение и заполнить поля. В результате извлечённые поля будут следующие:

    Name: active_connection_reuse

    RespH: 10.0.5.152

    SensorId: cec1da6b-b075-4556-a2b2-001c4fcb7b5c

    Source: zeek-stdout

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

Универсальная нормализация всего события 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"}

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

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

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

1

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

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

В графу "Регулярное выражение" напишите выражение для извлечения структурированной информации из исходного текста записи лога. Используйте встроенные парсеры: 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

Расположение: manage ⇒ Настройка коллекторов.

Действия:

  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

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

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

Плагин processors

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

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

Видео