###### 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" } ```