
Analyseur de sources de logs SIEM Microsoft Sentinel
J'ai dû répondre à « qu'est-ce qu'on tire 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 on peut rester générique. Alors j'ai construit ce petit outil juste 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 classe 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 journaux est importante pour votre environnement, ce contexte prime toujours sur ce que cet outil vous indique. 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 :
| Fonctionnalité | Description |
|---|---|
| Moteur de classification | Base de connaissances de 481 entrées couvrant plus de 240 connecteurs, 22 catégories, avec statut de cycle de vie (déprécié/obsolète plus tables de remplacement) et repli heuristique automatique pour les tables inconnues |
| Score coût-valeur | Matrice par table entre niveau de coût et niveau de détection avec évaluation combinée (Haute valeur à Faible valeur), tarifée selon le plan observé (Analytics, Basic, Data Lake) |
| Recommandations | 13 types d'actions priorisés : candidats Data Lake ou Basic, tables sans détection, gaspillage de streaming XDR, filtrage à l'ingestion, candidats à la scission, utilisation des plans, sources dépréciées, insuffisances de rétention, résultats du XDR Checker et du Detection Analyzer, chacun avec des estimations d'économies |
| Mappage des détections | Mappe les règles d'analytique, les requêtes de chasse et les détections XDR vers chaque table pour repérer les lacunes de couverture |
| Balises de corrélation | Dé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étention | Compare la rétention réelle aux minimums recommandés selon les normes sectorielles et les bonnes pratiques de sécurité |
| Optimisation du SOC | Récupère les recommandations d'amélioration du SOC de Microsoft via l'API Security Insights |
| Analyse des écarts de mots-clés | Signale les tables que vous devriez ingérer mais que vous n'ingérez pas, en fonction des mots-clés fournisseur/produit |
| Découverte des transformations | Découvre les règles de collecte de données (DCR) ciblant l'espace de travail (liste d'abonnements filtrée sur la destination, DCR de transformation de l'espace de travail et associations d'espace de travail), analyse les transformations en ligne et multi-étapes, et étiquette chaque opération (filtre, projection, suppression de colonne, enrichissement, agrégation) |
| Détection des tables scindées | Identifie les tables scindées _SPLT_CL et les relie aux tables parentes dans le moteur de classification |
| Générateur KQL de scission | Génère un KQL de scission prêt pour le portail à partir d'une base de connaissances organisée, d'une analyse des règles en direct et de statistiques communautaires de fréquence de champs — format condition uniquement qui se colle directement dans l'éditeur de règles de scission Sentinel. Les listes de champs sont croisées avec le schéma en direct de la table ; tout élément absent est signalé comme supprimé |
[!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 comprenez toujours ce que vous exécutez avant de l'exécuter 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.
| Ce dont vous avez besoin | Version |
|---|---|
| PowerShell | 7.0+ |
| Modules Az | Az.Accounts |
| Autres modules | PwshSpectreConsole 2.6.3+ |
| Optionnel | Microsoft.Graph.Authentication (pour -IncludeDefenderXDR en tant qu'utilisateur connecté) |
Les points de terminaison suivent l'environnement Azure de la session Connect-AzAccount actuelle, donc les espaces de travail Azure Government et Azure China fonctionnent sans paramètres supplémentaires. Les valeurs du cloud public sont utilisées lorsqu'aucun environnement n'est disponible.
Si vous n'êtes pas déjà connecté à Azure, le module lancera Connect-AzAccount pour vous. Si vous l'êtes, il continuera simplement.
Autorisations : Log Analytics Reader et Microsoft Sentinel Reader sur l'espace de travail couvrent l'analyse. La découverte des transformations nécessite également Microsoft.Insights/dataCollectionRules/read (Monitoring Reader) sur l'abonnement ou le groupe de ressources ; sans cela, l'exécution continue et imprime un avertissement nommant l'autorisation manquante. -IncludeDefenderXDR utilise Microsoft Graph avec CustomDetection.Read.All, ce qui pour un utilisateur connecté signifie le module optionnel Microsoft.Graph.Authentication.
Assez simple :```powershell
Install-Module -Name Az.Accounts -Scope CurrentUser Install-Module -Name PwshSpectreConsole -Scope CurrentUser
git clone https://github.com/lnfernux/log-horizon Import-Module ./log-horizon/LogHorizon.psd1
## 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'
<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 d'autres sorties :
<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 si des tables liées à des fournisseurs spécifiques vous manquent ? Ajoutez 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
Activez l'analyse de la qualité/bruit des règles en fonction des incidents et des règles d'automatisation :```powershell Invoke-LogHorizon -SubscriptionId '...' -ResourceGroup 'rg' -WorkspaceName 'ws' -IncludeDetectionAnalyzer -DetectionLookbackDays 90
### 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/
Vous pouvez désormais mettre à jour la rétention et le type des tables directement depuis le TUI interactif :
Invoke-LogHorizon normalement, puis choisissez Gérer la rétention et le type des tables dans le menu principal pour des mises à jour groupées de rétention ou de type.Pour les scripts ou l'automatisation, utilisez la commande publique dédiée :```powershell
Set-LogHorizonTableRetention -SubscriptionId '...' -ResourceGroupName 'rg' -WorkspaceName 'ws' ` -TableName 'SigninLogs' -TotalRetentionInDays 365 -WhatIf
Set-LogHorizonTableRetention -SubscriptionId '...' -ResourceGroupName 'rg' -WorkspaceName 'ws' ` -TableName 'AzureDiagnostics','VMConnection' -TargetPlan Basic -TotalRetentionInDays 730
Set-LogHorizonTableRetention -SubscriptionId '...' -ResourceGroupName 'rg' -WorkspaceName 'ws' ` -TableName 'SigninLogs' -RetentionInDays -1 -TotalRetentionInDays -1
### 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 transmettre à votre propre logique.
La phase de collecte des données (utilisation, règles, incidents, tables, DCR) est mise en cache par défaut, de sorte qu'une nouvelle exécution sur le même espace de travail — par exemple pour exporter un second format ou rouvrir la TUI — prend quelques secondes au lieu de plusieurs minutes. Le cache se trouve sous $env:LOCALAPPDATA\LogHorizon\cache (remplaçable avec -CachePath), avec un fichier par combinaison d'abonnement, de groupe de ressources, d'espace de travail, de -DaysBack, de -DetectionLookbackDays, de -IncludeDefenderXDR, de -IncludeDetectionAnalyzer, des trois paramètres de prix et de la version du module. Les entrées plus anciennes que -CacheMaxAgeMinutes (60 par défaut) sont ignorées, et chaque enregistrement supprime les entrées expirées afin que le dossier n'accumule pas de fichiers provenant d'autres ensembles de paramètres ou de versions antérieures. Les jetons ne sont jamais écrits dans le cache ; l'authentification s'exécute à chaque appel, de sorte que l'assistant de rétention dispose toujours d'informations d'identification en direct.
Le fichier de cache est un Clixml en texte brut. Avec -IncludeDetectionAnalyzer, il contient les titres, numéros, statuts et classifications des incidents de votre espace de travail ; les propriétaires d'incidents, les auteurs de règles et les identités des propriétaires assignés ne sont pas collectés. Utilisez -NoCache sur les machines partagées ou pointez -CachePath vers un emplacement doté du contrôle d'accès dont vous avez besoin.```powershell
Invoke-LogHorizon -SubscriptionId '...' -ResourceGroup 'rg' -WorkspaceName 'ws' -RefreshCache
Invoke-LogHorizon -SubscriptionId '...' -ResourceGroup 'rg' -WorkspaceName 'ws' -NoCache
Invoke-LogHorizon -SubscriptionId '...' -ResourceGroup 'rg' -WorkspaceName 'ws' -CacheMaxAgeMinutes 1440
### Réglage des journaux et KQL de scission
Le TUI interactif comprend un menu **Réglage des journaux / Transforms** avec des suggestions de réglage en direct (utilisation des champs à partir de vos règles déployées et de vos requêtes de chasse), un KQL de scission basé sur la base de connaissances, et un évaluateur par table. Chaque bloc KQL est uniquement une condition et se colle directement dans l'éditeur de règles de scission Sentinel, avec attribution de la source (base de connaissances, analyse de règles, ou combiné).
### Tarification personnalisée
Les prix par défaut sont ceux de l'Europe de l'Ouest en PAYG simplifié en USD : 5,59 $/Go Analytics, 1,15 $/Go Basic, 0,20 $/Go Data Lake (0,07 ingestion + 0,13 traitement). Chaque table est tarifée selon le plan observé dans la table `Usage`, et le statut gratuit provient de `Usage.IsBillable`. Les volumes utilisent les Go de facturation (1000 Mo). Si votre niveau d'engagement est différent :```powershell
Invoke-LogHorizon -SubscriptionId '...' -ResourceGroup 'rg' -WorkspaceName 'ws' -PricePerGB 4.61 -BasicPricePerGB 1.15 -LakePricePerGB 0.20
| Paramètre | Type | Requis | Défaut | Description |
|---|---|---|---|---|
-SubscriptionId | string | Oui | - | ID d'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 (alias -o) |
-OutputPath | string | Non | - | Chemin de fichier ou de répertoire pour l'exportation. Un répertoire existant ou un séparateur final génère un nom de fichier horodaté ; un nom de fichier sans extension reçoit l'extension du format ; les répertoires manquants sont créés |
-Keywords | string[] | Non | - | Mots-clés pour l'analyse des écarts (p. ex. 'AWS','CrowdStrike', alias -kw) |
-IncludeDefenderXDR | switch | Non | - | Inclure l'analyse des détections personnalisées Defender XDR |
-IncludeDetectionAnalyzer | switch | Non | - | Inclure l'analyse des détections bruyantes par règle à l'aide des incidents et des règles d'automatisation |
-DetectionLookbackDays | int | Non | 90 | Fenêtre de requête pour l'analyse des détections 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 |
Il y a donc quatre phases.
Le module se connecte à Azure et extrait les données des API Log Analytics, Security Insights, Azure Monitor et Microsoft Graph. Chaque appel passe par un wrapper de nouvelle tentative (erreurs 429, 5xx et de transport) et, sauf si -NoCache est défini, les données collectées sont mises en cache localement pour la prochaine exécution.
| Source de données | API | Ce que nous récupérons |
|---|---|---|
| Utilisation des tables | Table Usage (KQL) | Volume d'ingestion, plan et indicateur facturable 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 touchent + balises de corrélation, plus les consommateurs de tables implicites pour les types de règles non KQL |
| Requêtes de chasse | Recherches enregistrées REST Log Analytics | 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 (aperçu) | Recommandations SOC intégrées de Microsoft |
| Rétention des tables | REST Tables Log Analytics | Rétention par table, archive, plan (Analytics/Basic/Auxiliary), indicateurs d'héritage par défaut et colonnes de schéma |
| Règles de collecte de données | REST Azure Monitor | DCR ciblant l'espace de travail (liste d'abonnements, DCR de transformation de l'espace de travail, associations) et leurs transformations |
| Defender XDR | Microsoft Graph | Règles de détection personnalisées XDR (facultatif ; CustomDetection.Read.All délégué ou jeton Az Graph) |
| Incidents | REST Security Insights | Résultats des incidents (statut/classification), chronologie et indices de liaison aux règles pour la notation de la 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 des fermetures automatiques |
| SentinelHealth | KQL Log Analytics | Événements d'exécution des règles d'automatisation avec numéros d'incident pour une attribution définitive des fermetures automatiques (facultatif, nécessite la surveillance de la santé) |
Chaque table est classée en deux passes :
D'abord, une recherche directe dans la base de connaissances de 481 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 mappages de sources de données MITRE, un niveau de tarification et une rétention recommandés, ainsi que des indicateurs de cycle de vie facultatifs (déprécié/ancien avec tables de remplacement, diffusabilité XDR, plateforme).
S'il n'y a pas de correspondance, des règles heuristiques s'appliquent, dans cet ordre :
Alert, Incident, Threat, Signin, Logon, Audit, Risk, Detection (correspondance au début des mots en PascalCase) -> primaireFlow, Metric, Diagnostic, Perf, Heartbeat, Health, Inventory, Usage -> secondaireAAD, Microsoft, Azure, Defender, Purview, Entra, Sentinel, Office, Intune, Windows ...) -> primaire, signalée pour examen et ajout à la base de données*Log/*Logs -> secondaireChaque table est notée sur plusieurs dimensions :
tablesWithRules / 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.Data/implicit-consumers.json les mappe (correspondance Threat Intelligence -> ThreatIntelIndicators/ThreatIntelObjects, Fusion -> SecurityAlert/Anomalies, UEBA -> BehaviorAnalytics/UserPeerAnalytics/IdentityInfo, création d'incidents Microsoft -> SecurityAlert). Les règles activées de ces types comptent dans la couverture effective, et chaque table signale une CoverageSource de kql, xdr, implicit, platform ou none. Les tables de plateforme que Sentinel écrit pour lui-même (SecurityIncident, SentinelHealth, Watchlist, Usage ...) ne sont jamais signalées comme ayant une couverture manquante et reçoivent l'évaluation Platform.Ensuite, le module génère des recommandations (13 types) :
| Type | Quand il se déclenche | Que faire |
|---|---|---|
| Data Lake | Secondaire + coût élevé + peu de détections, et la table prend en charge le plan Auxiliary (repli sur une suggestion de plan Basic lorsque seul Basic est pris en charge) | Déplacer vers le niveau Auxiliary/Data Lake ; les économies correspondent au coût actuel moins le même volume au tarif lake (ou Basic) |
| Faible valeur | Coût élevé + zéro détection | Ajouter des règles, filtrer ou déplacer vers le data lake |
| Optimisation XDR | Diffusé XDR + 0 règle Sentinel + règles XDR existantes | Arrêter la diffusion, utiliser le portail XDR unifié à la place |
| Couverture manquante | Primaire + zéro détection (hors tables de plateforme) | Écrire des règles d'analyse pour tirer de la valeur des données |
| Filtre à 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 pour que les lignes à forte valeur restent sur Analytics et que le reste aille vers Data Lake |
| Utilisation du plan | Les lignes d'utilisation montrent plus d'un plan, ou le plan configuré diffère de ce qu'Usage a observé | Vérifier si la transition de plan était attendue |
| Source dépréciée | Une table marquée comme dépréciée ou ancienne dans la base de données ingère toujours | Migrer les détections vers les tables de remplacement, puis retirer l'ancien connecteur. Informatif : aucune économie n'est revendiquée car l'ingestion se déplace plutôt que de disparaître |
| Rétention insuffisante | Rétention de l'espace de travail ou de la table inférieure à la référence de 90 jours | Augmenter la rétention totale/archive pour respecter les recommandations réglementaires |
| Amélioration de la rétention | Table payante, non plateforme, atteint 90 jours mais reste sous la recommandation de catégorie | Envisager une rétention totale plus longue |
| Sous la référence interactive | Table Analytics avec rétention interactive (à chaud) sous 90 jours | Relever la rétention interactive aux 90 jours inclus dans Sentinel, sauf si la fenêtre chaude courte est délibérée |
Les recommandations sont triées une fois, Élevé > Moyen > Faible puis par économies estimées, et chaque sortie (JSON, Markdown, HTML, TUI) conserve cet ordre.
Lorsque vous passez -IncludeDetectionAnalyzer, le module récupère les incidents et règles d'automatisation récents, puis note chaque règle d'analyse activée pour son potentiel de bruit.
Métriques par règle (calculées à partir des données d'incident) :
| Métrique | Comment elle est calculée |
|---|---|
| Total des incidents | Nombre d'incidents liés à la règle |
| Ratio de fermeture automatique | Incidents fermés par les règles d'automatisation ÷ total des incidents. Source principale : table SentinelHealth (exécutions de règles d'automatisation par règles de fermeture d'incident ou playbook activées, correspondance sur le numéro d'incident). Repli : correspondance des conditions des règles d'automatisation (ID de règle analytique, conditions de titre et de gravité, combinées par ET comme le fait Sentinel). Les règles dont les conditions ne portent que sur le statut/les tactiques/les entités sont traitées comme s'appliquant à chaque incident. |
| Ratio de faux positifs | Incidents classés comme faux positifs ÷ total des incidents |
Formule du score de bruit :
Chaque métrique 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 %)** : nombre d'incidents générés par une règle par rapport aux autres règles.
- **Percentile d'auto-fermeture (40 %)** : fréquence à laquelle les incidents sont automatiquement fermés par les règles d'automatisation (poids le plus élevé, car la fermeture automatisée est le signal le plus fort d'alertes à faible valeur).
- **Percentile de faux positifs (25 %)** : fréquence à laquelle les analystes classent le résultat comme faux positif.
**Seuils de score** :
| Score | Libellé | Signification |
|---|---|---|
| ≥ 70 | Bruyant | La règle nécessite probablement un réglage ou une désactivation |
| ≥ 50 | À surveiller | La règle montre des signes précoces de bruit |
| < 50 | Sain | La règle se situe dans la plage normale |
| N/A | - | La règle n'a aucun incident corrélé, ou moins de 3 règles ont des incidents, donc rien à classer |
Les incidents sont regroupés par identifiant de règle analytique (avec repli sur le nom de la règle, puis le titre), de sorte que deux règles partageant un nom d'affichage sont notées séparément.
Les règles avec un score ≥ 70 et au moins 5 incidents sont automatiquement signalées comme **recommandations haute priorité** dans la vue Recommandations.
### 5. Tableau de bord interactif
Le menu principal propose ces vues :
- **Tableau de bord** : statistiques générales, top 10 des tables les plus coûteuses (les sources obsolètes et héritées portent un badge), barre de couverture, résumé de conformité de rétention, encart d'exclusion de corrélation
- **Voir les recommandations** : actions priorisées avec économies mensuelles estimées, extensibles pour afficher la liste complète lorsqu'il y a plus de 10 éléments
- **Voir l'évaluation de détection** : résumé de la matrice coût-valeur, couverture des règles et requêtes de chasse par table, exploration primaire/secondaire, liste des règles exclues de la corrélation
- **Voir l'analyseur de détection** : classement des règles bruyantes basé sur les percentiles avec indicateurs de qualité de fermeture (lorsque vous avez utilisé `-IncludeDetectionAnalyzer`), navigateur de règles consultable
- **Voir l'optimisation SOC** : suggestions d'amélioration propres à Microsoft avec exploration
- **Voir l'évaluation de rétention** : tables sous les minimums recommandés avec rétention actuelle vs recommandée, type de plan et déficit, plus lignes consultatives XDR
- **Voir les transformations de données** : inventaire des transformations DCR avec classification du type de transformation et KQL complet par table
- **Réglage des journaux / transformations** : suggestions de réglage en direct, KQL fractionné par base de connaissances et évaluateur par table avec changement de rétention/type sur une seule table
- **Voir toutes les tables** : liste complète avec classification, plans, coût, règles, rétention (codée par couleur) et évaluation ; sélectionnez une table pour un panneau de détails (sources de couverture, prise en charge du plan, rétention, statut, ses recommandations)
- **Gérer la rétention et le type des tables** : assistant de rétention et de plan en masse avec aperçu et application
- **Dictionnaire** : chaque terme utilisé par l'outil (classification, niveaux de coût et de détection, évaluations, sources de couverture, les 13 types de recommandations, métriques et libellés de score de l'analyseur de détection, plans de tables, statut de cycle de vie, états XDR, types de transformations) avec les mêmes définitions que ce README, servi depuis `Data/dictionary.json`
- **Exporter le rapport** : choisissez un format, puis un chemin (répertoire pour un fichier horodaté, ou un nom de fichier ; Entrée conserve le répertoire actuel) et écrivez du JSON, du Markdown ou du HTML directement depuis le menu
- **Analyse XDR** apparaît sur le tableau de bord lorsque vous avez utilisé `-IncludeDefenderXDR`
---
## La base de données de classification
Située dans `Data/log-classifications.json`. **481 entrées**, **243 connecteurs**, **22 catégories**.
### Contenu de chaque entrée
| Champ | Ce qu'il contient |
|---|---|
| `tableName` | Nom de la table Log Analytics (`SecurityEvent`, `SigninLogs`, etc.) |
| `connector` | Quel connecteur de données produit cette table |
| `classification` | `primary` (valeur de sécurité) ou `secondary` (télémétrie de support) |
| `category` | Catégorie de sécurité : Identity & Access, Network Security, etc. |
| `description` | Résumé en langage clair du contenu de la table |
| `keywords` | Termes pour la correspondance d'analyse des lacunes par mots-clés |
| `mitreSources` | Correspondances des sources de données MITRE ATT&CK |
| `recommendedTier` | `analytics` (niveau chaud) ou `datalake` (candidat auxiliaire) |
| `recommendedRetentionDays` | Rétention totale minimale recommandée en jours (directives réglementaires) |
| `isFree` | Indique si Microsoft ingère cette table gratuitement (l'exécution utilise `Usage.IsBillable` en premier) |
| `status` | Optionnel. `deprecated` (connecteur retiré ou ingestion arrêtée) ou `legacy` (ancien chemin de collecte avec un successeur documenté) |
| `replacedBy` | Optionnel. Noms des tables vers lesquelles migrer ; présent chaque fois que `status` est défini (peut être vide) |
| `xdrStreamable` | Optionnel, tables Defender uniquement. `true` pour les 21 tables diffusées par le connecteur Defender XDR ; `false` pour les tables exclusivement portail et TVM |
| `platform` | Optionnel. `true` pour les tables que Sentinel lui-même consomme (`SecurityIncident`, `Usage`, `Watchlist`, ...) qui n'ont jamais besoin de règles analytiques |
Les tables avec un `status` affichent un badge dans la TUI et les rapports, et toute table qui ingère encore génère une recommandation `DeprecatedSource` nommant le remplacement. Les tables avec `xdrStreamable: false` ne sont jamais traitées comme candidates à la diffusion XDR par le vérificateur XDR.
### Données de sécurité primaires vs secondaires
**Primaires** (278 entrées) : les tables sur lesquelles vous construisez réellement vos 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** (203 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
| Catégorie | Nombre | Exemples |
|---|---|---|
| Identity & Access | 51 | `SigninLogs`, `MicrosoftServicePrincipalSignInLogs`, `OktaSSO` |
| Network Security | 49 | `AZFWNetworkRule`, `NSPAccessLogs`, `DarktraceModelAlerts_CL` |
| Cloud Control Plane | 37 | `AzureActivity`, `AZKVAuditLogs`, `GoogleWorkspaceReports` |
| Network Flow | 36 | `NTANetAnalytics`, `CommonSecurityLog`, `AZFWFatFlow` |
| Endpoint Detection | 33 | `DeviceProcessEvents`, `CrowdStrikeAuditEvents`, `SentinelOneAlertsV2_CL` |
| Application Logs | 32 | `AppServiceHTTPLogs`, `AppServiceAuditLogs`, `DynatraceAttacksV2_CL` |
| Email Security | 29 | `EmailEvents`, `CampaignInfo`, `Ttp_Url_CL` |
| Security Alerts | 29 | `SecurityAlert`, `SentinelBehaviorInfo`, `DisruptionAndResponseEvents` |
| Vulnerability Mgmt | 23 | `DeviceTvmSoftwareVulnerabilities`, `Rapid7InsightVMCloudVulnerabilities` |
| Cloud Security | 20 | `EnrichedMicrosoft365AuditLogs`, `OAuthAppInfo`, `PowerAppsActivity` |
| Endpoint Telemetry | 18 | `DeviceInfo`, `Windows365NetworkLogs`, `SentinelOneAgents_CL` |
| Posture Management | 17 | `ExposureGraphNodes`, `SecurityNestedRecommendation`, `ZTSMetadata` |
| Data Security | 16 | `PurviewDataSensitivityLogs`, `DataSecurityEvents`, `PowerPlatformDlpActivity` |
| Data Platform | 16 | `SQLSecurityAuditEvents`, `CDBControlPlaneRequests`, `SnowflakeLogin_CL` |
| Platform Health | 14 | `SentinelHealth`, `Usage`, `SecurityCaseEvent` |
| Container & K8s | 13 | `AKSAudit`, `CloudProcessEvents`, `GKEAudit` |
| Infrastructure Diag | 13 | `AzureMetrics`, `AGWPerformanceLogs`, `ContainerAppSystemLogs` |
| Threat Intelligence | 10 | `ThreatIntelIndicators`, `ThreatIntelObjects`, `CybleVisionAlerts_CL` |
| Configuration Mgmt | 8 | `ConfigurationData`, `AVNMRuleCollectionChange` |
| SAP Security | 7 | `ABAPAuditLog`, `SAPBTPAuditLog_CL`, `Onapsis_Defend_CL` |
| Storage Access | 6 | `StorageBlobLogs`, `CloudStorageAggregatedEvents`, `AWSS3ServerAccess` |
| IoT/OT Security | 4 | `RadiflowEvent`, `DragosAlerts_CL`, `Phosphorus_CL` |
### Prise en charge des plans de tables
`Data/basic-plan-tables.json` et `Data/auxiliary-plan-tables.json` listent les tables intégrées que la [matrice des fonctionnalités des tables Azure Monitor](https://learn.microsoft.com/en-us/azure/azure-monitor/reference/tables-features) marque comme prenant en charge les plans Basic et Auxiliary (Data Lake). L'assistant de rétention utilise la liste Basic pour valider les changements de plan, et la recommandation `DataLake` ne propose le niveau lake que pour les tables qui le prennent en charge, avec repli sur une suggestion de plan Basic là où c'est le niveau le plus bas pris en charge. Les tables personnalisées basées sur DCR prennent en charge les deux plans ; les tables personnalisées Classic ne prennent en charge aucun. Les deux fichiers sont régénérés à partir de cette matrice à chaque version.
### Classifications personnalisées
Vous pouvez fournir votre propre fichier de classification pour **ajouter** des entrées pour des tables absentes de la base intégrée, ou **surcharger** des entrées existantes lorsque les valeurs par défaut ne correspondent pas à votre environnement. Les entrées personnalisées priment 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'
The custom file uses the same schema as Data/log-classifications.json, an array of objects:```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 alimentant les connecteurs de données et les définitions de tables de Microsoft dans une IA avec une base de notation humaine, en utilisant les bonnes pratiques Microsoft et les normes du secteur comme critères de classification. Si quelque chose semble incohérent pour votre environnement, faites confiance à votre propre contexte plutôt qu'à l'outil — l'IA peut faire des erreurs, et le contexte est roi.
Les critères de classification ont été tirés des sources suivantes :
**ACSC (Australian Signals Directorate, Australian Cyber Security Centre)**
- [ACSC : Bonnes pratiques pour la journalisation des événements et la détection des menaces (août 2024)](https://www.cyber.gov.au/sites/default/files/2024-08/best-practices-for-event-logging-and-threat-detection.pdf)
- [ACSC : Journaux prioritaires pour l'ingestion SIEM — Guide du praticien (mai 2025)](https://www.cyber.gov.au/business-government/detecting-responding-to-threats/event-logging/implementing-siem-soar-platforms/priority-logs-for-siem-ingestion-practitioner-guidance)
**CISA (Cybersecurity and Infrastructure Security Agency)**
- [CISA : Orientations 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](https://www.cisa.gov/sites/default/files/2023-02/TLP%20CLEAR%20-%20Guidance%20for%20Implementing%20M-21-31_Improving%20the%20Federal%20Governments%20Investigative%20and%20Remediation%20Capabilities_.pdf)
- [CISA : Playbook de mise en œuvre des journaux cloud étendus Microsoft (2025)](https://www.cisa.gov/sites/default/files/2025-01/microsoft-expanded-cloud-logs-implementation-playbook-508c.pdf)
**Microsoft**
- [Référence des connecteurs de données Microsoft Sentinel](https://learn.microsoft.com/en-us/azure/sentinel/data-connectors-reference)
- [Référence des tables et connecteurs Microsoft Sentinel](https://learn.microsoft.com/en-us/azure/sentinel/sentinel-tables-connectors-reference)
- [Dépôt GitHub Azure-Sentinel](https://github.com/Azure/Azure-Sentinel) (règles d'analyse communautaires, définitions de connecteurs, modèles de solutions)
- [Facturation Microsoft Sentinel](https://learn.microsoft.com/azure/sentinel/billing)
- [Gestion des niveaux de données Microsoft Sentinel](https://learn.microsoft.com/azure/sentinel/manage-data-overview)
**MITRE**
- [Sources de données MITRE ATT&CK](https://attack.mitre.org/datasources/)
**NIST (National Institute of Standards and Technology)**
- [NIST SP 800-92 : Guide de gestion des journaux de sécurité informatique](https://csrc.nist.gov/pubs/sp/800/92/final)
**NSA (National Security Agency)**
- Orientations NSA sur le transfert d'événements cybernétiques
**NCSC-UK (National Cyber Security Centre - Royaume-Uni)**
- « Qu'est-ce que nous devrions exactement journaliser ? » du NCSC-UK
**Google Cloud**
- [Vue d'ensemble des journaux d'audit Google Cloud](https://docs.cloud.google.com/logging/docs/audit)
- [Bonnes pratiques pour les journaux d'audit Google Cloud](https://docs.cloud.google.com/logging/docs/audit/best-practices)
D'autres sources ont également été utilisées, ainsi que « l'expertise » des auteurs, si l'on peut qualifier cela ainsi.
---
## Structure du projet```
LogHorizon.psd1 Module manifest (v0.9.0)
LogHorizon.psm1 Module loader
Public/
Invoke-LogHorizon.ps1 Entry point, the main orchestrator
Set-LogHorizonTableRetention.ps1 Scriptable table retention and plan changes
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
Get-CollectionCache.ps1 Collection cache (key, path, read, write)
Get-LogHorizonEndpoint.ps1 ARM / Log Analytics / Graph endpoints for the signed-in Azure environment
Get-LogHorizonDictionary.ps1 Loads the term dictionary shown by the Dictionary menu
Invoke-AzRestWithRetry.ps1 REST wrapper: retry on 429/5xx/transport errors, async operation polling
Invoke-Classification.ps1 Static DB + heuristic classification + _SPLT_CL detection + custom file validation
Invoke-Analysis.ps1 Cost-value matrix + recommendations + Detection Analyzer + XDR Checker + split suggestions
Set-TableRetention.ps1 Retention change set, preview, Tables API apply engine, plan support lookups
Write-Report.ps1 Spectre.Console TUI rendering
Export-Report.ps1 JSON / Markdown / static HTML export with shared section renderer
Data/
log-classifications.json 481-entry classification knowledge base
basic-plan-tables.json Built-in tables that support the Basic plan (from the Azure Monitor feature matrix)
auxiliary-plan-tables.json Built-in tables that support the Auxiliary / Data Lake plan
implicit-consumers.json Non-KQL rule kinds to tables, plus platform tables
dictionary.json Term definitions for the Dictionary menu (kept 1:1 with this README, enforced by tests)
high-value-fields.json Split KQL knowledge base: 165 tables with curated fields and split hints
field-frequency-stats.json Community field frequency stats mined from the Azure-Sentinel rule corpus
custom-classifications-example.json Example custom classification override file
ReportTemplate.html Static HTML report template (pure-CSS tabs, zero JS, CSP meta)
Tests/
LogHorizon.Tests.ps1 437 Pester v5 unit tests
Les bases de connaissances KQL fractionnées, high-value-fields.json et field-frequency-stats.json, sont construites hors ligne à partir du dépôt public Azure/Azure-Sentinel (Solutions/, Detections/, Hunting Queries/, environ 3 800 fichiers de règles YAML). Chaque requête est exécutée via les mêmes Get-TablesFromKql et Get-FieldsFromKql que le module utilise à l'exécution pour construire des comptages de fréquence de champs par table, à partir desquels trois niveaux de champs de repli sont dérivés :
TimeGenerated)Les champs extraits sont fusionnés dans le fichier organisé high-value-fields.json (les entrées organisées sont conservées, les tables nouvellement découvertes avec au moins 3 règles et 3 champs significatifs sont ajoutées).
À l'exécution, Get-SplitKql utilise une hiérarchie de repli : entrée organisée de la base de connaissances -> analyse des champs des règles/requêtes de chasse en direct -> statistiques communautaires par table -> valeurs par défaut de catégorie -> champs universels. La fréquence des champs n'est pas une méthode parfaite, mais elle est utile à connaître.
437 tests Pester v5, aucune connectivité Azure requise. Exécutez-les depuis une session PowerShell standard plutôt que depuis le terminal intégré de VS Code :```powershell Invoke-Pester ./Tests/LogHorizon.Tests.ps1 -Output Detailed
## Licence
GPL-3.0. Voir [LICENSE](https://github.com/lnfernux/log-horizon/blob/main/LICENSE).
## Historique des versions
| Version | Date | Modifications |
|---|---|---|
| 0.9.0 | 2026-09-06 | Version de remédiation issue d’une revue complète du code et des données. Exactitude : tarification tenant compte du plan à partir de `Usage.Plan` et `Usage.IsBillable` avec les tarifs Basic et Data Lake et le Go facturable (1000 Mo), attribution de fermeture automatique du Detection Analyzer limitée aux règles de fermeture/playbook activées (`triggeringLogic.isEnabled`), incidents via `2025-09-01` avec `$top=1000`, couverture implicite pour les types de règles non-KQL et les tables de plateforme (`implicit-consumers.json`), vérification de base de la rétention interactive, tri unique des recommandations. Transformations : découverte DCR au niveau de l’abonnement filtrée sur l’espace de travail de destination plus le DCR de transformation de l’espace de travail et les associations, avec un statut visible et un avertissement lorsqu’une permission manque ; analyse des transformations d’espace de travail et multi-étapes ; KQL fractionné croisé avec le schéma de table en direct. Robustesse : cache de collecte activé par défaut (`-NoCache`, `-RefreshCache`, `-CacheMaxAgeMinutes`, `-CachePath`), authentification avant le spinner avec avertissements imprimés ensuite, sortie TUI et Markdown échappée, résolution du chemin d’export qui crée les répertoires et renvoie le chemin écrit, méta CSP dans le HTML, nouvelles tentatives REST sur erreurs de transport et achèvement asynchrone de type Location, résolution de l’espace de travail via REST (`Az.Resources` supprimé), validation de classification personnalisée, heuristiques sensibles à la casse Pascal avec repli Microsoft propriétaire, délais d’expiration des regex. Les points de terminaison suivent l’environnement Azure connecté (Government, China) et les versions d’API déplacées vers SecurityInsights `2025-09-01`, OperationalInsights `2025-07-01`, recommandations `2025-10-01-preview`. Données : base de classification 345 -> 481 entrées avec clés `status`/`replacedBy`/`xdrStreamable`/`platform`, plus de 80 tables propriétaires et 35 tables successeurs, corrections d’étiquettes de connecteurs, corrections `isFree` ; `basic-plan-tables.json` régénéré et nouveau `auxiliary-plan-tables.json` à partir de la matrice des fonctionnalités des tables Azure Monitor ; recommandation `DeprecatedSource`, recommandation Data Lake tenant compte du plan avec repli Basic, XDR Checker honore la streamabilité, badges de cycle de vie dans la TUI et les exports. Passe de revue : la clé de cache couvre la tarification et la version du module, les booléens et niveaux de classification personnalisés analysés plutôt que convertis, attribution de fermeture automatique sensible à la gravité, prédicats KQL fractionnés vérifiés contre le schéma en direct, statut de récupération XDR affiché au lieu d’un `$null` silencieux, chemins de sortie sans extension traités comme fichiers, identités des propriétaires d’incidents non collectées. Menu dictionnaire dans la TUI avec chaque terme utilisé par l’outil, adossé à `Data/dictionary.json` et épinglé au code par des tests. Les objets d’automatisation et de détection personnalisée Defender sont projetés sur les champs consommés, de sorte que les identités d’auteurs (createdBy, lastModifiedBy, propriétaires assignés) n’atteignent jamais le cache ni les exports. Licence GPL-3.0. 437 tests |
| 0.8.0 | 2026-05-26 | Ajout 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, plus la commande publique `Set-LogHorizonTableRetention`. Ajout du moteur d’application PATCH de l’API Tables avec validation, interrogation asynchrone Azure et repli en deux étapes (PATCH combiné, puis plan seul plus rétention seule) pour des mises à jour de rétention résilientes. Ajout d’une couverture Pester ciblée pour la validation, la forme des charges utiles, le repli et le mappage des commandes publiques. Corrige également un cas limite/bogue où les utilisateurs recevaient des recommandations de passer des tables data lake au niveau data lake s’ils avaient encore des données d’analytique dans Sentinel |
| 0.7.1 | 2026-05-15 | Ajout de la prise en compte 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 l’utilisation multi-plans et les écarts configuré-vs-observé, et affiche les données de plan dans le tableau de bord, l’exploration des tables, View All Tables, l’évaluation de la rétention et les exports. Correction de l’attribution de fermeture automatique du Detection Analyzer afin que l’heuristique de synchronisation ne s’applique que lorsqu’aucune règle d’automatisation activée n’existe. 203 tests réussis |
| 0.7.0 | 2026-04-16 | Mise à jour de l’évaluation de détection avec tableau récapitulatif de la matrice coût-valeur (catégories d’évaluation Primaire/Secondaire x7 avec code couleur), sous-menu d’exploration pour les tables primaires/secondaires avec colonnes de niveau coût/détection. Mise à jour du Detection Analyzer avec barres de couverture de volume pondérées en Go (Go de détection/chasse/combiné en pourcentage de l’ingestion totale aux côtés des barres existantes de nombre de tables). Améliorations d’affichage adaptatif pour le Detection Analyzer (largeur de barre dynamique, troncature des noms de règles, masquage conditionnel de colonnes selon la largeur de la console). 193 tests réussis |
| 0.6.3 | 2026-04-11 | Mise à jour mineure pour PSGallery |
| 0.6.2 | 2026-04-11 | Menu Log Tuning / Transforms : analyse d’ajustement 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 filter/project/combiné, estimations d’économies), extraction des colonnes de schéma depuis l’API Tables, hiérarchie de repli `Get-SplitKql` (statistiques communautaires → défauts de catégorie → champs universels), évaluateur de tables complet avec matrice d’utilisation des champs, sections d’export d’ajustement unifiées KB + en direct, script d’extraction `Build-FieldKnowledgeBase.ps1` pour le corpus de règles GitHub Azure-Sentinel. Detection Analyzer : attribution de fermeture automatique basée sur SentinelHealth (principale) avec repli de correspondance de règles sensible aux opérateurs, analyse des wrappers de conditions booléennes, détection du statut Resolved, correspondance de fin de GUID pour les ID de ressources ARM. La couverture est désormais basée sur le nombre de tables sur toutes les tables (y compris le niveau gratuit). Avertissement de notation ajouté à la TUI et aux exports. 174 tests |
| 0.6.1 | 2026-04-10 | Corrections de bogues : le filtrage `$kqlKeywords` est désormais partagé au niveau du fichier (était indéfini dans `Get-TablesFromKql`), `[CmdletBinding()]` ajouté à toutes les fonctions d’aide, vérification unifiée Defender simplifiée, 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 DB, prérequis alignés sur le manifeste |
| 0.6.0 | 2026-04-10 | Détection dynamique de streaming XDR avec 21 `KnownXDRTables` (était codé en dur à 18), `XDRState` par table (`NotStreaming`/`Analytics`/`Basic`/`Auxiliary`), Auxiliary reconnu comme niveau data lake, tables XDR non streamées signalées comme recommandations Information/Low avec `NotStreamedCount`, l’analyseur de rétention affiche les tables XDR non streamées comme « XDR only (30d) », répartition des niveaux en vue d’ensemble (analytics/basic/data lake + non streamé), étiquettes Export-Report Auxiliary→« data lake », base de classification mise à jour à 345 entrées (+`DeviceNetworkInfo`, `DeviceInfo`→secondaire/datalake, `DeviceImageLoadEvents` et `IdentityQueryEvents`→niveau datalake), 15 nouveaux tests Pester (121 au total) |
| 0.5.0 | 2026-04-03 | Export HTML statique avec onglets CSS pur (zéro JS, aucun CDN, entièrement autonome), moteur de rendu de sections MD/HTML unifié, capture complète des données JSON (dataTransforms, correlationExcluded/Included, streamingTables), commutateur `-NonInteractive` pour usage CI/pipeline, alias de format `md`, noms de fichiers automatiques horodatés, affichage KQL complet dans les transformations DCR (sans troncature), gestion KQL multiligne dans les tableaux Markdown, correction de la corruption de backreference regex `$` dans le remplacement de jetons HTML, renommage des fonctions internes pour éviter les conflits d’alias PowerShell (`h`→`hEnc`, `md`→`mdEsc`), 33 nouveaux tests Pester (106 au total) |
| 0.4.1 | 2026-04-03 | Correctifs 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 et résolution des avertissements PSScriptAnalyzer |
| 0.4.0 | 2026-04-02 | Découverte des transformations (liste DCR + classification des types de transformation), détection des tables fractionnées (`_SPLT_CL`), helper KQL fractionné avec base de connaissances de 15 tables (`high-value-fields.json`) + repli d’analyse de règles, sortie KQL prête pour le portail avec conditions uniquement, liste de recommandations extensible, menu TUI de suggestions KQL fractionnées |
| 0.3.0 | 2026-04-02 | Analyse 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 de menu d’évaluation de la rétention, colonne de rétention dans All Tables, `recommendedRetentionDays` dans le schéma de classification |
| 0.2.2 | 2026-04-02 | La table d’optimisation SOC masque la colonne Detail sur les consoles étroites |
| 0.2.1 | 2026-04-02 | Prise en charge de la classification personnalisée (`-CustomClassificationPath`), recommandations d’optimisation SOC enrichies avec suggestions API/exploration, vue par défaut actifs uniquement, suppression de l’avertissement d’encodage UTF-8 |
| 0.2.0 | - | Première version publique avec moteur de classification, notation coût-valeur, TUI Spectre.Console, export vers JSON/Markdown |
| 0.1.0 | - | Version interne pour le développement |
## Problèmes connus
### Avertissement d’encodage UTF-8 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()
Le module définit cela automatiquement à l'importation, mais selon votre session, l'avertissement peut toujours apparaître. C'est purement cosmétique et n'affecte pas le fonctionnement.
Si vous rencontrez des problèmes ou souhaitez contribuer, créez une PR.
| Detection Analyzer | Note les règles d'analytique pour leur potentiel de bruit en utilisant les résultats d'incidents (ratio d'auto-fermeture, ratio de faux positifs et percentiles de volume d'incidents) |
| XDR Checker | Ajoute une couche de conseil axée XDR : vérifications de couverture de streaming et recommandations de rétention Data Lake sur un an pour la télémétrie liée au XDR |
| Classifications personnalisées | Fournissez votre propre JSON pour ajouter ou remplacer la base de données de classification intégrée |
| Cache de collecte | Les données collectées de l'espace de travail sont mises en cache localement (60 minutes par défaut) afin que les ré-exécutions et ré-exports prennent quelques secondes ; désactivez avec -NoCache |
| Clouds souverains | Les points de terminaison ARM, Log Analytics et Graph suivent l'environnement Azure connecté (public, US Government, China) |
| TUI interactif | Tableau de bord Spectre.Console avec menus, tables codées par couleur, explorations en profondeur, assistant de rétention et art ASCII |
| Export | Rapport JSON, Markdown ou HTML statique pour le partage avec l'équipe |
| 5.59 |
Prix d'ingestion par Go du niveau Sentinel Analytics (alias -ppgb) |
-BasicPricePerGB | decimal | Non | 1.15 | Prix par Go des journaux Basic |
-LakePricePerGB | decimal | Non | 0.20 | Prix par Go du niveau Auxiliaire / Data Lake (ingestion + traitement) |
-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 (alias -clf) |
-NoCache | switch | Non | - | Ne pas lire ni écrire le cache de collecte |
-RefreshCache | switch | Non | - | Collecter des données fraîches et écraser l'entrée du cache |
-CacheMaxAgeMinutes | int | Non | 60 | Âge maximal d'une entrée de cache à réutiliser (1-10080) |
-CachePath | string | Non | $env:LOCALAPPDATA\LogHorizon\cache | Répertoire pour les fichiers de cache |
| Table Defender XDR connue non diffusée, diffusée sans couverture, non transférée vers Data Lake, ou sous l'avis d'un an |
| Examiner la diffusion et la rétention de la télémétrie XDR |
| Analyseur de détections | Scores de règle >= 70 avec au moins 5 incidents (avec -IncludeDetectionAnalyzer) | Régler ou désactiver la règle bruyante |