Microsoft Defender Voor Endpoint: Threat Analytics En Inlichtingenkoppeling
📅 2025-11-27
•
⏱️ 48 minuten lezen
•
🟢 High
💼 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
CIS M365: Control (L1) - CIS Microsoft 365 Foundations Benchmark – real-time threat intelligence, incident response en endpointmonitoring met traceerbare opvolging.
BIO: 12.01, 12.03, 14.01 - BIO Baseline Informatiebeveiliging Overheid – thema 12 Security Operations en thema 14 Incidentmanagement met nadruk op intelligencegestuurde besluitvorming.
ISO 27001:2022: A.5.7, A.5.23, A.8.16, A.8.23 - ISO 27001:2022 – beheer van informatiebeveiligingsincidenten, informatie-uitwisseling en continue monitoring van dreigingen.
NIS2: Artikel - NIS2 – risicobeheermaatregelen, incidentafhandeling en rapportage naar bevoegde autoriteiten met up-to-date dreigingsinformatie.
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
}
}
functionGet-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 @()
}
}
functionNew-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 = $nullforeach ($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 = $nullif ($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: $_"
}
}
functionTest-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 $DataWrite-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-ThreatAnalyticsConfigurationif (-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 $statusreturn$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.