Cos’è il KQL (Kusto Query Language) e perché è la competenza chiave nella Cybersecurity e nell’Analisi Dati

This post has already been read 2 times!

Cos'è il KQL (Kusto Query Language)

Perché il KQL è diventato il linguaggio fondamentale per la Cybersecurity e l’Analisi Dati

Nel 2015, chiunque pianificasse una carriera nella sicurezza informatica o nell’analisi dei flussi digitali studiava Python, SQL o Java. Era la scelta logica, quasi obbligata.

Oggi, a distanza di poco più di dieci anni, quello scenario è stato scosso dalle fondamenta. Se si scorrono i requisiti per posizioni critiche come Threat Hunter o Detection Engineer, emerge un nome che ricorre con un’insistenza quasi ossessiva: KQL.

Il Kusto Query Language non è semplicemente l’ennesima sintassi da aggiungere al curriculum per superare un colloquio tecnico. Rappresenta la linea di demarcazione tra chi subisce passivamente la valanga quotidiana di log aziendali e chi riesce a guidarla per prendere decisioni prima che sia troppo tardi.

Eppure, la maggior parte dei percorsi accademici tradizionali non lo menziona nemmeno.


Da amministratore di sistema a investigatore digitale

Per comprendere il valore reale di KQL bisogna osservare la metamorfosi del lavoro nell’era del cloud. Fino a poco tempo fa, un amministratore di sistema gestiva perimetri definiti: server fisici, firewall, applicazioni e reti locali.

Oggi, una grande organizzazione produce milioni di eventi ogni singolo secondo. Ogni login, ogni file modificato, ogni connessione di un dispositivo periferico lascia una traccia digitale. Il problema contemporaneo non è l’archiviazione di questi dati, ma la loro interpretazione in tempo reale.

In questo spazio si colloca il Threat Hunter. Il suo compito non è aspettare che un sistema automatico invii una notifica di pericolo, ma muoversi nell’ombra, cercando attivamente anomalie infinitesimali che anticipano un attacco strutturato. È un lavoro che richiede un approccio più simile a quello di un investigatore forense che di un classico tecnico informatico. E lo strumento principale di questa indagine è proprio KQL.


KQL come framework di pensiero

Limitarsi a definire KQL come un linguaggio di query è corretto, ma riduttivo. KQL è, a tutti gli effetti, un sistema strutturato per ragionare sui dati.

Prendiamo una query elementare, quasi intuitiva:

SigninLogs
| where TimeGenerated >= ago(7d)
| summarize count() by UserPrincipalName
| sort by count_ desc

Anche senza competenze specifiche, il meccanismo sequenziale è evidente: si isolano i log di accesso, si restringe il campo agli ultimi sette giorni, si aggregano i tentativi per utente e si ordinano i risultati dal più alto al più basso.

Questa struttura a pipeline (rappresentata dal simbolo |) obbliga il professionista a procedere per gradi logici consecutivi. È questa linearità che trasforma lo strumento tecnico in una mappa mentale per l’analista.


La progettazione della difesa: il Detection Engineer

Una delle figure più richieste e complesse del mercato attuale è il Detection Engineer. Questa figura non si limita a usare le regole esistenti, ma progetta la logica capace di intercettare le minacce emergenti.

Scenario tipico:

un utente si autentica regolarmente dalla sede di Milano. Nel giro di tre ore, lo stesso account registra accessi da Singapore, New York e Francoforte. Se un analista junior potrebbe notarlo solo a posteriori, un Detection Engineer traduce l’esperienza umana in una query KQL automatizzata in grado di bloccare l’anomalia all’istante. Questa capacità di trasformare l’intuizione investigativa in codice predittivo è ciò che il mercato valuta più a caro prezzo.

Unire i puntini: la correlazione multi-tabella con l’operatore join

Nella sicurezza informatica, i dati isolati raccontano solo mezza storia. La vera transizione da analista junior a investigatore digitale avviene quando si impara a connettere fonti informative diverse, ad esempio, un alert generato dal firewall di rete e i registri di accesso degli utenti nel cloud, per ricostruire l’intera dinamica di un incidente.

Immaginiamo che il firewall aziendale rilevi un traffico anomalo verso un indirizzo IP dannoso noto (registrato nella tabella NetworkAlerts), senza però specificare quale utente stia usando quella macchina in quel momento. Attraverso una inner join, possiamo incrociare in tempo reale questi dati con i log di autenticazione di Microsoft Entra ID (SigninLogs), usando l’indirizzo IP come punto di contatto:

NetworkAlerts
| where TimeGenerated >= ago(1d)
| where Severity == "High"
| project AlertTime=TimeGenerated, AlertName, SourceIP
| join kind=inner (
    SigninLogs
    | where TimeGenerated >= ago(1d)
    | where ResultType == 0 // Accessi riusciti
    | project LoginTime=TimeGenerated, UserPrincipalName, IPAddress
) on $left.SourceIP == $right.IPAddress
| where datetime_diff('minute', AlertTime, LoginTime) between (0 .. 30)
| project AlertTime, AlertName, UserPrincipalName, SourceIP

Questa query mostra come l’operatore join consenta di arricchire gli alert di rete con il contesto utente, trasformando un semplice evento di rete in un incidente investigabile che collega un IP sospetto a un account specifico.

Questo approccio risponde a una logica precisa: entrambe le tabelle vengono filtrate prima dell’unione per non sprecare risorse di calcolo, mentre la funzione datetime_diff assicura una correlazione temporale stretta (30 minuti), escludendo i falsi positivi dovuti al cambio di IP dinamici durante la giornata.


Il vero valore non risiede nella sintassi

I manuali tecnici abbondano di spiegazioni su operatori come where, summarize, project o join. Ma la sintassi è solo lo strato superficiale della competenza. Le aziende non investono su professionisti che ricordano a memoria i comandi, ma su profili capaci di porre le domande corrette alla base dati.

La differenza di approccio è netta:

  • Un profilo junior chiede alla macchina: “Quanti accessi falliti ci sono stati oggi?”
  • Un profilo avanzato chiede: “Quali comportamenti si discostano in modo statisticamente significativo dalla baseline di questa settimana?”

KQL, in questo senso, agisce come un acceleratore del pensiero analitico.


Risolvere un incidente in pochi minuti: un caso reale

All’interno di un SOC (Security Operations Center) moderno, la gestione del rumore di fondo è una sfida quotidiana. Immaginiamo un picco improvviso e imprevisto di autenticazioni fallite su un server critico. Le opzioni sul tavolo sono diverse: un attacco brute force in corso, un errore sistemico di configurazione o un bug di un’applicazione interna.

Attraverso una query KQL ben mirata, un analista è in grado di isolare la telemetria in pochi minuti, scoprendo che l’intero blocco di traffico anomalo proviene da una singola macchina aggiornata poche ore prima. Nessuna violazione, solo un loop software. La capacità di separare un falso allarme da un disastro informatico in una manciata di minuti evita il blocco ingiustificato dei reparti aziendali, dimostrando il ritorno sull’investimento di una simile competenza.

Oltre il semplice conteggio: l’analisi delle serie temporali con make-series

L’analisi forense e il monitoraggio dei dati non si limitano a contare quanti eventi anomali si sono verificati, ma studiano come questi eventi si distribuiscono nel tempo. È qui che KQL si avvicina alla Data Science. L’operatore make-series trasforma righe di log piatte in una sequenza temporale continua, colmando automaticamente i “buchi” nei momenti in cui non sono avvenuti eventi.

Se prendiamo il caso precedente delle autenticazioni fallite, un analista senior non si limita a estrarre un elenco, ma crea una baseline degli ultimi 7 giorni, aggregando i dati in blocchi di un’ora per ciascun utente:

SigninLogs
| where TimeGenerated >= ago(7d)
| where ResultType != 0 // Isola solo i tentativi di login falliti
| make-series FailedLogins=count() default=0 on TimeGenerated from ago(7d) to now() step 1h by UserPrincipalName

L’aspetto fondamentale di questa query è l’istruzione default=0: se in una determinata ora un utente non ha registrato fallimenti, la macchina inserisce uno zero anziché un valore vuoto (null). Questo genera un vettore matematico pulito e standardizzato, che rappresenta il punto di partenza ideale per applicare funzioni di machine learning nativo di Kusto, capaci di distinguere un normale picco di lavoro del lunedì mattina da un vero attacco informatico automatizzato.


La convergenza dei ruoli ibridi

Il mercato del lavoro premia sempre di più le figure ibride, e KQL si posiziona esattamente all’incrocio di quattro macro-aree:

  1. Cybersecurity: Comprensione profonda di vettori di attacco, vulnerabilità e indicatori di compromissione (IoC).
  2. Data Science e Analisi Dati: Capacità di gestire aggregazioni, distribuzioni statistiche, serie temporali e rilevamento dei valori anomali (outliers).
  3. Cloud Infrastructure: Familiarità con gli ambienti in cui risiedono i dati, in particolare l’ecosistema Microsoft (Azure Monitor, Microsoft Sentinel, Defender XDR).
  4. Logica Investigativa: Attitudine a formulare ipotesi d’indagine e a validarle attraverso i dati.

Chi riesce a sintetizzare questi quattro aspetti sviluppa un profilo professionale difficilmente sostituibile.


L’ecosistema delle competenze KQL

Per strutturare una crescita professionale in questo campo, è utile mappare la competenza su quattro livelli progressivi:

  1. Sintassi di base: Apprendimento degli operatori fondamentali e della struttura delle pipeline.
  2. Modellazione della telemetria: Comprensione dell’architettura dei dati, delle relazioni tra tabelle diverse e della provenienza dei log.
  3. Investigazione avanzata: Sviluppo della capacità di formulare query complesse per correlare eventi distanti nel tempo o nello spazio logico.
  4. Automazione e Intelligence: Trasformazione delle query in regole di detection continue e processi di risposta automatizzati.

Perché si tratta di una competenza “anti-fragile” di fronte all’IA

Una delle obiezioni più frequenti riguarda l’avvento dei modelli linguistici aziendali: se un’intelligenza artificiale può scrivere una query KQL partendo da un testo semplice, ha ancora senso studiare questo linguaggio?

La risposta risiede nella natura stessa del lavoro analitico. L’IA è eccellente nel tradurre una richiesta in codice, ma non possiede il contesto strategico per decidere quale domanda sia rilevante porre in un determinato momento. Possedere la padronanza concettuale del KQL permette di validare i risultati generati dagli assistenti digitali, scartare le allucinazioni del software e interpretare l’output in modo critico. L’evoluzione tecnologica non cancella il professionista, ma ne sposta il baricentro verso un’attività a più alto valore cognitivo.


I passi per iniziare

Chi sceglie di orientarsi verso questo settore può seguire un percorso lineare:

  1. Familiarizzare con i concetti fondamentali di telemetria e gestione dei log strutturati.
  2. Sperimentare gli operatori di base di KQL utilizzando gli ambienti di test gratuiti messi a disposizione da Microsoft.
  3. Analizzare i casi di studio reali legati agli incidenti di sicurezza e alle violazioni di dati.
  4. Applicare le query a scenari pratici di caccia alle minacce (threat hunting).
  5. Integrare l’uso degli strumenti di automazione e degli assistenti di intelligenza artificiale per velocizzare il flusso di lavoro.

Sviluppare questa combinazione di competenze significa posizionarsi in una delle traiettorie più stabili e remunerative dell’attuale mercato tecnologico.

Domande e Risposte per un Colloquio su KQL e Analisi Dati

Ecco una selezione delle domande più probabili e strategiche per un colloquio di lavoro incentrato sull’analisi avanzata dei dati, sulla cybersecurity e sull’uso di KQL (Kusto Query Language).

Le risposte sono strutturate per dimostrare non solo la conoscenza della sintassi, ma soprattutto la capacità di risolvere problemi reali.

1. Domande Tecniche su KQL e Logica dei Dati

Q1: Qual è la differenza fondamentale tra l’approccio di SQL e quello di KQL nella manipolazione dei dati?

Risposta ideale:

“La differenza principale risiede nella struttura logica e nella finalità originaria dei due linguaggi. SQL è dichiarativo e nasce per database relazionali (OLTP); le query richiedono spesso sottoquery annidate o JOIN complessi che possono frammentare la lettura del flusso logico.

KQL, al contrario, adotta una struttura a pipeline sequenziale strutturata con l’operatore pippa (|). È pensato specificamente per l’analisi di serie temporali e flussi massivi di telemetria (OLAP). In KQL i dati entrano dall’alto e vengono raffinati, filtrati e aggregati passo dopo passo, muovendosi da sinistra a destra e dall’alto verso il basso. Questo rende il codice KQL intrinsecamente più leggibile, più veloce da scrivere durante un’emergenza (incident response) e più efficiente nel calcolo su miliardi di righe.”


Q2: Se una query KQL su una tabella enorme (es. SecurityEvent) va in timeout, quali sono le prime azioni di ottimizzazione che intraprendi?

Risposta ideale:

“L’ottimizzazione in KQL segue una regola d’oro: ridurre il volume dei dati il prima possibile all’interno della pipeline. Seguirei questi passi:

  1. Filtro temporale immediato: Inserire l’operatore where TimeGenerated >= ago(...) come primissima riga, subito dopo il nome della tabella. Kusto indicizza i dati per tempo; non filtrare subito significa forzare una scansione completa inutile.
  2. Filtrare per colonne indicizzate: Applicare filtri specifici su colonne ad alta cardinalità (come EventID o Computer) subito dopo il filtro temporale.
  3. Proiezione preventiva: Usare project o project-away per mantenere in memoria solo le colonne strettamente necessarie per l’analisi, riducendo l’impatto sull’utilizzo della RAM.
  4. Aggregazione precoce: Se devo fare dei conteggi, uso summarize prima di effettuare eventuali join o operazioni di stringa pesanti (come has o contains), evitando di trascinare record di dettaglio non necessari.”

Esempio di struttura ottimizzata:

SecurityEvent
| where TimeGenerated >= ago(1d)      // 1. Filtro temporale subito
| where EventID == 4624               // 2. Filtro indicizzato
| project TimeGenerated, Computer, Account  // 3. Riduzione colonne
| summarize Count=count() by Account, Computer  // 4. Aggregazione

2. Domande di Scenario e Detection Engineering

Q3: Come struttureresti una logica in KQL per identificare un potenziale attacco di “Impossible Travel” (un utente che effettua l’accesso da due nazioni diverse in un lasso di tempo fisicamente impossibile)?

Risposta ideale:

“Per risolvere questo scenario serve correlare i dati di accesso dello stesso utente in un intervallo temporale ridotto. La logica si sviluppa così:

  1. Estraggo i log di accesso riusciti (es. dalla tabella SigninLogs) in un arco temporale di 24 ore.
  2. Uso l’operatore serialize insieme alle funzioni della finestra temporale come next() o prev() per confrontare ogni accesso con quello successivo effettuato dallo stesso utente.
  3. Calcolo la distanza geografica o verifico semplicemente se la nazione (IP Country) è cambiata.
  4. Calcolo il delta temporale tra i due accessi consecutivi utilizzando datetime_diff().
  5. Se il delta temporale è inferiore a poche ore e le nazioni sono geograficamente distanti (es. Italia e Singapore), isolo il record come anomalia.”

Esempio di query:

SigninLogs
| where TimeGenerated >= ago(1d)
| where ResultType == 0               // Accessi riusciti
| project TimeGenerated, UserPrincipalName, Location, IPAddress
| order by UserPrincipalName asc, TimeGenerated asc
| serialize
| extend NextLocation = next(Location), NextTime = next(TimeGenerated)
| where UserPrincipalName == next(UserPrincipalName)
| where Location != NextLocation
| extend TimeDeltaMinutes = datetime_diff('minute', NextTime, TimeGenerated)
| where TimeDeltaMinutes < 120        // Meno di due ore tra i due accessi

3. Metodologia e Gestione del Progetto Analitico

Q4: Le regole di rilevamento automatico (Detection) possono generare molti falsi positivi, intasando il lavoro del team. Qual è il tuo approccio per fare “tuning” (messa a punto) di una query rumorosa?

Risposta ideale:

“La gestione del rumore di fondo è una priorità strategica. Se una query genera troppi alert, non la disattivo, ma applico un processo iterativo basato sull’analisi statistica dei risultati:

  1. Analisi della Baseline: Eseguo la query su uno storico più ampio (es. 30 giorni) usando summarize count() by Contesto per capire quale sotto-elemento (un server specifico, un account di servizio, un’applicazione interna) sta generando la maggior parte dei record.
  2. Isolamento del comportamento atteso: Spesso i picchi sono dovuti ad attività legittime automatizzate (es. script di backup o scansioni di vulnerabilità pianificate). Introduco clausole di esclusione mirate (es. where not(Computer == 'BackupServer' and EventID == X)).
  3. Innalzamento della soglia (Threshold): Invece di segnalare ogni singolo evento, trasformo la logica per identificare scostamenti dalla norma, ad esempio utilizzando funzioni di aggregazione per rilevare anomalie quantitative (es. più di 50 tentativi falliti in 5 minuti, anziché un singolo fallimento).”

4. Domande di Visione e Intelligenza Artificiale

Q5: Oggi gli assistenti basati su intelligenza artificiale sanno scrivere query KQL partendo da una richiesta in linguaggio naturale. In che modo questo cambia il valore del tuo ruolo?

Risposta ideale:

“L’intelligenza artificiale è un ottimo acceleratore per la scrittura della sintassi, ma non sostituisce la capacità analitica. L’IA può tradurre una domanda in codice, ma non sa quale domanda sia sensato porre nel contesto specifico di un incidente o di un’architettura aziendale.

Il valore del mio ruolo si sposta dalla pura compilazione del codice alla progettazione della logica investigativa e alla validazione critica dell’output. Devo essere in grado di capire se il codice generato dall’IA copre tutti i vettori di attacco, identificare eventuali allucinazioni del modello e, soprattutto, interpretare il risultato della query per prendere decisioni strategiche. L’IA si occupa della sintassi, io mi occupo della strategia e del contesto.”

“`html id=”fevbox01″

“`

Pubblicità

You may also like...