Нормализация событий
Для того, чтобы можно было осуществлять с данными событий различные манипуляции (сравнивать с помощью фильтров по заданными значениями, извлекать данные в директивах корреляции), необходимо их разобрать на составляющие поля, т.е. нормализовать.
Работа с ненормализованными событиями
В случае, если мы получаем событие с коллектора, для которого не установлен плагин нормализации, либо под данный тип событий отсутствует подходящий плагин или регулярное выражение, то автоматически заполняются следующие поля внутренней структуры события 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 реализована функция создания пользовательских полей событий.
Пользовательские поля
Расположение: Администрирование → Настройка коллекторов → Поля событий → Пользовательские
Действия:
-
создать пользовательские поля, нажав на «Добавить»
-
задать уникальное название поля события в стиле PascalCase, название поля для отображения, описание
-
задать тип данных поля из выпадающего списка. Типы данных полей и их описание представлены в следующей таблице
-
сохранить
Тип поля | Описание |
---|---|
string |
представляет строковый тип данных |
int |
представляет целое число со знаком, которое в зависимости о платформы может соответствовать либо int32, либо int64 |
int32 |
представляет целое число от -2 147 483 648 до 2 147 483 647 |
int64 |
представляет целое число |
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 |
представляет число с плавающей точкой |
float64 |
представляет число с плавающей точкой |
bytes |
синоним типа uint8, представляет целое число от 0 до 255 |
time |
представляет временной тип данных |
bool |
логический тип, имеет одно из двух значений: |
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"
}
}
Расположение: Администрирование → Настройка коллекторов
Действия:
-
Перейдите на вкладку «Плагины» и создайте плагин, нажав на кнопку «Добавить»
-
Задайте уникальное имя плагина и нажмите кнопку «Сохранить»
-
В форму регулярное выражение вставьте конструкцию формата:
json:source;; AND sensor_id;; AND message.name;; AND message.id\.resp_h
Разделителями между json-полями служит конструкция:
;; AND
Для выделения json-поля, которое входит в состав другого поля
(в нашем примере это поле name
, которое находится внутри поля message
), необходимо использовать поле1.поле2/
конструкцию.
-
Введите описание
Для нормализации по полю, содержащему точку в названии, необходимо использовать экранирующий символ \
, как показано в примере.
-
Нажмите «Проверить выражение и заполнить поля». В результате извлечённые поля будут следующие:
Name: active_connection_reuse
RespH: 10.0.5.152
SensorId: cec1da6b-b075-4556-a2b2-001c4fcb7b5c
Source: zeek-stdout -
Выберите соответствия для полей нормализации и нажмите «Сохранить».
Универсальная нормализация всего события 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"}
В поле "Описание" напишите примеры использования вашего правила и любые дополнительные заметки.
Теперь нажмите кнопку "Проверить выражение и заполнить поля".
В столбце "Извлечённые поля" отобразятся полученные результаты. На картинке ниже можно увидеть, как прошёл парсинг для указанного примера.

Эвристический анализ паттерна
Данный вид анализ применяется для определения структуры текста события.
В графу "Регулярное выражение" напишите выражение для извлечения структурированной информации из исходного текста записи лога. Используйте встроенные парсеры: 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
Расположение: Администрирование → Настройка коллекторов.
Действия:
-
На основе анализа событий принимается решение создать два пользовательских поля нормализации:
Criticality
иMessage
. Для этого во вкладке «Поля событий» перейдите на вкладку «Пользовательские» и добавьте два поля, определив тип представления данных как «string» -
Перейдите на вкладку «Плагины» и создайте плагин, нажав на кнопку «Добавить»
-
Задайте уникальное имя плагина и нажмите кнопку «Сохранить»
-
Добавьте регулярное выражение и его краткое описание, которое будет разбирать события, при этом помечая значения поля критичности и сообщения CriticalityField и MessageField, соответственно:
^\w*\:\s(?P<CriticalityField>\w*)\:\s\w*\:\s(?P<MessageField>.*)$
-
Вставьте пример сообщения в форму «Пример сырого текста события», нажмите на кнопку «Проверить выражение и заполнить поля»
-
Добавьте поля маппинга, сопоставив поле в регулярном выражении с соответствующим созданным пользовательским полем нормализации и нажмите на кнопку «Сохранить»
-
Перейдите на вкладку «Коллекторы», выберите тип коллектора, с помощью которого осуществляется сбор событий (в примере используется Syslog-коллектор)
-
В левой панели выберите вкладку «Плагины» и включите созданный плагин
-
осуществите поиск событий от данного источника и убедитесь, что в карточке события в разделе «Пользовательские поля» появились значения полей
Criticality
иMessage
Дополнительно
-
Плагин не будет разбивать события на поля нормализации, которые поступают на данный коллектор до его перезагрузки
-
В связи с тем, что один плагин может иметь неограниченное количество регулярных выражений, необходимо при создании задавать описание.
Плагины коллектора позволяют динамически конфигурировать модуль очистки и нормализации событий в коллекторах SIEM.
Плагины извлекают значения полей в соответствии с набором заданных правил. В каждом правиле можно опционально указать правила приведения имён полей, также называемый "маппинг полей". Рекомендуется приводить названия полей к стандартной схеме события ECS.
-
regex
-
json
-
processors
Плагин 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
содержит набор конфигурируемых процессоров события. Процессоры события можно конфигурировать, располагать в любой последовательности применения.
Доступные процессоры: