
블루 팀이 탐지 데이터를 분석하고, 관계를 이해하며, 알림 피로를 줄이고, 사고 대응을 개선하기 위한 대화형 데이터 시각화 도구입니다.
Detectree는 블루 팀을 위한 데이터 시각화 도구입니다. 탐지 데이터를 그래픽으로 표현하여 분석가가 기본 활동의 성격에 대해 거의 즉각적인 판단을 내리고 데이터 포인트 간의 복잡한 관계를 이해할 수 있게 해줍니다. 궁극적으로 이는 대응 시간을 줄이고 알림 피로를 완화하며 팀 내 분석가 간의 커뮤니케이션을 촉진하는 데 도움이 될 수 있습니다.
Detectree는 svelte로 작성되었으며 force-graph 자바스크립트 라이브러리를 기반으로 합니다.
사용자 환경에서 Detectree를 사용하려면 탐지 항목이 최소한의 속성 집합을 충족해야 합니다. 아래 표에서 각 탐지에 포함되어야 하는 필드와 선택 사항인 필드를 확인할 수 있습니다.
| 필드 | 필수 여부 |
|---|---|
| 엔드포인트 ID | 예 |
| 카테고리 | 예 |
| 심각도 | 예 |
| 탐지 이름 | 예 |
| 상위 프로세스 이름 | 예 |
| 상위 프로세스 ID | 예 |
| 프로세스 이름 | 예 |
| 프로세스 ID | 예 |
| 사용자 | 아니요 |
| 명령줄 | 아니요 |
| 파일 이름 | 아니요 |
| 레지스트리 키 | 아니요 |
| 네트워크 주소 | 아니요 |
| 대상 프로세스 이름 | 아니요 |
| 대상 프로세스 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
예제 그래프는 다음 스크린샷에서 확인할 수 있습니다.

새 백엔드를 지원하려면 backend_adapters 폴더에 전용 TypeScript 파일을 만들어야 합니다. elastic 파일을 템플릿으로 사용할 수 있으며, 새 모듈은 elastic 파일의 함수와 동일한 매개변수를 입력으로 받는 쿼리 함수를 노출해야 합니다. 그런 다음 원하는 방식으로 선택한 백엔드를 쿼리할 수 있습니다. 쿼리 함수는 schema.yaml 파일에 정의된 매핑에 따라 매핑된 데이터가 포함된 객체를 반환해야 합니다. 마지막으로 백엔드가 올바르게 선택되도록 하려면 draw_tree.ts 내부의 다음 객체에도 추가해야 합니다. 여기서 객체 키는 schema.yml에서 백엔드를 참조하는 방식이기도 합니다.
const backendTypes = {
elastic: '../backend_adapters/elastic'
};