Нормализация событий
Для того, чтобы можно было осуществлять с данными событий различные манипуляции (сравнивать с помощью фильтров по заданными значениями, извлекать данные в директивах корреляции), необходимо их разобрать на составляющие поля, т.е. нормализовать.
Работа с ненормализованными событиями
В случае, если мы получаем событие с коллектора, для которого не установлен плагин нормализации, либо под данный тип событий отсутствует подходящий плагин или регулярное выражение, то автоматически заполняются следующие поля внутренней структуры события ПК «КОМРАД»:
CTime (время создания)
Время создания события, извлечённое из сырого текста события
GenerationTime (Время получения)
Время получения события агентом/коллектором
WTime (Время записи)
Время записи в хранилище
CollectorType (Тип источника)
Тип агента или коллектора событий ИБ
Raw (Сырой текст)
Исходный текст полученного события
CollectorID (ID источника)
Уникальный идентификатор агента или коллектора событий ИБ
SetupID (ID инсталляции)
Идентификатор инсталляции ПК «КОМРАД»
TenantID (ID кластера)
ID кластера в мульти-кластерной инсталляции
SL (Метка безопасности)
Метка безопасности для управления доступом к событиям ИБ
Producer (Место возникновения)
Точка генерации события ИБ в ПК «КОМРАД» - коллектор, коррелятор, Сканер-ВС
AggregationName (Метка агрегации)
Метка агрегации событий ИБ
Count (Число агрегированных)
Число агрегированных событий ИБ по метке агрегации
AssetIPs (IP активов)
IP связанных с событием активов
FwdIP (IP форвардера)
IP узла, с которого поступило событие в коллектор
FwdPort (Порт форвардера)
Порт, который использовался узлом для направления события в коллектор
PluginIDs (ID плагинов)
ID плагинов, сработавших в нормализации события.
Некоторые поля событий для коллекторов WMI и SQL (SQL.TaskName) генерируются только при получении события ИБ, для остальных коллекторов набор полей реализуется через Elastic Common Schema (ECS).
Также в ПК «КОМРАД» реализована функция создания пользовательских полей событий.
Пользовательские поля
Расположение: Администрирование → Настройка коллекторов → Поля событий → Пользовательские
Действия:
-
создать пользовательские поля нажав на «Добавить»
-
задать уникальное название поля события в стиле 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), то поля событий будут автоматически нормализованы ПК «КОМРАД».
Разработка плагинов
Плагины включают в себя регулярные выражения для разбора событий. Поля, извлекаемые из событий, могут быть добавлены в существующую стандартную структуру события, это осуществляется с помощью настройки маппинга с предварительным добавлением пользовательских полей.
Плагины можно создавать самостоятельно и устанавливать разработанные вендором или третьей стороной.
Для разработки собственных плагинов необходимо иметь сведения о структуре событий, отправляемых источником, примеры сообщений и знания по применению регулярных выражений для извлечения данных.
Синтаксис парсера 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;; AND
Извлекает в событие поля:
Имя поля | Значение |
---|---|
FlowId |
116307482565223 |
SrcPort |
32876 |
Плагин processors содержит набор конфигурируемых процессоров события. Процессоры события можно конфигурировать, располагать в любой последовательности применения.
Доступные процессоры: