Geautomatiseerde Triage Voor SOC's In De Nederlandse Overheid

💼 Management Samenvatting

Geautomatiseerde triage is de motor achter moderne security operations: het bepaalt welke signalen onmiddellijke aandacht verdienen, welke automatisch kunnen worden afgehandeld en welke delen van de organisatie moeten worden gealarmeerd.

Aanbeveling
IMPLEMENT
Risico zonder
High
Risk Score
8/10
Implementatie
200u (tech: 120u)
Van toepassing op:
Microsoft Sentinel
Microsoft Defender XDR
Azure
On-premises SOC tooling

SOC-teams binnen Nederlandse overheidsorganisaties verwerken dagelijks duizenden waarschuwingen uit Microsoft Sentinel, Defender XDR, specialistische OT-monitoring en ketenpartners. Zonder geautomatiseerde triage wordt elke melding handmatig beoordeeld, stapelen wachtrijen zich op en zien analisten door de bomen het bos niet meer. Dit leidt tot vertraagde detectie van ransomware, buitgemaakte inloggegevens of beleidswijzigingen door kwaadwillenden. NIS2 en de BIO verlangen aantoonbaar risicogestuurde processen; toezichthouders willen zien dat alerts systematisch worden geclassificeerd, dat beslislogica is gedocumenteerd en dat escalaties reproduceerbaar verlopen. Een gebrek aan triage-automatisering resulteert in onvoorspelbare responstijden, onnodige escalaties naar bestuurders en onvoldoende inzicht in workload, waardoor bestuur en gemeenteraad niet kunnen beoordelen of de security-organisatie adequaat is ingericht.

PowerShell Modules Vereist
Primary API: Microsoft Sentinel Management API, Microsoft Graph Security API
Connection: Connect-AzAccount, Connect-MgGraph
Required Modules: Az.Accounts, Az.OperationalInsights, Microsoft.Graph, Microsoft.Graph.Security

Implementatie

Dit artikel beschrijft hoe u geautomatiseerde triage ontwerpt, bouwt en borgt binnen Microsoft Sentinel en Defender XDR, aangevuld met eigen scripts en workflows. We behandelen strategische randvoorwaarden, datakwaliteit, playbook-architectuur, risicoscoring, integratie met ITSM en ketenpartners, continue monitoring en verbetering, en de audit- en compliance-eisen die voortkomen uit AVG, BIO en NIS2. Het bijbehorende PowerShell-script helpt teams om configuraties te controleren, risicoscores offline te testen en rapportages te genereren voor audits, waardoor u veilig kunt experimenteren voordat automatisering live gaat.

Strategische en technische randvoorwaarden voor geautomatiseerde triage

Een volwassen triage-aanpak begint bij bestuurlijke verankering. Bestuurders en CISO’s moeten expliciet vaststellen welke risicocategorieën de organisatie kent, welke KPI’s gelden voor detectie en escalatie, en hoeveel autonomie het SOC krijgt om beslissingen te automatiseren. Zonder deze kaders kan automatisering onbedoeld meldingen onderdrukken of juist een lawine aan meldingen genereren. Nederlandse overheden opereren onder publieke verantwoording; de gemeenteraad, provinciale staten of het ministerie wil kunnen zien welke risicoacceptaties zijn gemaakt en hoe deze aansluiten op de BIO- en NIS2-verplichtingen. Een formeel triagebeleid beschrijft daarom het risicomodel, de gebruikte datakwaliteitsregels, de maximale wachttijd voor kritieke alerts en de governance rondom wijzigingen in playbooks.

Data is de tweede pijler. Geautomatiseerde triage kan alleen waarde leveren wanneer logbronnen volledig, tijdig en gestandaardiseerd zijn. Dit betekent dat Microsoft Sentinel workspaces zijn gekoppeld aan alle relevante bronnen (Defender, Entra ID, Intune, firewalls, OT, SaaS) en dat Normalized Schemas of de Microsoft Security Graph worden gebruikt om velden consistent te benoemen. Daarnaast is het noodzakelijk om contextdata beschikbaar te maken, zoals CMDB-records, identity-risk scores, VIP-lijsten en asset criticality. Deze datasets moeten periodiek worden vergeleken met bronregistraties, zodat triage-logica weet of een alert betrekking heeft op een testaccount, een gedeeld serviceaccount of een kritieke productieworkload. Zonder context blijven automatische beslissingen oppervlakkig en moeten analisten alsnog handmatig onderzoek doen.

De derde randvoorwaarde betreft mensen en processen. Automatisering vereist dat SOC-analisten, incidentmanagers en applicatiebeheerders het eens zijn over de betekenis van risicoscores en de gewenste vervolgacties. Dit vraagt om opleidingsprogramma’s waarin scenario’s worden geoefend, bijvoorbeeld hoe een triage-playbook reageert op massale phishing of privilege-escalatie. Er moeten duidelijke hand-off punten zijn richting IT-operations, juridische teams en communicatie, zodat automatische escalaties niet stranden in generieke e-mails. Bovendien moet het changeproces voor triage-modellen integraal deel uitmaken van het CAB of het security-architectuurboard, zodat wijzigingen worden getest, goedgekeurd en gelogd. Hierdoor ontstaat vertrouwen dat automatisering voorspelbaar blijft, ook bij personeelswissels of reorganisaties.

Tot slot is compliance een harde eis. Triage-automatisering verwerkt persoonsgegevens (IP-adressen, gebruikersnamen, gedragspatronen) en moet voldoen aan AVG-artikel 32. Documenteer welke gegevens worden gebruikt, hoe lang ze worden bewaard en hoe burgers of medewerkers inzicht krijgen in geautomatiseerde besluitvorming. Beschrijf ook hoe incidentmeldingen, dataretentie en ketencommunicatie aansluiten op de wet Open overheid en sectorale richtlijnen zoals de Wet beveiliging netwerk- en informatiesystemen. Door deze eisen vroegtijdig te adresseren voorkomt u dat juridische teams automatiseringsinitiatieven stilleggen en kan de organisatie bij audits aantonen dat triagebeslissingen traceerbaar en uitlegbaar zijn.

Architectuur en uitvoering van triage-automatisering

De implementatiefase begint met het ontwerpen van een beslisboom die risico, waarschijnlijkheid en impact combineert. Gebruik Microsoft Sentinel analytic rules om alerts te correleren en voorzie iedere regel van een initiële severity en een set dynamische modifiers (bijvoorbeeld asset criticality of recente identiteitsrisico’s). Bouw vervolgens een scoring engine in Azure Functions of Logic Apps die deze modifiers toepast en een triagebesluit teruggeeft: automatisch sluiten, automatisch verrijken en escaleren, of direct operator-interventie vereisen. Documenteer elke stap in het playbook, inclusief fallback-scenario’s en tijdslimieten, zodat analisten precies weten wat er gebeurt wanneer een API tijdelijk onbeschikbaar is of een bron geen data levert.

Gebruik PowerShell-script automated-triage.ps1 (functie Invoke-Remediation) – Past lokale triageconfiguraties aan, bouwt voorbeeldbeslisbomen op basis van sampledata en schrijft wijzigingen weg naar JSON-rapportages voordat ze in productie worden uitgerold..

Integratie met bestaande tooling is cruciaal. Koppel de triage-engine aan Microsoft Defender XDR om device- en identiteitsignalen samen te brengen, aan ITSM-systemen zoals TOPdesk of ServiceNow voor ticketcreatie en aan communicatiekanalen zoals Teams of SMS-gateways voor urgente meldingen. Gebruik service principals met minimaal benodigde rechten en bewaak secret-rotatie via Azure Key Vault. Zorg voor sandbox- en stagingomgevingen waarin u nieuwe rule sets en playbooks kunt testen met historische data; dit voorkomt dat regressies direct impact hebben op productie. Automatiseer deploys met Infrastructure as Code (Bicep, Terraform) en policy-as-code zodat wijzigingen consistent zijn tussen tenants of shared service centra.

Een robuuste implementatie omvat eveneens uitgebreide logging en telemetrie. Iedere triagebeslissing moet voorzien zijn van een unieke identifier, inputparameters, gebruikte modellen en de uiteindelijke actie. Sla deze gegevens op in een aparte Log Analytics workspace of Azure Data Explorer cluster, zodat data scientists en auditors achteraf kunnen analyseren waarom een melding wel of niet is geëscaleerd. Combineer dit met unit tests en scenario-tests waarin u gecontroleerd foutinjecties uitvoert, zoals het wegvallen van een bron of het binnenkomen van duizenden identieke alerts. Door testresultaten automatisch te vergelijken met verwachtingswaarden detecteert u vroegtijdig bias of fouten in de playbooks.

Vergeet ten slotte de human-in-the-loop. Automatisering moet analisten ondersteunen, niet vervangen. Bouw functionaliteit in waarmee analisten een triage-uitspraak kunnen overrulen, feedback kunnen geven en lessons learned direct kunnen markeren voor modelupdates. Gebruik deze feedbackloops om regressies te voorkomen en om stakeholders te laten zien dat automatische beslissingen onder toezicht staan. Dit vergroot het vertrouwen van bestuurders, FG’s en ondernemingsraden en zorgt ervoor dat automatisering geen black box wordt.

Operationele monitoring en continue tuning

Gebruik PowerShell-script automated-triage.ps1 (functie Invoke-Monitoring) – Controleert dagelijks of triage-risicoscores, playbookversies en serviceprincipals voldoen aan de afgesproken standaarden en levert een samenvattend rapport voor CISO en SOC-lead..

Zodra triage actief is verschuift de aandacht naar performance-monitoring. Definieer KPI’s zoals gemiddelde triagetijd, percentage alerts dat automatisch wordt afgehandeld, aantal foutpositieven dat door analisten wordt teruggedraaid en het aantal incidenten dat buiten SLA is geëscaleerd. Toon deze metrics realtime in Sentinel workbooks of Power BI dashboards en zorg dat zij onderdeel zijn van de reguliere security-rapportages richting bestuur en ketenpartners. Door trends te analyseren ziet u of nieuwe dreigingscampagnes het systeem overbelasten of dat bepaalde playbooks structureel te streng zijn en legitieme activiteiten blokkeren.

Monitoring omvat ook technische gezondheid. Houd bij of Logic Apps, Azure Functions en Automation-accounts binnen limieten blijven, of connectors nog geldige tokens hebben en of rate limits in zicht komen. Gebruik Azure Monitor en Application Insights voor gedetailleerde foutanalyse en stel alerts in voor afwijkingen zoals een plotselinge daling in inkomende alerts (wat kan wijzen op logpipeline-falen) of een stijging in automatische sluitingen (mogelijke misconfiguratie). Laat het PowerShell-script in deze repository periodiek draaien in DebugMode om sampledata door de beslisboom te sturen; hierdoor kunt u regressies detecteren zonder productie te raken.

Continue tuning is noodzakelijk om veranderende dreigingen bij te houden. Plan maandelijkse review-sessies waarin SOC, threat intelligence en IT-operations de triage-uitvoer doorlopen, feedback van analisten beoordelen en beslissen welke regels moeten worden aangepast. Gebruik A/B-tests waarbij een subset van alerts via een nieuwe beslisboom loopt zodat u impact kunt meten voordat iedereen wordt overgezet. Documenteer elke wijziging inclusief rationale, verwachte effect en rollback-plan, zodat audits eenvoudig kunnen aantonen waarom een bepaalde drempel is aangepast.

Verbind monitoring met compliance door audittrails minimaal zeven jaar te bewaren en te koppelen aan incidentregisters en verwerkingsregisters. Door triage-rapportages te archiveren in SharePoint of een records management systeem voldoet u aan de Woo en kunt u aantonen welke geautomatiseerde beslissingen zijn genomen tijdens een specifieke dreigingscampagne. Combineer dit met periodieke penetratietests of purple teaming om te valideren dat automatisering niet eenvoudig te omzeilen is door een aanvaller.

Verankering in organisatie en ketensamenwerking

Geautomatiseerde triage raakt meerdere afdelingen. Zorg dat processen voor change- en releasebeheer, incidentrespons, crisiscommunicatie en leveranciersmanagement zijn afgestemd op de nieuwe werkelijkheid. Documenteer in het CSIRT- of SOC-handboek welke stappen automatisering al uitvoert en waar menselijke interventie nodig blijft. Ontwikkel trainingsprogramma’s waarin analisten leren werken met beslislogboeken, feedbackmechanismen en overrides, en waarin proceseigenaren begrijpen wat de impact is op hun verantwoordelijkheden. Zo blijft kennis niet beperkt tot een klein automatiseringsteam en kan de organisatie doorgaan bij personeelswissels.

Ketensamenwerking is een onderscheidend kenmerk van de Nederlandse overheid. Deel daarom triage-uitkomsten via beveiligde kanalen met ketenpartners, bijvoorbeeld gemeenten binnen een regio, veiligheidsregio’s of Rijksonderdelen. Stel gezamenlijke taxonomieën op zodat iedereen dezelfde risiconiveaus begrijpt en gebruik TLP-labels om de verspreiding van informatie te reguleren. Bouw interfaces naar NCSC, SURF of branchegerichte ISAC’s zodat relevante dreigingsinformatie automatisch kan worden verwerkt in triage-beslissingen. Door ketenpartners te betrekken voorkomt u dat automatisering enkel intern optimaliseert terwijl ketenrisico’s blijven bestaan.

Operational excellence vereist ook financiële en contractuele borging. Leg in SLA’s met leveranciers vast welke data zij aanleveren, hoe snel zij moeten reageren op automatische tickets en hoe zij toegang krijgen tot triage-rapportages. Neem in sourcingcontracten clausules op over het onderhouden van integraties met Microsoft Sentinel of Defender, en borg dat leveranciers hun eigen runbooks afstemmen op de beslislogica. Maak daarnaast budget vrij voor continue verbetering: machine learning-modellen moeten periodiek opnieuw getraind worden en integraties vergen onderhoud wanneer Microsoft API’s wijzigen.

Tot slot moeten lessons learned structureel worden vastgelegd. Gebruik een centrale knowledge base waarin iedere afwijking, override of auditbevinding wordt beschreven en gekoppeld aan de betreffende triageversie. Combineer dit met maturity-assessments en externe reviews zodat bestuurders objectief kunnen zien of geautomatiseerde triage volwassen genoeg is voor verdere uitbreiding, bijvoorbeeld naar OT-omgevingen of shared services. Door deze kennisdeling te stimuleren groeit de competentie van de complete organisatie en blijft geautomatiseerde triage afgestemd op de eisen van de Nederlandse Baseline voor Veilige Cloud.

Compliance & Frameworks

Automation

Gebruik het onderstaande PowerShell script om deze security control te monitoren en te implementeren. Het script bevat functies voor zowel monitoring (-Monitoring) als remediation (-Remediation).

PowerShell
<# .SYNOPSIS Valideert en optimaliseert geautomatiseerde triageconfiguraties voor SOC-teams. .DESCRIPTION Het script behoort bij het artikel content/security/automated-triage.json binnen het project "Nederlandse Baseline voor Veilige Cloud". Het controleert of triagebeslisbomen, playbooks en serviceprincipals voldoen aan afgesproken standaarden, analyseert risicoscores en genereert rapportages voor CISO en SOC-lead. In DebugMode werkt het script uitsluitend met voorbeelddata, zodat organisaties lokaal kunnen testen zonder verbinding te maken met productieomgevingen. .NOTES Filename: automated-triage.ps1 Author: Nederlandse Baseline voor Veilige Cloud Created: 2025-11-27 Last Modified: 2025-11-27 Version: 1.0 Related JSON: content/security/automated-triage.json .LINK https://github.com/microsoft/m365-tenant-best-practise .EXAMPLE .\automated-triage.ps1 -Monitoring -DebugMode Voert een lokale controle uit met voorbeelddata en toont het triage-overzicht. .EXAMPLE .\automated-triage.ps1 -Remediation -WhatIf Toont welke configuraties zouden worden aangepast zonder de wijzigingen daadwerkelijk door te voeren. #> #Requires -Version 5.1 [CmdletBinding()] param( [Parameter(Mandatory = $false)] [switch]$Monitoring, [Parameter(Mandatory = $false)] [switch]$Remediation, [Parameter(Mandatory = $false)] [switch]$WhatIf, [Parameter(Mandatory = $false)] [switch]$DebugMode, [Parameter(Mandatory = $false)] [string]$OutputPath = ".\\artifacts\\automated-triage-report.json" ) $ErrorActionPreference = 'Stop' $VerbosePreference = 'Continue' function Write-ScriptBanner { Write-Host "`n========================================" -ForegroundColor Cyan Write-Host "Automated Triage Validatie" -ForegroundColor Cyan Write-Host "Nederlandse Baseline voor Veilige Cloud" -ForegroundColor Cyan Write-Host "========================================`n" -ForegroundColor Cyan } function Connect-SecurityAutomationServices { [CmdletBinding()] param() if ($DebugMode) { Write-Verbose "DebugMode: er worden geen cloudverbindingen opgezet." return } Write-Verbose "Controleren of vereiste modules beschikbaar zijn..." foreach ($module in @('Az.Accounts','Az.OperationalInsights','Microsoft.Graph','Microsoft.Graph.Security')) { if (-not (Get-Module -ListAvailable -Name $module)) { Write-Warning "Module $module is niet gevonden. Installeer of laad deze module voordat u echte triage-configuraties aanpast." } } Write-Host "Verbindingen moeten door de organisatie zelf worden gelegd (bijv. Connect-AzAccount, Connect-MgGraph)." -ForegroundColor Yellow } function Get-TriageSampleData { [CmdletBinding()] param() return [PSCustomObject]@{ AlertsTotal = 1850 AlertsPerHour = 78 AutoClosedPercentage = 0.38 ManualEscalations = 42 MeanTimeToTriageMinutes = 11 ServicePrincipalExpiryDays = 22 PlaybookVersionDrift = 3 InactivePlaybooks = @('VIP-Escalation-v1','Phishing-GuestAccounts') MissingContextFeeds = @('CMDB-Criticality') LastReviewDate = (Get-Date).AddDays(-37) } } function Test-TriageConfiguration { [CmdletBinding()] param() $data = Get-TriageSampleData $issues = @() if ($data.AutoClosedPercentage -lt 0.25 -or $data.AutoClosedPercentage -gt 0.7) { $issues += "Automatische afhandeling ($([int]($data.AutoClosedPercentage*100))%) ligt buiten de streefbandbreedte (25-70%)." } if ($data.ServicePrincipalExpiryDays -lt 15) { $issues += "Een service principal verloopt binnen $($data.ServicePrincipalExpiryDays) dagen; plan secret-rotatie." } if ($data.PlaybookVersionDrift -gt 1) { $issues += "Er draaien $($data.PlaybookVersionDrift) verschillende playbookversies; synchroniseer deployments." } if ($data.MissingContextFeeds.Count -gt 0) { $issues += "Contextfeeds ontbreken: $($data.MissingContextFeeds -join ', ')." } if ((Get-Date) - $data.LastReviewDate -gt [TimeSpan]::FromDays(30)) { $issues += "Laatste formele triage-review is ouder dan 30 dagen." } [PSCustomObject]@{ ScriptName = 'automated-triage.ps1' Timestamp = Get-Date AlertsTotal = $data.AlertsTotal AutoClosed = [int]($data.AutoClosedPercentage * 100) MeanTriage = $data.MeanTimeToTriageMinutes ManualEsc = $data.ManualEscalations Issues = $issues IsCompliant = ($issues.Count -eq 0) Recommendations = if ($issues.Count -eq 0) { @('Triageconfiguratie voldoet aan de ingestelde normen.') } else { $issues } } } function Invoke-AutomatedTriageMonitoring { [CmdletBinding()] param() $result = Test-TriageConfiguration Write-Host "Totaal alerts afgelopen 24 uur : $($result.AlertsTotal)" -ForegroundColor White Write-Host "Per uur : $([math]::Round($result.AlertsTotal / 24,2))" -ForegroundColor White Write-Host "Automatisch afgehandeld : $($result.AutoClosed)%" -ForegroundColor White Write-Host "Gemiddelde triagetijd (min) : $($result.MeanTriage)" -ForegroundColor White Write-Host "Handmatige escalaties : $($result.ManualEsc)" -ForegroundColor White if ($result.IsCompliant) { Write-Host "`n✅ Triage-configuratie voldoet aan de normen." -ForegroundColor Green } else { Write-Host "`n❌ Aandacht vereist. Aanbevelingen:" -ForegroundColor Yellow $result.Recommendations | ForEach-Object { Write-Host " - $_" -ForegroundColor Yellow } } return $result } function Invoke-AutomatedTriageRemediation { [CmdletBinding()] param() $result = Test-TriageConfiguration $actions = @() if ($result.Recommendations -match "bandbreedte") { $actions += "Pas analytics- en playbookdrempels aan zodat 40-60% van de alerts automatisch wordt afgehandeld." } if ($result.Recommendations -match "service principal") { $actions += "Roteer client secrets en documenteer de nieuwe vervaldatum in Azure Key Vault." } if ($result.Recommendations -match "playbookversies") { $actions += "Voer een herdeploy uit via IaC zodat alle regio's dezelfde playbookversie draaien." } if ($result.Recommendations -match "Contextfeeds") { $actions += "Publiceer de ontbrekende contextfeed (bijv. CMDB-criticality) richting Sentinel via de REST-connector." } if ($result.Recommendations -match "review") { $actions += "Plan een triage-review met SOC, CISO en proceseigenaren binnen 7 dagen." } if ($actions.Count -eq 0) { Write-Host "Geen wijzigingen nodig." -ForegroundColor Green return $result } Write-Host "`nRemediatieplan:" -ForegroundColor Cyan $actions | ForEach-Object { if ($WhatIf) { Write-Host "WhatIf: $_" -ForegroundColor Yellow } else { Write-Host $_ -ForegroundColor Gray } } return $result } function Save-TriageReport { [CmdletBinding()] param( [Parameter(Mandatory = $true)] [pscustomobject]$Data ) $directory = Split-Path -Parent $OutputPath if (-not (Test-Path $directory)) { New-Item -ItemType Directory -Path $directory -Force | Out-Null } $Data | ConvertTo-Json -Depth 4 | Out-File -FilePath $OutputPath -Encoding UTF8 Write-Host "`nRapport opgeslagen naar $OutputPath" -ForegroundColor Green } Write-ScriptBanner Connect-SecurityAutomationServices try { $result = if ($Monitoring) { Invoke-AutomatedTriageMonitoring } elseif ($Remediation) { Invoke-AutomatedTriageRemediation } else { Test-TriageConfiguration } Save-TriageReport -Data $result return $result } catch { Write-Error "Fout tijdens triage-evaluatie: $_" exit 1 } finally { Write-Host "`n========================================`n" -ForegroundColor Cyan }

Risico zonder implementatie

Risico zonder implementatie
High: Zonder geautomatiseerde triage blijven SOC’s afhankelijk van handwerk, raken kritieke meldingen ondergesneeuwd en kan de organisatie niet aantonen dat zij voldoet aan BIO- en NIS2-eisen.

Management Samenvatting

Ontwerp een bestuurlijk gedragen triagebeleid, bouw een beslisboom in Microsoft Sentinel en Defender XDR, koppel contextdata en ITSM, gebruik het meegeleverde script voor validatie en monitoring en borg logging en audittrail zodat u consistent en uitlegbaar reageert op dreigingen.