Microsoft Sentinel e Github: Better Togheter!
All’interno della community abbiamo parlato ampiamente di Microsoft Sentinel, SIEM e SOAR di casa Redmond e di come esso possa aiutare le aziende a collezionare Log e rispondere in moto automatizzato ad Incidenti di sicurezza Informatica, a tal proposito vi lascio il link della community che vi permette di visualizzare tutti gli articoli inerenti a questa soluzione di Microsoft Microsoft Sentinel – ICT Power
Quest’oggi vorrei parlarvi di un’integrazione, che a mio avviso può aiutare le aziende a migliorare l’efficienza di questo strumento, a automatizzare attività oltre a migliorare la Governance dei processi dei reparti di CyberSecurity, ovvero l’integrazione tra Microsoft Sentinel e GitHub.
Microsoft stessa, al giorno d’oggi, raccomanda di utilizzare Repositories come prima scelta, in quanto offrono versioning, approvazioni, workflow e rollback per gestire le detection e per chi è Multitenant sono il modo più scalabile per gestirli, proprio per questo qual’ora vogliate approfondire il pensiero di Microsoft vi rimango al link ufficiale della documentazione Detection lifecycle management recommendations for Microsoft Sentinel | Microsoft Learn

Figura 1: Flusso di Lavoro tra Microsoft Sentinel e GitHub
Prima di darvi evidenza di come poter integrare i due ecosistemi, è necessario darvi evidenza di alcune terminologie e concetti chiave.
Concetti Chiave
| Termine |
Cos’è |
Nel nostro caso |
| Repository (repo) | Una cartella su GitHub che ricorda ogni versione di ogni file | Contiene le regole come file |
| Branch | Una “linea” di lavoro dentro il repo. Quella principale si chiama main | Sentinel ascolta solo il branch che scegli, di solito main |
| Commit | Un salvataggio con nome, data e autore | Ogni modifica a una regola diventa un commit |
| Pull request (PR) | Una richiesta di unire modifiche in main, che si può rivedere prima | Il punto in cui controlli una KQL prima che vada in produzione |
| GitHub Actions / workflow | Un’automazione che GitHub esegue quando succede qualcosa, descritta in un file .yml | Sentinel crea un workflow che pubblica le regole a ogni commit su main |
| ARM template / Bicep | Due formati per descrivere risorse Azure in un file. ARM è JSON, Bicep è più leggibile | Ogni regola è un file .json o .bicep |
| Service principal (app registration) | Un’identità “tecnica” in Entra ID che usa un programma, non una persona | Il workflow si autentica con questa per scrivere nel workspace |
| Fonte di verità | Il posto dove sta la versione “giusta” | Diventa il repo: ciò che c’è lì sovrascrive le modifiche fatte nel portale |
Quanto costa questa soluzione?
La funzione Repositories di per se è gratuita, sono a pagamento i dati di cui viene eseguita Ingestion in Microsoft Sentinel, e se superate la soglia gratuita dovrete pagare anche i “minuti” della GitHub Actions.
|
Scenario |
Costo |
Note |
| Sentinel su workspace nuovo | 0 € per i primi 31 giorni, fino a 10 GB/giorno | Ingestione e analisi gratuite nel trial, massimo 20 workspace per tenant (prezzi Sentinel) |
| Sentinel dopo il trial | Pay-as-you-go a GB ingerito, varia per regione | Le regole non costano: costano i log che analizzano |
| GitHub Actions su repo pubblico | 0 € | Runner standard gratuiti |
| GitHub Actions su repo privato | 0 € fino a 2.000 minuti al mese (piano Free) | Un deploy dura pochi minuti, quindi resti nella quota (GitHub Docs) |
| Playbook (Logic Apps a consumo) | Centesimi per esecuzione | Solo se li usi |
| Custom detection rules | Richiedono Microsoft 365 E5 o licenza equivalente con Defender XDR | Se il tenant non ce l’ha, serve un trial E5 |
Per un eventuale ambiente di demo, il consiglio che posso fornirvi è quello di configurare un Repo privato, un Workspace di Microsoft Sentinel con “pochi” logs (EntraID sign-in e Azure Activity), e un daily cap sul workspace per evitare sorprese, quest’ultimo si configura dal portale di Azure à Settings à Usage and estimated costs à Daily cap
Primo passaggio? Preparare il Repository di GitHub
Recatevi su GitHub eseguite la login con il vostro account, se non lo avete procedete alla creazione di un Account gratuito

Figura 2: Scegliamo di creare un nuovo Repo

Figura 3: Scegliamo un nome ed una descrizione per il Repo, e aggiungiamo un Readme impostandolo come privato

Figura 4: Repo creato correttamente
Una volta creato, sarà necessario impostare la struttura del repository che dovrà essere in questo modo:
sentinel-content/
├── AnalyticsRules/
├── AutomationRules/
├── CustomDetections/
├── HuntingQueries/
├── Parsers/
├── Playbooks/
├── Workbooks/
└── README.md
I nomi delle cartelle sono a vostra scelta, il deploy guarda il contenuto dei file e non il contenuto della cartella, la struttura impostata in questo modo vi permetterà di “orientarvi meglio”.
Nel mio caso ho chiesto a Claude Code di “costruire” per me il repository e questo è il risultato

Figura 5: Struttura Repo che Claude Code ha creato secondo le indicazioni che sono state fornite

Figura 6: Configurazione del Repository per permettere i Workflow

Figura 7: Serve allo smart deployment, che scrive un file di tracciamento nel repo
Ora è necessario avere almeno un file valido nel repo prima di collegarlo, e per farlo abbiamo due metodi:
- Esportare una Analytics Rule già presente
- Scrivere una Analytics Rule da zero
Nel mio caso procederò con la prima soluzione di cui vi darò evidenza passo passo.

Figura 8: Selezioniamo una o pio Analytics ed esportiamole

Figura 9: Download Json delle regole effettuato con successo

Figura 10: Ho fornito al file un nome parlante, consiglio un file per regola così il PR tocca una sola regola
Ora rechiamoci su GitHub e posizioniamo il file all’interno della cartella “AnalyticsRule”

Figura 11: Selezioniamo il file ed inseriamo un commento per il Commit
Nello stesso modo eseguiamo un Export di una regola di Automation, cambierà la cartella di destinazione di GitHub che diventerà “AutomationRules”

Figura 12: Download della regola di automazione

Figura 13: Commit anche della regola di automazione
Ora siete pronti per collegare il Repo a Microsoft Sentinel.
Ma ricapitoliamo cosa abbiamo fatto fino ad ora:
- Creato repo GitHub e relativa struttura
- Caricato nel repo Analytics Rule
- Caricato nel repo Automation Rule
Ora rechiamoci all’interno del portale di Microsoft Defender, nella sezione relativa a Microsoft Sentinel

Figura 14: Configuriamo il Repository di GitHub in Microsoft Sentinel

Figura 15: Autorizziamo il repository, dopo aver inserito nome descrizione

Figura 16: Il sistema ci chiede di autorizzare Azure Sentinel sul repo GitHub

Figura 17: Selezioniamo il repository che abbiamo creato in precedenza

Figura 18: Selezionate solo i Content Types che avete popolato, nel mio caso Analytycis/Automation Rules, potete aggiungere altro in un secondo momento
Cosa succede nel momento in cui clicchiamo Create?
Cosa succede dietro le quinte, in pochi secondi:
- In Entra ID nasce un’app registration chiamata Azure Sentinel Content Deployment App seguita da un ID tra parentesi, con permessi sul workspace
- Nel repo compare il file .github/workflows/sentinel-deploy-<id>.yml.
- Nei Settings > Secrets and variables > Actions del repo compaiono i secret che il workflow usa per autenticarsi. Non toccarli.
- Parte subito il primo deploy.
Limiti da sapere: massimo 5 connessioni per workspace, e non puoi creare due connessioni con lo stesso repo e lo stesso branch sullo stesso workspace.

Figura 19: Connessione Riuscita

Figura 20: Comparsa Workflows in GitHub

Figura 21: Secret Presenti all’interno del repo

Figura 22: Dalle Actions di GitHub il primo flusso ha funzionato correttamente
Come la soluzione ci aiuta nel lavoro di tutti i giorni?
Qui c’è il valore aggiunto di questa configurazione, ovvero tutte le regole collegate al repository si modificano solo nel repo, questo permette a chi lavora quotidianamente nel tuning della piattaforma di avere un unico punto di accesso, soprattutto quanto il repo risulta collegato a più istanze di Microsoft Sentinel.
Vediamo insieme cosa accade:

Figura 23: Regola attualmente configurata con ingestion_time() > ago(5m)
Ora modificheremo, direttamente da GitHub, la regola impostando il parametro a 2m

Figura 24: Modifica parametro e commit della change

Figura 25: Scegliamo di fare commit in un altro Branch, questo ci permetterà di vedere la modifica effettuata e dopo fare il merge in Main (sentinel prende le modifiche da li)

Figura 26: Modifiche evidenziate per verificare prima di effettuare il merge

Figura 27: Dopo la verifica effettuare il pull
Scelgo come metodo di merge “Squash and Marge” in quanto tutti i commit della PR diventano un solo commit su main, con il titolo della PR. Ogni modifica a una regola è una riga nella descrizione, e se serve un rollback lo fai su un unico commit. Per le detection è la scelta più pulita

Figura 28: Merge della modifica in Main

Figura 29: Automazione che stà “scrivendo” la modifica in Sentinel

Figura 30: Modifica riuscita

Figura 31: Modifica eseguita anche lato Microsoft Sentinel
E se avessimo commesso un errore e volessimo ripristinare la regola a prima della modifica?
Possiamo farlo direttamente dalla Pull Request

Figura 32: Pull Request Closed apriamola

Figura 33: Facciamo il Revert

Figura 34: Eseguiamo il commit del revert
Ora attendiamo l’automazione e verifichiamo in Microsoft Sentinel il revert della modifica

Figura 35: Revert Effettuato con successo
Se cancellata la regola direttamente da GitHub, questa non si cancella in automatico da Sentinel, ma dovrete procedere alla cancellazione manuale. Inoltre se qualcuno modifica una regola dal portale la modifica resta finché quel file non viene ridistribuito. Con lo smart deployment questo succede solo quando il file cambia nel repo: a quel punto la versione del repo sovrascrive quella del portale. Se la modifica fatta nel portale era giusta.
Per eventuali approfondimenti vi rimando alla documentazione Microsoft Manage custom content with repository connections – Microsoft Sentinel | Microsoft Learn
Invece per approfondimenti su quanto visto all’interno dell’articolo Deploy Custom Content from your Repository – Microsoft Sentinel | Microsoft Learn
Conclusioni
Collegare GitHub a Microsoft Sentinel trasforma le detection in codice, e il vantaggio più concreto è la tracciabilità. Ogni modifica ad una regola passa da un commit e da una pull request: si sa sempre chi l’ha fatta, quando, cosa è cambiato riga per riga e perché. Se una regola smette di funzionare, la storia del repository dice esattamente da quale modifica è partito il problema, e il rollback è un click. È un salto rispetto alla gestione dal portale, dove una soglia cambiata o una query modificata lasciano poche tracce leggibili. Con “Repositories” il repository diventa l’unica fonte di verità: le regole si modificano solo lì, e quello che arriva in Sentinel è sempre ciò che è stato approvato. A questo si aggiunge un’autenticazione pulita, tramite OIDC e managed identity, senza secret da custodire, e un costo praticamente nullo. Il consiglio è partire in piccolo: poche analytics rules, una pull request per ogni modifica, e solo dopo estendere l’approccio al resto dei contenuti.