<h1>2. Нормализация и корреляция событий информационной безопасности.</h1> Операционная система IBM AIX приносит в SIEM ряд событий, из которых в данном случае нас интересуют два: Событие входа пользователя по SSH: ``` А) <134>Sep 22 05:01:48 Message forwarded from sovma131: audit:USER_Login root OK sshd user: ektest tty: ssh Б) <134>Sep 22 04:54:46 audit: USER_Login root OK sshd user: ektest tty: ssh ``` Событие чтения конфигурационного файла операционной системы: ``` А) May 19 09:50:06 aix53 local0:info audit: OS_CONF_READ mp OK cat audit object read event detected /etc/shadow Б) Jun 3 00:10:05 aix53 local0:info audit: OS_CONF_READ mp OK cat audit object read event detected /etc/ssh/sshd_config ``` ### Создание правила нормализации Созададим правило нормализации для данного события: Начнем с импорта событий ![](https://i.imgur.com/zEjCnqE.png) и вставки шаблона ![](https://i.imgur.com/Mm2fNBl.png) ![](https://i.imgur.com/2erleMo.png) Запишем событие в форматную строку ![](https://i.imgur.com/ZOo2fZQ.png) и начнем парсить событие Начнем с даты события Так как дата в каждом событии разная то необходимо ее вытянуть из события с помощью токена {time = DATETIME} ![](https://i.imgur.com/sUlW8kS.png) Далее в форматной строки вытянем номер события с помощью токена {NUMBER} так как номер события тоже меняется ![](https://i.imgur.com/UgF60qk.png) Добавим токен {msgid=WORD} чтобы получить уникальный идентификатор события ![](https://i.imgur.com/PxC0nOX.png) Далее отпарсим источник от которого приходят события с помощью токена {src.asset = WORD} ![](https://i.imgur.com/GXRWmK1.png) Далее отпарсим субъект куда происходит подключение {subject.account.name = STRING} ![](https://i.imgur.com/a2hUfQo.png) Добавим токен {protocol.layer7=WORD} чтобы вытянуть протокол из события ![](https://i.imgur.com/hKHwBYR.png) Добавим упрощенный оператор switch для идентификации статуса Login, тут мы добавляем новую переменную, в которую будет записываться значение статуса аутентификации, а switch будет проверять переменную по всем кейсам, которые мы задали и выдаст итоговое значение ![](https://i.imgur.com/CSZWcEx.png) Так как у нас в 1 событии встречаются опциональные части то мы добавляем оператор токена "?" ![](https://i.imgur.com/GI8iaDF.png) Результатом мы видим, что правило нормализации срабатывает на 2 события 1 ![](https://i.imgur.com/5bpliaJ.png) 2 ![](https://i.imgur.com/vXaQcbd.png) Далее добавим метаданные с помощью редактора метаданных ![](https://i.imgur.com/zUSAvOE.png) Добавим в правило еще некоторые поля, отредактируем старые и получим конечный результат ![](https://i.imgur.com/AxU8Ce7.png) Далее создадим новое правило нормализации для второго события Начнем с времени ![](https://i.imgur.com/pqo9O0j.png) Далее вытянем источник события ![](https://i.imgur.com/P7ypT9Q.png) и так как он может быть опциональным добавим оператор токена "?" ![](https://i.imgur.com/WVdz1dS.png) Далее добавим логин учетной записи события с помощью токена {subject.account.name} ![](https://i.imgur.com/g1dDBPw.png) Добавим идентификатор утчетной записи с помощью токена {subject.account.id} ![](https://i.imgur.com/otTn2rY.png) Далее с помощью оператора switch распарсим ответ ![](https://i.imgur.com/s013Esy.png) Теперь вытащим использованую команду с помощью токена {subject.process.cmdline} ![](https://i.imgur.com/nYDKaUB.png) Определим рабочую директорию исполняемого процесса с помощью токена {subject.process.cwd} ![](https://i.imgur.com/bAYRcUn.png) Как результат это правило нормализации отрабатывает для двух событий ![](https://i.imgur.com/n3HxObC.png) Добавим дополнительные поля правила ![](https://i.imgur.com/jcuAcUV.png) Заполним метаданные ![](https://i.imgur.com/ijY2mP9.png) Итоговое правило №1 ``` TEXT = '<{NUMBER}>{time = DATETIME} {"Message forwarded from"?} {src.hostname = WORD?} {":"?} audit: {msgid = WORD} root {$R = WORD} sshd user: {subject.account.name = STRING} tty: {protocol.layer7=WORD}' object = "system" importance = "info" subject = "account" action = "login" status = switch $R case "OK" "success" case "FAIL" "failure" case "FAILURE" "failure" endswitch id = "PT_IBM_AIX_syslog_USER_Login_root" event_src.category = "AAA" event_src.title = "AIX" event_src.vendor = "IBM" ``` Итоговое правило №2 ``` # Примеры исходных событий TEXT = '{time = DATETIME} {src.hostname = STRING} local0:info audit: {msgid = STRING} {subject.account.name = STRING} {$R = WORD} {subject.process.cmdline = WORD} audit object {datafield1 = STRING} event detected {subject.process.fullpath = STRING}' object = "system" importance = "info" subject = "account" action = "view" status = switch $R case "OK" "success" case "FAIL" "failure" case "FAILURE" "failure" endswitch importance = "high" id = "PT_IBM_AIX_syslog_OS_CONF_READ" event_src.category = "AAA" event_src.title = "AIX" event_src.vendor = "IBM" ``` ### Создание правила корреляции Запишем в тестовый сценарий содержание результата правила нормализации ![](https://i.imgur.com/K9Qokc2.png) Заполним информацию о событиях ![](https://i.imgur.com/y2o0Dx6.png) Запишем правило для корреляции rule User_read_file_then_login_ssh: (User_read_file -> User_login_ssh) within 5m Где значения в скобках означают последовательность проверки выполнения событий а within их выполнение в течение определенного времени Прокинем в корреляцию данные из исходного события ![](https://i.imgur.com/r5m1ccm.png) Добавим статические данные в коррелированное событие ![](https://i.imgur.com/K4ObJhf.png) Заполним метаданные ![](https://i.imgur.com/uaEON1n.png) Правило корреляции ``` event User_read_file: key: event_src.hostname filter { correlation_name == null and action == "view" and object.account.name == "mp" and subject == "account" and object == "system" } event User_login_ssh: key: event_src.hostname filter { correlation_name == null and subject == "account" and object == "system" and action == "login" and protocol.layer7 == "ssh" } rule User_read_file_then_login_ssh: (User_read_file -> User_login_ssh) within 5m init { $first_event = true } on User_read_file { $object.account.name = object.account.name $subject.process.cwd = subject.process.cwd } on User_login_ssh { if $first_event then $first_event = false $subject.account.name = subject.account.name $event_src.category = event_src.category $event_src.title = event_src.title $event_src.vendor = event_src.vendor $src.hostname = src.hostname $id = id $protocol.layer7 = protocol.layer7 endif } emit { $subject = "account" $correlation_type = "event" $action = "access" $object = "system" $importance = "high" $status = "success" } ``` Вводимые данные ``` expect 1 {} {"subject": "account","action": "view","object": "system","status": "success","event_src.category": "AAA","event_src.title": "AIX","event_src.vendor": "IBM","id": "PT_IBM_AIX_syslog_local10_info","importance": "info","msgid": "OS_CONF_READ","event_src.hostname": "aix53","object.account.name": "mp","subject.process.cmdline": "cat","subject.account.name": "test","subject.process.cwd": "/etc/shadow","time": "2022-09-22T04:51:04"} {"subject": "account","action": "login","object": "system","status": "success","event_src.category": "AAA","event_src.title": "AIX","event_src.vendor": "IBM","id": "PT_IBM_AIX_syslog_USER_Login_root","importance": "info","msgid": "USER_Login","protocol.layer7": "ssh","event_src.hostname": "aix53","object.account.name": "ektest","subject.account.name": "test","time": "2022-09-22T04:52:46"} ``` Вывод ``` [WARNING] Will automatically generate increasing UUIDs for normalized events [WARNING] Table lists schema is not provided, considering it's empty! SUCCESS! Got results: {"subject.account.name": "test", "subject": "account", "_rule": "User_read_file_then_login_ssh", "id": "PT_IBM_AIX_syslog_USER_Login_root", "event_src.vendor": "IBM", "event_src.category": "AAA", "object": "system", "event_src.title": "AIX", "object.account.name": "mp", "correlation_name": "User_read_file_then_login_ssh", "action": "access", "time": "2022-09-22T04:52:46Z", "protocol.layer7": "ssh", "correlation_type": "event", "_objects": [{"AssetId": null, "Fqdn": "aix53", "IpAddress": null, "EventTimestamp": "2022-09-22T04:51:04Z"}, {"AssetId": null, "Fqdn": "aix53", "IpAddress": null, "EventTimestamp": "2022-09-22T04:52:46Z"}], "importance": "high", "count": 1, "subevents.time": ["2022-09-22T04:51:04Z", "2022-09-22T04:52:46Z"], "status": "success", "subject.process.cwd": "/etc/shadow", "subevents": ["9fff75aa-0637-4139-a024-351bd99f26af", "9fff75aa-0637-4139-a024-351bd99f26b0"], "uuid": "21767afd-ffab-425c-9336-43f7118dd26f", "origin_app_id": "00000000-0000-0000-0000-000000000005", "primary_siem_app_id": "00000000-0000-0000-0000-000000000005", "siem_id": "e1b2c118-1a86-11ea-9632-e3fa28d252ab", "normalized": true, "generator.version": "25.0.2412 (libservice v.2.0.728)", "generator.type": "correlationengine"} ```