---
# System prepended metadata

title: INT-2-Омаров_Джамалутин
tags: [INT]

---

###### tags: `INT`
# INT-2-Омаров_Джамалутин
*Выполнил Омаров Джамалутин*
## Нормализация и корреляция событий информационной безопасности

### Установка утилиты и запуск

1. Скачаем архив с утилитой и извлечем.

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

2. Необходимо разместить папку с утилитой по корректному пути, без недопустимых символов.

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

Внутри папки находятся dll и конфиги необходимые для работы утилиты.

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


3. Можем запускать.

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

### Начальная настройка

Немного информации об утилите **PTSIEMSDK**.

Вкладка **Редактор Объектов** - это область для создания, добавления правил локализации регистрируемых по правилу событий и описания правила.

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

Вкладка **Настройки** - данная вкладка предназначена для настройки параметров работы утилиты.

Приступим к начальной настройке.

1. Настройка -> Пути -> Папка с результатами.

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

Я создал папку по пути `C:\result_ptsiem`. Там будут складываться все результаты, которые мы получим во вкладке сценариев (нормализованные, коррелированные события).

2. Откроем справочник F1.

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

Здесь можно посмотреть таксономию (поля, параметры и их назначения) и горячие клавиши.
Каждое событие - это субъектно-объектное взаимодействие. Субъект совершает действие над объектом. 

Перечень редактируемых полей:
* поля, описывающие субъект при взаимодействии
* поля, описывающие действия над объектом при взаимодействии
* поля, описывающие объект при взаимодействии
* адресные поля источника взаимдействия
* адресные поля получателя
* поля, описывающие источник события
* поля настройки агрегации инцедентов
* другие

### Нормализация

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

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

Для начала работы нам необходимо загрузить сырые события.

1. Загрузка сырых событий.

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

read_config_raw_events.txt

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

Результат.

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

1 событие.

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

2 событие.

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

Как мы можем видеть, это два одинаковых события, различающиеся лишь временем и путем к папке. Формат события так же одинаковый. Нет различия в синтаксисе.

2. Шаблоны.

Вставим шаблон.

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

Мы видим ключевые слова, определяющие каким образом мы получили данные события:
* TEXT
* JSON
* TABULAR
* EVENTLOG

**TEXT** используется для объявления форматной строки события в формате простого текста.

**JSON** используется для объявления форматной строки правила нормализации событий в формате JSON. 

**TABULAR** используется для объявления форматной строки правила нормализации событий, представленных в виде ассоциативного массив в формате JSON, другими словами формат из **базы данных**.

**EVENTLOG** используется для объявления форматной строки правила нормализации событий из журнала Windows.

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

3. Формула.

Копируем текст события и вставляем в форматную строку.

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

Какие-то участки лога будут якорями (неизменяемыми), а какие-то динамическими. Динамические участки нам необходимо парсить.

Первое, на что я обратил внимание - дата и время. Эти параметры изменяются.

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

Заменим их специальным токеном.

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

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

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

Из задания известно, что `OS_CONF_READ` - это идентификатор типа события. Поэтому обращаемся в справочник и находим данный параметр.

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

Значит, мы должны присвоить имя идентификатора параметру `msgid`. Он уникален в рамках нашего события.

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

`aix53` - имя узла источника события.

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

Откроем справочник.

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

`src.hostname` - имя узла источника при взаимодействии.

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

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

`mp` - имя пользователя.

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

Откроем справочник.

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

`subject.account.name` - логин учетной записи.

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

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

`OK` - показатель успешности действия.

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

Откроем справочник.

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

`status` - результат действия.

В качестве токена используем `WORD`. Данный токен используется для распознавания слов.

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

`cat` - имя приложения, использованное для чтения.

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

Откроем справочник.

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

`subject.process.name` - имя исполняемого файла процесса.

Используем токен `STRING`.

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

`/etc/shadow` - путь к файлу, который читали.

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

Откроем справочник.

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

`object.fullpath` - полный путь к объекту.

Используем токен `STRING`.

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

`audit object read event detected` - обнаружение события чтения объекта аудита. Данная строчка является якорем.

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

`local0:info audit` - данная строчка говорит о том, что это информационное сообщение.

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

Для того, чтобы протестировать написанное, заполним основные поля.

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

```
subject = "account"
action = "view"
object = "file"
status = "success"

importance = "info"

event_src.vendor = "IBM"
event_src.title = "AIX"
event_src.category = "Operating system"
event_src.hostname = "aix53"

id = "IBM_AIX_log_OS_CONF_READ_info_audit"
```

Субъект - аккаунт, так как присутствует имя пользователя.
Действие - просмотр, так как используется утилита `cat`.
Объект - файл, так как `/etc/shadow` является файлом.
Статус - успешно, так как сообщение `OK`.
Важность - информирование.
Вендор - `IBM` (взято из задания).
Продукт вендора - `AIX` (взято из задания).
Категория - операционная система (взято из задания).
Имя узла - `aix53`
Идентификатор нормализованного события - `IBM_AIX_log_OS_CONF_READ_info_audit`. Вендор -> Продукт вендора -> Откуда взяли сырое событие(предположил название) -> Тип события -> Пометка для понимания.

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

4. Запуск

Нажмем на кнопку запуска.

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

События нормализовались успешно. И мы видим нормализованный эквивалент в графе результат.

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

Также необходимо удостовериться, что все необходимые данные получилось достать.

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

Все, что нужно достали!

В данной части мы взяли сырое событие, написали код формулы, которое парсит это сырое событие. Теперь необходимо перейти к разработке метаинформации. Позаботимся о том, чтобы пользователю, который будет работать с системой, человекочитаемую суть события.

Теперь сохраним нашу формулу.

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

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

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

### Метаинформация

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

1. Редактор метаданных.

Откроем редактор.

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

Вставим шаблон.

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

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

Поле `Criteria` - условия отбора нормализованных событий.
Необходимо вписать туда идентификатор события.

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

Для соответствия есть параметр `LocalizationID`. Это идентификатор, по которому различные блоки будут матчиться.

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

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

`Description` - описание сути формулы.

`EventDescription` - отображение события в UI.

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

Закрываем и сохраняем.

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

2. Сценарии.

Перейдем во вкладку Сценарии, чтобы проэмулировать то, как это будет работать.

В секции `BUILD`.

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

Добавим нашу формулу.

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

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

Добавим нашу локализацию.

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

В секции `RUN`.

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

Укажем иcходный файл событий (там откуда брали сырые события).

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

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

Ставим галочку на "Исходные события без конвертов". Когда агент собырает события с конечных узлов, то оборачивает его в конверт. Конверт содержит формат json со служебной информацией для дальнейших сервисов.

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

А также "Показать статистику".

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

И локализуем события.

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

Запускаем.

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

Продолжить.

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

3. Просмотр событий

После запуска сценария можно смотреть события.

RU

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

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

EN

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

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

Нормализованные события мы видим на обоих языках. Такие события увидит пользователь в интерфейсе SIEM, когда будет заниматься расследованием и мониторингом.

### ssh_login_raw_events

Проделаем аналогичную настройку и тесты для сырых событий файла `ssh_login_raw_events.txt`.

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

2 события имеют одинаковый формат, но в одном есть строка имени источника, а в другом ее нет.

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

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

Пользователь ektest залогинился по протоколу ssh с правами root.

`{"Message forwarded from" src.hostname = WORDDASH ":"?}` здесь я указал источник события, а также обратите внимание на `?` в конце... Это означает, что данное выражение опционально: Данная строка может присутствовать в событии, а также ее может не быть.

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

Финальная формула будет выглядеть так. События нормализовались успешно. И мы видим нормализованный эквивалент в графе результат.

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

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

Метаинформация.

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

Сценарий.

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

После запуска, продолжить.

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

RU

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

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

EN

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

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

### Корреляция

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

Задание: Пользователь сначала прочитал файл /etc/shadow, после чего успешно вошел в систему под другим пользователем, оба события произошли в течение 5 минут.

1. Формула.

Давайте по порядку, для начала необходимо создать event.
**event** - события, которые группируются по ключу и фильтруются по определенным критериям. В моем случае необходимо было, чтобы фильтрация одного события произошла по сценарию чтения пользователем определенного файла.

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

Далее второе событие - вход в систему под другим пользователем.

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

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

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

**init** - первое, что выполнится при первом приходе первого события.

**on** - выполняется на каждый приход события.

**emit** - выполняется при наступлении правила корреляции. То есть, если оно появится, правило сработало.

Нажимаем запуск

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

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

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

Заполнили информацию о нашей корреляции. Теперь посмотрим на вывод после запуска.

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

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

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

Или развернем в JSON формате.

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

Также пробросил необходимые параметры.
Результат ниже! После данного этапа можно перейти к метаинформации.

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

2. Метаинформация.

Заполнил таким образом.

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

3. КОД

```
event Reading:
    key:
        event_src.hostname
    filter {
        correlation_name == null
        and event_src.title == "AIX"
        and object.fullpath == "/etc/shadow"
        and action == "view"
        and status == "success"
        and object == "file"
        and subject == "account"
        and importance == "info"
    }

event Successful_Login:
    key:
        event_src.hostname
    filter {
        correlation_name == null
        and event_src.title == "AIX"
        and subject == "account"
        and action == "login"
        and object == "system"
        and status == "success"
        and importance == "info"
    }

rule login_after_reading_5min: (Reading -> Successful_Login) with different subject.account.name within 5m

    init {
        $first_event = true
    }

    on Reading {
        $object.fullpath = object.fullpath
    }
    
    on Successful_Login {
        $src.hostname = src.hostname
    }

    emit {
        $correlation_type = "event" 
        $subject = "account"
        $action = "detect"
        $object = "system"
        $status = "success"
        $importance = "info"
        
    }


```