Skip to content
KitploitKITPLOIT
OutilsBlog
Soumettre
OutilsBlog
Soumettre

Outils de Hacking, PenTest et Cybersécurité pour votre Arsenal de Sécurité !

Kitploit est un répertoire d'outils de hacking, de cybersécurité et de pentesting. Découvrez les dernières mises à jour des projets pour trouver des vulnérabilités, analyser des systèmes, automatiser les tests et renforcer votre sécurité.

··Flux·Contact·Confidentialité·© 2026 Kitploit

Répertoire d'outils

Catégories

Voir toutes les catégories
Loading categories
log-horizon — Analyseur de sources de logs SIEM Microsoft Sentinel | Kitploit
Outils/GitHubGitHub/lnfernux/log-horizon
Sécurité de l'Infrastructure CloudAudit de ConfigurationSécurité CloudDevSecOpsRenseignement sur les MenacesRéponse aux IncidentsAnalyse de Journaux
GitHublnfernux/log-horizon

log-horizon

Analyseur de sources de logs SIEM Microsoft Sentinel

Voir le dépôt
28il y a 2 moisVérifié par Kitploit

Populaires

Voir tout →

Découvrez les outils les plus utilisés par notre communauté.

Explorer tous les outils

Parcourez notre collection d'outils

Voir tous les outils →
Partager
Site web

Analyseur de sources de journaux SIEM Microsoft Sentinel

PowerShell 7+ Module Version


J'ai dû répondre à "qu'est-ce que nous tirons réellement de ces journaux ?" ou "quels sont les journaux recommandés pour Microsoft Sentinel ?" plus de fois que je ne peux compter. La réponse dépend toujours de tellement de choses, mais nous pouvons être génériques. Alors j'ai construit ce petit outil ici.

Log Horizon se connecte à votre espace de travail Microsoft Sentinel (et optionnellement à Defender XDR), parcourt chaque table de journaux que vous ingérez, et vous indique si vous en tirez une valeur de sécurité ou si vous brûlez simplement de l'argent. Il classifie les tables, les note par rapport à vos règles de détection, et vous donne des recommandations concrètes avec des estimations d'économies.

Important : Il s'agit d'une approche générique. Si vous savez qu'une source de journal est importante pour votre environnement, ce contexte prévaut toujours sur ce que cet outil vous dit. Les classifications sont un point de départ, pas une vérité absolue.

Vous voulez en savoir plus ? J'ai quelques articles sur Log Horizon sur mon blog :

  1. Publication de l'outil : Log Horizon
  2. Mise à jour : Log Horizon v0.5.0
  3. Construire une base de journaux pratique et comment Log Horizon vous y aide
  4. Comment utiliser Log Horizon

Fonctionnalités

Avertissement

[!CAUTION] Avertissement

Cet outil est développé et maintenu avec l'aide de l'IA. Veuillez faire preuve de prudence lors de l'utilisation de cette solution et assurez-vous toujours de comprendre ce que vous exécutez avant de l'utiliser en production. Le développeur décline toute responsabilité en cas de vulnérabilités ou de problèmes.

En téléchargeant, installant ou utilisant cet outil, vous reconnaissez avoir lu, compris et accepté ces conditions.

Prérequis

Ce dont vous avez besoinVersion
PowerShell7.0+
Modules AzAz.Accounts, Az.Resources
Autres modulesPwshSpectreConsole 2.6.3+

Si vous n'êtes pas déjà connecté à Azure, le module lancera Connect-AzAccount pour vous. Si vous l'êtes, il continuera simplement.

Pour commencer

Assez simple :```powershell

Grab the dependencies

Install-Module -Name Az.Accounts, Az.Resources -Scope CurrentUser Install-Module -Name PwshSpectreConsole -Scope CurrentUser

Clone and import

git clone https://github.com/lnfernux/log-horizon Import-Module ./log-horizon/LogHorizon.psd1

root@kitploit:~
## Utilisation

### Les bases

Commencez par vous connecter à Azure et assurez-vous de sélectionner le bon compte et le bon abonnement :```powershell
Connect-AzAccount

Ensuite, nous pouvons invoquer l'outil :```powershell Invoke-LogHorizon -SubscriptionId '00000000-0000-0000-0000-000000000000' -ResourceGroup 'rg-sentinel' -WorkspaceName 'my-sentinel-ws'

root@kitploit:~
<img width="860" height="842" alt="{F4FFA929-B24F-490C-BD3D-F75E214BCD93}" src="https://assets.kitploit.com/production/public/readmes/13110/ff9d1da85043d02a216df72913ecf63520310b8d820b1bd1278b8e4aca718494.png" />

Il dispose également d'un menu pour approfondir les autres résultats :

<img width="395" height="223" alt="{83CE9E6E-F373-49CD-BE05-182DB69F36BE}" src="https://assets.kitploit.com/production/public/readmes/13110/0606a575b10640bd13ebb87b930f74b2438167b5578cb843b412b4fcf273fc26.png" />


### Lacunes de mots-clés + Defender XDR

Vous voulez savoir s'il vous manque des tables liées à des fournisseurs spécifiques ? Insérez quelques mots-clés. Ajoutez `-IncludeDefenderXDR` si vous souhaitez également l'analyse XDR.```powershell
Invoke-LogHorizon -SubscriptionId '...' -ResourceGroup 'rg' -WorkspaceName 'ws' -Keywords 'CrowdStrike','AWS','Okta' -IncludeDefenderXDR

Analyseur de détection

Activer l'analyse de la qualité/bruit des règles basée sur les incidents et les règles d'automatisation :```powershell Invoke-LogHorizon -SubscriptionId '...' -ResourceGroup 'rg' -WorkspaceName 'ws' -IncludeDetectionAnalyzer -DetectionLookbackDays 90

root@kitploit:~
### Exporter un rapport```powershell
# JSON
Invoke-LogHorizon -SubscriptionId '...' -ResourceGroup 'rg' -WorkspaceName 'ws' -Output json -OutputPath ./report.json

# Markdown
Invoke-LogHorizon -SubscriptionId '...' -ResourceGroup 'rg' -WorkspaceName 'ws' -Output markdown -OutputPath ./report.md

# Static HTML (self-contained, no JS, works offline)
Invoke-LogHorizon -SubscriptionId '...' -ResourceGroup 'rg' -WorkspaceName 'ws' -Output html -OutputPath ./report.html

# Auto-generate timestamped filename by pointing at a directory
Invoke-LogHorizon -SubscriptionId '...' -ResourceGroup 'rg' -WorkspaceName 'ws' -Output html -OutputPath ./reports/

Gérer la rétention et le type de table

Vous pouvez désormais mettre à jour la rétention et le type de table directement depuis le TUI interactif :

  • Ouvrez normalement Invoke-LogHorizon, puis choisissez Manage table retention and type dans le menu principal pour les mises à jour en masse de la rétention ou du type.
  • Ouvrez Log Tuning / Transforms > Evaluate specific table et choisissez Manage retention/type for this table pour un changement de table unique.

Pour les scripts ou l'automatisation, utilisez la commande publique dédiée :```powershell

Preview a single-table change

Set-LogHorizonTableRetention -SubscriptionId '...' -ResourceGroupName 'rg' -WorkspaceName 'ws' ` -TableName 'SigninLogs' -TotalRetentionInDays 365 -WhatIf

Switch tables to Basic and set total retention

Set-LogHorizonTableRetention -SubscriptionId '...' -ResourceGroupName 'rg' -WorkspaceName 'ws' ` -TableName 'AzureDiagnostics','VMConnection' -TargetPlan Basic -TotalRetentionInDays 730

Use -1 for inherit/default semantics

RetentionInDays = inherit workspace default

TotalRetentionInDays = remove long-term retention

Set-LogHorizonTableRetention -SubscriptionId '...' -ResourceGroupName 'rg' -WorkspaceName 'ws' ` -TableName 'SigninLogs' -RetentionInDays -1 -TotalRetentionInDays -1

root@kitploit:~
### Mode non interactif / CI

Ignorez le TUI interactif et exportez directement vers un fichier — utile pour les pipelines ou les exécutions planifiées :```powershell
Invoke-LogHorizon -SubscriptionId '...' -ResourceGroup 'rg' -WorkspaceName 'ws' -NonInteractive -Output json -OutputPath ./reports/

Si vous omettez -Output, l'objet d'analyse est renvoyé au pipeline afin que vous puissiez le rediriger vers votre propre logique.

Suggestions de KQL divisé

Le TUI interactif inclut un menu Suggestions de KQL divisé qui génère du KQL divisé prêt pour le portail pour les tables qui sont de bonnes candidates au fractionnement. Il affiche du KQL par table que vous pouvez coller directement dans l'éditeur de règles de fractionnement Sentinel, avec attribution de source (base de connaissances, analyse de règles ou combiné).

Tarification personnalisée

Le prix par défaut est de 5,59 $/GB (West Europe Simplified PAYG). Si votre niveau d'engagement est différent :```powershell Invoke-LogHorizon -SubscriptionId '...' -ResourceGroup 'rg' -WorkspaceName 'ws' -PricePerGB 4.61

root@kitploit:~
### Tous les paramètres

| Paramètre | Type | Requis | Défaut | Description |
|---|---|---|---|---|
| `-SubscriptionId` | string | Oui | - | ID de l’abonnement Azure |
| `-ResourceGroup` | string | Oui | - | Groupe de ressources contenant l’espace de travail Sentinel |
| `-WorkspaceName` | string | Oui | - | Nom de l’espace de travail Log Analytics |
| `-WorkspaceId` | string | Non | - | ID de l’espace de travail (résolu automatiquement si omis) |
| `-Output` | string | Non | - | Format d’exportation : `json`, `markdown` / `md`, ou `html` |
| `-OutputPath` | string | Non | - | Chemin du fichier ou du répertoire pour l’exportation (génère automatiquement un nom de fichier horodaté lorsqu’il s’agit d’un répertoire) |
| `-Keywords` | string[] | Non | - | Mots‑clés pour l’analyse des lacunes (p. ex. `'AWS','CrowdStrike'`) |
| `-IncludeDefenderXDR` | switch | Non | - | Inclure l’analyse des détections personnalisées Defender XDR |
| `-IncludeDetectionAnalyzer` | switch | Non | - | Inclure l’analyse de bruit par règle utilisant les incidents et les règles d’automatisation |
| `-DetectionLookbackDays` | int | Non | 90 | Fenêtre de requête pour l’analyse de détection basée sur les incidents/automatisations (1‑365 jours) |
| `-DaysBack` | int | Non | 90 | Fenêtre de requête pour les données d’utilisation (1‑365 jours) |
| `-PricePerGB` | decimal | Non | 5.59 | Prix d’ingestion Sentinel par Go |
| `-NonInteractive` | switch | Non | - | Ignorer le tableau de bord TUI et exporter directement (ou renvoyer les données au pipeline si `-Output` est omis) |
| `-CustomClassificationPath` | string | Non | - | Chemin vers un fichier JSON personnalisé pour ajouter ou remplacer des classifications |

---

## Sous le capot

Il y a donc quatre phases.

### 1. Collecte des données

Le module se connecte à Azure et récupère les données des API Log Analytics et Security Insights :

| Source de données | API | Ce qu’on récupère |
|---|---|---|
| Utilisation des tables | Table `Usage` (KQL) | Volume d’ingestion par table sur votre fenêtre de requête |
| Règles d’analyse | REST Security Insights | Règles de détection actives + les tables qu’elles ciblent + les balises de corrélation |
| Requêtes de chasse | REST Security Insights | Requêtes de chasse enregistrées + tables référencées |
| Connecteurs de données | REST Security Insights | Inventaire des connecteurs installés |
| Optimisation SOC | REST Security Insights | Recommandations SOC intégrées de Microsoft |
| Rétention des tables | REST Azure Tables | Rétention, archivage et plan (Analytics/Basic) par table |
| Defender XDR | REST Security Insights | Détections personnalisées XDR et configuration de streaming (optionnel) |
| Incidents | REST Security Insights | Résultats des incidents (statut/classification), timing et indices de liaison aux règles pour le score de qualité des règles |
| Règles d’automatisation | REST Security Insights | Actions de fermeture d’incident au niveau des règles et conditions de correspondance de titre pour l’attribution de fermeture automatique |
| SentinelHealth | Log Analytics KQL | Événements d’exécution des règles d’automatisation avec les numéros d’incident pour une attribution définitive de fermeture automatique (optionnel, nécessite la supervision de l’état de santé) |

### 2. Classification

Chaque table est classée en deux passes :

**D’abord**, une recherche directe dans la base de connaissances de 345 entrées dans `Data/log-classifications.json`. Chaque entrée contient le nom du connecteur, la classification primaire/secondaire, la catégorie de sécurité, les correspondances de sources de données MITRE et un niveau de tarification recommandé.

**S’il n’y a pas de correspondance**, les règles heuristiques s’activent :
- Le nom contient des motifs de sécurité comme `Alert`, `Incident`, `Threat`, `Signin`, `Audit`, `Risk` -> **primaire**
- Le nom ressemble à de la télémétrie d’infrastructure : `Flow`, `Metric`, `Diagnostic`, `Perf`, `Heartbeat` -> **secondaire**
- Des règles d’analyse actives pointent vers elle -> **primaire**
- Volume élevé (>10 Go/mois) sans détection -> **secondaire**
- Aucun des cas ci-dessus -> **inconnue**

### 3. Score coût‑valeur

Chaque table reçoit un score sur plusieurs dimensions :

- **Niveau de coût** : Gratuit / Faible (<1 Go) / Moyen (1‑10 Go) / Élevé (10‑50 Go) / Très élevé (>50 Go)
- **Niveau de détection** : Aucune / Faible (1‑2 règles) / Moyen (3‑9 règles) / Élevé (10+ règles)
- **Évaluation** : Haute valeur / Bonne valeur / Couverture manquante / Révision nécessaire / Candidat pour le lac de données / Niveau gratuit
- **% de couverture** : Pourcentage de tables ayant au moins une règle d’analyse ou une requête de chasse les référençant, calculé comme `tablesAvecRegles / totalTables * 100`. La couverture par table additionne les règles d’analyse + les requêtes de chasse trouvées en analysant le KQL pour les noms de tables.

Ensuite, le module génère des recommandations :

| Type | Quand il se déclenche | Que faire |
|---|---|---|
| **Lac de données** | Secondaire + coût élevé + peu de détections | Déplacer vers le niveau Auxiliaire/Lac de données (~95 % d’économies) |
| **Faible valeur** | Coût élevé + zéro détections | Ajouter des règles, filtrer ou déplacer vers le lac de données |
| **Optimiser XDR** | Diffusé par XDR + 0 règle Sentinel + règles XDR existantes | Arrêter le streaming, utiliser le portail XDR unifié à la place |
| **Couverture manquante** | Primaire + zéro détections | Écrire des règles d’analyse pour tirer la valeur des données |
| **Filtrage à l’ingestion** | Primaire + >20 Go + <=3 détections | Appliquer une transformation à l’ingestion pour réduire le volume |
| **Candidat à la scission** | Primaire + volume élevé + détections + aucune transformation existante | Scinder la table — les lignes à haute valeur restent dans Analytics, le reste va dans le lac de données |
| **Rétention insuffisante** | Rétention de la table inférieure au minimum recommandé | Augmenter la rétention totale/d’archivage pour respecter les directives réglementaires |

### 4. Analyseur de détection (score de bruit)

Lorsque vous passez `-IncludeDetectionAnalyzer`, le module récupère les incidents récents et les règles d’automatisation, puis score chaque règle d’analyse activée pour son potentiel de bruit.

**Mesures par règle** (calculées à partir des données d’incidents) :

| Mesure | Comment c’est calculé |
|---|---|
| Total incidents | Nombre d’incidents liés à la règle |
| Ratio FermetureAuto | Incidents fermés par des règles d’automatisation ÷ total des incidents. Source principale : table SentinelHealth (correspondance définitive via le numéro d’incident). Solution de repli : correspondance de titre sensible à l’opérateur avec les conditions des règles d’automatisation. |
| Ratio FauxPositif | Incidents classés comme faux positifs ÷ total des incidents |

**Formule du score de bruit** :

Chaque mesure est convertie en rang percentile parmi toutes les règles ayant au moins un incident. Le score composite est un mélange pondéré :```
Score = (Volume_percentile × 0.35) + (AutoClose_percentile × 0.40) + (FalsePositive_percentile × 0.25)
  • Percentile de volume (35 %) — combien d'incidents une règle génère par rapport aux autres règles.
  • Percentile de fermeture automatique (40 %) — à quelle fréquence les incidents sont automatiquement fermés par des règles d'automatisation (poids le plus élevé car la fermeture automatique est le signal le plus fort d'alertes de faible valeur).
  • Percentile de faux positifs (25 %) — à quelle fréquence les analystes classent le résultat comme faux positif.

Seuils de score :

Les règles avec un score ≥ 70 et au moins 5 incidents sont automatiquement présentées comme recommandations haute priorité dans la vue Recommandations.

5. Tableau de bord interactif

  • Tableau de bord : statistiques générales, top 10 des tables les plus coûteuses, barre de couverture, résumé de conformité de rétention, callout d'exclusion de corrélation
  • Recommandations : actions priorisées avec économies mensuelles estimées — extensible pour afficher la liste complète lorsqu'il y a plus de 10 éléments
  • Évaluation de détection : ventilation de la couverture des règles et des requêtes de chasse par table, liste des règles exclues de corrélation
  • Optimisation SOC : suggestions d'amélioration de Microsoft
  • Évaluation de rétention : tables en dessous des minimums recommandés avec rétention actuelle vs recommandée, type de plan et écart
  • Transformations : inventaire des transformations DCR avec classification du type de transformation
  • Suggestions de fractionnement KQL : KQL de fractionnement par table prêt à être collé dans le portail, avec attribution de source (base de connaissances, analyse de règles ou combiné)
  • Toutes les tables : la liste complète avec classification, coût, règles, rétention (codée par couleur) et évaluation
  • Analyse XDR : intégration Defender XDR (lorsque vous avez utilisé -IncludeDefenderXDR)
  • Analyseur de détection : classement des règles bruyantes basé sur le percentile avec indicateurs de qualité de fermeture (lorsque vous avez utilisé -IncludeDetectionAnalyzer)
  • Export : exporter le rapport en JSON ou Markdown directement depuis le menu

La base de données de classification

Située dans Data/log-classifications.json. 345 entrées, 190 connecteurs, 21 catégories.

Ce que contient chaque entrée

Données de sécurité primaires vs secondaires

Primaires (211 entrées) : les tables sur lesquelles vous construisez réellement des détections. Journaux de connexion, alertes de sécurité, renseignements sur les menaces, pistes d'audit, résultats de vulnérabilités, hits de pare-feu, télémétrie EDR.

Secondaires (133 entrées) : éléments de support. Métriques de performance, diagnostics d'infrastructure, volumes de flux réseau, instantanés d'inventaire, lignes de base de configuration, contrôles de santé.

Catégories en un coup d'œil

Classifications personnalisées

Vous pouvez fournir votre propre fichier de classification pour ajouter des entrées pour des tables qui ne sont pas dans la base de données intégrée, ou remplacer des entrées existantes lorsque les valeurs par défaut ne correspondent pas à votre environnement. Les entrées personnalisées ont priorité sur les entrées intégrées lorsque le même tableName apparaît dans les deux.```powershell Invoke-LogHorizon -SubscriptionId '...' -ResourceGroup 'rg' -WorkspaceName 'ws' ` -CustomClassificationPath './my-classifications.json'

root@kitploit:~
Le fichier personnalisé utilise le même schéma que `Data/log-classifications.json` — un tableau d'objets :```json
[
  {
    "tableName": "MyCustomApp_CL",
    "connector": "Custom Logs (DCR)",
    "classification": "primary",
    "category": "Application Logs",
    "description": "Security-relevant audit events from an internal application",
    "keywords": ["custom", "internal", "audit"],
    "mitreSources": [],
    "recommendedTier": "analytics",
    "isFree": false
  },
  {
    "tableName": "AzureMetrics",
    "connector": "Azure Monitor",
    "classification": "primary",
    "category": "Infrastructure Diag",
    "description": "Override: promoted to primary because we detect on Azure resource metrics in this environment",
    "keywords": ["metrics", "azure", "infrastructure", "monitoring"],
    "mitreSources": [],
    "recommendedTier": "analytics",
    "isFree": false
  }
]

Voir Data/custom-classifications-example.json pour un modèle prêt à l'emploi.

Comment les classifications ont été construites

La classification primaire/secondaire a été réalisée en partie par l'auteur, puis en introduisant les définitions des connecteurs de données et des tables de Microsoft dans une IA, avec une base de classification humaine, en utilisant les meilleures pratiques Microsoft et les normes du secteur comme critères de classification. Si quelque chose vous semble inadapté à votre environnement, faites confiance à votre propre contexte plutôt qu'à l'outil — l'IA peut commettre des erreurs, et le contexte est roi.

Les critères de classification ont été tirés des sources suivantes :

ACSC (Direction australienne des signaux, Centre australien de cybersécurité)

  • ACSC : Meilleures pratiques pour la journalisation des événements et la détection des menaces (août 2024)
  • ACSC : Journaux prioritaires pour l'ingestion SIEM — Guide pratique (mai 2025)

CISA (Agence de cybersécurité et de sécurité des infrastructures)

  • CISA : Guide pour la mise en œuvre de M-21-31 : Améliorer les capacités d'enquête et de remédiation du gouvernement fédéral
  • CISA : Cahier de mise en œuvre des journaux cloud étendus de Microsoft (2025)

Microsoft

  • Référence des connecteurs de données Microsoft Sentinel
  • Référence des tables et connecteurs Microsoft Sentinel
  • Dépôt GitHub Azure-Sentinel (règles d'analyse communautaires, définitions de connecteurs, modèles de solutions)
  • Facturation Microsoft Sentinel
  • Gestion des niveaux de données Microsoft Sentinel

MITRE

  • Sources de données MITRE ATT&CK

NIST (Institut national des normes et de la technologie)

  • NIST SP 800-92 : Guide de gestion des journaux de sécurité informatique

NSA (Agence de sécurité nationale)

  • Guide de transmission d'événements cyber de la NSA

NCSC-UK (Centre national de cybersécurité du Royaume-Uni)

  • « Que devons-nous exactement journaliser ? » du NCSC-UK

Google Cloud

  • Vue d'ensemble des journaux d'audit Google Cloud
  • Meilleures pratiques pour les journaux d'audit Google Cloud

D'autres sources ont également été utilisées, ainsi que « l'expertise » des auteurs, si l'on peut qualifier ainsi.

Project layout```

LogHorizon.psd1 Module manifest (v0.6.2) LogHorizon.psm1 Module loader Public/ Invoke-LogHorizon.ps1 Entry point, the main orchestrator Private/ Connect-Sentinel.ps1 Azure auth + workspace resolution Get-TableUsage.ps1 KQL query for ingestion volumes Get-AnalyticsRules.ps1 Analytics rules + table/field extraction + correlation tags Get-HuntingQueries.ps1 Hunting queries + table extraction Get-DataConnectors.ps1 Data connector inventory Get-DataTransforms.ps1 DCR transform discovery, split KQL generation Get-DefenderXDR.ps1 Defender XDR analysis (optional) Get-Incidents.ps1 Incident fetch + SentinelHealth auto-close attribution Get-AutomationRules.ps1 Automation rule inventory + close-logic attribution Get-SocOptimization.ps1 SOC improvement recommendations Get-TableRetention.ps1 Per-table retention, archive, and plan type Invoke-AzRestWithRetry.ps1 REST retry wrapper with exponential backoff for 429/5xx Invoke-Classification.ps1 Static DB + heuristic classification + _SPLT_CL detection Invoke-Analysis.ps1 Cost-value matrix + recommendations + split suggestions Write-Report.ps1 Spectre.Console TUI rendering Export-Report.ps1 JSON / Markdown / static HTML export with shared section renderer Data/ log-classifications.json 345-entry classification knowledge base high-value-fields.json 15-table split KQL knowledge base with curated fields and split hints field-frequency-stats.json Community field frequency stats (generated by Build-FieldKnowledgeBase.ps1) custom-classifications-example.json Example custom classification override file ReportTemplate.html Static HTML report template (pure-CSS tabs, zero JS) Tests/ LogHorizon.Tests.ps1 Pester v5 unit tests

root@kitploit:~
### Génération de la base de connaissances

Les bases de connaissances KQL divisées -- `high-value-fields.json` et `field-frequency-stats.json` -- sont générées hors ligne par `Build-FieldKnowledgeBase.ps1`. Le script :

1. Clone superficiellement le dépôt GitHub [Azure/Azure-Sentinel](https://github.com/Azure/Azure-Sentinel) (checkout sparse de `Solutions/`, `Detections/`, `Hunting Queries/`)
2. Analyse environ 3 800 fichiers de règles YAML et extrait les requêtes KQL via des expressions régulières
3. Exécute `Get-TablesFromKql` et `Get-FieldsFromKql` sur chaque requête pour construire des comptages de fréquence de champs par table
4. Calcule trois niveaux de champs de repli :
   - **Champs universels** -- champs apparaissant dans >50% de toutes les tables (ex. `TimeGenerated`)
   - **Valeurs par défaut par catégorie** -- champs apparaissant dans >40% des tables d'une catégorie de classification
   - **Statistiques par table** -- comptages bruts de fréquence de champs pour les tables avec >= 3 règles référencées
5. Fusionne les champs extraits dans le fichier `high-value-fields.json` existant (reporte les entrées organisées, ajoute les tables nouvellement découvertes avec >= 3 règles et >= 3 champs significatifs)
6. Produit les deux fichiers dans `Data/`

À l'exécution, `Get-SplitKql` utilise une hiérarchie de repli : entrée de base de connaissances organisée -> analyse des champs de règles/hunting en direct -> statistiques communautaires par table -> valeurs par défaut par catégorie -> champs universels. La fréquence des champs n'est pas une méthode parfaite, mais elle est utile à connaître.

## Tests```powershell
Invoke-Pester ./Tests/LogHorizon.Tests.ps1 -Output Detailed

Licence

MIT

Historique des versions

Problèmes connus

Avertissement d’encodage UTF-8 de PwshSpectreConsole

Pour activer la sortie UTF-8 dans votre terminal, ajoutez la ligne suivante en haut de votre fichier $PROFILE PowerShell et redémarrez le terminal :```powershell $OutputEncoding = [console]::InputEncoding = [console]::OutputEncoding = [System.Text.UTF8Encoding]::new()

root@kitploit:~
Le module définit cela automatiquement lors de l'importation, mais selon votre session, l'avertissement peut toujours apparaître. C'est cosmétique et n'affecte pas le fonctionnement.

## Contribuer

Si vous rencontrez des problèmes ou souhaitez contribuer, créez une PR.

## Vous aimez l'outil ? 

</br>
<a href='https://ko-fi.com/B0B61XGLO7' target='_blank'><img height='36' style='border:0px;height:36px;' src="https://assets.kitploit.com/production/public/readmes/13110/85ecfd7542830b8c7e246d37aec7c2b7397da003291ec4c56074631499f4829a.webp" border='0' alt='Offrez-moi un café sur ko-fi.com' /></a>
</br>
Télécharger l’outil
FonctionnalitéDescription
Moteur de classificationBase de connaissances de 345 entrées couvrant 190+ connecteurs, 21 catégories, avec repli heuristique automatique pour les tables inconnues
Score coût-valeurMatrice par table de niveau de coût vs niveau de détection avec évaluation combinée (Haute Valeur → Faible Valeur)
RecommandationsActions priorisées : candidats pour le lac de données, tables sans détection, gaspillage de streaming XDR, filtrage à l'ingestion, insuffisance de rétention
Cartographie des détectionsMappe les règles analytiques, les requêtes de chasse et les détections XDR vers chaque table pour repérer les lacunes de couverture
Étiquettes de corrélationDétecte les balises #DONT_CORR# / #INC_CORR# dans les descriptions de règles et signale les règles exclues de la corrélation Defender
Conformité de rétentionCompare la rétention réelle par rapport aux minimums recommandés basés sur les standards de l'industrie et les meilleures pratiques de sécurité
Optimisation SOCRécupère les propres recommandations d'amélioration SOC de Microsoft depuis l'API Security Insights
Analyse des écarts par mots-clésSignale les tables que vous devriez ingérer mais que vous n'ingérez pas, basé sur les mots-clés fournisseur/produit
Découverte des transformationsDécouvre les règles de collecte de données (DCR) et classifie les transformations à l'ingestion (filtre, projection, enrichissement, agrégation)
Détection des tables fractionnéesIdentifie les tables fractionnées _SPLT_CL et les relie aux tables parentes dans le moteur de classification
Générateur KQL fractionnéGénère du KQL prêt pour le portail à partir d'une base de connaissances organisée, d'une analyse de règles en direct et de statistiques de fréquence de champs communautaires -- format condition uniquement qui se colle directement dans l'éditeur de règles fractionnées Sentinel
Analyseur de détectionNote les règles analytiques pour leur potentiel de bruit en utilisant les résultats d'incidents (ratio de fermeture automatique, ratio de faux positifs et percentiles de volume d'incidents)
Vérificateur XDRAjoute une couche consultative XDR : vérifications de couverture de streaming et recommandations de rétention d'un an dans le lac de données pour les données télémétriques liées à XDR
Classifications personnaliséesFournissez votre propre JSON pour ajouter ou remplacer la base de classification intégrée
TUI interactifTableau de bord Spectre.Console avec menus, tableaux colorés, explorations détaillées et art ASCII
ExportRapport JSON, Markdown ou HTML statique pour partager avec l'équipe
ScoreÉtiquetteSignification
≥ 70BruyantLa règle nécessite probablement un réglage ou une désactivation
≥ 50SurveillanceLa règle montre des signes précoces de bruit
< 50SainLa règle est dans la plage normale
N/D—La règle n'a pas d'incidents corrélés (aucun score possible)
ChampCe qu'il contient
tableNameNom de la table Log Analytics (SecurityEvent, SigninLogs, etc.)
connectorQuel connecteur de données produit cette table
classificationprimary (valeur de sécurité) ou secondary (télémétrie de support)
categoryCatégorie de sécurité : Identity & Access, Network Security, etc.
descriptionRésumé en anglais simple de ce que contient la table
keywordsTermes pour la correspondance d'analyse d'écart par mots-clés
mitreSourcesMappages de sources de données MITRE ATT&CK
recommendedTieranalytics (niveau chaud) ou datalake (candidat auxiliaire)
recommendedRetentionDaysRétention totale minimale recommandée en jours (directive réglementaire)
isFreeSi Microsoft ingère celle-ci gratuitement
CatégorieNombreExemples
Identité et accès33SigninLogs, OktaSSO, CyberArk_AuditEvents_CL
Sécurité réseau29AZFWNetworkRule, Cloudflare_CL, darktrace_model_alerts_CL
Alertes de sécurité26SecurityAlert, SecurityIncident, SentinelOneAlerts_CL
Détection des points de terminaison22DeviceProcessEvents, DeviceFileEvents, SentinelOne_CL
Plan de contrôle cloud22AzureActivity, OfficeActivity, GoogleWorkspaceReports
Flux réseau23AzureNetworkAnalytics_CL, CommonSecurityLog, AZFWFatFlow
Sécurité cloud13McasShadowItReporting, PaloAltoPrismaCloudAlertV2_CL
Sécurité des e-mails20EmailEvents, ProofPointTAPMessagesBlockedV2_CL, MimecastSIEM_CL
Télémétrie des points de terminaison14DeviceInfo, SentinelOneAgents_CL, jamfprotecttelemetryv2_CL
Gestion des vulnérabilités11DeviceTvmSoftwareVulnerabilities, QualysHostDetectionV3_CL
Sécurité des données12PurviewDataSensitivityLogs, VaronisAlerts_CL, MimecastDLP_CL
Journaux d'application22AppServiceHTTPLogs, FunctionAppLogs, DynatraceAttacks_CL
Renseignement sur les menaces8ThreatIntelligenceIndicator, CybleVisionAlerts_CL
Sécurité SAP7ABAPAuditLog, SAPBTPAuditLog_CL, Onapsis_Defend_CL
Sécurité IoT/OT4RadiflowEvent, DragosAlerts_CL, Phosphorus_CL
Plateforme de données13AzureDiagnostics, SnowflakeLogin_CL, MongoDBAudit_CL
Conteneurs et K8s7ContainerLog, KubeEvents, GKEAudit, AWSEKSLogs_CL
Santé de la plateforme6SentinelHealth, Watchlist, SOCPrimeAuditLogs_CL
Diagnostics d'infrastructure7AzureMetrics, GCPComputeEngine, GCPMonitoring
Gestion de la posture7DeviceTvmSecureConfigurationAssessment, CortexXpanseAlerts_CL
Gestion de la configuration6ConfigurationData, ESIExchangeOnlineConfig_CL
Accès au stockage5StorageBlobLogs, StorageFileLogs, AWSS3ServerAccess
VersionDateModifications
0.8.02026-05-26Ajout de la gestion interactive de la rétention des tables avec un nouveau flux TUI en masse et un point d’entrée de mise à jour de table unique, ainsi que la commande publique Set-LogHorizonTableRetention. Ajout du moteur d’application PATCH de l’API Tables avec validation, sondage d’opération asynchrone Azure et repli en deux étapes (PATCH combiné, puis plan uniquement plus rétention uniquement) pour des mises à jour de rétention résilientes. Ajout de la couverture Pester ciblée pour la validation, la forme des charges utiles, le repli et le mappage des commandes publiques. Correction également d’un cas limite/bogue où les utilisateurs recevaient des recommandations de changer les tables Data Lake en niveau Data Lake s’ils avaient encore des données d’analyse dans Sentinel
0.7.12026-05-15Ajout de la connaissance du plan à partir de Usage.Plan sans remplacer le plan de table configuré : l’analyse suit désormais l’historique des plans observés, signale les utilisations multi-plans et les écarts configurés vs observés, et affiche les données de plan dans le tableau de bord, l’exploration des tables, l’affichage de toutes les tables, l’évaluation de la rétention et les exportations. Correction de l’attribution de fermeture automatique du Détecteur d’analyse afin que l’heuristique de temporisation ne s’applique que lorsqu’aucune règle d’automatisation activée n’existe. 203 tests réussis
0.7.02026-04-16Mise à jour de l’évaluation de la détection avec un tableau récapitulatif de la matrice coût-valeur (7 catégories d’évaluation Primaire/Secondaire avec code couleur), sous-menu d’exploration pour les tables primaires/secondaires avec colonnes de niveau coût/détection. Mise à jour de l’analyseur de détection avec des barres de couverture volumique pondérées en Go (Go de détection/chasse/combiné en pourcentage de l’ingestion totale en plus des barres existantes par nombre de tables). Améliorations de l’affichage adaptatif pour l’analyseur de détection (largeur de barre dynamique, troncature des noms de règles, masquage conditionnel des colonnes en fonction de la largeur de la console). 193 tests réussis
0.6.32026-04-11Mise à jour mineure pour PSGallery
0.6.22026-04-11Menu Réglage des journaux / Transformations : analyse de réglage des données en direct (utilisation des champs par table à partir des règles déployées/requêtes de chasse, génération de KQL filtre/projet/combiné, estimations d’économies), extraction des colonnes de schéma depuis l’API Tables, hiérarchie de repli Get-SplitKql (statistiques communautaires → valeurs par défaut des catégories → champs universels), évaluateur de table complet avec matrice d’utilisation des champs, sections d’exportation unifiées KB + réglage en direct, script d’extraction Build-FieldKnowledgeBase.ps1 pour le corpus de règles GitHub Azure-Sentinel. Analyseur de détection : attribution de fermeture automatique basée sur SentinelHealth (primaire) avec repli de correspondance de règles tenant compte des opérateurs, analyse des wrappers de conditions booléennes, détection de l’état Résolu, correspondance de fin de GUID pour les ID de ressources ARM. La couverture est désormais basée sur le nombre de tables pour toutes les tables (y compris le niveau gratuit). Avis de notation ajouté à la TUI et aux exportations. 174 tests
0.6.12026-04-10Corrections de bogues : le filtrage $kqlKeywords est maintenant partagé au niveau du fichier (n’était pas défini dans Get-TablesFromKql), ajout de [CmdletBinding()] à toutes les fonctions d’assistance, simplification de la vérification unifiée Defender, suppression du paramètre de test fantôme -RuleCount. Robustesse : pagination de Get-HuntingQueries, wrapper de nouvelle tentative Invoke-AzRestWithRetry avec backoff exponentiel pour 429/5xx, validation de PricePerGB, Write-Verbose dans les fonctions clés. Docs : badge de version, nombre de bases de données, prérequis alignés sur le manifeste
0.6.02026-04-10Détection de streaming XDR dynamique avec 21 KnownXDRTables (auparavant 18 codés en dur), XDRState par table (NotStreaming/Analytics/Basic/Auxiliary), Auxiliary reconnu comme niveau Data Lake, tables XDR non streamées remontées sous forme de recommandations Information/Faible avec NotStreamedCount, l’analyseur de rétention affiche les tables XDR non streamées comme « XDR only (30d) », répartition des niveaux dans l’aperçu (analytics/basic/data lake + non streamé), étiquettes Export-Report Auxiliary→« data lake », base de données de classification mise à jour à 345 entrées (+DeviceNetworkInfo, DeviceInfo→secondary/datalake, DeviceImageLoadEvents et IdentityQueryEvents→niveau datalake), 15 nouveaux tests Pester (121 au total)
0.5.02026-04-03Export HTML statique avec onglets CSS purs (zéro JS, sans CDN, entièrement autonome), moteur de rendu de section unifié MD/HTML, capture complète des données JSON (dataTransforms, correlationExcluded/Included, streamingTables), commutateur -NonInteractive pour utilisation en CI/pipeline, alias de format md, noms de fichiers automatiques avec horodatage, affichage complet du KQL dans les transformations DCR (sans troncature), gestion du KQL multiligne dans les tableaux markdown, correction de la corruption des backreferences $ dans le remplacement des jetons HTML, renommage des aides internes pour éviter les conflits d’alias PowerShell (h→hEnc, md→mdEsc), 33 nouveaux tests Pester (106 au total)
0.4.12026-04-03Corrections de sécurité et de stabilité – ajout de l’assainissement de la mémoire des jetons, validation des chemins de sortie et protection XSS, limites de pagination de l’API REST, correction du masquage des erreurs du chargeur de modules, résolution des avertissements PSScriptAnalyzer
0.4.02026-04-02Découverte des transformations (liste des DCR + classification du type de transformation), détection des tables divisées (_SPLT_CL), aide KQL divisée avec une base de connaissances de 15 tables (high-value-fields.json) + repli d’analyse de règles, sortie KQL prête pour le portail avec condition uniquement, liste de recommandations extensible, menu TUI des suggestions KQL divisées
0.3.02026-04-02Analyse de conformité de la rétention des journaux (CISA M-21-31, NIST SP 800-92, NCSC-UK, ASD ACSC, NSA), détection des balises de corrélation (#DONT_CORR#/#INC_CORR#), vue du menu d’évaluation de la rétention, colonne de rétention dans Toutes les tables, recommendedRetentionDays dans le schéma de classification
0.2.22026-04-02La table d’optimisation SOC masque la colonne Détail sur les consoles étroites
0.2.12026-04-02Prise en charge de la classification personnalisée (-CustomClassificationPath), enrichissement des recommandations d’optimisation SOC avec les suggestions de l’API/exploration, vue active par défaut, suppression des avertissements d’encodage UTF-8
0.2.0-Première version publique avec moteur de classification, notation coût-valeur, TUI Spectre.Console, export en JSON/Markdown
0.1.0-Version interne pour le développement