Работа с результатами запросов DQL
Работа с результатами запросов DQL в Расследованиях
Руководство
При решении инцидентов или охоте на угрозы по данным результаты работы инженеров по безопасности и DevOps-инженеров зависят от их находок. Они могут начать с запроса, вызвавшего ошибку, и добраться до истинной первопричины проблемы, ища подсказки в логах, событиях и трассировках. Чтобы найти эти подсказки, им нужно уточнять запросы DQL на основе результатов предыдущих запросов.
Далее вы узнаете, как Расследования помогают ускорить расследования за счёт более быстрого и удобного построения запросов DQL из результатов запросов.
Целевая аудитория
Эта статья предназначена для инженеров по безопасности и DevOps-инженеров, которые занимаются поддержкой и защитой своей инфраструктуры, решением инцидентов и охотой на угрозы по логам, событиям и трассировкам.
Предварительные требования
Убедитесь, что логи вашего приложения загружаются в Ключ-АСТРОМ через приём логов или приём событий безопасности.
Базовые знания:
- Ключ-АСТРОМ Query Language (DQL)
- Ключ-АСТРОМ Pattern Language (DPL)
Чтобы следовать этой статье, у вас есть следующие варианты в Ключ-АСТРОМ Playground:
- Создать собственное расследование из существующего шаблона
- Открыть общее расследование
Начало работы
После того как вы откроете Расследования и создадите расследование, первый узел, созданный при выполнении запроса, отображает логи, с которых вы хотите начать расследование.
Фильтрация по значениям полей таблицы результатов
Самый простой способ создать фильтр — щёлкнуть правой кнопкой мыши по значению поля и выбрать Фильтр. В следующих двух примерах (Фильтрация по одному значению и Фильтрация по нескольким значениям) мы будем фильтровать по IP-адресам. Однако вы можете использовать тот же подход для любых других типов данных.
В Playground фильтры по значениям полей отображаются в дереве запросов как мятные узлы.
Фильтрация по одному значению
Чтобы отобразить только события с одного IP-адреса, щёлкните правой кнопкой мыши по IP-адресу в поле src_ip таблицы результатов и выберите Фильтр.
Аналогичная команда будет добавлена в поле ввода запроса:
| filter src_ip == toIp("52.88.49.98")
Чтобы исключить события с IP-адреса, щёлкните правой кнопкой мыши по IP-адресу в поле src_ip таблицы результатов и выберите Исключить.
Фильтрация по нескольким значениям
Предположим, вы нашли много IP-адресов в логах аутентификации и хотите увидеть другие запросы, инициированные с этих IP-адресов. В этом случае вы можете фильтровать по нескольким значениям сразу. У вас есть два варианта:
- Вариант 1: выберите диапазон значений (удерживая клавишу Shift, выберите первое и последнее значение в таблице), щёлкните по ним правой кнопкой мыши и выберите Фильтр.
- Вариант 2: выберите отдельные значения (удерживая клавишу Ctrl, выберите нужные значения), щёлкните по ним правой кнопкой мыши и выберите Фильтр.
Чтобы сэкономить место и повысить производительность запроса, в фильтр добавляются только уникальные значения.
Аналогичная команда будет добавлена в поле ввода запроса:
| filter ipIn(src_ip, {"11.144.253.191", "187.6.11.91", "4.87.158.108", "165.144.55.79"})
Фильтрация по части значения
Предположим, вы хотите найти только события, содержащие часть Intel Mac OS X 10_15_7 в значении user-agent. В этом случае вы можете фильтровать по выбранной части значения: выделите нужную часть курсором, щёлкните правой кнопкой мыши и выберите Фильтр.
Аналогичная команда будет добавлена в поле ввода запроса:
| filter contains(user_agent, "Intel Mac OS X 10_15_7")
В Playground фильтры по части значения отображаются в дереве запросов как оранжевые узлы.
Фильтрация по статистическим значениям
Предположим, вы хотите увидеть только событие с размером ответа больше среднего размера ответа в текущем наборе результатов. В этом случае вы можете создавать запросы на основе статистических значений: выберите поля, по которым нужно рассчитать медиану, щёлкните по ним правой кнопкой мыши и выберите Статистика > Медиана > Больше.
Аналогичная команда будет добавлена в поле ввода запроса (где значение медианы рассчитывается автоматически):
| filter response_size > 4464
В Playground статистические фильтры отображаются в дереве запросов как зелёные узлы.
Фильтрация по метке времени
Метки времени — одни из самых важных точек данных при расследовании логов и событий. Расследования предлагают специальные фильтры для этого типа данных в дополнение к операторам фильтрации Later than, Equal или Earlier than.
В Playground фильтры по метке времени отображаются в дереве запросов как синие узлы.
Фильтрация по диапазону
Предположим, вы нашли интересную строку лога и хотите лучше её понять. Вы хотите увидеть, что ещё произошло вокруг времени вашего события. В этом случае вы можете фильтровать по диапазону: щёлкните правой кнопкой мыши по метке времени и выберите Фильтры по времени > Около 5 секунд. Это добавит фильтр, показывающий записи ровно за пять секунд до и через пять секунд после выбранного события.
Аналогичная команда будет добавлена в поле ввода запроса:
| filter timestamp >= toTimestamp("2025-01-13T07:46:32.000000000Z")-5s
and timestamp <= toTimestamp("2025-01-13T07:46:32.000000000Z")+5s
Фильтрация по диапазону нескольких выбранных значений метки времени
Предположим сценарий, в котором происходят несколько событий в разное время, и вы хотите понять, что ещё произошло в этом временном интервале. В этом случае вы можете фильтровать по диапазону нескольких выбранных значений метки времени: выберите несколько значений метки времени (с помощью клавиш Shift или Ctrl) и выберите Фильтр по диапазону. Это создаст фильтр, показывающий все записи между минимальным и максимальным значениями метки времени из выбранного диапазона.
Аналогичная команда будет добавлена в поле ввода запроса:
| filter timestamp >= toTimestamp("2025-01-13T07:31:23.000Z")
and timestamp <= toTimestamp("2025-01-13T07:46:37.000Z")
Копирование записей из таблицы результатов
Существует больше способов использования записей, чем создание дополнительных фильтров. С помощью Расследований вы можете получать доступ к своим результатам различными способами, например, копируя их в другие системы.
Копирование как текст
Самый базовый режим копирования — копирование как текст. Вы можете скопировать либо одно поле за раз, либо несколько значений одновременно, используя клавиши Shift или Ctrl. Выберите поля, которые хотите скопировать, щёлкните по ним правой кнопкой мыши и выберите Копировать > Как текст.
Копирование как значение DQL
Предположим, вы хотите использовать значение IP-адреса из результатов в следующем запросе DQL, сохранив его тип. В этом случае вы можете щёлкнуть правой кнопкой мыши по значению IP-адреса и выбрать Копировать > Как значение DQL. Это скопирует IP-адрес с функцией приведения типа, готовой к использованию.
Аналогичная команда будет добавлена в поле ввода запроса:
toIp("187.6.11.91")
Копирование записи как данные DQL
Предположим, вы нашли интересную запись, которой хотите поделиться с коллегами. Копировать каждую колонку вручную было бы трудоёмко, а делиться запросом DQL для его выполнения — неудобно. В этом случае вы можете щёлкнуть правой кнопкой мыши по записи в таблице результатов, выбрать Копировать > Запись как данные DQL и вставить её в Slack или без лишних усилий добавить в задачу Jira. Скопированная запись — это конструкция данных, позволяющая получить запись в любой среде Ключ-АСТРОМ.
Аналогичная команда будет добавлена в поле ввода запроса:
data
record(
content = """187.6.11.91 - - [13/Jan/2025 09:46:32 +0200] "POST /index.php HTTP/1.1" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36" 200 5503""",
src_ip = toIp("187.6.11.91"),
timestamp = toTimestamp("2025-01-13T07:46:32.000000000Z"),
request = "POST /index.php HTTP/1.1",
user_agent = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36",
response = 200,
response_size = 5503
)
Или предположим, вы выполнили запрос, вернувший 200 результатов, и хотите отфильтровать их дальше. В этом случае вы можете выбрать все записи, скопировать их как данные DQL, вставить в поле ввода запроса и выполнить запрос. Вы получите тот же набор результатов, который теперь можно фильтровать гораздо быстрее.
Копирование записи как данные JSON
Предположим, вы хотите использовать свои находки в другой системе или написать собственный скрипт на Python для их анализа. Для поддержки такого кросс-использования данных вы можете скопировать результаты как данные JSON: выберите одну или несколько записей в таблице результатов, выберите Копировать > Запись как данные JSON и вставьте в задачу Jira или в качестве входных данных для вашего скрипта.
Аналогичная команда будет добавлена в поле ввода запроса:
{
"content": "62.27.37.94 - - [13/Jan/2025 09:46:30 +0200] \"GET /index.php?alfa=rnwbm HTTP/1.1\" \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36\" 200 8612",
"src_ip": "62.27.37.94",
"timestamp": "2025-01-13T07:46:30.000000000Z",
"request": "GET /index.php?alfa=rnwbm HTTP/1.1",
"user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36",
"response": 200,
"response_size": 8612
}
При копировании нескольких записей как данных JSON они копируются как объект массива JSON.