---
# System prepended metadata

title: Гришанов Матвей Сергеевич – Интенсив №2. Нормализация и корреляция событий информационной безопасности.

---

# Гришанов Матвей Сергеевич – Интенсив №2. Нормализация и корреляция событий информационной безопасности.

[toc]

---

## Установка утилиты PTSIEMSDK GUI

Скачиваем подготовленный архив и извлекаем из него файлы в выбранную заранее директорию. 

![](https://i.imgur.com/Gvcn1ZG.png)

---

Переходим в директорию **gui** и запускаем **standalone** приложение.

![](https://i.imgur.com/tQ0xOri.png)

---

## Изучение пользовательского интерфейса утилиты

Вкладка **"Редактор объектов"** -- область, которая используется для создания и редактирования формул и правил.

![](https://i.imgur.com/OiGvwks.png)

---

Вкладка **"Сценарии"** -- область, предназначенная для создания симуляции работы **SIEM**.

![](https://i.imgur.com/bZBCZwo.png)

---

Вкладка **"Настройка"** -- данная область отвечает за настройки параметров **пути**, **редактора объектов**, **сценариев**. Во вкладочке **общее** можно сменить локализацию программы, выбрав русский язык или английский.

![](https://i.imgur.com/01uZlvf.png)

![](https://i.imgur.com/HzdH5Cf.png)

![](https://i.imgur.com/XjZUBWn.png)

![](https://i.imgur.com/GiOj7fp.png)

---

### Меню "Справка"

Меню **"Справка"** -- вызывается с помощью клавиши **(F1)** или по нажатии на клавишу в правом нижнем углу интерфейса программы.

Вкладка **"Таксономия"** -- используется для описания всех полей, использующихся в системе. 

:::info
:information_source: Данный раздел справочника пригодится для написания формул нормализации. 
:::

![](https://i.imgur.com/Ve6C2No.png)

Так как во всех событиях описывается субъектно-объектное взаимодействие, то во вкладке **"Таксономия"** мы можем видеть поля:

1. Субъектов (**тех, кто начал взаимодействие**)

![](https://i.imgur.com/TXYBngc.png)

2. Действий (**описывают действие над объектом**)

![](https://i.imgur.com/WxeEho7.png)

3. Объектов (**тех, над кем взаимодействие совершается**)

![](https://i.imgur.com/tUGevnn.png)

4. Адреса (**источника взаимодействия**)

![](https://i.imgur.com/odXEEgA.png)

5. Адреса (**получателя**)

![](https://i.imgur.com/u2nS0vl.png)

6. Описания источника события

![](https://i.imgur.com/h7gi98B.png)

7. Другие 

![](https://i.imgur.com/yeq4SWb.png)

8. Настройки агрегации инцидентов

![](https://i.imgur.com/sVTOkf5.png)

---

Вкладка **"Горячие клавиши"** -- содержит в себе все **"хоткеи"** программы.

![](https://i.imgur.com/aTDcYHQ.png)

---

## Настройка папки с результатами для сценариев

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

Заходим во вкладку **"Настройка"** и выбираем **"Пути"**.

![](https://i.imgur.com/x2CXxy8.png)

---

Далее в области **"Прочее"** задаём папку для результатов.

![](https://i.imgur.com/Qo6bZ6H.png)

---

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

Нормализация события — это процедура приведения необработанного события к нормализованному виду в соответствии с заранее заданным для источника и типа события правилом нормализации.

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

## Разработка формулы нормализации для событий 1-ого типа

Cоздаём формулу нормализации, используя кнопочку **"Создать"** в правом верхнем углу.

![](https://i.imgur.com/mkHSU4W.png)

---

Далее необходимо импортировать сырые события в рабочее пространтсво.

![](https://i.imgur.com/Hua934W.png)

---

Выбираем файл read_config_raw_events.txt в качестве необработанного события.

![](https://i.imgur.com/GZr0mfb.png)

---

В области **"Исходное событие"** появилось загруженное событие.

![](https://i.imgur.com/liVsWM3.png)

---

Для того, чтобы увидеть его полностью -- необходимо включить **"Перенос по словам"** в контекстном меню, которое открывает по нажатии ПКМ.

![](https://i.imgur.com/14DGAd6.png)

---

После смены режима отображения.

1. Первое событие.

![](https://i.imgur.com/hRVSwXZ.png)

2. Второе событие.

![](https://i.imgur.com/SogU7tj.png)

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

---

Переходим к вставке шаблона, где выбираем **TEXT**.

![](https://i.imgur.com/oxSX2vy.png)

Вставленный шаблон **TEXT**.

![](https://i.imgur.com/Y3mZlIs.png)

:::info
:information_source: Исходя из возможностей приложения, возможно использовать 4 типа шаблона:

**TEXT** -- неструктурированная строка.

**JSON** -- структурированный формат.

**TABULAR** -- очень похож на формат **JSON**, чаще всего используется с **DB**.

**EVENTLOG** -- используется для логов **Windows** (похож на **JSON**).
:::

---

Далее мы вставляем **"Первое событие"** в форматную строку **TEXT**.

![](https://i.imgur.com/noG33uR.png)

---

:::info
:information_source: Начинаем постепенно редактировать нашу строку.

:information_source: Анализируем её и выбираем статические участки **(Якорные)** и динамические участки **(Их необходимо парсить и сохранять в поля)**. 

:information_source: А с использованием **"Токенов"** мы разбираем событие на части и таким образом получаем данные.
:::

---

Начнём с **даты**, которая является **динамическим участком**.

![](https://i.imgur.com/zJPRgTU.png)

---

Заменяем **дату** на специальный **токен** `DATETIME` и сохраняем метку времени в поле `time`.

:::info
:information_source: Для выбора поля используем справочник утилиты. Также частенько поглядываем в **developguide**.
:::

![](https://i.imgur.com/OquXCLB.png)

---

Участок события распарсится и будет сохранён в метку времени `time`.

:::warning
:warning: Так как присвоение полю time было сделано в форматной строке, то строчку `time = ` из шаблона необходимо удалить.
:::

![](https://i.imgur.com/1kHsOtW.png)

---

Следующий фрагмент `aix53`, который является источником события (узлом-источником), мы присвоим полю `src.hostname`, а в качестве токена будем использовать **WORDDASH** (используется для распознавания отдельных слов).

![](https://i.imgur.com/23dZnqG.png)

---

Далее строка `local0:info` -- это сообщение и оно информационное.

Оставляем без изменений.

---

Уникальным идентификатором типа события является следующий фрагмент -- `OS_CONF_READ`. Согласно справочнику идентификатор типа события использует поле **msgid**.

![](https://i.imgur.com/jOLw7Su.png)

---

Следующим фрагментом является имя пользователя -- `mp`. В данном случае пользователь является субъектом, поэтому поле -- `subject.account.name`. Типом данных является `STRING`.

![](https://i.imgur.com/1ixyGcc.png)

---

Фрагмент `OK` является показателем действия (**OK|FAIL|FAILURE**). Используя справочник, можно понять, что полем будет являться `datafield1`. `WORD` -- токен.

![](https://i.imgur.com/U0Q3kap.png)

---

Следующий фрагмент `cat`, который является именем утилиты, использованной для чтения файла. Пользуясь справочником, можно понять, что полем будет являться `subject.process.name`. `STRING` -- токен.

![](https://i.imgur.com/91xnPQW.png)

---

Фрагмент `/etc/shadow` - это полный путь к файлу, который считывают утилитой `cat`. Используем поле `object.fullpath` и токен `STRING`.

![](https://i.imgur.com/V43xs26.png)

---

Заполняем поля необходимые для проведения тестового сценария.

```
subject = "account" # выбираем этот параметр, так как имеется имя пользователя.
action = "view" # используем просмотр.
object = "file" # файл, который указан по пути /etc/shadow

#Воспользуемся if else для того, чтобы разделять status событий, которые могут быть как успешными, так и неудачными.

if datafield1 == "OK" then
    status = "success"
else
    status = "failure"
endif

importance = "info" # информация

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

event_src.vendor = "ibm"
event_src.title = "aix"
event_src.category = "Operating system"

# Идентификатор нормализации

id = "IBM_AIX_OS_CONF_READ"
```

![](https://i.imgur.com/pEZlp3n.png)

---

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

![](https://i.imgur.com/wWvUqKH.png)

![](https://i.imgur.com/6oaveT9.png)

:::success
:star: Тесты прошли успешно!
:::

---

Результат 1-ого события.

![](https://i.imgur.com/F7nRCI8.png)

Результат 2-ого события.

![](https://i.imgur.com/FjUz7Gk.png)

---

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

![](https://i.imgur.com/XX3zqrp.png)

---

## Создание заполненной пользовательской локализации и файла метаинформации с критериями локализации для 1-ого типа событий

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

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

Для того, чтобы открыть поле для редактирования метаданных - необходимо нажать на кнопку **"Редактор метаданных"**.

![](https://i.imgur.com/TW4mKhY.png)

---

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

```
#Описание события
EventDescriptions: 
    - Criteria: <Условие правила локализации 1>
      LocalizationId: <Ключ правила локализации 1>
    - Criteria: <Условие правила локализации 2>
      LocalizationId: <Ключ правила локализации 2>
```

Секция `Criteria` необходима для ввода условия правила локализации.

Секция `LocalizationId` предназначена для ввода идентификатора (ключа) для сопоставления условия правила локализации с одним описанием событий, указанным в поле **RU**, и одним описанием, указанным в поле **EN**.

![](https://i.imgur.com/DXJXeMX.png)

---

Заполняем поле **"Метаданные"**:

В качестве критериев указываем условия, которые являются определяющими - **OK|FAIL|FAILURE**. Также не забываем отметить ключи правил локализации для их связи.
```
EventDescriptions:
    - Criteria: id = "IBM_AIX_OS_CONF_READ" and datafield1 = "OK"
      LocalizationId: IBM_AIX_OS_CONF_READ_file_read_SUCCESS
    - Criteria: id = "IBM_AIX_OS_CONF_READ" and datafield1 = "FAIL" or datafield1 = "FAILURE"
      LocalizationId: IBM_AIX_OS_CONF_READ_file_read_FAILURE
```

![](https://i.imgur.com/ZesC2jA.png)

---

Заполняем поле **"RU"**:

В данном поле необходимо указать краткие отдельные описания для событий, указав при этом `LocalizationId`.

```
Description: Событие чтения конфигурационного файла операционной системы
EventDescriptions:
    - LocalizationId: IBM_AIX_OS_CONF_READ_file_read_SUCCESS
      EventDescription: Пользователь {subject.account.name} с именем узла {src.hostname} прочитал конфигурационный файл системы по пути {object.fullpath} с помощью утилиты {subject.process.name}
    - LocalizationId: IBM_AIX_OS_CONF_READ_file_read_FAILURE
      EventDescription: Пользователь {subject.account.name} с именем узла {src.hostname} не смог прочитать конфигурационный файл системы по пути {object.fullpath} с помощью утилиты {subject.process.name}
```

![](https://i.imgur.com/dex2Z5T.png)

---

Заполняем поле **"EN"**:

Аналогичным образом заполняем поля и для **EN-локализации**.

```
Description: Operating system configuration file read event
EventDescriptions:
    - LocalizationId: IBM_AIX_OS_CONF_READ_file_read_SUCCESS
      EventDescription: User {subject.account.name} with hostname {src.hostname} read the system configuration file at {object.fullpath} using the {subject.process.name} utility
    - LocalizationId: IBM_AIX_OS_CONF_READ_file_read_FAILURE
      EventDescription: User {subject.account.name} with hostname {src.hostname} could not read system configuration file at {object.fullpath} using {subject.process.name} utility
```

![](https://i.imgur.com/b5krPha.png)

---

Проведем тестирование.

Необходимо зайти во вкладку **"Сценарии"**, где нужно настроить параметры `BUILD` и `RUN`.

`BUILD FORMULAS` - необходимо выбрать папку, где находится наша формула нормализации.

`BUILD LOCALIZATION` - выбираем папку, где находится локализация.

В параметрах `RUN` выбираем файл с исходными события и ставим галочки на пунктах `NORMALIZE` и `LOCALIZE`.

![](https://i.imgur.com/nmHU06u.png)

---

Нажимаем кнопку **"Запуск"** и начинаем тестирование.

![](https://i.imgur.com/SHuo0jn.png)

---

:::success
:star: Все локализации успешно сработали!
:::

![](https://i.imgur.com/5riOepm.png)

![](https://i.imgur.com/flC87Xq.png)

![](https://i.imgur.com/CEnQV10.png)

![](https://i.imgur.com/jT46gl6.png)

---

## Файлы тестов

[Тесты правила нормализации для события 1-ого типа](https://disk.yandex.ru/d/WHU7fqwTGAOnAQ)

---

## Разработка формулы нормализации для событий 2-ого типа


Следующим шагом в выполнении данной домашней работы становится написание второго правила нормализации.

Создаем новое правило нормализации и выбираем **"TEXT"** шаблон для формулы.

Вносим в поле текст наше необработанное событие.

![](https://i.imgur.com/dxuIvjM.png)

---

Первым делом заменяем фрагмент `<134>`, так как он может динамически изменяться в событиях. Используем токен `NUMBER`.

![](https://i.imgur.com/kaWfx9j.png)

---

Следующим фрагментом является дата, которая будет сохраняться в метку времени `time`. Она в свою очередь имеет токен `DATETIME`.

![](https://i.imgur.com/khYUEIp.png)

---

Далее источник события, который мы обозначаем с помощью поля `src.hostname` и токена `WORDDASH`. Также отмечаем, что этот фрагмент опционален, используя символ `?`.

![](https://i.imgur.com/S6nG8Nq.png)

---

Уникальным идентификатором типа события является следующий фрагмент -- `USER_Login`. Согласно справочнику идентификатор типа события использует поле **msgid**.

![](https://i.imgur.com/rooJ2xU.png)

---

Фрагмент `OK` является показателем действия (**OK|FAIL|FAILURE**). Используя справочник, можно понять, что полем будет являться `datafield1`. `WORD` -- токен.

![](https://i.imgur.com/pEZCnna.png)

---

Следующим фрагментом является имя пользователя -- `ektest`. В данном случае пользователь является субъектом, поэтому поле -- `subject.account.name`. Типом данных является `STRING`.

![](https://i.imgur.com/W4TA158.png)

---

Последним фрагментом является протокол передачи данных (уровня приложения по модели **OSI**). Полем является `protocol.layer7`, а токеном `WORD`.

![](https://i.imgur.com/Rdi3mo8.png)

---

Заполняем оставшиеся поля аналогичным образом, что и в предыдущем правиле нормализации. Изменяем параметр `action` и `object`, а также `id`.

```
subject = "account"
action = "login"
object = "system"

if datafield1 == "OK" then
    status = "success"
else
    status = "failure"
endif

importance = "info"

event_src.vendor = "ibm"
event_src.title = "aix"
event_src.category = "Operating system"

id = "IBM_AIX_USER_LOGIN"
```

![](https://i.imgur.com/y9ml2uO.png)

---

Проверяем работу правила нормализации на исходных событиях.

![](https://i.imgur.com/449vVrt.png)

![](https://i.imgur.com/jp8lDqZ.png)

:::success
:star: Тестирование прошло успешно!
:::

---

Результат 1-ого события.

![](https://i.imgur.com/uTNHQ5q.png)

Результат 2-ого события.

![](https://i.imgur.com/CwfiyOp.png)

---

Сохраняем правило нормализации в заранее подготовленной папке.

![](https://i.imgur.com/yxjNBlc.png)

---

## Создание заполненной пользовательской локализации и файла метаинформации с критериями локализации для 2-ого типа событий

В редакторе метаданных заполняем все поля аналогично предыдущему правилу нормализации. Изменяем описание событий.

![](https://i.imgur.com/lKfEUL4.png)

---

Проведем тестирование.

Необходимо зайти во вкладку **"Сценарии"**, где нужно настроить параметры `BUILD` и `RUN`.

`BUILD FORMULAS` - необходимо выбрать папку, где находится наша формула нормализации.

`BUILD LOCALIZATION` - выбираем папку, где находится локализация.

В параметрах `RUN` выбираем файл с исходными события и ставим галочки на пунктах `NORMALIZE` и `LOCALIZE`.

![](https://i.imgur.com/LC8v47i.png)

---

Нажимаем кнопку **"Запуск"** и начинаем тестирование.

![](https://i.imgur.com/m325xRQ.png)

---

:::success
:star: Все локализации успешно сработали!
:::

![](https://i.imgur.com/qIk5NSR.png)

![](https://i.imgur.com/s2NJffU.png)

![](https://i.imgur.com/o7SNjSM.png)

![](https://i.imgur.com/3osQiHO.png)

---

## Файлы тестов

[Тесты правила нормализации для события 2-ого типа](https://disk.yandex.ru/d/_ZXA3RG0lNuW3A)

---

# Корреляция событий

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

Создаем **правило корреляции** тем же образом, что и правило нормализации.

![](https://i.imgur.com/t2x2TP7.png)

---

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

Для указания полей события и условия отбора используются инструкции **key** и
**filter**.

Формат вызова:

```
event <Название события>:
     key:
          <Поле события 1>, <Поле события 2>, ...
     filter {
          <Условие отбора события>
     }
```

Инструкция **key** директивы **event** предназначена для указания полей события, по значению которых поток нормализованных событий будет разделяться на несколько потоков.

Инструкция **filter** директивы event предназначена для настройки условия отбора события.

![](https://i.imgur.com/yERkejU.png)

![](https://i.imgur.com/qT4Ioe0.png)

---

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

Название правила корреляции: `IBM_AIX_success_reading_and_logon`

Условие выполнения:`(Successful_Reading -> Successful_Login) with different subject.account.name`

Также не забываем добавить оператор `timer`, который в нашей работе отвечает за то, что события произошли в течение 5 минут.

![](https://i.imgur.com/QSCSHY3.png)

---

Инструкция **init** директивы **rule** предназначена для объявления переменных, используемых в инструкциях on и **insert_into** или в директиве **emit**. Переменным вы можете присвоить определенные значения. Блок операторов инструкции **init** выполняется один раз при регистрации первого события последовательности в условии правила корреляции. 

В данной работе инструкция init не используется.

![](https://i.imgur.com/yXsfnSr.png)

---

Инструкция on директивы **rule** (обработчик события) предназначена для выполнения
блока операторов при регистрации указанного события (событие должно быть объявлено в
директиве **event**).

Записываем блоки операторов, которые будут содержаться в правиле корреляции.

![](https://i.imgur.com/kdrhSZh.png)

![](https://i.imgur.com/P00MJT0.png)

---

Директива **emit** предназначена для заполнения полей корреляционного события (названия
полей нужно начинать со знака доллара). Директива выполняется при выполнении условия
правила корреляции.

![](https://i.imgur.com/7ArbYMc.png)

---

Итоговый код:

```
event Successful_Reading:
    key:
        event_src.host #Хост(источник события)
    filter
    {
        correlation_name == null #Название корреляционного события
        and event_src.title == "aix" #Название источника события
        and action == "view" #Действие
        and object == "file" #Объект
        and status == "success" #Статус 
        and object.fullpath == "/etc/shadow" #Полный путь до объекта
    }
    
    event Successful_Login:
    key:
        event_src.host
    filter
    {
        correlation_name == null
        and event_src.title == "aix"
        and action == "login"
        and object == "system"
        and status == "success"
    }
    
    rule IBM_AIX_success_reading_and_login: (Successful_Reading -> Successful_Login) with different subject.account.name timer 5m
    
        init {}
    
        on Successful_Reading
        {
            $event_src.hostname = event_src.hostname
            $object.process.name = object.process.name
            $subject.account.name = subject.account.name
        }
    
        on Successful_Login
        {
            $event_src.hostname = event_src.hostname
            $protocol.layer7 = protocol.layer7
            $datafield1 = subject.account.name
        }
    
emit {
    $correlation_type = "event"
    
    $subject = "account"
    $action = "access"
    $object = "profile"
    $status = "success"
    
    $importance = "info"
}
```

---

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

```
{"subject": "account", "action": "view", "object": "file", "status": "success", "datafield1": "OK", "event_src.category": "Operating system", "event_src.title": "aix", "event_src.vendor": "ibm", "id": "IBM_AIX_OS_CONF_READ", "importance": "info", "msgid": "OS_CONF_READ", "object.fullpath": "/etc/shadow", "src.hostname": "aix53", "subject.account.name": "mp", "subject.process.name": "cat", "time": "2022-05-19T09:50:06Z"}

{"subject": "account", "action": "login", "object": "system", "status": "success", "datafield1": "OK", "event_src.category": "Operating system", "event_src.title": "aix", "event_src.vendor": "ibm", "id": "IBM_AIX_USER_LOGIN", "importance": "info", "msgid": "USER_Login", "protocol.layer7": "ssh", "src.hostname": "sovma131", "subject.account.name": "ektest", "time": "2022-09-22T05:01:48Z"}

expect 1 {}
```


Запускаем составленный тестовый сценарий.

![](https://i.imgur.com/kIDQGnT.png)

:::success
:star: Правило корреляции успешно сработало!
:::

![](https://i.imgur.com/2QCXcNA.png)

---

## Файлы тестов

[Тесты правила корреляции](https://disk.yandex.ru/d/PcEDxUKV8elHEA)

---

