
Outil de visualisation de données interactif pour les équipes bleues afin d'analyser les données de détection, de comprendre les relations, de réduire la fatigue liée aux alertes et d'améliorer la réponse aux incidents.
Detectree est un outil de visualisation de données destiné aux équipes bleues. Il fournit une représentation graphique des données de détection, ce qui permet à un analyste de se faire une opinion presque instantanée sur la nature de l'activité sous-jacente et de comprendre les relations complexes entre les points de données. En fin de compte, cela peut contribuer à réduire le temps de réponse, à diminuer la fatigue liée aux alertes et à faciliter la communication entre les analystes au sein des équipes.
Detectree est écrit en svelte et basé sur la bibliothèque javascript force-graph.
Afin d'utiliser Detectree dans votre environnement, les détections doivent satisfaire un ensemble minimal de propriétés. Dans le tableau suivant, vous pouvez voir quels champs doivent être inclus dans chaque détection et lesquels sont facultatifs.
| Champ | Requis |
|---|
| ID du point de terminaison | oui |
| Catégorie | oui |
| Sévérité | oui |
| Nom de la détection | oui |
| Nom du processus parent | oui |
| ID du processus parent | oui |
| Nom du processus | oui |
| ID du processus | oui |
| Utilisateur | non |
| Ligne de commande | non |
| Nom du fichier | non |
| Clé de registre | non |
| Adresse réseau | non |
| Nom du processus cible | non |
| ID du processus cible | non |
Les correspondances pour chaque champ sont définies dans le fichier schema.yml, un exemple de fichier schema.yml.example est fourni. Ce fichier définit quels champs doivent être extraits des données dans le backend et comment ils sont mappés en interne. En particulier, la partie mapping contient le mapping detectree à gauche et le mapping backend à droite ; vous devrez renseigner le mapping en fonction de votre environnement.
Le schéma contient également la configuration du backend ; pour elastic, cela devrait être simple, mais la signification des différents champs est la suivante :
primaryId est l'identifiant unique du point de terminaison. C'est ce qui est utilisé pour récupérer les détections.
timeField est le champ temporel utilisé pour restreindre la requête.
source est le champ qui identifie le type de détection ; dans l'exemple de schéma, il est mappé à NewProcess, RegistryWrite, FileAccess, etc.
Ensuite, dans les mappings, le champ type identifie une détection spécifique ; par exemple, si votre backend ne prend en charge que les détections NewProcess (ou quel que soit le nom correspondant), vous n'aurez besoin que d'un seul mapping. Étroitement lié à cela, le champ kind relie le type de détection à celui de detectree. Par exemple, si kind est file, le mapping doit fournir un filePath qui sera utilisé pour dessiner un nœud de contexte.
Actuellement, le seul backend pris en charge est elastic, mais il devrait être trivial de créer un adaptateur pour tout nouveau backend. Voir la section Ajouter un nouveau backend pour plus d'informations.
Afin de déployer l'application dans votre environnement, vous devez installer les dépendances requises avec npm install (ou pnpm install ou yarn). Vous devrez ensuite sélectionner le bon adaptateur pour votre environnement ; suivez ce guide pour les informations les plus récentes.
Si, par exemple, vous souhaitez utiliser node comme backend, vous devez installer @sveltejs/adapter-node et modifier votre svelte.config.js en remplaçant @sveltejs/adapter-auto par @sveltejs/adapter-node. Le projet peut ensuite être construit avec la commande suivante ; la sortie sera dans le dossier output.
npm run build
Un serveur de développement peut être démarré avec la commande suivante, ce qui permettra de servir l'application localement.
npm run dev
# ou démarrez le serveur et ouvrez l'application dans un nouvel onglet du navigateur
npm run dev -- --open
Un exemple de graphe peut être vu dans la capture d'écran suivante

Afin de prendre en charge un nouveau backend, vous devez créer un fichier TypeScript dédié dans le dossier backend_adapters. Vous pouvez utiliser celui d'elastic comme modèle ; le nouveau module doit exposer une fonction de requête qui prend en entrée les mêmes paramètres que celle du fichier elastic. Vous pouvez ensuite interroger le backend choisi de la manière souhaitée. La fonction de requête doit retourner un objet contenant les données mappées selon le mapping défini dans le fichier schema.yaml. Enfin, pour que le backend soit correctement sélectionné, vous devez également l'ajouter dans l'objet suivant à l'intérieur de draw_tree.ts ; les clés de l'objet ici seront également la façon dont le backend est référencé dans le schema.yml
const backendTypes = {
elastic: '../backend_adapters/elastic'
};