
Analizzatore di sorgenti di log per Microsoft Sentinel SIEM
Ho dovuto rispondere a "cosa stiamo ottenendo davvero da questi log?" o "quali sono i log consigliati per Microsoft Sentinel" più volte di quante riesca a contare. La risposta dipende sempre da così tante cose, ma possiamo essere generici. Quindi ho costruito questo coso proprio qui.
Log Horizon si connette al tuo workspace Microsoft Sentinel (e opzionalmente a Defender XDR), esamina ogni tabella di log che stai ingerendo e ti dice se stai ottenendo valore di sicurezza o stai solo bruciando denaro. Classifica le tabelle, le valuta rispetto alle tue regole di rilevamento e ti fornisce raccomandazioni concrete con stime di risparmio.
Importante: Questo è un approccio generico. Se sai che una fonte di log è importante per il tuo ambiente, quel contesto ha sempre la precedenza su ciò che questo strumento ti dice. Le classificazioni sono un punto di partenza, non un verbo sacro.
Vuoi leggere altro? Ho alcuni articoli su Log Horizon sul mio blog:
| Funzionalità | Descrizione |
|---|---|
| Motore di classificazione | Knowledge base di 481 voci che copre 240+ connettori, 22 categorie, con stato del ciclo di vita (deprecato/legacy più tabelle di sostituzione) e fallback euristico automatico per tabelle sconosciute |
| Valutazione costo-valore | Matrice per tabella tra fascia di costo e fascia di rilevamento con valutazione combinata (da Alto Valore a Basso Valore), prezzata in base al piano osservato (Analytics, Basic, Data Lake) |
| Raccomandazioni | 13 tipi di azioni prioritizzate: candidati per data lake o Basic, tabelle con zero rilevamenti, spreco di streaming XDR, filtraggio in fase di ingesto, candidati per split, utilizzo del piano, fonti deprecate, carenze di retention, risultati di XDR Checker e Detection Analyzer, ciascuno con stime di risparmio |
| Mappatura dei rilevamenti | Mappa le regole di analisi, le query di hunting e i rilevamenti XDR su ciascuna tabella per individuare lacune di copertura |
| Tag di correlazione | Rileva i tag #DONT_CORR# / #INC_CORR# nelle descrizioni delle regole e segnala le regole escluse dalla correlazione Defender |
| Conformità retention | Confronta la retention effettiva con i minimi raccomandati in base a standard di settore e best practice di sicurezza |
| Ottimizzazione SOC | Recupera le raccomandazioni di miglioramento SOC di Microsoft dall'API Security Insights |
| Analisi lacune per parole chiave | Segnala le tabelle che dovresti ingerire ma non stai ingerendo, in base a parole chiave di vendor/prodotto |
| Scoperta trasformazioni | Scopre le Data Collection Rules (DCR) che puntano al workspace (lista di sottoscrizioni filtrata sulla destinazione, la DCR di trasformazione del workspace e le associazioni del workspace), analizza le trasformazioni inline e multi-stadio e etichetta ogni operazione (filtro, proiezione, rimozione colonna, arricchimento, aggregazione) |
| Rilevamento tabelle split | Identifica le tabelle split _SPLT_CL e le collega alle tabelle padre nel motore di classificazione |
| Generatore KQL split | Genera KQL split pronto per il portale da una knowledge base curata, analisi live delle regole e statistiche di frequenza dei campi della community -- formato solo-condizione che si incolla direttamente nell'editor delle regole split di Sentinel. Le liste di campi vengono intersecate con lo schema live della tabella; qualsiasi cosa non presente viene segnalata come scartata |
[!CAUTION] Disclaimer
Questo strumento è sviluppato e mantenuto con l'aiuto dell'IA. Si prega di prestare attenzione quando si utilizza questa soluzione e di comprendere sempre cosa si sta eseguendo prima di eseguirlo in produzione. Lo sviluppatore non si assume alcuna responsabilità per vulnerabilità o problemi.
Scaricando, installando o utilizzando questo strumento, riconosci di aver letto, compreso e accettato questi termini.
| Cosa ti serve | Versione |
|---|---|
| PowerShell | 7.0+ |
| Moduli Az | Az.Accounts |
| Altri moduli | PwshSpectreConsole 2.6.3+ |
| Opzionale | Microsoft.Graph.Authentication (per -IncludeDefenderXDR come utente con accesso effettuato) |
Gli endpoint seguono l'ambiente Azure della sessione corrente di Connect-AzAccount, quindi i workspace Azure Government e Azure China funzionano senza parametri aggiuntivi. I valori del cloud pubblico vengono utilizzati quando non è disponibile alcun ambiente.
Se non hai già effettuato l'accesso ad Azure, il modulo avvierà Connect-AzAccount per te. Se invece sei già connesso, continuerà semplicemente.
Autorizzazioni: Log Analytics Reader e Microsoft Sentinel Reader sul workspace coprono l'analisi. La scoperta delle trasformazioni richiede anche Microsoft.Insights/dataCollectionRules/read (Monitoring Reader) sulla sottoscrizione o sul resource group; senza di essa l'esecuzione continua e stampa un avviso che indica l'autorizzazione mancante. -IncludeDefenderXDR utilizza Microsoft Graph con CustomDetection.Read.All, che per un utente con accesso effettuato significa il modulo opzionale Microsoft.Graph.Authentication.
Abbastanza semplice:```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
## Utilizzo
### Le basi
Inizia connettendoti ad Azure e assicurandoti di selezionare l'account e la sottoscrizione corretti:```powershell
Connect-AzAccount
Allora possiamo invocare lo strumento:```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" />
Dispone inoltre di un menu per approfondire altri output:
<img width="395" height="223" alt="{83CE9E6E-F373-49CD-BE05-182DB69F36BE}" src="https://assets.kitploit.com/production/public/readmes/13110/0606a575b10640bd13ebb87b930f74b2438167b5578cb843b412b4fcf273fc26.png" />
### Lacune nelle parole chiave + Defender XDR
Vuoi sapere se ti mancano tabelle relative a vendor specifici? Inserisci alcune parole chiave. Aggiungi `-IncludeDefenderXDR` se desideri anche l'analisi XDR.```powershell
Invoke-LogHorizon -SubscriptionId '...' -ResourceGroup 'rg' -WorkspaceName 'ws' -Keywords 'CrowdStrike','AWS','Okta' -IncludeDefenderXDR
Abilita l'analisi della qualità/rumore delle regole basata su incidenti e regole di automazione:```powershell Invoke-LogHorizon -SubscriptionId '...' -ResourceGroup 'rg' -WorkspaceName 'ws' -IncludeDetectionAnalyzer -DetectionLookbackDays 90
### Esporta un report```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/
Ora puoi aggiornare la conservazione e il tipo delle tabelle direttamente dalla TUI interattiva:
Invoke-LogHorizon normalmente, poi scegli Gestisci conservazione e tipo delle tabelle dal menu principale per aggiornamenti in blocco di conservazione o tipo.Per scripting o automazione, usa il comando pubblico dedicato:```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
### Modalità non interattiva / CI
Salta la TUI interattiva ed esporta direttamente in un file, utile per pipeline o esecuzioni pianificate:```powershell
Invoke-LogHorizon -SubscriptionId '...' -ResourceGroup 'rg' -WorkspaceName 'ws' -NonInteractive -Output json -OutputPath ./reports/
Se ometti -Output, l'oggetto di analisi viene restituito alla pipeline così puoi passarlo alla tua logica.
La fase di raccolta dati (utilizzo, regole, incidenti, tabelle, DCR) è memorizzata nella cache per impostazione predefinita, così rieseguire l'analisi sulla stessa area di lavoro, ad esempio per esportare un secondo formato o per riaprire la TUI, richiede secondi invece di minuti. La cache si trova in $env:LOCALAPPDATA\LogHorizon\cache (sostituibile con -CachePath), un file per ogni combinazione di sottoscrizione, gruppo di risorse, area di lavoro, -DaysBack, -DetectionLookbackDays, -IncludeDefenderXDR, -IncludeDetectionAnalyzer, i tre parametri di prezzo e la versione del modulo. Le voci più vecchie di -CacheMaxAgeMinutes (predefinito 60) vengono ignorate e ogni salvataggio elimina le voci scadute, così la cartella non accumula file di altri set di parametri o versioni precedenti. I token non vengono mai scritti nella cache; l'autenticazione viene eseguita a ogni chiamata, quindi la procedura guidata di conservazione ha sempre credenziali attive.
Il file di cache è Clixml in testo semplice. Con -IncludeDetectionAnalyzer contiene titoli, numeri, stato e classificazione degli incidenti dalla tua area di lavoro; i proprietari degli incidenti, gli autori delle regole e le identità dei proprietari assegnati non vengono raccolti. Usa -NoCache su macchine condivise o punta -CachePath a una posizione con il controllo degli accessi di cui hai bisogno.```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
### Ottimizzazione dei log e KQL di suddivisione
La TUI interattiva include un menu **Log Tuning / Transforms** con suggerimenti di ottimizzazione in tempo reale (utilizzo dei campi dalle regole distribuite e dalle query di caccia), KQL di suddivisione basato sulla knowledge base e un valutatore per singola tabella. Ogni blocco KQL è solo condizione e si incolla direttamente nell'editor di regole di suddivisione di Sentinel, con attribuzione della fonte (knowledge base, analisi delle regole o combinata).
### Prezzi personalizzati
I prezzi predefiniti sono West Europe Simplified PAYG in USD: 5,59 $/GB Analytics, 1,15 $/GB Basic, 0,20 $/GB Data Lake (0,07 ingestione + 0,13 elaborazione). Ogni tabella è prezzata in base al piano osservato nella tabella `Usage`, e lo stato gratuito deriva da `Usage.IsBillable`. I volumi utilizzano GB di fatturazione (1000 MB). Se il tuo livello di impegno è diverso:```powershell
Invoke-LogHorizon -SubscriptionId '...' -ResourceGroup 'rg' -WorkspaceName 'ws' -PricePerGB 4.61 -BasicPricePerGB 1.15 -LakePricePerGB 0.20
| Parametro | Tipo | Obbligatorio | Predefinito | Descrizione |
|---|---|---|---|---|
-SubscriptionId | string | Sì | - | ID della sottoscrizione Azure |
-ResourceGroup | string | Sì | - | Gruppo di risorse che contiene l'area di lavoro Sentinel |
-WorkspaceName | string | Sì | - | Nome dell'area di lavoro Log Analytics |
-WorkspaceId | string | No | - | ID dell'area di lavoro (risolto automaticamente se omesso) |
-Output | string | No | - | Formato di esportazione: json, markdown / md, o html (alias -o) |
-OutputPath | string | No | - | Percorso di file o directory per l'esportazione. Una directory esistente o un separatore finale genera un nome file con timestamp; un nome file senza estensione riceve l'estensione del formato; le directory mancanti vengono create |
-Keywords | string[] | No | - | Parole chiave per l'analisi delle lacune (es. 'AWS','CrowdStrike', alias -kw) |
-IncludeDefenderXDR | switch | No | - | Include l'analisi delle rilevazioni personalizzate Defender XDR |
-IncludeDetectionAnalyzer | switch | No | - | Include l'analisi delle rilevazioni rumorose per regola utilizzando incidenti e regole di automazione |
-DetectionLookbackDays | int | No | 90 | Finestra di query per l'analisi delle rilevazioni basata su incidenti/automazione (1-365 giorni) |
-DaysBack | int | No | 90 | Finestra di query per i dati di utilizzo (1-365 giorni) |
-PricePerGB | decimal | No | 5.59 |
Quindi ci sono quattro fasi.
Il modulo si connette ad Azure e recupera dati dalle API Log Analytics, Security Insights, Azure Monitor e Microsoft Graph. Ogni chiamata passa attraverso un wrapper di retry (errori 429, 5xx e di trasporto) e, a meno che non sia impostato -NoCache, i dati raccolti vengono memorizzati nella cache localmente per l'esecuzione successiva.
| Origine dati | API | Cosa recuperiamo |
|---|---|---|
| Utilizzo tabelle | Tabella Usage (KQL) | Volume di inserimento, piano e flag fatturabile per tabella nella finestra di query |
| Regole di analisi | REST Security Insights | Regole di rilevamento attive + tabelle che toccano + tag di correlazione, più consumatori impliciti di tabelle per tipi di regole non KQL |
| Query di caccia | REST ricerche salvate Log Analytics | Query di caccia salvate + tabelle referenziate |
| Connettori dati | REST Security Insights | Inventario dei connettori installati |
| Ottimizzazione SOC | REST Security Insights (anteprima) | Raccomandazioni SOC integrate di Microsoft |
| Conservazione tabelle | REST Tabelle Log Analytics | Conservazione per tabella, archivio, piano (Analytics/Basic/Auxiliary), flag ereditati-predefiniti e colonne dello schema |
| Regole di raccolta dati | REST Azure Monitor | DCR che puntano all'area di lavoro (elenco sottoscrizioni, DCR di trasformazione dell'area di lavoro, associazioni) e le loro trasformazioni |
| Defender XDR | Microsoft Graph | Regole di rilevamento personalizzate XDR (opzionale; CustomDetection.Read.All delegato o token Az Graph) |
| Incidenti | REST Security Insights | Esiti degli incidenti (stato/classificazione), tempistiche e suggerimenti di collegamento alle regole per la valutazione della qualità delle regole |
| Regole di automazione | REST Security Insights | Azioni di chiusura incidenti a livello di regola e condizioni di corrispondenza del titolo per l'attribuzione della chiusura automatica |
| SentinelHealth | KQL Log Analytics | Eventi di esecuzione delle regole di automazione con numeri di incidente per l'attribuzione definitiva della chiusura automatica (opzionale, richiede il monitoraggio dell'integrità) |
Ogni tabella viene classificata attraverso due passaggi:
Primo, una ricerca diretta nella knowledge base di 481 voci in Data/log-classifications.json. Ogni voce contiene il nome del connettore, classificazione primaria/secondaria, categoria di sicurezza, mapping delle origini dati MITRE, livello di prezzo e conservazione raccomandati, e flag opzionali del ciclo di vita (deprecato/legacy con tabelle di sostituzione, trasmissibilità XDR, piattaforma).
Se non c'è corrispondenza, entrano in gioco le regole euristiche, in questo ordine:
Alert, Incident, Threat, Signin, Logon, Audit, Risk, Detection (corrispondenza all'inizio delle parole PascalCase) -> primariaFlow, Metric, Diagnostic, Perf, Heartbeat, Health, Inventory, Usage -> secondariaAAD, Microsoft, Azure, Defender, Purview, Entra, Sentinel, Office, Intune, Windows ...) -> primaria, contrassegnata per revisione e aggiunta al database*Log/*Logs -> secondariaOgni tabella viene valutata su alcune dimensioni:
tablesWithRules / totalTables * 100. La copertura per tabella somma le regole di analisi + le query di caccia trovate analizzando KQL per i nomi delle tabelle.Data/implicit-consumers.json le mappa (corrispondenza Threat Intelligence -> ThreatIntelIndicators/ThreatIntelObjects, Fusion -> SecurityAlert/Anomalies, UEBA -> BehaviorAnalytics/UserPeerAnalytics/IdentityInfo, creazione incidenti Microsoft -> SecurityAlert). Le regole abilitate di questi tipi contano per la copertura effettiva, e ogni tabella riporta una CoverageSource di kql, xdr, implicit, platform o none. Le tabelle di piattaforma che Sentinel scrive per sé (SecurityIncident, SentinelHealth, Watchlist, Usage ...) non vengono mai contrassegnate come copertura mancante e ricevono la valutazione Platform.Poi il modulo genera raccomandazioni (13 tipi):
| Tipo | Quando si attiva | Cosa fare |
|---|---|---|
| Data Lake | Secondaria + costo elevato + pochi rilevamenti, e la tabella supporta il piano Auxiliary (ricade su una proposta di piano Basic quando è supportato solo Basic) | Spostare al livello Auxiliary/Data Lake; i risparmi sono il costo attuale meno lo stesso volume al tasso del lake (o Basic) |
| Basso valore | Costo elevato + zero rilevamenti | Aggiungere regole, filtrare o spostare al data lake |
| Ottimizza XDR | Trasmessa XDR + 0 regole Sentinel + esistono regole XDR | Interrompere la trasmissione, usare invece il portale XDR unificato |
| Copertura mancante | Primaria + zero rilevamenti (non tabelle di piattaforma) | Scrivere regole di analisi per ottenere valore dai dati |
| Filtro all'inserimento | Primaria + >20 GB + <=3 rilevamenti | Applicare una trasformazione all'inserimento per ridurre il volume |
| Candidato alla suddivisione | Primaria + volume elevato + rilevamenti + nessuna trasformazione esistente | Suddividere la tabella così che le righe ad alto valore restino su Analytics e il resto vada al Data Lake |
| Uso del piano | Le righe di utilizzo mostrano più di un piano, o il piano configurato differisce da quanto osservato da Usage | Verificare se la transizione di piano era prevista |
| Origine deprecata | Una tabella contrassegnata come deprecata o legacy nel database sta ancora inserendo dati | Migrare i rilevamenti alle tabelle di sostituzione, poi ritirare il vecchio connettore. Informativo: non vengono dichiarati risparmi perché l'inserimento si sposta piuttosto che scomparire |
| Carenza di conservazione | Conservazione dell'area di lavoro o della tabella inferiore alla baseline di 90 giorni | Aumentare la conservazione totale/archivio per soddisfare le linee guida normative |
| Miglioramento conservazione | Tabella a pagamento, non di piattaforma, che soddisfa i 90 giorni ma resta sotto la raccomandazione di categoria | Considerare una conservazione totale più lunga |
| Sotto la baseline interattiva | Tabella Analytics con conservazione interattiva (hot) sotto i 90 giorni | Alzare la conservazione interattiva ai 90 giorni inclusi da Sentinel, a meno che la finestra hot breve non sia intenzionale |
Le raccomandazioni vengono ordinate una volta, Alta > Media > Bassa e poi per risparmi stimati, e ogni output (JSON, Markdown, HTML, TUI) mantiene quell'ordine.
Quando passi -IncludeDetectionAnalyzer, il modulo recupera gli incidenti recenti e le regole di automazione, poi valuta ogni regola di analisi abilitata per la potenziale rumorosità.
Metriche per regola (calcolate dai dati degli incidenti):
| Metrica | Come viene calcolata |
|---|---|
| Incidenti totali | Conteggio degli incidenti collegati alla regola |
| Rapporto AutoClose | Incidenti chiusi dalle regole di automazione ÷ incidenti totali. Fonte primaria: tabella SentinelHealth (esecuzioni di regole di automazione per regole di chiusura incidenti o playbook abilitate, abbinate sul numero di incidente). Fallback: corrispondenza delle condizioni delle regole di automazione (id della regola analitica, condizioni di titolo e gravità, combinate con AND come fa Sentinel). Le regole le cui condizioni sono solo stato/tattiche/entità vengono trattate come applicabili a ogni incidente. |
| Rapporto falsi positivi | Incidenti classificati come falsi positivi ÷ incidenti totali |
Formula del punteggio di rumorosità:
Ogni metrica viene convertita in un rango percentile tra tutte le regole che hanno almeno un incidente. Il punteggio composito è una combinazione ponderata:``` Score = (Volume_percentile × 0.35) + (AutoClose_percentile × 0.40) + (FalsePositive_percentile × 0.25)
- **Percentile di volume (35%)**: quanti incidenti genera una regola rispetto alle altre regole.
- **Percentile di AutoClose (40%)**: quanto spesso gli incidenti vengono chiusi automaticamente dalle regole di automazione (peso maggiore perché la chiusura automatica è il segnale più forte di avvisi a basso valore).
- **Percentile di falsi positivi (25%)**: quanto spesso gli analisti classificano l'esito come falso positivo.
**Soglie di punteggio**:
| Punteggio | Etichetta | Significato |
|---|---|---|
| ≥ 70 | Rumorosa | La regola probabilmente necessita di ottimizzazione o disattivazione |
| ≥ 50 | Da monitorare | La regola mostra i primi segni di rumorosità |
| < 50 | Sana | La regola rientra nell'intervallo normale |
| N/D | - | La regola non ha incidenti correlati, o meno di 3 regole hanno incidenti, quindi non c'è nulla con cui confrontarsi |
Gli incidenti vengono raggruppati per ID della regola analitica (con fallback al nome della regola, poi al titolo), quindi due regole che condividono un nome visualizzato vengono valutate separatamente.
Le regole con un punteggio ≥ 70 e almeno 5 incidenti vengono automaticamente segnalate come **raccomandazioni ad alta priorità** nella vista Raccomandazioni.
### 5. Dashboard interattiva
Il menu principale offre queste viste:
- **Dashboard**: statistiche generali, top 10 delle tabelle più costose (le origini deprecate e legacy mostrano un badge), barra di copertura, riepilogo conformità conservazione, avviso esclusioni correlazione
- **Visualizza raccomandazioni**: azioni prioritarie con risparmio mensile stimato, espandibili per mostrare l'elenco completo quando ci sono più di 10 elementi
- **Visualizza valutazione rilevamento**: riepilogo matrice costo-valore, copertura per tabella di regole e query di caccia, drill-down primario/secondario, elenco regole escluse dalla correlazione
- **Visualizza analizzatore rilevamento**: classifica delle regole rumorose basata su percentili con indicatori di qualità di chiusura (quando hai usato `-IncludeDetectionAnalyzer`), browser regole ricercabile
- **Visualizza ottimizzazione SOC**: suggerimenti di miglioramento di Microsoft con drill-down
- **Visualizza valutazione conservazione**: tabelle al di sotto dei minimi raccomandati con conservazione attuale vs raccomandata, tipo di piano e carenza, più righe informative XDR
- **Visualizza trasformazioni dati**: inventario trasformazioni DCR con classificazione del tipo di trasformazione e KQL completo per tabella
- **Ottimizzazione log / Trasformazioni**: suggerimenti di ottimizzazione in tempo reale, KQL suddiviso per knowledge-base e valutatore per tabella con modifica di conservazione/tipo per singola tabella
- **Visualizza tutte le tabelle**: elenco completo con classificazione, piani, costo, regole, conservazione (codificata a colori) e valutazione; seleziona una tabella per un pannello di dettaglio (fonti di copertura, supporto piano, conservazione, stato, relative raccomandazioni)
- **Gestisci conservazione e tipo tabella**: procedura guidata per conservazione e piano in blocco con anteprima e applicazione
- **Dizionario**: ogni termine usato dallo strumento (classificazione, livelli di costo e rilevamento, valutazioni, fonti di copertura, i 13 tipi di raccomandazione, metriche e etichette di punteggio dell'Analizzatore rilevamento, piani tabella, stato del ciclo di vita, stati XDR, tipi di trasformazione) con le stesse definizioni di questo README, servito da `Data/dictionary.json`
- **Esporta report**: scegli un formato, poi un percorso (directory per un file con timestamp, o un nome file; Invio mantiene la directory corrente) e scrivi JSON, Markdown o HTML direttamente dal menu
- **Analisi XDR** appare nella dashboard quando hai usato `-IncludeDefenderXDR`
---
## Il database di classificazione
Situato in `Data/log-classifications.json`. **481 voci**, **243 connettori**, **22 categorie**.
### Cosa contiene ogni voce
| Campo | Cosa contiene |
|---|---|
| `tableName` | Nome della tabella Log Analytics (`SecurityEvent`, `SigninLogs`, ecc.) |
| `connector` | Quale connettore dati produce questa tabella |
| `classification` | `primary` (valore di sicurezza) o `secondary` (telemetria di supporto) |
| `category` | Categoria di sicurezza: Identity & Access, Network Security, ecc. |
| `description` | Riepilogo in linguaggio semplice di cosa contiene la tabella |
| `keywords` | Termini per l'analisi delle lacune tramite parole chiave |
| `mitreSources` | Mappature delle fonti dati MITRE ATT&CK |
| `recommendedTier` | `analytics` (livello hot) o `datalake` (candidato ausiliario) |
| `recommendedRetentionDays` | Conservazione totale minima raccomandata in giorni (linee guida normative) |
| `isFree` | Se Microsoft acquisisce questa tabella gratuitamente (il runtime usa prima `Usage.IsBillable`) |
| `status` | Opzionale. `deprecated` (connettore ritirato o acquisizione interrotta) o `legacy` (percorso di raccolta più vecchio con successore documentato) |
| `replacedBy` | Opzionale. Nomi delle tabelle verso cui migrare; presente ogni volta che `status` è impostato (può essere vuoto) |
| `xdrStreamable` | Opzionale, solo tabelle Defender. `true` per le 21 tabelle trasmesse dal connettore Defender XDR; `false` per tabelle solo-portale e TVM |
| `platform` | Opzionale. `true` per le tabelle che Sentinel stesso consuma (`SecurityIncident`, `Usage`, `Watchlist`, ...) che non necessitano mai di regole analitiche |
Le tabelle con uno `status` mostrano un badge nella TUI e nei report, e qualsiasi tabella che acquisisce ancora dati genera una raccomandazione `DeprecatedSource` che indica la sostituzione. Le tabelle con `xdrStreamable: false` non vengono mai trattate come candidate allo streaming XDR dal Controllo XDR.
### Dati di sicurezza primari vs secondari
**Primari** (278 voci): le tabelle su cui costruisci effettivamente i rilevamenti. Log di accesso, avvisi di sicurezza, threat intelligence, tracce di audit, risultati di vulnerabilità, hit firewall, telemetria EDR.
**Secondari** (203 voci): materiale di supporto. Metriche prestazionali, diagnostica infrastruttura, volumi di flusso di rete, snapshot di inventario, baseline di configurazione, controlli di integrità.
### Categorie a colpo d'occhio
| Categoria | Conteggio | Esempi |
|---|---|---|
| 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` |
### Supporto piani tabella
`Data/basic-plan-tables.json` e `Data/auxiliary-plan-tables.json` elencano le tabelle integrate che la [matrice delle funzionalità delle tabelle di Azure Monitor](https://learn.microsoft.com/en-us/azure/azure-monitor/reference/tables-features) indica come supportanti i piani Basic e Auxiliary (Data Lake). La procedura guidata di conservazione usa l'elenco Basic per validare i cambi di piano, e la raccomandazione `DataLake` propone il livello lake solo per le tabelle che lo supportano, ripiegando su un suggerimento di piano Basic dove quello è il livello più basso supportato. Le tabelle personalizzate basate su DCR supportano entrambi i piani; le tabelle personalizzate Classic non ne supportano nessuno. Entrambi i file vengono rigenerati da quella matrice a ogni release.
### Classificazioni personalizzate
Puoi fornire un tuo file di classificazione per **aggiungere** voci per tabelle non presenti nel database integrato, o **sovrascrivere** voci esistenti quando i valori predefiniti non corrispondono al tuo ambiente. Le voci personalizzate hanno precedenza su quelle integrate quando lo stesso `tableName` appare in entrambi.```powershell
Invoke-LogHorizon -SubscriptionId '...' -ResourceGroup 'rg' -WorkspaceName 'ws' `
-CustomClassificationPath './my-classifications.json'
Il file personalizzato utilizza lo stesso schema di Data/log-classifications.json, un array di oggetti:```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
}
]
Vedi `Data/custom-classifications-example.json` per un modello pronto all'uso.
### Come sono state costruite le classificazioni
La classificazione primaria/secondaria è stata realizzata in parte dall'autore e poi alimentando i connettori dati e le definizioni delle tabelle di Microsoft in un'IA con una baseline di valutazione umana, utilizzando le best practice Microsoft e gli standard di settore come criteri di classificazione. Se qualcosa non ti sembra corretto per il tuo ambiente, affidati al tuo contesto piuttosto che allo strumento: l'IA può commettere errori, e il contesto è fondamentale.
I criteri di classificazione sono stati tratti dalle seguenti fonti:
**ACSC (Australian Signals Directorate, Australian Cyber Security Centre)**
- [ACSC: Best practices for event logging and threat detection (ago 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 (mag 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**
- [Riferimento ai connettori dati di Microsoft Sentinel](https://learn.microsoft.com/en-us/azure/sentinel/data-connectors-reference)
- [Riferimento a tabelle e connettori di Microsoft Sentinel](https://learn.microsoft.com/en-us/azure/sentinel/sentinel-tables-connectors-reference)
- [Repository GitHub Azure-Sentinel](https://github.com/Azure/Azure-Sentinel) (regole di analisi della community, definizioni dei connettori, modelli di soluzione)
- [Fatturazione di Microsoft Sentinel](https://learn.microsoft.com/azure/sentinel/billing)
- [Gestione dei livelli dati di Microsoft Sentinel](https://learn.microsoft.com/azure/sentinel/manage-data-overview)
**MITRE**
- [Fonti dati di MITRE ATT&CK](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 - Regno Unito)**
- "What exactly should we be logging?" di NCSC-UK
**Google Cloud**
- [Panoramica dei log di controllo di Google Cloud](https://docs.cloud.google.com/logging/docs/audit)
- [Best practice per i log di controllo di Google Cloud](https://docs.cloud.google.com/logging/docs/audit/best-practices)
Sono state utilizzate anche altre fonti, insieme alla "competenza" degli autori, se così si può definire.
---
## Struttura del progetto```
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
Le knowledge base KQL suddivise, high-value-fields.json e field-frequency-stats.json, vengono costruite offline dal repository pubblico Azure/Azure-Sentinel (Solutions/, Detections/, Hunting Queries/, circa 3.800 file di regole YAML). Ogni query viene eseguita tramite gli stessi Get-TablesFromKql e Get-FieldsFromKql che il modulo utilizza in fase di esecuzione per costruire i conteggi di frequenza dei campi per tabella, da cui vengono derivati tre livelli di campi di fallback:
TimeGenerated)I campi estratti vengono uniti nel file curato high-value-fields.json (le voci curate vengono mantenute, le tabelle appena scoperte con almeno 3 regole e 3 campi significativi vengono aggiunte).
In fase di esecuzione, Get-SplitKql utilizza una gerarchia di fallback: voce KB curata -> analisi live dei campi di regole/hunting -> statistiche community per tabella -> default di categoria -> campi universali. La frequenza dei campi non è un metodo perfetto, ma è utile da conoscere.
437 test Pester v5, nessuna connettività Azure richiesta. Eseguiteli da una sessione PowerShell semplice piuttosto che dal terminale integrato di VS Code:```powershell Invoke-Pester ./Tests/LogHorizon.Tests.ps1 -Output Detailed
## Licenza
GPL-3.0. Vedi [LICENSE](https://github.com/lnfernux/log-horizon/blob/main/LICENSE).
## Cronologia versioni
| Versione | Data | Modifiche |
|---|---|---|
| 0.9.0 | 2026-09-06 | Release di remediation da una revisione completa di codice e dati. Correttezza: prezzi basati sul piano da `Usage.Plan` e `Usage.IsBillable` con tariffe Basic e Data Lake e GB di fatturazione (1000 MB), attribuzione di auto-chiusura del Detection Analyzer limitata alle regole di chiusura/playbook abilitate (`triggeringLogic.isEnabled`), incidenti tramite `2025-09-01` con `$top=1000`, copertura implicita per tipi di regole non-KQL e tabelle di piattaforma (`implicit-consumers.json`), controllo di base della retention interattiva, ordinamento singolo delle raccomandazioni. Trasformazioni: individuazione DCR a livello di sottoscrizione filtrata sulla workspace di destinazione più la DCR di trasformazione della workspace e le associazioni, con stato visibile e avviso quando manca un'autorizzazione; parsing di trasformazioni workspace e multi-stage; KQL suddiviso intersecato con lo schema live delle tabelle. Robustezza: cache di raccolta attiva per impostazione predefinita (`-NoCache`, `-RefreshCache`, `-CacheMaxAgeMinutes`, `-CachePath`), autenticazione prima dello spinner con avvisi stampati successivamente, output TUI e Markdown con escape, risoluzione del percorso di esportazione che crea le directory e restituisce il percorso scritto, meta CSP in HTML, nuovi tentativi REST su errori di trasporto e completamento asincrono in stile Location, risoluzione della workspace tramite REST (`Az.Resources` rimosso), validazione della classificazione personalizzata, euristiche sensibili a PascalCase con fallback di prima parte Microsoft, timeout regex. Gli endpoint seguono l'ambiente Azure connesso (Government, China) e le versioni API sono state spostate a SecurityInsights `2025-09-01`, OperationalInsights `2025-07-01`, raccomandazioni `2025-10-01-preview`. Dati: database di classificazione 345 -> 481 voci con chiavi `status`/`replacedBy`/`xdrStreamable`/`platform`, 80+ tabelle di prima parte e 35 successori, correzioni delle etichette dei connettori, correzioni `isFree`; rigenerati `basic-plan-tables.json` e nuovo `auxiliary-plan-tables.json` dalla matrice delle funzionalità delle tabelle di Azure Monitor; raccomandazione `DeprecatedSource`, raccomandazione Data Lake basata sul piano con fallback Basic, XDR Checker rispetta la streamability, badge del ciclo di vita in TUI ed esportazioni. Passaggio di revisione: la chiave della cache copre prezzi e versione del modulo, booleani e livelli di classificazione personalizzata analizzati anziché convertiti, attribuzione di auto-chiusura sensibile alla gravità, predicati KQL suddivisi verificati contro lo schema live, stato di fetch XDR mostrato anziché un `$null` silenzioso, percorsi di output senza estensione sono file, identità dei proprietari degli incidenti non più raccolte. Menu dizionario nella TUI con ogni termine usato dallo strumento, supportato da `Data/dictionary.json` e ancorato al codice tramite test. Gli oggetti di automazione delle regole e di rilevamento personalizzato Defender sono proiettati sui campi consumati, quindi le identità degli autori (createdBy, lastModifiedBy, proprietari assegnati) non raggiungono mai la cache o le esportazioni. Licenza GPL-3.0. 437 test |
| 0.8.0 | 2026-05-26 | Aggiunta gestione interattiva della retention delle tabelle con un nuovo flusso TUI bulk e punto di ingresso per l'aggiornamento di singole tabelle, più il comando pubblico `Set-LogHorizonTableRetention`. Aggiunto motore di applicazione PATCH dell'API Tables con validazione, polling delle operazioni asincrone di Azure e fallback in due passaggi (PATCH combinato, poi solo piano più solo retention) per aggiornamenti di retention resilienti. Aggiunta copertura Pester mirata per validazione, forma del payload, fallback e mapping dei comandi pubblici. Corregge anche un caso limite/bug in cui gli utenti ricevevano raccomandazioni di cambiare tabelle data lake al livello data lake se avevano ancora dati di analisi in Sentinel |
| 0.7.1 | 2026-05-15 | Aggiunta consapevolezza del piano da `Usage.Plan` senza sostituire il piano configurato delle tabelle: l'analisi ora traccia la cronologia dei piani osservati, segnala l'uso multi-piano e le discrepanze configurato-vs-osservato, e mostra i dati del piano nel dashboard, nel drill-down delle tabelle, in View All Tables, nella valutazione della retention e nelle esportazioni. Corretta l'attribuzione di auto-chiusura del Detection Analyzer così che l'euristica temporale si applichi solo quando non esistono regole di automazione abilitate. 203 test superati |
| 0.7.0 | 2026-04-16 | Valutazione del rilevamento aggiornata con tabella riepilogativa della matrice costo-valore (categorie di valutazione Primario/Secondario x7 con codifica colore), sottomenu di drill-down per tabelle primarie/secondarie con colonne di livello costo/rilevamento. Detection Analyzer aggiornato con barre di copertura del volume ponderate in GB (GB di rilevamento/hunting/combinati come percentuale dell'ingestione totale accanto alle barre esistenti del conteggio tabelle). Miglioramenti del display adattivo per Detection Analyzer (larghezza dinamica delle barre, troncamento dei nomi delle regole, occultamento condizionale delle colonne in base alla larghezza della console). 193 test superati |
| 0.6.3 | 2026-04-11 | Aggiornamento minore per PSGallery |
| 0.6.2 | 2026-04-11 | Menu Log Tuning / Transforms: analisi live del tuning dei dati (uso dei campi per tabella dalle regole/query di hunting distribuite, generazione KQL filter/project/combinato, stime di risparmio), estrazione delle colonne dello schema dall'API Tables, gerarchia di fallback `Get-SplitKql` (statistiche community → impostazioni predefinite per categoria → campi universali), valutatore completo delle tabelle con matrice di uso dei campi, sezioni di esportazione unificate KB + tuning live, script di mining `Build-FieldKnowledgeBase.ps1` per il corpus di regole GitHub di Azure-Sentinel. Detection Analyzer: attribuzione di auto-chiusura basata su SentinelHealth (primaria) con fallback di corrispondenza regole sensibile all'operatore, parsing del wrapper delle condizioni booleane, rilevamento dello stato Resolved, corrispondenza della coda GUID per ID risorsa ARM. La copertura ora è basata sul conteggio delle tabelle su tutte le tabelle (incluso il livello gratuito). Nota di non responsabilità sul punteggio aggiunta a TUI ed esportazioni. 174 test |
| 0.6.1 | 2026-04-10 | Correzioni di bug: il filtro `$kqlKeywords` ora è condiviso a livello di file (era indefinito in `Get-TablesFromKql`), `[CmdletBinding()]` aggiunto a tutte le funzioni helper, controllo unificato Defender semplificato, rimosso il parametro di test fantasma `-RuleCount`. Robustezza: paginazione di `Get-HuntingQueries`, wrapper di nuovo tentativo `Invoke-AzRestWithRetry` con backoff esponenziale per 429/5xx, validazione di `PricePerGB`, `Write-Verbose` nelle funzioni chiave. Documentazione: badge della versione, conteggio DB, prerequisiti allineati al manifest |
| 0.6.0 | 2026-04-10 | Rilevamento dinamico dello streaming XDR con 21 `KnownXDRTables` (era hardcoded 18), `XDRState` per tabella (`NotStreaming`/`Analytics`/`Basic`/`Auxiliary`), Auxiliary riconosciuto come livello data lake, tabelle XDR non in streaming mostrate come raccomandazioni Information/Low con `NotStreamedCount`, analizzatore di retention mostra le tabelle XDR non in streaming come "XDR only (30d)", ripartizione dei livelli nella panoramica (analytics/basic/data lake + non in streaming), etichette Export-Report Auxiliary→"data lake", database di classificazione aggiornato a 345 voci (+`DeviceNetworkInfo`, `DeviceInfo`→secondario/data lake, `DeviceImageLoadEvents` e `IdentityQueryEvents`→livello data lake), 15 nuovi test Pester (121 totali) |
| 0.5.0 | 2026-04-03 | Esportazione HTML statica con schede CSS pure (zero JS, nessun CDN, completamente autonoma), renderer unificato delle sezioni MD/HTML, acquisizione completa dei dati JSON (dataTransforms, correlationExcluded/Included, streamingTables), interruttore `-NonInteractive` per uso CI/pipeline, alias di formato `md`, nomi file automatici con timestamp, visualizzazione KQL completa nelle trasformazioni DCR (nessun troncamento), gestione KQL multilinea nelle tabelle markdown, corrotto il backreference regex `$` nella sostituzione dei token HTML, helper interni rinominati per evitare conflitti di alias PowerShell (`h`→`hEnc`, `md`→`mdEsc`), 33 nuovi test Pester (106 totali) |
| 0.4.1 | 2026-04-03 | Correzioni di sicurezza e stabilità - aggiunta sanificazione della memoria dei token, validazione dei percorsi di output e protezione XSS, limiti di paginazione dell'API REST, corretto il mascheramento degli errori del caricatore di moduli e risolti gli avvisi PSScriptAnalyzer |
| 0.4.0 | 2026-04-02 | Individuazione delle trasformazioni (elenco DCR + classificazione dei tipi di trasformazione), rilevamento delle tabelle suddivise (`_SPLT_CL`), helper KQL suddiviso con knowledge base di 15 tabelle (`high-value-fields.json`) + fallback di analisi delle regole, output KQL solo-condizione pronto per il portale, elenco espandibile delle raccomandazioni, menu TUI dei suggerimenti KQL suddivisi |
| 0.3.0 | 2026-04-02 | Analisi di conformità della retention dei log (CISA M-21-31, NIST SP 800-92, NCSC-UK, ASD ACSC, NSA), rilevamento dei tag di correlazione (`#DONT_CORR#`/`#INC_CORR#`), vista menu di valutazione della retention, colonna retention in All Tables, `recommendedRetentionDays` nello schema di classificazione |
| 0.2.2 | 2026-04-02 | La tabella di ottimizzazione SOC nasconde la colonna Detail su console strette |
| 0.2.1 | 2026-04-02 | Supporto classificazione personalizzata (`-CustomClassificationPath`), raccomandazioni di ottimizzazione SOC arricchite con suggerimenti API/drill-down, vista predefinita solo-attivi, soppressione dell'avviso di codifica UTF-8 |
| 0.2.0 | - | Prima release pubblica con motore di classificazione, punteggio costo-valore, TUI Spectre.Console, esportazione in JSON/Markdown |
| 0.1.0 | - | Versione interna per lo sviluppo |
## Problemi noti
### Avviso di codifica UTF-8 PwshSpectreConsole
Per abilitare l'output UTF-8 nel tuo terminale, aggiungi la seguente riga all'inizio del tuo file `$PROFILE` di PowerShell e riavvia il terminale:```powershell
$OutputEncoding = [console]::InputEncoding = [console]::OutputEncoding = [System.Text.UTF8Encoding]::new()
Il modulo lo imposta automaticamente all'importazione, ma a seconda della sessione l'avviso potrebbe comunque apparire. È solo estetico e non influisce sulla funzionalità.
Se hai problemi o vuoi contribuire, crea una PR.
| Detection Analyzer | Valuta le regole analitiche per potenziale rumorosità usando gli esiti degli incidenti (rapporto di auto-chiusura, rapporto di falsi positivi e percentili del volume di incidenti) |
| XDR Checker | Aggiunge un livello consultivo incentrato su XDR: controlli di copertura dello streaming e indicazioni di retention di un anno su Data Lake per la telemetria correlata a XDR |
| Classificazioni personalizzate | Fornisci il tuo JSON per aggiungere o sovrascrivere il database di classificazione integrato |
| Cache di raccolta | I dati raccolti dal workspace vengono memorizzati in cache localmente (default 60 minuti) così che le riesecuzioni e le riesportazioni richiedano secondi; disattivabile con -NoCache |
| Cloud sovrani | Gli endpoint ARM, Log Analytics e Graph seguono l'ambiente Azure in cui si è effettuato l'accesso (pubblico, US Government, Cina) |
| TUI interattiva | Dashboard Spectre.Console con menu, tabelle codificate a colori, drill-down, procedura guidata per la retention e arte ASCII |
| Esportazione | Report JSON, Markdown o HTML statico per la condivisione con il team |
Prezzo di inserimento per GB del livello Analytics di Sentinel (alias -ppgb) |
-BasicPricePerGB | decimal | No | 1.15 | Prezzo per GB dei log Basic |
-LakePricePerGB | decimal | No | 0.20 | Prezzo per GB del livello Auxiliary / Data Lake (inserimento + elaborazione) |
-NonInteractive | switch | No | - | Salta la dashboard TUI ed esporta direttamente (o restituisce i dati alla pipeline se -Output è omesso) |
-CustomClassificationPath | string | No | - | Percorso di un file JSON personalizzato per aggiungere o sovrascrivere le classificazioni (alias -clf) |
-NoCache | switch | No | - | Non leggere né scrivere la cache di raccolta |
-RefreshCache | switch | No | - | Raccogli dati aggiornati e sovrascrivi la voce della cache |
-CacheMaxAgeMinutes | int | No | 60 | Età massima di una voce della cache da riutilizzare (1-10080) |
-CachePath | string | No | $env:LOCALAPPDATA\LogHorizon\cache | Directory per i file della cache |
| Controllo XDR |
| Tabella Defender XDR nota non trasmessa, trasmessa senza copertura, non inoltrata al Data Lake, o sotto l'anno di consulenza |
| Rivedere trasmissione e conservazione per la telemetria XDR |
| Analizzatore di rilevamenti | Punteggi regola >= 70 con almeno 5 incidenti (con -IncludeDetectionAnalyzer) | Ottimizzare o disabilitare la regola rumorosa |