Microsoft Defender for Endpoint: Configurare gli Indicators con le API
Microsoft Defender for Endpoint, uno strumento che al giorno d’oggi offre, attraverso i continui investimenti che la casa di Redmond stà effettuando, una protezione a 360 gradi degli Endpoint Aziendali.
Microsoft, offre il collegamento tramite API al portale di Microsoft Defender XDR, in maniera veramente approfondita, dove è possibile vedere lo status dei device, le policy applicate e gli eventuali Incident, questo perché molte organizzazioni, magari con sviluppatori interni all’azienda integrano in modo nativo strumenti di Ticketing, software di reportistica con la componente XDR di casa Redmond.
Oggi vorrei darvi evidenza di come tramite le API di Microsoft Defender for Endpoint è possibile inserire gli Indicators senza dover necessariamente accedere al portale di Defender XDR, questa soluzione potrebbe essere molto utile per inserire gli indicatori in modalità blocco a partire da un tool di terze parti che “raccoglie” gli indici di compromissione e gli analisti sfruttano questo strumento per l’inserimento degli stessi senza dover necessariamente accedere al portale.

Figura 1: Componenti di Microsoft Defender for Endpoint dove viene spiegato l’esposizione della APIs da parte di Microsoft
Cosa sono gli Indicator in Microsoft Defender for Endpoint?
Un indicatore di compromissione (IoC) è un artefatto forense osservato sulla rete o su un Host. Un IoC indica, con elevata sicurezza, che si è verificata un’intrusione in un Endpoint o all’interno della rete, questo indici sono osservabili motivo per che li collega direttamente ad eventi che si possono misurare, come ad esempio:
- Hash di Malware noti
- Firme del traffico di rete dannoso
- URL o domini noti che sono “distributori” di Malware
Per bloccare altre compromissioni o prevenire violazioni di IoC noti, gli strumenti a nostra disposizione dovrebbero essere in grado di rilevare tutti i dati dannosi enumerati dal set di regole dello strumento. La corrispondenza IoC è una funzionalità essenziale in ogni soluzione di protezione degli Endpoint.
Questa funzionalità offre a SecOps la possibilità di impostare un elenco di indicatori per il rilevamento e il blocco (Detection and Reponse).
Le organizzazioni possono creare indicatori che definiscono il rilevamento, la prevenzione e l’esclusione delle entità IoC. È possibile definire l’azione da intraprendere, nonché la durata dell’applicazione dell’azione e l’ambito del gruppo di dispositivi a cui applicarla.
Quando vengono inseriti gli Indicators sono possibili le seguenti operazioni:
- Allow: l’esecuzione dell’IoC può essere eseguita sui dispositivi.
- Audit: viene attivato un avviso quando l’IoC viene eseguito.
- Warn: l’IoC richiede un avviso che l’utente può bypassare
- Block Execution: l’esecuzione dell’IoC non è consentita.
- Block and remediate: l’esecuzione dell’IoC non è consentita e all’IoC viene applicata un’azione correttiva.
Vi riporto inoltre una tabella in cui viene definito quali azioni sono consentite in base agli indicatori inseriti:
| IoC type | Available actions |
| Files | Allow Audit Warn Block execution Block and remediate |
| IP addresses | Allow Audit Warn Block execution |
| URLs and domains | Allow Audit Warn Block execution |
| Certificates | Allow Block and remediate |
Quali licenze sono necessarie per utilizzare questa funzionalità?
Per poter utilizzare la funzionalità di inserimento degli indici di compromissione all’interno di Defender for Endpoint è necessaria una licenza di Endpoint Protection di casa Redmond o una suite che comprenda:
- Microsoft Defender for Endpoint P1 Microsoft Defender for Endpoint | M365 Maps
- Microsoft Defender for Endpoint P2 Microsoft Defender for Endpoint | M365 Maps
- Microsoft Defender for Business Microsoft Defender for Business | M365 Maps
Come sempre ringraziamo Aaron Dinnage per l’ottimo lavoro svolto con il suo sito Home | M365 Maps
Perché, se posso inserire gli IoC in modo manuale dovrei usare le API?
Una domanda decisamente lecita, inserire in modo manuale gli IoC all’interno del portale di Microsoft Defender XDR è sicuramente un metodo utilizzato in modo importante dalle organizzazioni che sfruttano questa funzionalità, ma altrettante aziende, o tramite i loro reparti di Cynet Threat Intelligence o con i loro analisti raccolgono gli IoC da diverse fonti li raccolgono in un file txt che è pubblicato in Internet ed hanno la necessità di inserire in modo automatico questi indicatori all’interno del portale di Microsoft Defender XDR.
Proprio per questo oggi vorrei darvi evidenza di come potersi collegare tramite API esposte direttamente da Microsoft e procedere all’inserimenti di questi indici recuperandoli appunto da txt pubblicato in internet.
Limitazioni nell’uso degli Indicators
Sono presenti alcune limitazioni nell’inserimento degli indicatori che si basano sul numero massimo degli stessi ovvero 15000 totali, per eventuali approfondimenti vi invito a consultare la pagina ufficiale Microsoft Overview of indicators in Microsoft Defender for Endpoint – Microsoft Defender for Endpoint | Microsoft Learn
Come posso inserire quindi gli IoC tramite API?
Per darvi evidenza di questa funzionalità io avrò un Tenant Microsoft con alcune licenze Microsoft 365 E5, un dispositivo gestito da Microsoft Intune e presente Defender for Endpoint, ed una macchina Ubuntu che esporrà in internet un File TXT contente gli indirizzi IP che saranno appunto i nostri IoC.

Figura 2: Licenze Microsoft 365 E5 presenti nel Tenant per sfruttare la funzionalità descritta nell’articolo

Figura 3: Device che risulta gestito da Microsoft Defender for Endpoint e a cui applicheremo gli indici di compromissione

Figura 4: Device demo che risulta correttamente gestito da Microsoft Defender for Endpoint

Figura 5: Parametro degli Indicator in Microsoft Defender che risulta vuoto allo stato attuale

Figura 6: Nome del gruppo a cui applicheremo gli IoC che contiene il device di Demo

Figura 7: File txt pubblicato in Internet che contiene gli IoC, per test ho inserito alcuni ip casuali per darvi poi evidenza del blocco
Procederemo ora a creare un’Applicazione in Entra ID con i seguenti permessi:
- Ti.ReadWrite.All (Application)
- Machine.ReadWrite.All (Application)
Accediamo quindi all’interfaccia di Microsoft Entra Admin Center

Figura 8: Accesso a Microsoft Entra Admin Center per creazione applicazione

Figura 9: Inserire un nome per l’applicazione e successivamente registrare la APP

Figura 10: Generazione Secret per l’applicazione

Figura 11: Copiare il Secret e tenerlo da parte, il secret sarà visualizzabile una sola volta altrimenti dovrete rigenerarlo

Figura 12: Selezioniamo Windows Defender ATP

Figura 13: Scegliamo di concedere a WindowsDefenderATP i permessi di Application
Ora dovremmo ricercare i seguenti permessi e applicarli cliccando su “ADD Permission”
- Ti.ReadWrite.All
- Machine.ReadWrite.All

Figura 14: Inserimento Permesso Ti.ReadWriteAll

Figura 15: Inserimento permesso Machine.ReadWrite.All

Figura 16: Eseguiamo il Grant Admin Consent

Figura 17: Permessi Concessi nel modo corretto

Figura 18: Copiatevi l’Application ID e il tenant ID dell’applicazione
Ora bisognerà predisporre lo script Powershell che permetterà il collegamento tramite API e l’inserimento quindi degli indicatori basati sul file txt pubblicato in Internet
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 |
# ======== CONFIG ========= $FeedUrl = <Url del file txt> $ExpireDays = 30 $LogFile = <percorso file di log> # ========================= # === Logging helper === function Write-Log($Message) { $timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss" "$timestamp $Message" | Out-File $LogFile -Append -Encoding utf8 Write-Host $Message } # === Load API === $TenantId = <Tenant ID parametro che avete preso durante la creazione della app> $ClientId = <Client ID Applicazione creata in precedenza> $ClientSecret = <Secret Applicazione> Write-Log "===== Starting Defender IOC import =====" # === Get Access Token === $Body = @{ client_id = $ClientId scope = "https://api.securitycenter.microsoft.com/.default" client_secret = $ClientSecret grant_type = "client_credentials" } try { $TokenResponse = Invoke-RestMethod -Method Post -Uri "https://login.microsoftonline.com/$TenantId/oauth2/v2.0/token" -Body $Body $AccessToken = $TokenResponse.access_token $Headers = @{ Authorization = "Bearer $AccessToken" } Write-Log "Access token acquired successfully." } catch { Write-Log "❌ Failed to acquire access token: $_" exit 1 } # Download IP List try { $RawFeed = Invoke-RestMethod -Uri $FeedUrl $IpList = $RawFeed -split "`n" | ForEach-Object { $_.Trim() } | Where-Object { $_ -ne "" } Write-Log "✅ Downloaded $($IpList.Count) IPs from feed." } catch { Write-Log "❌ Failed to download IP feed: $_" exit 1 } # Insert Indicators foreach ($ip in $IpList) { $Body = @{ indicatorValue = $ip indicatorType = "IpAddress" action = "Block" severity = "High" title = "Blocked IOC from feed" description = "Auto-imported IOC from feed" rbacGroupNames = @(<nome del gruppo a cui applicare gli indicator>) generateAlert = "True" } | ConvertTo-Json -Depth 3 try { Invoke-RestMethod -Method Post -Uri "https://api.securitycenter.microsoft.com/api/indicators" -Headers $Headers -Body $Body -ContentType "application/json" | Out-Null Write-Log "✅ Inserted indicator $ip" } catch { Write-Log "❌ Failed to insert $ip : $_" } } Write-Log "===== IOC import finished =====" |
I punti in “grassetto” e racchiusi tra “<>” sono i parametri che dovrete inserire in base alla vostra infrastruttura, una volta creato per capire che tutto funzioni nel modo corretto eseguitelo in Powershell

Figura 19: Script eseguito con successo

Figura 20: Indicators inseriti correttamente

Figura 21: File di log che viene popolato
Se ad esempio invece volete inserire degli indicator come dei domain, dovrete pubblicare un ulteriore file txt contenente i domini

Figura 22: File txt pubblicato che contiene i domini da bloccare
Inoltre servirà modificare lo script powershell nel seguente modo
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 |
# ======== CONFIG ========= $FeedUrl = <Url con cui sono pubblicati I domini da bloccare> $ExpireDays = 30 $LogFile = <Percorso File Log> # ========================= # === Logging helper === function Write-Log($Message) { $timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss" "$timestamp $Message" | Out-File $LogFile -Append -Encoding utf8 Write-Host $Message } # === Load API === $TenantId = <TenantID> $ClientId = <ClientID> $ClientSecret = <SecretID> Write-Log "===== Starting Defender IOC import =====" # === Get Access Token === $Body = @{ client_id = $ClientId scope = "https://api.securitycenter.microsoft.com/.default" client_secret = $ClientSecret grant_type = "client_credentials" } try { $TokenResponse = Invoke-RestMethod -Method Post -Uri "https://login.microsoftonline.com/$TenantId/oauth2/v2.0/token" -Body $Body $AccessToken = $TokenResponse.access_token $Headers = @{ Authorization = "Bearer $AccessToken" } Write-Log "Access token acquired successfully." } catch { Write-Log "❌ Failed to acquire access token: $_" exit 1 } # Download domain List try { $RawFeed = Invoke-RestMethod -Uri $FeedUrl $domainList = $RawFeed -split "`n" | ForEach-Object { $_.Trim() } | Where-Object { $_ -ne "" } Write-Log "✅ Downloaded $($domainList.Count) domains from feed." } catch { Write-Log "❌ Failed to download domain feed: $_" exit 1 } # Insert Indicators foreach ($domain in $domainList) { $Body = @{ indicatorValue = $domain indicatorType = "DomainName" action = "Block" severity = "High" title = "Blocked IOC from feed Domain" description = "Auto-imported IOC from feed Domain" rbacGroupNames = @(<Gruppo di device a cui applicare gli indicator>) generateAlert = "True" } | ConvertTo-Json -Depth 3 try { Invoke-RestMethod -Method Post -Uri "https://api.securitycenter.microsoft.com/api/indicators" -Headers $Headers -Body $Body -ContentType "application/json" | Out-Null Write-Log "✅ Inserted indicator $domain" } catch { Write-Log "❌ Failed to insert $domain : $_" } } Write-Log "===== IOC import finished =====" |
Dopo l’esecuzione dello script vedrete popolarsi il campo Indicators inerente a URL/Domain:

Figura 23: Indicatori URL e Domain inseriti nel modo corretto
Ora sull’Endpoint verranno bloccate le connessioni verso questi FQDN, giusto per darvi evidenza accedendo alla macchina “GuidoCloudPC”:

Figura 24: Blocco che avviene sulla macchina a cui è applicato l’indicators

Figura 25: Incident che viene creato quando il dispositivo contattata un Indicatore contrassegnato come bloccato
Ora è importante capire come automatizzare il processo di inserimento degli IoC tramite una schedulazione, così è possibile permettere al sistema di inserire in modo automatizzato gli Indicators in modo costante. Io procederò a creare un task schedulato su un server che essendo sempre acceso è lo strumento adatto per questa tipologia di attività

Figura 26: Salvataggio Script PowerShell in una cartella del server, nel mio caso C:\service\Indicators

Figura 27: Aprite il task schedulare e procedete a creare un nuovo Task

Figura 28: Scegliete un nome e configurate i parametri necessari

Figura 29: Io schedulo l’esecuzione giornaliera, ma questo può essere modificato in base alle vostre esigenze

Figura 30: Overview di quando è schedulato il task
Ora come arguments, dovrete inserire il seguente comando: -NoProfile -ExecutionPolicy Bypass -File “C:\Percorso\TuoScript.ps1” dovrete creare un task per ogni script quindi nel mio caso saranno due script

Figura 31: Indichiamo che deve eseguire PowerShell richiamando lo script

Figura 32: Overview dello script schedulato

Figura 33: Inserimento credenziali Account amministratore della macchina
Dovrete ripetere tutti i passaggi indicati per il secondo script, o gli altri script che avrete creato

Figura 34: Script presente all’interno del Task Scheduler
Conclusioni
L’esposizione delle API da parte di Microsoft Defender XDR rappresenta un’opportunità strategica per le organizzazioni che desiderano automatizzare i processi di sicurezza, mantenendo al contempo il pieno controllo sulla gestione dei dati degli endpoint. La possibilità di inserire indicatori di compromissione tramite script semplici e diretti costituisce un tassello fondamentale per una difesa proattiva. Inoltre, l’integrazione via API apre la strada allo sviluppo di soluzioni personalizzate, offrendo agli sviluppatori gli strumenti necessari per migliorare in modo significativo la security posture aziendale.