
Интерактивный инструмент визуализации данных для синих команд, позволяющий анализировать данные обнаружения, понимать взаимосвязи, снижать усталость от оповещений и улучшать реагирование на инциденты.
Detectree — это инструмент визуализации данных для синих команд. Он обеспечивает графическое представление данных обнаружения, что позволяет аналитику практически мгновенно формировать мнение о характере базовой активности и понимать сложные взаимосвязи между точками данных. В конечном итоге это может помочь сократить время реагирования, снизить усталость от оповещений и облегчить коммуникацию между аналитиками внутри команд.
Detectree написан на svelte и основан на javascript-библиотеке force-graph.
Чтобы использовать Detectree в вашей среде, обнаружения должны удовлетворять минимальному набору свойств. В следующей таблице вы можете увидеть, какие поля должны быть включены в каждое обнаружение, а какие являются необязательными.
| Поле | Обязательное |
|---|---|
| Endpoint ID | да |
| Category | да |
| Severity | да |
| Detection Name | да |
| Parent Process Name | да |
| Parent Process ID | да |
| Process Name | да |
| Process ID | да |
| User | нет |
| Command Line | нет |
| File Name | нет |
| Registry Key | нет |
| Network Address | нет |
| Target Process Name | нет |
| Target Process ID | нет |
Сопоставления для каждого поля определены в файле schema.yml, пример файла schema.yml.example предоставлен. Этот файл определяет, какие поля должны извлекаться из данных в бэкенде и как они сопоставляются внутренне. В частности, часть сопоставления содержит сопоставление detectree слева и сопоставление бэкенда справа; вам необходимо заполнить сопоставление в соответствии с вашей средой.
Схема также содержит конфигурацию бэкенда; для elastic она должна быть понятной, но значение различных полей следующее:
primaryId — уникальный идентификатор конечной точки. Он используется для получения обнаружений.
timeField — поле времени, используемое для ограничения запроса.
source — поле, которое идентифицирует тип обнаружения; в примере схемы оно сопоставлено с NewProcess, RegistryWrite, FileAccess и так далее.
Затем в mappings поле type идентифицирует конкретное обнаружение; например, если ваш бэкенд поддерживает только обнаружения NewProcess (или как бы они ни назывались), вам потребуется только одно сопоставление. В тесной связи с этим поле kind связывает тип обнаружения с типом detectree. Например, если kind равен file, сопоставление должно предоставить filePath, который будет использоваться для отрисовки контекстного узла.
В настоящее время единственным поддерживаемым бэкендом является elastic, однако создать адаптер для любого нового бэкенда должно быть тривиально. См. раздел Добавление нового бэкенда для получения дополнительной информации.
Чтобы развернуть приложение в вашей среде, вам необходимо установить требуемые зависимости с помощью npm install (или pnpm install или yarn). Затем вам нужно выбрать правильный адаптер для вашей среды; следуйте этому руководству для получения самой актуальной информации.
Например, если вы хотите использовать node в качестве бэкенда, вам нужно установить @sveltejs/adapter-node и изменить ваш svelte.config.js, заменив @sveltejs/adapter-auto на @sveltejs/adapter-node. Затем проект можно собрать следующей командой; вывод будет в папке output.
npm run build
Разработческий сервер можно запустить следующей командой; это позволит обслуживать приложение локально.
npm run dev
# или запустить сервер и открыть приложение в новой вкладке браузера
npm run dev -- --open
Пример графа можно увидеть на следующем скриншоте

Чтобы поддержать новый бэкенд, вам необходимо создать выделенный TypeScript-файл в папке backend_adapters. Вы можете использовать elastic в качестве шаблона; новый модуль должен предоставлять функцию запроса, которая должна принимать на вход те же параметры, что и функция в файле elastic. Затем вы можете запрашивать выбранный бэкенд предпочтительным способом. Функция запроса должна возвращать объект, содержащий данные, сопоставленные в соответствии с сопоставлением, определённым в файле schema.yaml. Наконец, чтобы бэкенд был корректно выбран, вам также необходимо добавить его в следующий объект внутри draw_tree.ts; ключи объекта здесь также будут тем, как бэкенд упоминается в schema.yml
const backendTypes = {
elastic: '../backend_adapters/elastic'
};