
log-horizon v0.9.0
Microsoft Sentinel SIEM Logquellen-Analyzer
Microsoft Sentinel SIEM Log Source Analyzer
Ich musste die Frage "Was bekommen wir eigentlich aus diesen Logs heraus?" oder "Was sind die empfohlenen Logs für Microsoft Sentinel?" öfter beantworten, als ich zählen kann. Die Antwort hängt immer von so vielen Dingen ab, aber wir können generisch sein. Also habe ich dieses Ding hier gebaut.
Log Horizon verbindet sich mit Ihrem Microsoft Sentinel-Arbeitsbereich (und optional Defender XDR), geht jede Log-Tabelle durch, die Sie erfassen, und sagt Ihnen, ob Sie daraus einen Sicherheitswert ziehen oder nur Geld verbrennen. Es klassifiziert Tabellen, bewertet sie gegen Ihre Erkennungsregeln und gibt Ihnen konkrete Empfehlungen mit Kosteneinsparungsschätzungen.
Wichtig: Dies ist ein generischer Ansatz. Wenn Sie wissen, dass eine Log-Quelle für Ihre Umgebung wichtig ist, hat dieser Kontext immer Vorrang vor dem, was dieses Tool Ihnen sagt. Die Klassifizierungen sind ein Ausgangspunkt, kein Evangelium.
Möchten Sie mehr lesen? Ich habe einige Beiträge über Log Horizon auf meinem Blog:
- Tool Release: Log Horizon
- Update: Log Horizon v0.5.0
- Building a practical log baseline and how Log Horizon helps you do that
- How to use Log Horizon
Funktionen
| Funktion | Beschreibung |
|---|---|
| Klassifizierungs-Engine | Wissensdatenbank mit 481 Einträgen, die 240+ Connectors und 22 Kategorien abdeckt, mit Lebenszyklusstatus (veraltet/legacy plus Ersatztabellen) und automatischem heuristischem Fallback für unbekannte Tabellen |
| Kosten-Wert-Bewertung | Matrix aus Kostenstufe pro Tabelle vs. Erkennungsstufe mit kombinierter Bewertung (Hoher Wert bis Niedriger Wert), bepreist pro beobachtetem Plan (Analytics, Basic, Data Lake) |
| Empfehlungen | 13 priorisierte Aktionstypen: Data-Lake- oder Basic-Kandidaten, Tabellen ohne Erkennung, XDR-Streaming-Verschwendung, Filterung bei der Erfassung, Split-Kandidaten, Plannutzung, veraltete Quellen, Aufbewahrungsdefizite, XDR-Checker- und Detection-Analyzer-Ergebnisse, jeweils mit Kosteneinsparungsschätzungen |
| Erkennungszuordnung | Ordnet Analyse-Regeln, Hunting-Abfragen und XDR-Erkennungen jeder Tabelle zu, um Abdeckungslücken zu erkennen |
| Korrelations-Tags | Erkennt #DONT_CORR# / #INC_CORR#-Tags in Regelbeschreibungen und kennzeichnet Regeln, die von der Defender-Korrelation ausgeschlossen sind |
| Aufbewahrungskonformität | Vergleicht die tatsächliche Aufbewahrung mit empfohlenen Mindestwerten basierend auf Industriestandards und Sicherheits-Best-Practices |
| SOC-Optimierung | Ruft Microsofts eigene SOC-Verbesserungsempfehlungen aus der Security Insights API ab |
| Keyword-Lückenanalyse | Kennzeichnet Tabellen, die Sie erfassen sollten, es aber nicht tun, basierend auf Anbieter-/Produkt-Keywords |
| Transform-Erkennung | Entdeckt Data Collection Rules (DCRs), die auf den Arbeitsbereich abzielen (Abonnementliste gefiltert nach Ziel, der Arbeitsbereichs-Transformations-DCR und Arbeitsbereichs-Zuordnungen), parst Inline- und mehrstufige Transforms und beschriftet jede Operation (Filter, Projektion, Spaltenentfernung, Anreicherung, Aggregation) |
| Split-Tabellen-Erkennung | Identifiziert _SPLT_CL-Split-Tabellen und verknüpft sie zurück zu den übergeordneten Tabellen in der Klassifizierungs-Engine |
| Split-KQL-Generator | Generiert portalbereites Split-KQL aus einer kuratierten Wissensdatenbank, Live-Regelanalyse und Community-Feldhäufigkeitsstatistiken -- Nur-Bedingungs-Format, das direkt in den Sentinel-Split-Regeleditor eingefügt werden kann. Feldlisten werden mit dem Live-Schema der Tabelle abgeglichen; alles, was nicht vorhanden ist, wird als verworfen gemeldet |
| Detection Analyzer | Bewertet Analyse-Regeln auf potenzielle Lautstärke anhand von Incident-Ergebnissen (Auto-Close-Verhältnis, False-Positive-Verhältnis und Incident-Volumen-Perzentile) |
| XDR-Checker | Fügt eine XDR-fokussierte Beratungsebene hinzu: Streaming-Abdeckungsprüfungen und einjährige Data-Lake-Aufbewahrungsempfehlungen für XDR-bezogene Telemetrie |
| Benutzerdefinierte Klassifizierungen | Stellen Sie Ihr eigenes JSON bereit, um die integrierte Klassifizierungsdatenbank zu ergänzen oder zu überschreiben |
| Sammlungs-Cache | Gesammelte Arbeitsbereichsdaten werden lokal zwischengespeichert (Standard 60 Minuten), sodass erneute Ausführungen und Re-Exports Sekunden dauern; mit -NoCache deaktivierbar |
| Sovereign Clouds | ARM-, Log-Analytics- und Graph-Endpunkte folgen der angemeldeten Azure-Umgebung (Public, US Government, China) |
| Interaktive TUI | Spectre.Console-Dashboard mit Menüs, farbcodierten Tabellen, Drill-Downs, Aufbewahrungsassistent und ASCII-Art |
| Export | JSON-, Markdown- oder statischer HTML-Bericht zum Teilen mit dem Team |
Haftungsausschluss
[!CAUTION] Haftungsausschluss
Dieses Tool wird mit Hilfe von KI entwickelt und gepflegt. Bitte seien Sie vorsichtig bei der Verwendung dieser Lösung und verstehen Sie immer, was Sie ausführen, bevor Sie es in der Produktion ausführen. Der Entwickler übernimmt keine Haftung für Schwachstellen oder Probleme.
Durch das Herunterladen, Installieren oder Verwenden dieses Tools bestätigen Sie, dass Sie diese Bedingungen gelesen, verstanden und ihnen zugestimmt haben.
Voraussetzungen
| Was Sie benötigen | Version |
|---|---|
| PowerShell | 7.0+ |
| Az-Module | Az.Accounts |
| Andere Module | PwshSpectreConsole 2.6.3+ |
| Optional | Microsoft.Graph.Authentication (für -IncludeDefenderXDR als angemeldeter Benutzer) |
Endpunkte folgen der Azure-Umgebung der aktuellen Connect-AzAccount-Sitzung, sodass Azure-Government- und Azure-China-Arbeitsbereiche ohne zusätzliche Parameter funktionieren. Die Public-Cloud-Werte werden verwendet, wenn keine Umgebung verfügbar ist.
Wenn Sie noch nicht bei Azure angemeldet sind, startet das Modul Connect-AzAccount für Sie. Wenn Sie angemeldet sind, macht es einfach weiter.
Berechtigungen: Log Analytics Reader und Microsoft Sentinel Reader auf dem Arbeitsbereich decken die Analyse ab. Die Transform-Erkennung benötigt außerdem Microsoft.Insights/dataCollectionRules/read (Monitoring Reader) auf dem Abonnement oder der Ressourcengruppe; ohne diese wird die Ausführung fortgesetzt und eine Warnung mit der fehlenden Berechtigung ausgegeben. -IncludeDefenderXDR verwendet Microsoft Graph mit CustomDetection.Read.All, was für einen angemeldeten Benutzer das optionale Modul Microsoft.Graph.Authentication bedeutet.
Erste Schritte
Ziemlich einfach:```powershell
Grab the dependencies
Install-Module -Name Az.Accounts -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
## Verwendung
### Die Grundlagen
Beginnen Sie damit, eine Verbindung zu Azure herzustellen und stellen Sie sicher, dass Sie das richtige Konto und Abonnement auswählen:```powershell
Connect-AzAccount
Dann können wir das Tool aufrufen:```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" />
Außerdem gibt es ein Menü, um tiefer in andere Ausgaben einzusteigen:
<img width="395" height="223" alt="{83CE9E6E-F373-49CD-BE05-182DB69F36BE}" src="https://assets.kitploit.com/production/public/readmes/13110/0606a575b10640bd13ebb87b930f74b2438167b5578cb843b412b4fcf273fc26.png" />
### Keyword-Lücken + Defender XDR
Möchtest du wissen, ob dir Tabellen zu bestimmten Anbietern fehlen? Gib ein paar Keywords ein. Füge `-IncludeDefenderXDR` hinzu, wenn du auch die XDR-Analyse möchtest.```powershell
Invoke-LogHorizon -SubscriptionId '...' -ResourceGroup 'rg' -WorkspaceName 'ws' -Keywords 'CrowdStrike','AWS','Okta' -IncludeDefenderXDR
Detection Analyzer
Aktivieren Sie die Regelqualitäts-/Rausch-Analyse basierend auf Vorfällen und Automatisierungsregeln:```powershell Invoke-LogHorizon -SubscriptionId '...' -ResourceGroup 'rg' -WorkspaceName 'ws' -IncludeDetectionAnalyzer -DetectionLookbackDays 90
### Einen Bericht exportieren```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/
Tabellenaufbewahrung und -typ verwalten
Sie können die Tabellenaufbewahrung und den Tabellentyp jetzt direkt über die interaktive TUI aktualisieren:
- Öffnen Sie
Invoke-LogHorizonnormal und wählen Sie dann Tabellenaufbewahrung und -typ verwalten aus dem Hauptmenü für Massenaktualisierungen von Aufbewahrung oder Typ. - Öffnen Sie Log Tuning / Transforms > Bestimmte Tabelle auswerten und wählen Sie Aufbewahrung/Typ für diese Tabelle verwalten für eine Änderung an einer einzelnen Tabelle.
Für Skripterstellung oder Automatisierung verwenden Sie den dedizierten öffentlichen Befehl:```powershell
Preview a single-table change (prints a Table / Plan / Interactive / Total / Status / Reason table, applies nothing)
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
### Nicht-interaktiver / CI-Modus
Überspringen Sie die interaktive TUI und exportieren Sie direkt in eine Datei – nützlich für Pipelines oder geplante Ausführungen:```powershell
Invoke-LogHorizon -SubscriptionId '...' -ResourceGroup 'rg' -WorkspaceName 'ws' -NonInteractive -Output json -OutputPath ./reports/
Wenn Sie -Output weglassen, wird das Analyseobjekt an die Pipeline zurückgegeben, sodass Sie es in Ihre eigene Logik weiterleiten können.
Sammlungs-Cache
Die Datenerfassungsphase (Nutzung, Regeln, Vorfälle, Tabellen, DCRs) ist standardmäßig zwischengespeichert, sodass eine erneute Ausführung gegen denselben Arbeitsbereich – beispielsweise zum Exportieren eines zweiten Formats oder zum erneuten Öffnen der TUI – Sekunden statt Minuten dauert. Der Cache befindet sich unter $env:LOCALAPPDATA\LogHorizon\cache (überschreibbar mit -CachePath), eine Datei pro Kombination aus Abonnement, Ressourcengruppe, Arbeitsbereich, -DaysBack, -DetectionLookbackDays, -IncludeDefenderXDR, -IncludeDetectionAnalyzer, den drei Preiskennzahlen und der Modulversion. Einträge, die älter als -CacheMaxAgeMinutes (Standard: 60) sind, werden ignoriert, und bei jedem Speichern werden abgelaufene Einträge gelöscht, sodass der Ordner keine Dateien aus anderen Parametersätzen oder älteren Versionen ansammelt. Token werden niemals in den Cache geschrieben; die Authentifizierung wird bei jedem Aufruf ausgeführt, sodass der Aufbewahrungsassistent immer über aktuelle Anmeldeinformationen verfügt.
Die Cachedatei ist Klartext-Clixml. Mit -IncludeDetectionAnalyzer enthält sie Vorfalltitel, -nummern, -status und -klassifizierung aus Ihrem Arbeitsbereich; Vorfallbesitzer, Regelautoren und Identitäten zugewiesener Besitzer werden nicht erfasst. Verwenden Sie -NoCache auf gemeinsam genutzten Maschinen oder richten Sie -CachePath auf einen Speicherort mit der von Ihnen benötigten Zugriffskontrolle.```powershell
Force a fresh collection and refresh the cache
Invoke-LogHorizon -SubscriptionId '...' -ResourceGroup 'rg' -WorkspaceName 'ws' -RefreshCache
Never read or write the cache
Invoke-LogHorizon -SubscriptionId '...' -ResourceGroup 'rg' -WorkspaceName 'ws' -NoCache
Accept cached data for up to a day
Invoke-LogHorizon -SubscriptionId '...' -ResourceGroup 'rg' -WorkspaceName 'ws' -CacheMaxAgeMinutes 1440
### Protokoll-Tuning und Split-KQL
Die interaktive TUI enthält ein Menü für **Protokoll-Tuning / Transforms** mit Live-Tuning-Vorschlägen (Feldnutzung aus Ihren bereitgestellten Regeln und Hunting-Abfragen), Wissensdatenbank-Split-KQL sowie einem Evaluator pro Tabelle. Jeder KQL-Block ist nur eine Bedingung und lässt sich direkt in den Sentinel-Split-Regeleditor einfügen, mit Quellenangabe (Wissensdatenbank, Regelanalyse oder kombiniert).
### Benutzerdefinierte Preisgestaltung
Standardpreise sind Westeuropa Simplified PAYG in USD: 5,59 $/GB Analytics, 1,15 $/GB Basic, 0,20 $/GB Data Lake (0,07 Erfassung + 0,13 Verarbeitung). Jede Tabelle wird nach dem in der `Usage`-Tabelle beobachteten Plan bepreist, und der kostenlose Status stammt aus `Usage.IsBillable`. Volumina verwenden Abrechnungs-GB (1000 MB). Falls Ihre Verpflichtungsstufe abweicht:```powershell
Invoke-LogHorizon -SubscriptionId '...' -ResourceGroup 'rg' -WorkspaceName 'ws' -PricePerGB 4.61 -BasicPricePerGB 1.15 -LakePricePerGB 0.20
Alle Parameter
| Parameter | Typ | Erforderlich | Standard | Beschreibung |
|---|---|---|---|---|
-SubscriptionId | string | Ja | - | Azure-Abonnement-ID |
-ResourceGroup | string | Ja | - | Ressourcengruppe, die den Sentinel-Arbeitsbereich enthält |
-WorkspaceName | string | Ja | - | Name des Log-Analytics-Arbeitsbereichs |
-WorkspaceId | string | Nein | - | Arbeitsbereichs-ID (wird automatisch aufgelöst, wenn ausgelassen) |
-Output | string | Nein | - | Exportformat: json, markdown / md oder html (Alias -o) |
-OutputPath | string | Nein | - | Datei- oder Verzeichnispfad für den Export. Ein vorhandenes Verzeichnis oder ein abschließendes Trennzeichen erhält einen Zeitstempel-Dateinamen; ein Dateiname ohne Erweiterung erhält die Erweiterung des Formats; fehlende Verzeichnisse werden erstellt |
-Keywords | string[] | Nein | - | Schlüsselwörter für die Gap-Analyse (z. B. 'AWS','CrowdStrike', Alias -kw) |
-IncludeDefenderXDR | switch | Nein | - | Defender-XDR-Analyse benutzerdefinierter Erkennungen einbeziehen |
-IncludeDetectionAnalyzer | switch | Nein | - | Analyse verrauschter Erkennungen pro Regel anhand von Incidents und Automatisierungsregeln einbeziehen |
-DetectionLookbackDays | int | Nein | 90 | Abfragefenster für die Erkennungsanalyse auf Incident-/Automatisierungsbasis (1–365 Tage) |
-DaysBack | int | Nein | 90 | Abfragefenster für Nutzungsdaten (1–365 Tage) |
-PricePerGB | decimal | Nein | 5.59 | Sentinel-Analytics-Tarif: Erfassungspreis pro GB (Alias -ppgb) |
-BasicPricePerGB | decimal | Nein | 1.15 | Basic-Logs-Preis pro GB |
-LakePricePerGB | decimal | Nein | 0.20 | Auxiliary-/Data-Lake-Tarif: Preis pro GB (Erfassung + Verarbeitung) |
-NonInteractive | switch | Nein | - | TUI-Dashboard überspringen und direkt exportieren (oder Daten an die Pipeline zurückgeben, wenn -Output ausgelassen wird) |
-CustomClassificationPath | string | Nein | - | Pfad zu einer benutzerdefinierten JSON-Datei zum Hinzufügen oder Überschreiben von Klassifizierungen (Alias -clf) |
-NoCache | switch | Nein | - | Sammelcache weder lesen noch schreiben |
-RefreshCache | switch | Nein | - | Frische Daten sammeln und den Cache-Eintrag überschreiben |
-CacheMaxAgeMinutes | int | Nein | 60 | Maximales Alter eines Cache-Eintrags zur Wiederverwendung (1–10080) |
-CachePath | string | Nein | $env:LOCALAPPDATA\LogHorizon\cache | Verzeichnis für Cache-Dateien |
Unter der Haube
Es gibt also vier Phasen.
1. Datenerfassung
Das Modul verbindet sich mit Azure und zieht Daten aus den Log-Analytics-, Security-Insights-, Azure-Monitor- und Microsoft-Graph-APIs. Jeder Aufruf durchläuft einen Retry-Wrapper (429, 5xx und Transportfehler) und, sofern -NoCache nicht gesetzt ist, werden die gesammelten Daten für den nächsten Lauf lokal zwischengespeichert.
| Datenquelle | API | Was wir abgreifen |
|---|---|---|
| Tabellennutzung | Usage-Tabelle (KQL) | Erfassungsvolumen, Plan und abrechenbares Flag pro Tabelle über Ihr Abfragefenster |
| Analyseregeln | Security Insights REST | Aktive Erkennungsregeln + welche Tabellen sie treffen + Korrelations-Tags, plus implizite Tabellenkonsumenten für Nicht-KQL-Regelarten |
| Hunting-Abfragen | Log-Analytics-gespeicherte-Suchen-REST | Gespeicherte Hunting-Abfragen + referenzierte Tabellen |
| Datenconnectors | Security Insights REST | Inventar installierter Connectors |
| SOC-Optimierung | Security Insights REST (Vorschau) | Integrierte SOC-Empfehlungen von Microsoft |
| Tabellenaufbewahrung | Log-Analytics-Tabellen-REST | Aufbewahrung, Archiv, Plan (Analytics/Basic/Auxiliary), geerbte Standard-Flags und Schema-Spalten pro Tabelle |
| Datenerfassungsregeln | Azure Monitor REST | DCRs, die auf den Arbeitsbereich abzielen (Abonnementliste, Arbeitsbereichs-Transformations-DCR, Zuordnungen) und deren Transformationen |
| Defender XDR | Microsoft Graph | XDR-Regeln für benutzerdefinierte Erkennungen (optional; delegiertes CustomDetection.Read.All oder ein Az-Graph-Token) |
| Incidents | Security Insights REST | Incident-Ergebnisse (Status/Klassifizierung), Zeitablauf und Regelverknüpfungshinweise für die Regelqualitätsbewertung |
| Automatisierungsregeln | Security Insights REST | Regelbezogene Aktionen zum Schließen von Incidents und Bedingungen für Titelabgleich zur Zuordnung automatischer Schließungen |
| SentinelHealth | Log Analytics KQL | Ausführungsereignisse von Automatisierungsregeln mit Incident-Nummern für die eindeutige Zuordnung automatischer Schließungen (optional, erfordert Health-Monitoring) |
2. Klassifizierung
Jede Tabelle wird in zwei Durchgängen klassifiziert:
Zuerst eine direkte Suche in der Wissensdatenbank mit 481 Einträgen in Data/log-classifications.json. Jeder Eintrag enthält den Connector-Namen, primäre/sekundäre Klassifizierung, Sicherheitskategorie, MITRE-Datenquellen-Zuordnungen, einen empfohlenen Preistarif und Aufbewahrungsdauer sowie optionale Lebenszyklus-Flags (veraltet/legacy mit Ersatztabellen, XDR-Streaming-Fähigkeit, Plattform).
Wenn es keine Übereinstimmung gibt, greifen heuristische Regeln in dieser Reihenfolge:
- Name enthält ein Sicherheits-Token wie
Alert,Incident,Threat,Signin,Logon,Audit,Risk,Detection(abgeglichen an PascalCase-Wortanfängen) -> primär - Name sieht nach Infra-Telemetrie aus:
Flow,Metric,Diagnostic,Perf,Heartbeat,Health,Inventory,Usage-> sekundär - Aktive Analyseregeln zeigen auf die Tabelle -> primär
- Integrierte Tabelle mit Microsoft-Präfix (
AAD,Microsoft,Azure,Defender,Purview,Entra,Sentinel,Office,Intune,Windows...) -> primär, zur Überprüfung und Ergänzung in der Datenbank markiert - Generischer
*Log/*Logs-Name -> sekundär - Hohes Volumen (>10 GB/Monat) ohne Erkennung -> sekundär
- Keines der oben genannten -> unbekannt
3. Kosten-Nutzen-Bewertung
Jede Tabelle wird in mehreren Dimensionen bewertet:
- Kostentarif: Kostenlos / Niedrig (<1 GB) / Mittel (1–10 GB) / Hoch (10–50 GB) / Sehr hoch (>50 GB)
- Erkennungstarif: Keine / Niedrig (1–2 Regeln) / Mittel (3–9 Regeln) / Hoch (10+ Regeln)
- Bewertung: Hoher Wert / Guter Wert / Fehlende Abdeckung / Optimieren / Geringer Wert / Untergenutzt / Kostenloser Tarif / Plattform
- Abdeckung %: Prozentsatz der Tabellen, auf die mindestens eine Analyseregel oder Hunting-Abfrage verweist, berechnet als
TabellenMitRegeln / Gesamttabellen * 100. Die Abdeckung pro Tabelle summiert Analyseregeln + Hunting-Abfragen, die durch Parsen von KQL nach Tabellennamen gefunden wurden. - Implizite Abdeckung: Regelarten ohne KQL verbrauchen dennoch Tabellen.
Data/implicit-consumers.jsonordnet sie zu (Threat-Intelligence-Abgleich ->ThreatIntelIndicators/ThreatIntelObjects, Fusion ->SecurityAlert/Anomalies, UEBA ->BehaviorAnalytics/UserPeerAnalytics/IdentityInfo, Microsoft-Incident-Erstellung ->SecurityAlert). Aktivierte Regeln dieser Arten zählen zur effektiven Abdeckung, und jede Tabelle meldet eineCoverageSourcevonkql,xdr,implicit,platformodernone. Plattformtabellen, die Sentinel selbst schreibt (SecurityIncident,SentinelHealth,Watchlist,Usage...), werden nie als fehlende Abdeckung markiert und erhalten die BewertungPlattform. - Nur aktivierte Analyseregeln und aktivierte Defender-Benutzerdefinierte-Erkennungen zählen zur Abdeckung.
Anschließend generiert das Modul Empfehlungen (13 Typen):
| Typ | Wann er ausgelöst wird | Was zu tun ist |
|---|---|---|
| Data Lake | Sekundär + hohe Kosten + wenige Erkennungen, und die Tabelle unterstützt den Auxiliary-Plan (fällt auf einen Basic-Plan-Vorschlag zurück, wenn nur Basic unterstützt wird) | In den Auxiliary-/Data-Lake-Tarif verschieben; Einsparungen sind aktuelle Kosten minus dasselbe Volumen zum Lake- (oder Basic-)Satz |
| Geringer Wert | Hohe Kosten + null Erkennungen | Regeln hinzufügen, filtern oder in den Data Lake verschieben |
| XDR-Optimierung | XDR-gestreamt + 0 Sentinel-Regeln + XDR-Regeln vorhanden | Streaming stoppen, stattdessen das einheitliche XDR-Portal verwenden |
| Fehlende Abdeckung | Primär + null Erkennungen (keine Plattformtabellen) | Analyseregeln schreiben, um Wert aus den Daten zu ziehen |
| Erfassungszeit-Filter | Primär + >20 GB + <=3 Erkennungen | Erfassungszeit-Transformation anwenden, um das Volumen zu reduzieren |
| Split-Kandidat | Primär + hohes Volumen + Erkennungen + keine vorhandene Transformation | Tabelle aufteilen, sodass hochwertige Zeilen auf Analytics bleiben und der Rest in den Data Lake geht |
| Plannutzung | Nutzungszeilen zeigen mehr als einen Plan, oder der konfigurierte Plan weicht von dem ab, was die Nutzung beobachtet hat | Prüfen, ob der Plantarifwechsel erwartet war |
| Veraltete Quelle | Eine in der Datenbank als veraltet oder legacy markierte Tabelle erfasst weiterhin Daten | Erkennungen auf die Ersatztabellen migrieren, dann den alten Connector ausmustern. Nur informativ: Es werden keine Einsparungen beansprucht, da die Erfassung verschoben statt verschwindet |
| Aufbewahrungsdefizit | Arbeitsbereichs- oder Tabellenaufbewahrung unter der 90-Tage-Baseline | Gesamt-/Archivaufbewahrung erhöhen, um regulatorischen Vorgaben zu entsprechen |
| Aufbewahrungsverbesserung | Bezahlte, nicht-Plattform-Tabelle erfüllt 90 Tage, liegt aber unter der Kategorieempfehlung | Längere Gesamtaufbewahrung in Betracht ziehen |
| Interaktiv unter Baseline | Analytics-Tabelle mit interaktiver (Hot-)Aufbewahrung unter 90 Tagen | Interaktive Aufbewahrung auf die 90 Tage erhöhen, die Sentinel enthält, sofern das kurze Hot-Fenster nicht beabsichtigt ist |
| XDR-Checker | Bekannte Defender-XDR-Tabelle nicht gestreamt, ohne Abdeckung gestreamt, nicht an den Data Lake weitergeleitet oder unter der Ein-Jahres-Empfehlung | Streaming und Aufbewahrung für XDR-Telemetrie überprüfen |
| Erkennungsanalysator | Regel-Score >= 70 mit mindestens 5 Incidents (mit -IncludeDetectionAnalyzer) | Die verrauschte Regel abstimmen oder deaktivieren |
Empfehlungen werden einmal sortiert, Hoch > Mittel > Niedrig und dann nach geschätzten Einsparungen, und jede Ausgabe (JSON, Markdown, HTML, TUI) behält diese Reihenfolge bei.
4. Erkennungsanalysator (Verrauschtheits-Bewertung)
Wenn Sie -IncludeDetectionAnalyzer übergeben, ruft das Modul aktuelle Incidents und Automatisierungsregeln ab und bewertet dann jede aktivierte Analyseregel auf potenzielle Verrauschtheit.
Metriken pro Regel (aus Incident-Daten berechnet):
| Metrik | Wie sie berechnet wird |
|---|---|
| Incidents gesamt | Anzahl der mit der Regel verknüpften Incidents |
| AutoClose-Verhältnis | Incidents, die durch Automatisierungsregeln geschlossen wurden ÷ Gesamt-Incidents. Primärquelle: SentinelHealth-Tabelle (Automatisierungsregel-Ausführungen durch aktivierte Close-Incident- oder Playbook-Regeln, abgeglichen über Incident-Nummer). Fallback: Bedingungsabgleich von Automatisierungsregeln (Analyseregeln-ID, Titel- und Schweregradbedingungen, UND-verknüpft wie bei Sentinel). Regeln, deren Bedingungen nur Status/Taktiken/Entitäten sind, werden so behandelt, als würden sie auf jeden Incident zutreffen. |
| FalsePositive-Verhältnis | Incidents, die als falsch positiv klassifiziert wurden ÷ Gesamt-Incidents |
Verrauschtheits-Score-Formel:
Jede Metrik wird in einen Perzentil-Rang über alle Regeln mit mindestens einem Incident umgewandelt. Der zusammengesetzte Score ist eine gewichtete Mischung:``` Score = (Volume_percentile × 0.35) + (AutoClose_percentile × 0.40) + (FalsePositive_percentile × 0.25)
- **Volumen-Perzentil (35 %)**: Wie viele Vorfälle eine Regel im Vergleich zu anderen Regeln erzeugt.
- **AutoClose-Perzentil (40 %)**: Wie oft Vorfälle automatisch durch Automatisierungsregeln geschlossen werden (höchste Gewichtung, da automatisches Schließen das stärkste Signal für Alarme mit geringem Wert ist).
- **FalsePositive-Perzentil (25 %)**: Wie oft Analysten das Ergebnis als Fehlalarm einstufen.
**Score-Schwellenwerte**:
| Score | Kennzeichnung | Bedeutung |
|---|---|---|
| ≥ 70 | Laut | Regel benötigt wahrscheinlich Feintuning oder Deaktivierung |
| ≥ 50 | Beobachten | Regel zeigt frühe Anzeichen von Lautstärke |
| < 50 | Gesund | Regel liegt im normalen Bereich |
| N/A | - | Regel hat keine zugehörigen Vorfälle, oder weniger als 3 Regeln haben Vorfälle, sodass es nichts zum Vergleichen gibt |
Vorfälle werden nach der analytischen Regel-ID gruppiert (mit Rückfall auf Regelname, dann Titel), sodass zwei Regeln mit demselben Anzeigenamen separat bewertet werden.
Regeln mit einem Score ≥ 70 und mindestens 5 Vorfällen werden automatisch als **Empfehlungen mit hoher Priorität** in der Ansicht „Empfehlungen“ angezeigt.
### 5. Interaktives Dashboard
Das Hauptmenü bietet diese Ansichten:
- **Dashboard**: Übersichtsstatistiken, Top-10 der teuersten Tabellen (veraltete und Legacy-Quellen tragen ein Abzeichen), Abdeckungsbalken, Aufbewahrungs-Compliance-Zusammenfassung, Hinweis zu Korrelationsausschlüssen
- **Empfehlungen anzeigen**: Priorisierte Maßnahmen mit geschätzten monatlichen Einsparungen, erweiterbar zur Anzeige der vollständigen Liste, wenn mehr als 10 vorhanden sind
- **Erkennungsbewertung anzeigen**: Kosten-Wert-Matrix-Zusammenfassung, Regel- und Hunting-Abfrageabdeckung pro Tabelle, Primär-/Sekundär-Drilldown, Liste der von Korrelation ausgeschlossenen Regeln
- **Erkennungsanalysator anzeigen**: Perzentilbasierte Rangliste lauter Regeln mit Schließungsqualitätsindikatoren (wenn Sie `-IncludeDetectionAnalyzer` verwendet haben), durchsuchbarer Regelbrowser
- **SOC-Optimierung anzeigen**: Microsofts eigene Verbesserungsvorschläge mit Drilldown
- **Aufbewahrungsbewertung anzeigen**: Tabellen unter den empfohlenen Mindestwerten mit aktueller vs. empfohlener Aufbewahrung, Plantyp und Fehlbetrag, plus XDR-Hinweiszeilen
- **Datentransformationen anzeigen**: DCR-Transformationsinventar mit Klassifizierung des Transformationstyps und vollständigem KQL pro Tabelle
- **Protokoll-Tuning / Transformationen**: Live-Tuning-Vorschläge, Wissensbasis-Split-KQL und ein Bewerter pro Tabelle mit einer Aufbewahrungs-/Typänderung für eine einzelne Tabelle
- **Alle Tabellen anzeigen**: Die vollständige Liste mit Klassifizierung, Plänen, Kosten, Regeln, Aufbewahrung (farbcodiert) und Bewertung; wählen Sie eine Tabelle für ein Detailpanel aus (Abdeckungsquellen, Planunterstützung, Aufbewahrung, Status, deren Empfehlungen)
- **Aufbewahrung und Typ von Tabellen verwalten**: Massenaufbewahrungs- und Plan-Assistent mit Vorschau und Anwenden
- **Wörterbuch**: Jeder Begriff, den das Tool verwendet (Klassifizierung, Kosten- und Erkennungsstufen, Bewertungen, Abdeckungsquellen, die 13 Empfehlungstypen, Metriken und Score-Kennzeichnungen des Erkennungsanalysators, Tabellenpläne, Lebenszyklusstatus, XDR-Zustände, Transformationstypen) mit denselben Definitionen wie in dieser README, bereitgestellt aus `Data/dictionary.json`
- **Bericht exportieren**: Wählen Sie ein Format, dann einen Pfad (Verzeichnis für eine Datei mit Zeitstempel oder einen Dateinamen; Eingabetaste behält das aktuelle Verzeichnis) und schreiben Sie JSON, Markdown oder HTML direkt aus dem Menü
- **XDR-Analyse** erscheint auf dem Dashboard, wenn Sie `-IncludeDefenderXDR` verwendet haben
---
## Die Klassifizierungsdatenbank
Befindet sich unter `Data/log-classifications.json`. **481 Einträge**, **243 Connectors**, **22 Kategorien**.
### Was in jedem Eintrag enthalten ist
| Feld | Was es enthält |
|---|---|
| `tableName` | Log-Analytics-Tabellenname (`SecurityEvent`, `SigninLogs` usw.) |
| `connector` | Welcher Datenconnector diese Tabelle erzeugt |
| `classification` | `primary` (Sicherheitswert) oder `secondary` (unterstützende Telemetrie) |
| `category` | Sicherheitskategorie: Identität & Zugriff, Netzwerksicherheit usw. |
| `description` | Verständliche Zusammenfassung dessen, was in der Tabelle enthalten ist |
| `keywords` | Begriffe für den Keyword-Lückenanalyse-Abgleich |
| `mitreSources` | MITRE-ATT&CK-Datenquellenzuordnungen |
| `recommendedTier` | `analytics` (Hot-Tier) oder `datalake` (Kandidat für Hilfsspeicher) |
| `recommendedRetentionDays` | Mindestempfehlung für die gesamte Aufbewahrungsdauer in Tagen (regulatorische Richtlinien) |
| `isFree` | Ob Microsoft diese Tabelle kostenlos erfasst (die Laufzeit verwendet zuerst `Usage.IsBillable`) |
| `status` | Optional. `deprecated` (Connector eingestellt oder Erfassung gestoppt) oder `legacy` (älterer Erfassungspfad mit dokumentiertem Nachfolger) |
| `replacedBy` | Optional. Tabellennamen für die Migration; vorhanden, wann immer `status` gesetzt ist (kann leer sein) |
| `xdrStreamable` | Optional, nur Defender-Tabellen. `true` für die 21 Tabellen, die der Defender-XDR-Connector streamt; `false` für Nur-Portal- und TVM-Tabellen |
| `platform` | Optional. `true` für Tabellen, die Sentinel selbst verbraucht (`SecurityIncident`, `Usage`, `Watchlist`, ...), die niemals Analyseregeln benötigen |
Tabellen mit einem `status` zeigen ein Abzeichen in der TUI und in den Berichten, und alle, die weiterhin Daten erfassen, erzeugen eine `DeprecatedSource`-Empfehlung, die den Ersatz benennt. Tabellen mit `xdrStreamable: false` werden vom XDR-Checker niemals als XDR-Streaming-Kandidaten behandelt.
### Primäre vs. sekundäre Sicherheitsdaten
**Primär** (278 Einträge): Die Tabellen, auf denen Sie tatsächlich Erkennungen aufbauen. Anmelde-Protokolle, Sicherheitswarnungen, Bedrohungsdaten, Audit-Trails, Schwachstellenbefunde, Firewall-Treffer, EDR-Telemetrie.
**Sekundär** (203 Einträge): Unterstützendes Material. Leistungsmetriken, Infrastrukturdiagnosen, Netzwerkflussvolumina, Inventarschnappschüsse, Konfigurations-Baselines, Health-Checks.
### Kategorien auf einen Blick
| Kategorie | Anzahl | Beispiele |
|---|---|---|
| Identität & Zugriff | 51 | `SigninLogs`, `MicrosoftServicePrincipalSignInLogs`, `OktaSSO` |
| Netzwerksicherheit | 49 | `AZFWNetworkRule`, `NSPAccessLogs`, `DarktraceModelAlerts_CL` |
| Cloud-Control-Plane | 37 | `AzureActivity`, `AZKVAuditLogs`, `GoogleWorkspaceReports` |
| Netzwerkfluss | 36 | `NTANetAnalytics`, `CommonSecurityLog`, `AZFWFatFlow` |
| Endpunkterkennung | 33 | `DeviceProcessEvents`, `CrowdStrikeAuditEvents`, `SentinelOneAlertsV2_CL` |
| Anwendungsprotokolle | 32 | `AppServiceHTTPLogs`, `AppServiceAuditLogs`, `DynatraceAttacksV2_CL` |
| E-Mail-Sicherheit | 29 | `EmailEvents`, `CampaignInfo`, `Ttp_Url_CL` |
| Sicherheitswarnungen | 29 | `SecurityAlert`, `SentinelBehaviorInfo`, `DisruptionAndResponseEvents` |
| Schwachstellenverwaltung | 23 | `DeviceTvmSoftwareVulnerabilities`, `Rapid7InsightVMCloudVulnerabilities` |
| Cloud-Sicherheit | 20 | `EnrichedMicrosoft365AuditLogs`, `OAuthAppInfo`, `PowerAppsActivity` |
| Endpunkttelemetrie | 18 | `DeviceInfo`, `Windows365NetworkLogs`, `SentinelOneAgents_CL` |
| Posture-Management | 17 | `ExposureGraphNodes`, `SecurityNestedRecommendation`, `ZTSMetadata` |
| Datensicherheit | 16 | `PurviewDataSensitivityLogs`, `DataSecurityEvents`, `PowerPlatformDlpActivity` |
| Datenplattform | 16 | `SQLSecurityAuditEvents`, `CDBControlPlaneRequests`, `SnowflakeLogin_CL` |
| Plattform-Health | 14 | `SentinelHealth`, `Usage`, `SecurityCaseEvent` |
| Container & K8s | 13 | `AKSAudit`, `CloudProcessEvents`, `GKEAudit` |
| Infrastrukturdiagnose | 13 | `AzureMetrics`, `AGWPerformanceLogs`, `ContainerAppSystemLogs` |
| Bedrohungsdaten | 10 | `ThreatIntelIndicators`, `ThreatIntelObjects`, `CybleVisionAlerts_CL` |
| Konfigurationsverwaltung | 8 | `ConfigurationData`, `AVNMRuleCollectionChange` |
| SAP-Sicherheit | 7 | `ABAPAuditLog`, `SAPBTPAuditLog_CL`, `Onapsis_Defend_CL` |
| Speicherzugriff | 6 | `StorageBlobLogs`, `CloudStorageAggregatedEvents`, `AWSS3ServerAccess` |
| IoT/OT-Sicherheit | 4 | `RadiflowEvent`, `DragosAlerts_CL`, `Phosphorus_CL` |
### Tabellenplanunterstützung
`Data/basic-plan-tables.json` und `Data/auxiliary-plan-tables.json` listen die integrierten Tabellen auf, die die [Azure Monitor-Tabellenfunktionsmatrix](https://learn.microsoft.com/en-us/azure/azure-monitor/reference/tables-features) als Unterstützung der Basic- und Auxiliary- (Data Lake) Pläne kennzeichnet. Der Aufbewahrungs-Assistent verwendet die Basic-Liste zur Validierung von Planwechseln, und die `DataLake`-Empfehlung schlägt die Lake-Stufe nur für Tabellen vor, die diese unterstützen, mit Rückfall auf einen Basic-Plan-Vorschlag, wo dies die niedrigste unterstützte Stufe ist. DCR-basierte benutzerdefinierte Tabellen unterstützen beide Pläne; klassische benutzerdefinierte Tabellen unterstützen keinen von beiden. Beide Dateien werden für jede Version aus dieser Matrix neu generiert.
### Benutzerdefinierte Klassifizierungen
Sie können eine eigene Klassifizierungsdatei bereitstellen, um Einträge für Tabellen **hinzuzufügen**, die nicht in der integrierten Datenbank enthalten sind, oder vorhandene Einträge zu **überschreiben**, wenn die Standardwerte nicht zu Ihrer Umgebung passen. Benutzerdefinierte Einträge haben Vorrang vor integrierten, wenn derselbe `tableName` in beiden vorkommt.```powershell
Invoke-LogHorizon -SubscriptionId '...' -ResourceGroup 'rg' -WorkspaceName 'ws' `
-CustomClassificationPath './my-classifications.json'
Das benutzerdefinierte Schema der Datei entspricht dem von Data/log-classifications.json, einem Array von Objekten:```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
}
]
Siehe `Data/custom-classifications-example.json` für eine einsatzbereite Vorlage.
### Wie die Klassifizierungen erstellt wurden
Die Primär-/Sekundärbewertung wurde teilweise vom Autor durchgeführt und anschließend durch Einspeisung von Microsofts Datenkonnektor- und Tabellendefinitionen in KI mit einer menschlichen Bewertungsbasis erstellt, wobei Microsoft-Best Practices und Industriestandards als Klassifizierungskriterien dienten. Falls etwas für Ihre Umgebung unpassend erscheint, vertrauen Sie Ihrem eigenen Kontext mehr als dem Tool – KI kann Fehler machen, und Kontext ist entscheidend.
Die Klassifizierungskriterien stammen aus den folgenden Quellen:
**ACSC (Australian Signals Directorate, Australian Cyber Security Centre)**
- [ACSC: Best practices for event logging and threat detection (Aug 2024)](https://www.cyber.gov.au/sites/default/files/2024-08/best-practices-for-event-logging-and-threat-detection.pdf)
- [ACSC: Priority logs for SIEM ingestion - Practitioner guidance (May 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: Guidance for Implementing M-21-31: Improving the Federal Government's Investigative and Remediation Capabilities](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: Microsoft Expanded Cloud Logs Implementation Playbook (2025)](https://www.cisa.gov/sites/default/files/2025-01/microsoft-expanded-cloud-logs-implementation-playbook-508c.pdf)
**Microsoft**
- [Microsoft Sentinel data connectors reference](https://learn.microsoft.com/en-us/azure/sentinel/data-connectors-reference)
- [Microsoft Sentinel tables & connectors reference](https://learn.microsoft.com/en-us/azure/sentinel/sentinel-tables-connectors-reference)
- [Azure-Sentinel GitHub repo](https://github.com/Azure/Azure-Sentinel) (Community-Analyseregeln, Konnektordefinitionen, Lösungsvorlagen)
- [Microsoft Sentinel billing](https://learn.microsoft.com/azure/sentinel/billing)
- [Microsoft Sentinel data tier management](https://learn.microsoft.com/azure/sentinel/manage-data-overview)
**MITRE**
- [MITRE ATT&CK Data Sources](https://attack.mitre.org/datasources/)
**NIST (National Institute of Standards and Technology)**
- [NIST SP 800-92: Guide to Computer Security Log Management](https://csrc.nist.gov/pubs/sp/800/92/final)
**NSA (National Security Agency)**
- NSA Cyber Event Forwarding Guidance
**NCSC-UK (National Cyber Security Centre - United Kingdom)**
- NCSC-UKs "What exactly should we be logging?"
**Google Cloud**
- [Google Cloud Audit Logs overview](https://docs.cloud.google.com/logging/docs/audit)
- [Google Cloud Audit Logs best practices](https://docs.cloud.google.com/logging/docs/audit/best-practices)
Es wurden auch andere Quellen verwendet, zusammen mit der „Expertise" des Autors, falls man sie als solche bezeichnen kann.
---
## Projektstruktur```
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
Wie die Wissensdatenbanken erzeugt werden
Die aufgeteilten KQL-Wissensdatenbanken high-value-fields.json und field-frequency-stats.json werden offline aus dem öffentlichen Azure/Azure-Sentinel-Repository erstellt (Solutions/, Detections/, Hunting Queries/, etwa 3.800 YAML-Regeldateien). Jede Abfrage wird mit denselben Get-TablesFromKql- und Get-FieldsFromKql-Funktionen ausgeführt, die das Modul zur Laufzeit verwendet, um Feldhäufigkeitszählungen pro Tabelle zu erstellen, aus denen drei Ebenen von Fallback-Feldern abgeleitet werden:
- Universelle Felder: Felder, die in mehr als 50 % aller Tabellen vorkommen (z. B.
TimeGenerated) - Kategorie-Standardwerte: Felder, die in mehr als 40 % der Tabellen innerhalb einer Klassifikationskategorie vorkommen
- Pro-Tabellen-Statistiken: Rohe Feldhäufigkeitszählungen für Tabellen mit mindestens 3 referenzierenden Regeln
Die abgebauten Felder werden in die kuratierte high-value-fields.json zusammengeführt (kuratierte Einträge bleiben erhalten, neu entdeckte Tabellen mit mindestens 3 Regeln und 3 aussagekräftigen Feldern werden hinzugefügt).
Zur Laufzeit verwendet Get-SplitKql eine Fallback-Hierarchie: kuratierter KB-Eintrag -> Live-Regel-/Hunting-Feldanalyse -> Community-Pro-Tabellen-Statistiken -> Kategorie-Standardwerte -> universelle Felder. Die Häufigkeit von Feldern ist keine perfekte Methode, aber es ist nützlich, sie zu kennen.
Tests
437 Pester-v5-Tests, keine Azure-Konnektivität erforderlich. Führen Sie sie aus einer normalen PowerShell-Sitzung aus, nicht aus dem integrierten VS-Code-Terminal:```powershell Invoke-Pester ./Tests/LogHorizon.Tests.ps1 -Output Detailed
## Lizenz
GPL-3.0. Siehe [LICENSE](https://github.com/lnfernux/log-horizon/blob/main/LICENSE).
## Versionshistorie
| Version | Datum | Änderungen |
|---|---|---|
| 0.9.0 | 2026-09-06 | Remediation-Release aus einer vollständigen Code- und Datenprüfung. Korrektheit: planbewusste Preisgestaltung über `Usage.Plan` und `Usage.IsBillable` mit Basic- und Data-Lake-Tarifen sowie Abrechnungs-GB (1000 MB), Detection-Analyzer-Auto-Close-Zuordnung beschränkt auf aktivierte Close/Playbook-Regeln (`triggeringLogic.isEnabled`), Incidents über `2025-09-01` mit `$top=1000`, implizite Abdeckung für Nicht-KQL-Regelarten und Plattformtabellen (`implicit-consumers.json`), interaktiver Aufbewahrungs-Baseline-Check, einzelne Empfehlungssortierung. Transforms: DCR-Erkennung auf Abonnementebene, gefiltert auf den Ziel-Workspace, plus der Workspace-Transformations-DCR und -Zuordnungen, mit sichtbarem Status und Warnung bei fehlender Berechtigung; Workspace- und mehrstufiges Transform-Parsing; Split-KQL überschnitten mit dem Live-Tabellenschema. Robustheit: Sammlungs-Cache standardmäßig aktiviert (`-NoCache`, `-RefreshCache`, `-CacheMaxAgeMinutes`, `-CachePath`), Authentifizierung vor dem Spinner mit danach ausgegebenen Warnungen, maskierte TUI- und Markdown-Ausgabe, Exportpfadauflösung, die Verzeichnisse erstellt und den geschriebenen Pfad zurückgibt, CSP-Meta in HTML, REST-Wiederholungen bei Übertragungsfehlern und Location-artiger asynchroner Abschluss, Workspace-Auflösung über REST (`Az.Resources` entfernt), Validierung benutzerdefinierter Klassifikationen, PascalCase-bewusste Heuristiken mit Microsoft-First-Party-Fallback, Regex-Timeouts. Endpunkte folgen der angemeldeten Azure-Umgebung (Government, China) und API-Versionen wurden auf SecurityInsights `2025-09-01`, OperationalInsights `2025-07-01`, Empfehlungen `2025-10-01-preview` verschoben. Daten: Klassifikationsdatenbank 345 -> 481 Einträge mit `status`/`replacedBy`/`xdrStreamable`/`platform`-Schlüsseln, 80+ First-Party- und 35 Nachfolgetabellen, Korrekturen von Connector-Labels, `isFree`-Korrekturen; `basic-plan-tables.json` neu generiert und neue `auxiliary-plan-tables.json` aus der Azure-Monitor-Tabellen-Feature-Matrix; `DeprecatedSource`-Empfehlung, planbewusste Data-Lake-Empfehlung mit Basic-Fallback, XDR-Checker berücksichtigt Streamability, Lebenszyklus-Badges in TUI und Exporten. Prüfungsdurchlauf: Cache-Schlüssel deckt Preisgestaltung und Modulversion ab, benutzerdefinierte Klassifikations-Booleans und -Stufen werden geparst statt gecastet, schwerwiegendkeitsbewusste Auto-Close-Zuordnung, Split-KQL-Prädikate gegen das Live-Schema geprüft, XDR-Abrufstatus wird angezeigt statt eines stillen `$null`, Ausgabepfade ohne Erweiterung sind Dateien, Incident-Owner-Identitäten werden nicht mehr erfasst. Wörterbuchmenü in der TUI mit jedem vom Tool verwendeten Begriff, unterstützt durch `Data/dictionary.json` und durch Tests am Code verankert. Automatisierungsregel- und Defender-Custom-Detection-Objekte werden auf die verbrauchten Felder projiziert, sodass Autoridentitäten (createdBy, lastModifiedBy, zugewiesene Besitzer) nie den Cache oder die Exporte erreichen. GPL-3.0-Lizenz. 437 Tests |
| 0.8.0 | 2026-05-26 | Interaktive Tabellen-Aufbewahrungsverwaltung hinzugefügt mit neuem Bulk-TUI-Flow und Einzeltabellen-Update-Einstiegspunkt, plus dem öffentlichen Befehl `Set-LogHorizonTableRetention`. Tables-API-PATCH-Anwendungsmodul mit Validierung, Azure-Async-Operation-Polling und zweistufigem Fallback (kombiniertes PATCH, dann nur Plan plus nur Aufbewahrung) für robuste Aufbewahrungsupdates hinzugefügt. Fokussierte Pester-Abdeckung für Validierung, Payload-Form, Fallback und öffentliches Befehlsmapping hinzugefügt. Behebt außerdem einen Randfall/Bug, bei dem Benutzer Empfehlungen erhielten, Data-Lake-Tabellen auf die Data-Lake-Stufe umzustellen, obwohl noch Analysedaten in Sentinel vorhanden waren |
| 0.7.1 | 2026-05-15 | Planbewusstheit über `Usage.Plan` hinzugefügt, ohne den konfigurierten Tabellenplan zu ersetzen: Die Analyse verfolgt nun die beobachtete Planhistorie, kennzeichnet Multi-Plan-Nutzung und Konfiguriert-vs-Beobachtet-Abweichungen und zeigt Plandaten im Dashboard, Tabellen-Drilldown, View All Tables, Aufbewahrungsbewertung und Exporten an. Detection-Analyzer-Auto-Close-Zuordnung korrigiert, sodass die Timing-Heuristik nur angewendet wird, wenn keine aktivierten Automatisierungsregeln existieren. 203 Tests bestanden |
| 0.7.0 | 2026-04-16 | Detection Assessment mit Kosten-Wert-Matrix-Zusammenfassungstabelle aktualisiert (Primär/Sekundär x7 Bewertungskategorien mit Farbcodierung), Drilldown-Untermenü für Primär-/Sekundärtabellen mit Kosten-/Detection-Stufen-Spalten. Detection Analyzer mit GB-gewichteten Volumenabdeckungsbalken aktualisiert (Detection/Hunting/kombinierte GB als Prozentsatz der Gesamtaufnahme neben den vorhandenen Tabellenzahl-Balken). Adaptive Anzeigeverbesserungen für Detection Analyzer (dynamische Balkenbreite, Regelnamenskürzung, bedingtes Ausblenden von Spalten basierend auf Konsolenbreite). 193 Tests bestanden |
| 0.6.3 | 2026-04-11 | Kleines Update für PSGallery |
| 0.6.2 | 2026-04-11 | Log-Tuning-/Transforms-Menü: Live-Daten-Tuning-Analyse (Feldnutzung pro Tabelle aus bereitgestellten Regeln/Hunting-Abfragen, Filter/Projekt/kombinierte KQL-Generierung, Einsparungsschätzungen), Schema-Spaltenextraktion aus der Tables-API, `Get-SplitKql`-Fallback-Hierarchie (Community-Statistiken → Kategorie-Standardwerte → universelle Felder), umfassender Tabellenbewerter mit Feldnutzungsmatrix, vereinheitlichte KB- + Live-Tuning-Exportabschnitte, `Build-FieldKnowledgeBase.ps1`-Mining-Skript für den Azure-Sentinel-GitHub-Regelkorpus. Detection Analyzer: SentinelHealth-basierte Auto-Close-Zuordnung (primär) mit operatorbewusstem Regelabgleich-Fallback, Boolean-Bedingungs-Wrapper-Parsing, Resolved-Status-Erkennung, GUID-Endabgleich für ARM-Ressourcen-IDs. Abdeckung jetzt tabellenzahlbasiert über alle Tabellen (einschließlich Free-Tier). Bewertungs-Haftungsausschluss zu TUI und Exporten hinzugefügt. 174 Tests |
| 0.6.1 | 2026-04-10 | Fehlerbehebungen: `$kqlKeywords`-Filterung jetzt auf Dateiebene gemeinsam genutzt (war in `Get-TablesFromKql` undefiniert), `[CmdletBinding()]` zu allen Hilfsfunktionen hinzugefügt, Defender-vereinheitlichter Check vereinfacht, Geister-`-RuleCount`-Testparameter entfernt. Robustheit: `Get-HuntingQueries`-Paginierung, `Invoke-AzRestWithRetry`-Wiederholungswrapper mit exponentiellem Backoff für 429/5xx, `PricePerGB`-Validierung, `Write-Verbose` in Schlüsselfunktionen. Dokumentation: Versionsbadge, DB-Anzahl, Voraussetzungen mit Manifest abgeglichen |
| 0.6.0 | 2026-04-10 | Dynamische XDR-Streaming-Erkennung mit 21 `KnownXDRTables` (vorher hartcodiert 18), `XDRState` pro Tabelle (`NotStreaming`/`Analytics`/`Basic`/`Auxiliary`), Auxiliary als Data-Lake-Stufe erkannt, nicht gestreamte XDR-Tabellen als Information/Low-Empfehlungen mit `NotStreamedCount` angezeigt, Aufbewahrungsanalysator zeigt nicht gestreamte XDR-Tabellen als „XDR only (30d)“, Übersichts-Stufenaufschlüsselung (Analytics/Basic/Data Lake + nicht gestreamt), Export-Report Auxiliary→„data lake“-Labels, Klassifikationsdatenbank auf 345 Einträge aktualisiert (+`DeviceNetworkInfo`, `DeviceInfo`→Sekundär/Data Lake, `DeviceImageLoadEvents` und `IdentityQueryEvents`→Data-Lake-Stufe), 15 neue Pester-Tests (insgesamt 121) |
| 0.5.0 | 2026-04-03 | Statischer HTML-Export mit reinen CSS-Tabs (null JS, kein CDN, vollständig eigenständig), vereinheitlichter MD/HTML-Abschnitts-Renderer, vollständige JSON-Datenerfassung (dataTransforms, correlationExcluded/Included, streamingTables), `-NonInteractive`-Schalter für CI/Pipeline-Nutzung, `md`-Format-Alias, datetime-gestempelte automatische Dateinamen, vollständige KQL-Anzeige in DCR-Transforms (keine Kürzung), mehrzeilige KQL-Behandlung in Markdown-Tabellen, korrigierte Regex-`$`-Backreference-Beschädigung beim HTML-Token-Ersetzen, interne Helfer umbenannt, um PowerShell-Alias-Konflikte zu vermeiden (`h`→`hEnc`, `md`→`mdEsc`), 33 neue Pester-Tests (insgesamt 106) |
| 0.4.1 | 2026-04-03 | Sicherheits- und Stabilitätskorrekturen – Token-Speicherbereinigung, Ausgabepfadvalidierung und XSS-Schutz, REST-API-Paginierungslimits, Behebung der Modullader-Fehlermaskierung und Auflösung von PSScriptAnalyzer-Warnungen hinzugefügt |
| 0.4.0 | 2026-04-02 | Transform-Erkennung (DCR-Auflistung + Transform-Typ-Klassifikation), Split-Tabellen-Erkennung (`_SPLT_CL`), Split-KQL-Helfer mit 15-Tabellen-Wissensbasis (`high-value-fields.json`) + Regelanalyse-Fallback, portalfertige nur-Bedingungs-KQL-Ausgabe, erweiterbare Empfehlungsliste, Split-KQL-Vorschlags-TUI-Menü |
| 0.3.0 | 2026-04-02 | Log-Aufbewahrungs-Compliance-Analyse (CISA M-21-31, NIST SP 800-92, NCSC-UK, ASD ACSC, NSA), Korrelations-Tag-Erkennung (`#DONT_CORR#`/`#INC_CORR#`), Aufbewahrungsbewertungs-Menüansicht, Aufbewahrungsspalte in All Tables, `recommendedRetentionDays` im Klassifikationsschema |
| 0.2.2 | 2026-04-02 | SOC-Optimierungstabelle blendet Detail-Spalte auf schmalen Konsolen aus |
| 0.2.1 | 2026-04-02 | Unterstützung benutzerdefinierter Klassifikation (`-CustomClassificationPath`), angereicherte SOC-Optimierungsempfehlungen mit API-Vorschlägen/Drilldown, nur-aktive-Standardansicht, Unterdrückung der UTF-8-Kodierungswarnung |
| 0.2.0 | - | Erste öffentliche Veröffentlichung mit Klassifikationsmodul, Kosten-Wert-Bewertung, Spectre.Console-TUI, Export nach JSON/Markdown |
| 0.1.0 | - | Interne Version für die Entwicklung |
## Bekannte Probleme
### PwshSpectreConsole-UTF-8-Kodierungswarnung
Um die UTF-8-Ausgabe in Ihrem Terminal zu aktivieren, fügen Sie die folgende Zeile am Anfang Ihrer PowerShell-`$PROFILE`-Datei hinzu und starten Sie das Terminal neu:```powershell
$OutputEncoding = [console]::InputEncoding = [console]::OutputEncoding = [System.Text.UTF8Encoding]::new()
Das Modul setzt dies beim Import automatisch, aber je nach Sitzung kann die Warnung trotzdem erscheinen. Sie ist rein kosmetisch und beeinträchtigt die Funktionalität nicht.
Mitwirken
Wenn du Probleme hast oder einen Beitrag leisten möchtest, erstelle einen Pull Request.