# Приемы парсинга событий

### Использование нормализатора в качестве доп. парсера

![image.png](https://kb.kuma-community.ru/uploads/images/gallery/2026-01/scaled-1680-/image.png)

KUMA 4.0.1 была добавлена возможность использовать нормализатор, как элемент другого нормализатора. Пример можно посмотреть в нормализаторе "\[OOTB\] Microsoft Products via KES WIN NG for KUMA 4.0.1"

### Парсинг нестандартной даты

[![image.png](https://kb.kuma-community.ru/uploads/images/gallery/2023-11/scaled-1680-/iFzimage.png)](https://kb.kuma-community.ru/uploads/images/gallery/2023-11/iFzimage.png)

---

### Ветвление событий от beats в зависимости от input типа

Даны следующие типы событий (содержимое тестового сообщения сокращено для лучшего понимания):

```json
{"tags":["beats_input_raw_event"],"input":{"type":"filestream"}}
{"message":"I0130 14:38:47.090079 1837403 utils.go:187] ID: 544472 GRPC response: {}","input":{"type":"container"}}
{"journal":{"system":"true"},"tags":["beats_input_codec_plain_applied"],"input":{"type":"journald"}}
{"input":{"type":"journald"},"journal":{"system":"true"},"tags":["beats_input_codec_plain_applied"]}
{"journal":{"system":"true"},"input":{"type":"journald"},"tags":["beats_input_codec_plain_applied"]}
```

Необходимо в парсинге разветлять (тк у каждого типа свой набор полей) парсинг в зависимости от типа input поля, мы имеем три типа в данном примере:

- "input":{"type":"container"}
- "input":{"type":"journald"}
- "input":{"type":"filestream"}

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

[![image.png](https://kb.kuma-community.ru/uploads/images/gallery/2024-01/scaled-1680-/mpAimage.png)](https://kb.kuma-community.ru/uploads/images/gallery/2024-01/mpAimage.png)

Поле из regex с наименованием route будет использоваться для маршрутизации по условию в нужный парсер, поле all необходимо для передачи полного содержимого в подпарсер. Структура парсера выглядит следующим образом:

[![image.png](https://kb.kuma-community.ru/uploads/images/gallery/2024-01/scaled-1680-/EBMimage.png)](https://kb.kuma-community.ru/uploads/images/gallery/2024-01/EBMimage.png)

Рассмотрим один подпарсер, например, filestream:

[![image.png](https://kb.kuma-community.ru/uploads/images/gallery/2024-01/scaled-1680-/1j0image.png)](https://kb.kuma-community.ru/uploads/images/gallery/2024-01/1j0image.png)

Тк общая структура сообщения формата JSON, используется соответсвующий коробочный парсер:

[![image.png](https://kb.kuma-community.ru/uploads/images/gallery/2024-01/scaled-1680-/H2limage.png)](https://kb.kuma-community.ru/uploads/images/gallery/2024-01/H2limage.png)

---

### Парсинг массивов

<p class="callout info">Актуально для KUMA 3.0+</p>

В KUMA 3.0.2 появилась возможность создания кастомных полей типа "массив" (SA, NA, FA), доступные для методов парсинг JSON и KV. Чтобы записать массив в дополнительное поле, достаточно его указать в маппинге:

![image.png](https://kb.kuma-community.ru/uploads/images/gallery/2024-02/scaled-1680-/gAsimage.png)

В событии это будет выглядеть следующим образом:

![image.png](https://kb.kuma-community.ru/uploads/images/gallery/2024-02/scaled-1680-/egnimage.png)

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

![image.png](https://kb.kuma-community.ru/uploads/images/gallery/2024-02/scaled-1680-/15gimage.png)

В таком случае в событии данное поле будет представлять собой массив переведенный в строку:

![image.png](https://kb.kuma-community.ru/uploads/images/gallery/2024-02/scaled-1680-/tOdimage.png)

Чтобы привести ее в более "приятный" вид можно выполнить следующие преобразования:

![image.png](https://kb.kuma-community.ru/uploads/images/gallery/2024-02/scaled-1680-/mH1image.png)

После этого в DeviceCustomString1 будут записаны все элементы массива через выбранный в последнем (3) преобразовании делиметр (в данном примере это "пробел"):

![image.png](https://kb.kuma-community.ru/uploads/images/gallery/2024-02/scaled-1680-/ZTMimage.png)

---

### Передача сырого события в экстранормализатор, для доступа к элементам массива

<p class="callout info">Актуально для KUMA 3.0+</p>

Для передачи «сырого» события в экстра-нормализатор необходимо:

- открыть нормализатор событий;
- перейти в меню «Условия дополнительной нормализации»;
- активировать параметр «Использовать сырое событие».

<p class="callout info">По умолчанию параметр «Использовать сырое событие» не активен. </p>

[![image.png](https://kb.kuma-community.ru/uploads/images/gallery/2024-03/scaled-1680-/lU1image.png)](https://kb.kuma-community.ru/uploads/images/gallery/2024-03/lU1image.png)

Рекомендуется активировать параметр «Использовать сырое событие» в нормализаторах типа **«xml», «json»**.

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

В качестве примера работы данной функции вы можете обратиться к нормализатору Microsoft Products для KUMA 3.0.1: параметр «Использовать сырое событие» включен последовательно в экстра-нормализаторах «AD FS» и «424».

В качестве примера, событие:

*&lt;Event xmlns='http://schemas.microsoft.com/win/2004/08/events/event'&gt;&lt;System&gt;&lt;Provider Name='ESENT'/&gt;&lt;EventID Qualifiers='0'&gt;216&lt;/EventID&gt;&lt;Level&gt;4&lt;/Level&gt;&lt;Task&gt;3&lt;/Task&gt;&lt;Keywords&gt;0x80000000000000&lt;/Keywords&gt;&lt;TimeCreated SystemTime='2024-01-20T20:06:07.144730300Z'/&gt;&lt;EventRecordID&gt;870234&lt;/EventRecordID&gt;&lt;Channel&gt;Application&lt;/Channel&gt;&lt;Computer&gt;COMPANY.COM&lt;/Computer&gt;&lt;Security/&gt;&lt;/System&gt;&lt;EventData&gt;&lt;Data&gt;lsass&lt;/Data&gt;&lt;Data&gt;724,R,98&lt;/Data&gt;&lt;Data&gt;&lt;/Data&gt;&lt;Data&gt;C:\\Windows\\NTDS\\ntds.dit&lt;/Data&gt;&lt;Data&gt;\\\\?\\GLOBALROOT\\Device\\HarddiskVolumeShadowCopy50\\Windows\\NTDS\\ntds.dit&lt;/Data&gt;&lt;/EventData&gt;&lt;/Event&gt;*

При парсинге ID события 216:

[![image.png](https://kb.kuma-community.ru/uploads/images/gallery/2024-03/scaled-1680-/6ssimage.png)](https://kb.kuma-community.ru/uploads/images/gallery/2024-03/6ssimage.png)

Будет корректно разбираться:

[![image.png](https://kb.kuma-community.ru/uploads/images/gallery/2024-03/scaled-1680-/Wizimage.png)](https://kb.kuma-community.ru/uploads/images/gallery/2024-03/Wizimage.png)

---

### Смена порядка следования экстранормализаторов

<p class="callout info">Материал был предостален пользователем комьюнити ❤️</p>

По умолчанию в GUI KUMA отсутствует возможность перемещать экстранормализаторы внутри правила нормализации и менять их местами. Однако, в ряде случаев данная операция всё же требуется. Например, когда нужно добавить блок с экстранормализатором выше уже существующих, так как они проверяются последовательно. Через веб-интерфейс это сделать проблематично, т.к. потребуется удаление и пересоздание заново всех блоков экстранормализаторов идущих ниже.

![image.png](https://kb.kuma-community.ru/uploads/images/gallery/2024-09/scaled-1680-/B2Mimage.png)

Ниже описан workaround, который позволяет получить нужное правило нормализации в виде JSON файла из MongoDB и отредактировать его, задав нужную последовательность экстранормализаторов.

<p class="callout warning">**Необходимые меры предосторожности**:  
1. Все действия по подготовке нужного правила настоятельно рекомендуется выполнять на тестовом стенде (не на продуктовой инсталляции), так как предполагается прямой доступ и запись данных в MongoDB (основную базу настроек KUMA). Нельзя исключать риск нарушения работы инсталляции KUMA из-за возможных ошибок.  
2. Предварительно рекомендуется сделать выгрузку контента и бэкап самой базы: средствами kuma tools (old), по API или через утилиту mongodump.  
</p>

1\. Разместить на стенде KUMA правило нормализации, которое будет подлежать редактированию. Открыть его в браузере и скопировать его UUID из строки URL.

![image.png](https://kb.kuma-community.ru/uploads/images/gallery/2024-09/scaled-1680-/HSkimage.png)

<p class="callout info">Необходимые утилиты под вашу ОС можно загрузить отсюда: [https://www.mongodb.com/try/download/database-tools](https://www.mongodb.com/try/download/database-tools) Документация по утилитам: [https://www.mongodb.com/docs/v4.2/reference/program/](https://www.mongodb.com/docs/v4.2/reference/program/) </p>

2\. C помощью встроенной консольной утилиты mongoexport выполнить подключение к базе kuma и экспорт нужного правила нормализации в файл:

```bash
/opt/kaspersky/kuma/mongodb/bin/mongoexport --db=kuma --collection=resources --query='{"_id": "your_normalizer_id"}' > normalizer.json
```

Пример успешного экспорта:

![image.png](https://kb.kuma-community.ru/uploads/images/gallery/2024-09/scaled-1680-/17timage.png)

3\. Открыть полученный JSON файл в редакторе, поддерживающим форматирование JSON и работу с объектами (например, Notepad++ c плагином JSTool).  
― Сразу поменять uuid в полях "\_id", "exportID", "id" на новый. Он должен быть уникальным в рамках всех остальных ресурсов KUMA для успешного импорта правила обратно. Сгенерировать UUID:   
cat /proc/sys/kernel/random/uuid  
― Сразу поменять значение поля "name", задав новое название правила или его версию.  
― Найти в структуре файла блок "extra", содержащий экстранормализаторы. Развернуть его и выполнить поиск нужного блока экстранормализации который требуется переместить.

![image.png](https://kb.kuma-community.ru/uploads/images/gallery/2024-09/scaled-1680-/EVmimage.png)

4\. В блоке <span style="font-family: 'Courier New';">"</span><span lang="EN-US" style="font-family: 'Courier New'; mso-ansi-language: EN-US;">extra</span><span style="font-family: 'Courier New';">"</span> найти по нужный экстранормализатор, выделить и скопировать его код целиком, ориентируясь на открывающую скобку перед полем <span style="font-family: 'Courier New';">"</span><span lang="EN-US" style="font-family: 'Courier New'; mso-ansi-language: EN-US;">normalizer</span><span style="font-family: 'Courier New';">"</span> и соответствующую закрывающую скобку.

![image.png](https://kb.kuma-community.ru/uploads/images/gallery/2024-09/scaled-1680-/vNkimage.png)

5\. Вставить скопированный код в нужное место в блоке "extra". Например, в его начале или между требуемых экстранормализаторов (зависит от нужного вам порядка их следования). Проверить, что все скобки { } на месте.

6\. Сохранить получившийся JSON файл, перенести его обратно на сервер с KUMA Core и выполнить его импорт в MongoDB:

```bash
/opt/kaspersky/kuma/mongodb/bin/mongoimport --db kuma --collection resources --file new_normalizer.json
```

Пример успешного импорта:

![image.png](https://kb.kuma-community.ru/uploads/images/gallery/2024-09/scaled-1680-/N3yimage.png)

7\. Зайти в веб-интерфейс KUMA и проверить наличие отредактированного нормализатора (в том же тенанте и папке, т.к. они не менялись)

![image.png](https://kb.kuma-community.ru/uploads/images/gallery/2024-09/scaled-1680-/15Iimage.png)

Результат: изменён порядок следования экстранормализаторов без их удаления и пересоздания вручную через веб-интерфейс

![image.png](https://kb.kuma-community.ru/uploads/images/gallery/2024-09/scaled-1680-/zYLimage.png)

#### Альтернативный вариант с VS Code

<p class="callout info">Потребуется приложение: [https://code.visualstudio.com/](https://code.visualstudio.com/) и плагин для работы с MongoDB: [https://marketplace.visualstudio.com/items?itemName=mongodb.mongodb-vscode](https://marketplace.visualstudio.com/items?itemName=mongodb.mongodb-vscode) </p>

<p class="callout info">Также можно использовать клиент MongoDB Compass для подключения к MongoDB: [https://www.mongodb.com/products/tools/compass](https://www.mongodb.com/products/tools/compass) </p>

<p class="callout warning">Рекомендуется работать с копией / дубликатом ресурса, чтобы предотвратить возможные проблемы</p>

1\. Подключение к монго через SSH:

![image.png](https://kb.kuma-community.ru/uploads/images/gallery/2024-09/scaled-1680-/VZAimage.png)

![image.png](https://kb.kuma-community.ru/uploads/images/gallery/2024-09/scaled-1680-/GvHimage.png)

Прописываем адрес, логин и пароль для SSH:

![image.png](https://kb.kuma-community.ru/uploads/images/gallery/2024-09/scaled-1680-/Wtnimage.png)

2\. Заходим в БД kuma

![image.png](https://kb.kuma-community.ru/uploads/images/gallery/2024-09/scaled-1680-/uYpimage.png)

3\. Переходим в коллекцию resoureces и нажимаем на значок поиска

![image.png](https://kb.kuma-community.ru/uploads/images/gallery/2024-09/scaled-1680-/Y9Uimage.png)

4\. Ищем ресурс по имени или ID (кому как удобно):

![image.png](https://kb.kuma-community.ru/uploads/images/gallery/2024-09/scaled-1680-/6Bcimage.png)

5\. Переходим в режим редактирования и далее можно перемежать блоки JSON нормализатора и других ресурсов, как вам удобно, для сохранения используте комбинацию клавиш Ctrl+S:

![image.png](https://kb.kuma-community.ru/uploads/images/gallery/2024-09/scaled-1680-/SSeimage.png)