Microsoft Defender Voor Endpoint: Threat Analytics En Inlichtingenkoppeling

💼 Management Samenvatting

Threat Analytics in Microsoft Defender voor Endpoint fungeert als een digitaal inlichtingenportaal dat ruwe telemetrie, wereldwijde aanvalscampagnes en lokale kwetsbaarheidsdata samenbrengt tot een coherent verhaal voor bestuurders en securityteams. De module vergelijkt continu de configuratie van Nederlandse tenants met de meest actuele campagnes, signaleert welke endpoints of identiteiten daadwerkelijk risico lopen en vertaalt dat naar maatregelen die passen binnen de normen van de Nederlandse Baseline voor Veilige Cloud. Door Threat Analytics als primaire bron voor strategische besluitvorming te gebruiken, beschikken CISO's, Chief Risk Officers en sectorexperts over dezelfde feitenbasis, inclusief impact op primaire processen, budgettaire consequenties en verplichtingen richting toezichthouders.

Aanbeveling
IMPLEMENT
Risico zonder
High
Risk Score
8/10
Implementatie
132u (tech: 60u)
Van toepassing op:
Microsoft 365 E5
Microsoft Defender voor Endpoint Plan 2
Microsoft Defender XDR

Nederlandse overheden en vitale aanbieders moeten onder NIS2, BIO en AVG aantonen dat zij actuele dreigingsinformatie verwerken in hun risicobeheersing. Zonder geïntegreerde intelligence blijven waarschuwingen versnipperd over rapportages, SIEM-alarmeringen en leveranciersberichten waardoor bestuurders pas reageren als incidenten al plaatsvinden. Threat Analytics brengt orde doordat het elke campagne automatisch koppelt aan de eigen configuratie, blootgestelde apparaten en openstaande changeverzoeken. Daarmee ontstaat directe traceerbaarheid van strategische besluiten naar feitelijke dreigingsdata, wat essentieel is bij audits, parlementaire vragen of crisissimulaties.

PowerShell Modules Vereist
Primary API: Microsoft Graph Security API (beta) - Threat Analytics endpoint
Connection: Connect-MgGraph -Scopes SecurityEvents.Read.All, ThreatHunting.Read.All
Required Modules: Microsoft.Graph, Microsoft.Graph.Security

Implementatie

Threat Analytics levert drie kernfunctionaliteiten: narratieven waarmee een dreiging in begrijpelijke taal wordt uitgelegd, blootstellingskaarten die elk asset tonen waarop dezelfde techniek zichtbaar is, en remediatiestappen die via Graph-API's of runbooks kunnen worden geautomatiseerd. De oplossing maakt gebruik van Defender-telemetrie, Microsoft Threat Intelligence, MITRE ATT&CK-classificaties en lokale indicatoren zoals ontbrekende zero trust policies. Door integraties met Microsoft Sentinel, Power BI en ITSM-systemen ontstaat een levende intelligenceketen waarin analyses, scripts en governancebesluiten automatisch aan elkaar worden gekoppeld en traceerbaar blijven gedurende audits.

Strategische Context en Organisatorische Positionering

Threat Analytics positioneert zich als het primaire briefinginstrument binnen de bestuurlijke cyclus. Elke analyse beschrijft niet alleen de technische vector, maar ook de bedrijfsprocessen, juridische verplichtingen en budgettaire gevolgen die geraakt worden wanneer maatregelen uitblijven. Door de rapporten voorafgaand aan het wekelijkse cyberoverleg te delen, bespreken bestuur, CISO-office en SOC dezelfde feiten, inclusief scenario's voor maatschappelijke dienstverlening, burgerportalen of belastingprocessen. Dit voorkomt dat dreigingen uitsluitend als technisch probleem worden gezien en maakt duidelijk welke bestuurlijke keuzes direct nodig zijn om continuïteit en publieke verantwoording te waarborgen.

De Nederlandse context vraagt om een verankering tussen nationale intelligencebronnen en de Microsoft 365 werkelijkheid. Threat Analytics sluit naadloos aan bij factsheets van het NCSC, sectorale ISAC-rapportages en waarschuwingen vanuit de Rijksbrede CIO-Raad doordat elke campagne automatisch vertaald wordt naar de eigen tenantconfiguratie. Een melding over misbruik van remote management tooling resulteert direct in een lijst van apparaten waarop dezelfde agent draait, inclusief advies om Conditional Access aan te scherpen of beheerderscertificaten te vervangen. Hierdoor kunnen organisaties aantonen dat ze waarschuwingen niet alleen registreren, maar daadwerkelijk toepassen op hun cloudomgevingen.

Het instrument moet onderdeel zijn van de geïntegreerde risicosturing. Voeg Threat Analytics toe aan de enterprise risk register zodat ieder rapport wordt gekoppeld aan een bestaand risico met eigenaar, risicoscore en geplande mitigerende maatregelen. De exposure-gegevens vullen heatmaps waarmee control owners zien welke processen buiten de risicobereidheid vallen en welke investeringen nodig zijn. Door rapporten te koppelen aan meerjarenbegrotingen ontstaat bovendien inzicht in de kosten van achterstallig onderhoud: elke niet-gemonitorde campagne kan worden vertaald naar resourcebehoefte, waarmee finance-afdelingen een directe aanleiding hebben om budget vrij te maken.

Wanneer Threat Analytics structureel wordt gebruikt binnen crisisteams en bestuurlijke rapportages, ontstaat een cultuur van gezamenlijke verantwoordelijkheid. Bestuurders ontvangen geen abstracte rode of groene status meer, maar een feitelijk verhaal inclusief getroffen sectoren, reputatie-impact en tijdslijnen voor herstel. Het SOC krijgt tegelijkertijd bestuurlijke rugdekking voor spoedmaatregelen, omdat rapporten exact laten zien welke kwetsbaarheid misbruikt kan worden en welke juridisch verplichte meldingen moeten volgen. Zo groeit Threat Analytics uit tot het centrale schaakbord waarop scenario's worden geoefend, prioriteiten worden afgestemd en lessons learned worden vastgelegd voor toekomstige evaluaties.

Implementatie en Integratie met Microsoft 365 Defender

Gebruik PowerShell-script threat-analytics.ps1 (functie Invoke-Remediation) – PowerShell-runbook dat Graph Security controleert, blootstellingsprofielen ophaalt en ruwe data omzet in besluitklare rapportages voor bestuur en SOC..

Succesvolle implementatie start bij het inzichtelijk maken van licenties, datastromen en afhankelijkheden. Controleer of alle endpoints Defender voor Endpoint Plan 2 actief hebben, of Defender for Identity en Defender for Cloud Apps zijn gekoppeld en of de organisatie de vereiste Microsoft 365 E5- of add-on licenties bezit. Documenteer in het beveiligingsarchitectuurdossier welke netwerken, devices en identiteiten telemetrie leveren, inclusief uitzonderingen zoals OT-segmenten of laptops van externe auditors. Deze inventarisatie maakt duidelijk waar aanvullende onboarding, sensorupdates of firewallopeningen nodig zijn voordat Threat Analytics zinvolle rapporten kan genereren.

Het script code/m365/defender-endpoint/threat-analytics.ps1 vormt de technische ruggengraat van de implementatie. Het controleert of de Microsoft Graph Security API bereikbaar is, valideert de aangevraagde scopes en schrijft resultaten weg naar een beveiligde exportlocatie. Door het script in een lokale debugmodus te draaien verifieert het team verbindingen, throttlinglimieten en authenticatiestromen via Privileged Identity Management. Documenteer welke serviceaccounts of beheerdersrollen het script mogen uitvoeren en hoe tijdelijke escalaties worden aangevraagd. Zo wordt het runbook de standaardmanier om rapportdata geautomatiseerd te distribueren naar dashboards, SIEM's en ITSM-systemen.

Wanneer de technische randvoorwaarden staan, is procesinrichting de volgende stap. Beschrijf in een implementatie-roadmap hoe nieuwe rapporten binnen 24 uur worden beoordeeld, welke change-templates worden voorbereid en hoe exposure-items vertaald worden naar concrete acties voor device management, identity teams en leveranciers. Plan vaste reviewmomenten met architectuur, privacy officers en juridische adviseurs zodat maatregelen voldoen aan de Nederlandse Baseline voor Veilige Cloud én lokale privacyafspraken. Integreer Threat Analytics in bestaande crisisplannen door scenario's te koppelen aan escalatie- en communicatieprotocollen zodat bestuurders, woordvoerders en ketenpartners weten welke stappen worden gezet wanneer een campagne als kritisch wordt gemarkeerd.

Tot slot vergt implementatie een nadrukkelijke leer- en verbeterlus. Stel trainingsmodules op voor SOC-analisten, beleidsadviseurs en managers waarin zij leren hoe ze rapporten lezen, exposure-scores interpreteren en dashboards actualiseren. Gebruik de output van Threat Analytics om maturity-metingen te voeden, bijvoorbeeld het percentage campagnes dat binnen vijf dagen een mitigatie kent of het aantal openstaande exposure-items per businessunit. Door deze metrics te koppelen aan KPI's in performancegesprekken en contracten van uitbestede partijen, ontstaat een duurzame borging: iedereen weet welke bijdrage van hem of haar wordt verwacht om threat intelligence daadwerkelijk om te zetten in risicoreductie.

Operationele Intelligence, Monitoring en Escalatie

Gebruik PowerShell-script threat-analytics.ps1 (functie Invoke-Monitoring) – Automatiseert gezondheidstesten, exposuretrend-analyses en notificaties richting CISO, SOC en ketenpartners..

Operationele monitoring begint met dagelijkse validatie van drie vragen: komt er verse data binnen, zijn rapporten tijdig beoordeeld en daalt de blootstelling daadwerkelijk? Het monitoringdeel van het script voert deze controle autonoom uit, bewaart resultaten als JSON en vergelijkt de oudste kritieke campagne met ingestelde drempelwaarden. Zodra een waarde overschreden wordt, genereert het script een melding voor het cyberoverleg en kan via een webhook een ticket worden aangemaakt. Hierdoor hoeft het SOC niet meer handmatig het portaal af te speuren; afwijkingen verschijnen automatisch op dashboards, inclusief historische trendgegevens.

Threat Analytics wordt nog krachtiger wanneer het wordt gekoppeld aan een kennisbank waarin lessons learned, beslisnota's en communicatieplannen worden opgeslagen. Elke campagne krijgt een uniek dossiernummer dat verwijst naar de opgehaalde data, uitgevoerde runbooks, changeverzoeken en eventuele meldingen aan het NCSC of de Autoriteit Persoonsgegevens. Tijdens oefeningen of echte incidenten kan het team razendsnel terugzoeken welke patches, compensating controls of juridische consults de vorige keer nodig waren. Dit versnelt besluitvorming en geeft auditors inzicht in de volwassenheid van het operationele proces.

Het platform vervult tevens een brugfunctie tussen detectie en respons. Door indicatoren van compromis, MITRE ATT&CK-technieken en blootgestelde assets door te geven aan Microsoft Sentinel of bestaande SIEM-oplossingen, kunnen use cases automatisch worden verfijnd. Analisten verrijken alerts met passages uit het Threat Analytics rapport, waardoor triage versnelt en context niet verloren gaat bij ploegoverdracht. Voeg de resultaten toe aan de Major Incident-procedure zodat communicatie naar bestuur, woordvoering en juridische afdelingen altijd is gebaseerd op dezelfde gevalideerde bron.

Ook ketenpartners profiteren van deze aanpak. Deel samenvattingen met leveranciers, shared service centers en sectorale ISAC's zodat gezamenlijke risico's sneller worden geadresseerd. Leg in contracten vast hoe snel partners moeten reageren op een Threat Analytics rapport dat relevant is voor hun dienstverlening en welke bewijsstukken ze moeten opleveren (bijvoorbeeld logextracten of patchrapportages). Hierdoor ontstaat een operationele kwaliteitskring waarin alle betrokken partijen real-time inzicht hebben in wie welke maatregel uitvoert, wat essentieel is voor ketenverantwoordelijkheid onder NIS2.

Compliance, Rapportage en Bewijsvoering

Threat Analytics is een krachtige bron voor compliance omdat het automatisch aangeeft welke controls geraakt worden, welke data is geanalyseerd en welke maatregelen zijn gepland. Door de rapportmetadata te koppelen aan controlcatalogi voor CIS, BIO, ISO 27001 en AVG ontstaat een matrix waarmee auditors binnen enkele minuten kunnen zien welke campagnes wanneer zijn beoordeeld en welke mitigaties zijn uitgevoerd. Dezelfde matrix toont ook waar achterstanden zitten, zodat bestuurders onderbouwde prioriteiten kunnen stellen.

Vertaal de technische bevindingen vervolgens naar narratieven voor raden van bestuur, gemeentesecretarissen of inspecties. Beschrijf per rapport hoe de dreiging de maatschappelijke dienstverlening of wettelijke verplichtingen kan verstoren, welk herstelpad is afgesproken en welke investeringen nodig zijn. Door deze informatie te integreren in kwartaalrapportages en jaarverslagen ontstaat een transparant spoor dat laat zien hoe cyberrisico's worden beheerst binnen de Nederlandse Baseline voor Veilige Cloud.

Bewijsvoering vraagt om discipline. Archiveer exports van het PowerShell-script, Graph API-responses, screenshots van het Threat Analytics portaal en bijbehorende besluitdocumenten in een onveranderbare opslaglocatie met retentie van minimaal zeven jaar. Label de dossiers met AVG- en NIS2-classificaties, zodat juristen snel kunnen beoordelen of persoonsgegevens aanwezig zijn en welke meldplicht van toepassing is. Documenteer ook welke communicatiestappen zijn genomen richting toezichthouders en ketenpartners, zodat reconstructies achteraf geen interpretatie vragen.

Gebruik de verzamelde data tot slot voor continue verbetering. Analyseer per kwartaal welke campagnes steeds terugkeren, welke businessunits traag reageren en welke mitigerende maatregelen het meeste effect opleveren. Combineer deze inzichten met resultaten uit penetratietesten of crisis-oefeningen om nieuwe controles te ontwerpen. Het effect is tweeledig: compliance-audits verlopen sneller omdat bewijs direct beschikbaar is, en de organisatie ontwikkelt aantoonbaar een lerend vermogen rond threat intelligence.

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 Microsoft Defender voor Endpoint: Threat Analytics en Inlichtingenkoppeling .DESCRIPTION Controleert de beschikbaarheid, gezondheid en opvolging van Threat Analytics rapporten in Microsoft 365 Defender, haalt campagnegegevens op via Microsoft Graph Security API (beta) en bouwt monitoringdossiers die direct deelbaar zijn met bestuur, SOC en toezichthouders conform de Nederlandse Baseline voor Veilige Cloud. .NOTES Filename: threat-analytics.ps1 Author: Nederlandse Baseline voor Veilige Cloud Created: 2025-01-10 Last Modified: 2025-11-27 Version: 2.0 Gerelateerd artikel: content/m365/defender-endpoint/threat-analytics.json .LINK https://github.com/[org]/m365-tenant-best-practise .EXAMPLE .\threat-analytics.ps1 -Monitoring Voert de monitoringcontrole uit, toont status van Graph-connectiviteit en beschikbare campagnes. .EXAMPLE .\threat-analytics.ps1 -Remediation Genereert organisatorische en technische stappen voor het activeren en opvolgen van Threat Analytics rapporten. #> #Requires -Version 5.1 #Requires -Modules Microsoft.Graph, Microsoft.Graph.Security [CmdletBinding()] param( [Parameter()] [switch]$Monitoring, [Parameter()] [switch]$Remediation, [Parameter()] [switch]$WhatIf, [Parameter()] [string]$ExportPath ) $ErrorActionPreference = 'Stop' $VerbosePreference = 'Continue' $script:GraphReady = $false $script:SeverityTemplate = [ordered]@{ critical = 0 high = 0 medium = 0 low = 0 informational = 0 unknown = 0 } $script:NoteExtension = ".note.txt" function Connect-RequiredServices { <# .SYNOPSIS Maakt verbinding met Microsoft Graph Security API (beta) #> [CmdletBinding()] param() Write-Verbose "Controleren van Microsoft.Graph modules..." $graphModule = Get-Module -ListAvailable -Name Microsoft.Graph if (-not $graphModule) { Write-Warning "Microsoft.Graph module niet gevonden. Installeer deze via Install-Module Microsoft.Graph -Scope CurrentUser." return } if (-not (Get-Command -Name Connect-MgGraph -ErrorAction SilentlyContinue)) { Write-Warning "Connect-MgGraph cmdlet niet beschikbaar. Update Microsoft.Graph modules." return } try { $context = Get-MgContext -ErrorAction SilentlyContinue if (-not $context) { Write-Host "Verbinding maken met Microsoft Graph..." -ForegroundColor Yellow Connect-MgGraph -Scopes "SecurityEvents.Read.All", "ThreatHunting.Read.All", "ThreatHunting.ReadWrite.All" -ErrorAction Stop | Out-Null } $selectProfileCmd = Get-Command -Name Select-MgProfile -ErrorAction SilentlyContinue if ($selectProfileCmd) { Select-MgProfile -Name "beta" } else { Write-Warning "Select-MgProfile niet beschikbaar. Werk de Microsoft.Graph modules bij om beta-profielen te ondersteunen." } $script:GraphReady = $true Write-Verbose "Verbonden met Microsoft Graph Security API (beta of standaard profiel)" } catch { Write-Warning "Verbinding met Microsoft Graph mislukt: $_" $script:GraphReady = $false } } function Get-ThreatAnalyticsReports { <# .SYNOPSIS Haalt Threat Analytics campagnes op via Graph .OUTPUTS Array van Threat Analytics objecten #> [CmdletBinding()] param() if (-not $script:GraphReady) { Write-Verbose "Graph niet beschikbaar, geen campagnes opgehaald." return @() } try { $uri = "https://graph.microsoft.com/beta/security/threatAnalytics" Write-Verbose "Ophalen van Threat Analytics rapporten..." $response = Invoke-MgGraphRequest -Method GET -Uri $uri -ErrorAction Stop return @($response.value) } catch { Write-Warning "Kon Threat Analytics data niet ophalen: $_" return @() } } function New-ThreatAnalyticsSummary { <# .SYNOPSIS Maakt een samenvatting voor rapportage en kennisbank #> [CmdletBinding()] param( [Parameter(Mandatory)] [array]$Reports ) $severity = [ordered]@{} $script:SeverityTemplate.GetEnumerator() | ForEach-Object { $severity[$_.Key] = $_.Value } $tacticCounts = @{} $oldestCritical = $null foreach ($report in $Reports) { $sev = ($report.severity | ForEach-Object { $_ }) -join "" if ([string]::IsNullOrWhiteSpace($sev)) { $sev = "unknown" } $sevKey = $sev.ToLowerInvariant() if ($severity.Contains($sevKey)) { $severity[$sevKey]++ } else { $severity[$sevKey] = 1 } if ($report.tactics) { foreach ($tactic in $report.tactics) { if ([string]::IsNullOrWhiteSpace($tactic)) { continue } if ($tacticCounts.ContainsKey($tactic)) { $tacticCounts[$tactic]++ } else { $tacticCounts[$tactic] = 1 } } } if ($sevKey -in @("critical","high") -and $report.lastUpdatedDateTime) { $candidate = [datetime]$report.lastUpdatedDateTime if (-not $oldestCritical -or $candidate -lt $oldestCritical) { $oldestCritical = $candidate } } } $tacticHighlights = $tacticCounts.GetEnumerator() | Sort-Object -Property Value -Descending | Select-Object -First 5 $oldestDays = $null if ($oldestCritical) { $oldestDays = (New-TimeSpan -Start $oldestCritical -End (Get-Date)).Days } return [pscustomobject]@{ SeverityBreakdown = $severity TacticHighlights = $tacticHighlights OldestHighDays = $oldestDays } } function Write-KnowledgeNote { <# .SYNOPSIS Schrijft een tekstueel dossier naast het JSON-resultaat #> [CmdletBinding()] param( [Parameter(Mandatory)] [string]$Path, [Parameter(Mandatory)] [pscustomobject]$Status ) try { $notePath = [System.IO.Path]::ChangeExtension($Path, $script:NoteExtension) $lines = @() $lines += "Threat Analytics overzicht - $(Get-Date -Format 'yyyy-MM-dd HH:mm:ss')" $lines += "Graph verbonden : $($Status.GraphConnected)" $lines += "Rapporten : $($Status.ReportsRetrieved)" $lines += "Kritieke items : $($Status.CriticalReports)" if ($Status.OldestOpenCriticalDays) { $lines += "Oudste kritieke campagne: $($Status.OldestOpenCriticalDays) dagen actief" } if ($Status.SeverityBreakdown) { $lines += "Severities:" foreach ($pair in $Status.SeverityBreakdown.GetEnumerator()) { $lines += " - {0}: {1}" -f $pair.Key, $pair.Value } } if ($Status.TacticHighlights) { $lines += "Top tactieken:" foreach ($tactic in $Status.TacticHighlights) { $lines += " - {0}: {1}" -f $tactic.Key, $tactic.Value } } if ($Status.Issues.Count -gt 0) { $lines += "Issues:" $Status.Issues | ForEach-Object { $lines += " - $_" } } if ($Status.Recommendations.Count -gt 0) { $lines += "Aanbevelingen:" $Status.Recommendations | ForEach-Object { $lines += " - $_" } } $parent = Split-Path -Path $notePath -Parent if (-not (Test-Path -Path $parent)) { New-Item -ItemType Directory -Path $parent -Force | Out-Null } $lines | Out-File -FilePath $notePath -Encoding UTF8 Write-Verbose "Kennisnotitie opgeslagen naar $notePath" } catch { Write-Warning "Kon kennisnotitie niet schrijven: $_" } } function Send-ThreatAnalyticsNotification { <# .SYNOPSIS Verstuurt een webhook-notificatie wanneer drempels worden overschreden #> [CmdletBinding()] param( [Parameter(Mandatory)] [pscustomobject]$Status ) $webhook = $env:THREAT_ANALYTICS_WEBHOOK if ([string]::IsNullOrWhiteSpace($webhook)) { return } $body = @{ title = "Threat Analytics Monitoring" summary = "Rapporten: {0}, Kritiek: {1}" -f $Status.ReportsRetrieved, $Status.CriticalReports details = @{ graphConnected = $Status.GraphConnected oldestCriticalDays = $Status.OldestOpenCriticalDays issues = $Status.Issues recommendations = $Status.Recommendations } } try { Invoke-RestMethod -Method Post -Uri $webhook -Body ($body | ConvertTo-Json -Depth 6) -ContentType "application/json" | Out-Null Write-Verbose "Webhook-notificatie verzonden." } catch { Write-Warning "Webhook-notificatie mislukt: $_" } } function Test-ThreatAnalyticsConfiguration { <# .SYNOPSIS Valideert Threat Analytics beschikbaarheid en opvolging .OUTPUTS PSCustomObject met statusinformatie #> [CmdletBinding()] param() $result = [ordered]@{ IsCompliant = $false GraphConnected = $script:GraphReady ReportsRetrieved = 0 CriticalReports = 0 OldestOpenCriticalDays = $null SeverityBreakdown = $null TacticHighlights = $null Issues = @() Recommendations = @() Timestamp = (Get-Date).ToString("s") } if (-not $script:GraphReady) { $result.Issues += "Geen Graph-verbinding. Start Connect-RequiredServices opnieuw of controleer PIM-rollen." return [pscustomobject]$result } $reports = Get-ThreatAnalyticsReports $result.ReportsRetrieved = $reports.Count if ($reports.Count -eq 0) { $result.Issues += "Geen Threat Analytics rapporten gevonden. Controleer licenties (M365 E5 of Defender for Endpoint Plan 2) en onboardingstatus." } else { $critical = $reports | Where-Object { $_.severity -eq "critical" -or $_.severity -eq "high" } $result.CriticalReports = $critical.Count $summary = New-ThreatAnalyticsSummary -Reports $reports $result.SeverityBreakdown = $summary.SeverityBreakdown $result.TacticHighlights = $summary.TacticHighlights $result.OldestOpenCriticalDays = $summary.OldestHighDays if ($critical.Count -gt 0) { if ($result.OldestOpenCriticalDays -gt 14) { $result.Issues += "Er staan kritieke campagnes langer dan 14 dagen open. Versnel remediatie en rapporteer aan de CISO." } } else { $result.Recommendations += "Geen kritieke campagnes. Blijf dagelijkse monitoring uitvoeren en documenteer reviewmomenten." } $result.Recommendations += "Publiceer Threat Analytics bevindingen in het wekelijkse cyberoverleg." $result.Recommendations += "Koppel exposure-scores aan ITSM-tickets met duidelijke eigenaarschap." } if ($result.Issues.Count -eq 0 -and $reports.Count -gt 0) { $result.IsCompliant = $true } return [pscustomobject]$result } function Export-ThreatAnalyticsStatus { <# .SYNOPSIS Exporteert resultaten naar JSON bestand #> [CmdletBinding()] param( [Parameter(Mandatory)] [string]$Path, [Parameter(Mandatory)] [pscustomobject]$Data ) try { $directory = Split-Path -Path $Path -Parent if (-not (Test-Path -Path $directory)) { New-Item -ItemType Directory -Path $directory -Force | Out-Null } $Data | ConvertTo-Json -Depth 5 | Out-File -FilePath $Path -Encoding UTF8 Write-KnowledgeNote -Path $Path -Status $Data Write-Host "Status geëxporteerd naar $Path" -ForegroundColor Green } catch { Write-Warning "Kon status niet exporteren: $_" } } function Invoke-Monitoring { <# .SYNOPSIS Voert de monitoringflow uit #> [CmdletBinding()] param() Write-Host "`nMonitoring: Threat Analytics" -ForegroundColor Cyan Write-Host "================================" -ForegroundColor Cyan $status = Test-ThreatAnalyticsConfiguration if (-not $status.GraphConnected) { Write-Host " ⚠️ Microsoft Graph niet verbonden" -ForegroundColor Yellow } Write-Host " Rapporten opgehaald : $($status.ReportsRetrieved)" -ForegroundColor White Write-Host " Kritieke campagnes : $($status.CriticalReports)" -ForegroundColor White if ($status.OldestOpenCriticalDays) { Write-Host " Oudste kritieke campagne staat $($status.OldestOpenCriticalDays) dagen open." -ForegroundColor Yellow } if ($status.SeverityBreakdown) { Write-Host "`nSeverities (laatste run):" -ForegroundColor Cyan foreach ($pair in $status.SeverityBreakdown.GetEnumerator()) { Write-Host (" - {0,-12}: {1}" -f $pair.Key, $pair.Value) -ForegroundColor White } } if ($status.TacticHighlights) { Write-Host "`nTop MITRE ATT&CK tactieken:" -ForegroundColor Cyan foreach ($tactic in $status.TacticHighlights) { Write-Host (" - {0}: {1}" -f $tactic.Key, $tactic.Value) -ForegroundColor White } } if ($status.IsCompliant) { Write-Host "`n✅ Threat Analytics basiscontrole geslaagd" -ForegroundColor Green } else { Write-Host "`n⚠️ Threat Analytics vereist aandacht" -ForegroundColor Yellow } if ($status.Issues.Count -gt 0) { Write-Host "`nGeconstateerde issues:" -ForegroundColor Red $status.Issues | ForEach-Object { Write-Host " - $_" -ForegroundColor Red } } if ($status.Recommendations.Count -gt 0) { Write-Host "`nAanbevelingen:" -ForegroundColor Cyan $status.Recommendations | ForEach-Object { Write-Host " - $_" -ForegroundColor White } } if ($ExportPath) { Export-ThreatAnalyticsStatus -Path $ExportPath -Data $status } Send-ThreatAnalyticsNotification -Status $status return $status } function Invoke-Remediation { <# .SYNOPSIS Geeft remediatie-instructies voor Threat Analytics #> [CmdletBinding()] param() Write-Host "`nRemediatiegids: Threat Analytics" -ForegroundColor Cyan Write-Host "================================" -ForegroundColor Cyan if ($WhatIf) { Write-Host " [WhatIf] Remediatie-instructies worden enkel weergegeven (geen acties uitgevoerd)." -ForegroundColor Yellow } Write-Host "`nStap 1 – Licentie en onboarding" -ForegroundColor White Write-Host " Controleer of alle relevante apparaten Microsoft Defender voor Endpoint Plan 2 of M365 E5 gebruiken." -ForegroundColor Gray Write-Host " Valideer onboardingstatus in security.microsoft.com → Settings → Endpoints → Device management." -ForegroundColor Gray Write-Host "`nStap 2 – Rollen en toegang" -ForegroundColor White Write-Host " Stel aangepaste rollen in voor CISO, SOC en auditors met minimaal ThreatAnalytics.Read.All rechten." -ForegroundColor Gray Write-Host " Gebruik Privileged Identity Management voor tijdelijke onderzoeksrechten." -ForegroundColor Gray Write-Host "`nStap 3 – Procesintegratie" -ForegroundColor White Write-Host " Leg vast dat elk nieuw rapport binnen 24 uur wordt beoordeeld en dat exposure-items een eigenaar hebben." -ForegroundColor Gray Write-Host " Koppel het rapportnummer aan ITSM-changes en incidenten zodat audittrail volledig is." -ForegroundColor Gray Write-Host "`nStap 4 – Automatisering" -ForegroundColor White Write-Host " Plan het script .\\threat-analytics.ps1 -Monitoring in Windows Task Scheduler of Azure Automation." -ForegroundColor Gray Write-Host " Exporteer resultaten naar een beveiligde opslaglocatie en stuur een melding naar het cyberoverleg." -ForegroundColor Gray Write-Host "`nStap 5 – Communicatie en compliance" -ForegroundColor White Write-Host " Rapporteer kritieke campagnes direct aan het bestuur en aan ketenpartners indien relevant." -ForegroundColor Gray Write-Host " Archiveer alle rapporten minimaal zeven jaar voor NIS2 en AVG auditverplichtingen." -ForegroundColor Gray Write-Host "`n✅ Remediatie-instructies voltooid" -ForegroundColor Green } try { Write-Host "`n================================" -ForegroundColor Cyan Write-Host "Threat Analytics – Nederlandse Baseline" -ForegroundColor Cyan Write-Host "================================`n" -ForegroundColor Cyan Connect-RequiredServices if ($Monitoring) { Invoke-Monitoring | Out-Null } elseif ($Remediation) { Invoke-Remediation } else { $status = Invoke-Monitoring if (-not $status.IsCompliant) { Write-Host "`nTip: run .\threat-analytics.ps1 -Remediation voor detailstappen." -ForegroundColor Yellow } } } catch { Write-Error "Scriptfout: $_" throw } finally { Write-Host "`n================================`n" -ForegroundColor Cyan }

Risico zonder implementatie

Risico zonder implementatie
High: Wanneer Threat Analytics niet wordt benut, blijft de organisatie blind voor actuele campagnes en ontbreekt de bewijsvoering dat NIS2-, BIO- en AVG-verplichtingen zijn geïntegreerd in risicobeheer. Dit leidt tot vertraagde respons, hogere forensische kosten en een aantoonbaar gebrek aan bestuurlijke grip.

Management Samenvatting

Activeer Threat Analytics, automatiseer de Graph-koppeling met het meegeleverde PowerShell-runbook en veranker de inzichten in governance-, incident- en auditprocessen. Zo beschikken bestuurders en SOC over dezelfde feitenbasis, dalen blootstellingsscores aantoonbaar en ontstaat herleidbare compliance met CIS, BIO, ISO 27001, NIS2 en AVG.