APT Threat Profiles: Informatiegestuurde Dreigingsanalyse Voor Microsoft 365

💼 Management Samenvatting

APT-threat profielen vormen de brug tussen ruwe dreigingsinformatie en concrete verdedigingsmaatregelen binnen Microsoft 365. Ze beschrijven niet alleen welke indicatoren zijn waargenomen, maar leggen ook het gedrags-DNA vast van actoren die maandenlang ongezien kunnen opereren in identiteits- en samenwerkingstools. Door deze profielen centraal te stellen in de Nederlandse Baseline voor Veilige Cloud ontstaat een consistent verhaal waarin architectuur, monitoring en crisisrespons elkaar versterken en bestuurders begrijpen waarom specifieke beveiligingsinvesteringen noodzakelijk zijn.

Aanbeveling
IMPLEMENT
Risico zonder
Very High
Risk Score
9/10
Implementatie
0u
Van toepassing op:
Microsoft 365 E5
Microsoft Defender XDR
Microsoft Sentinel

Zonder uitgewerkte APT-profielen blijven securityteams gevangen in een reactieve modus waarin elke waarschuwing als losstaand incident wordt behandeld. SOC-analisten missen dan het overzicht van de motieven, middelen en langetermijndoelen van geavanceerde tegenstanders en configuratiemanagers weten niet welke maatregel als eerste moet worden aangescherpt. Voor overheidsorganisaties brengt dit een verhoogd risico op langdurige compromittering mee, omdat statelijke actoren juist de tijd nemen om privileges te verkennen, mailboxen af te luisteren en beleidsdocumenten te exfiltreren. Door de tactieken, technieken en procedures van deze actoren te documenteren, ontstaat een gedeeld begrippenkader tussen beleidsmakers, CISO-office en operationele teams. Dat kader versnelt besluitvorming tijdens een incident, voorkomt dubbel werk in monitoring en maakt het eenvoudiger richting toezichthouders om aan te tonen dat beveiliging risicogestuurd wordt ingericht.

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

Implementatie

Dit artikel biedt een volledig stappenplan voor het opstellen, bijhouden en operationaliseren van APT-threat profielen in Microsoft 365. Eerst bespreken we de noodzakelijke inhoud van een profiel en leggen we uit hoe u strategische motieven, tactische aanvalspatronen en operationele indicatoren samenbrengt in één consistent document. Daarna beschrijven we het samenwerkingsproces dat nodig is om profielen te verrijken met Nederlandse sectorinformatie, wettelijke vereisten en kennis uit eigen incidentrespons. Tot slot laten we zien hoe u elk profiel vertaalt naar concrete detecties in Microsoft Defender XDR en Microsoft Sentinel, inclusief de inzet van een PowerShell-assessment om randvoorwaarden te controleren. Het resultaat is een robuuste werkwijze waarmee organisaties voortdurend leren van dreigingsinformatie en die lessen direct verankeren in hun beveiligingsconfiguratie.

Wat is een APT-profiel en waarom is het cruciaal voor Microsoft 365-beveiliging?

Een APT-profiel is een narratief dossier dat het volledige gedragspatroon van een dreigingsactor blootlegt. Het beschrijft hoe een groep zich voorbereidt, welke aanvalsparcoursen worden gekozen, welke misleidings- en persistentiemechanismen worden ingezet en hoe exfiltratie of sabotage uiteindelijk plaatsvindt. Dit gaat dus veel verder dan het verzamelen van losse indicatoren. De beschrijving omvat motieven, doelwitten, operationele tempo's, gebruikte tooling en zeer specifieke tactieken zoals misbruik van gedelegeerde Exchange-permissies of het aanmaken van OAuth-app-registraties voor persistente toegang. Voor Microsoft 365 is dit cruciaal omdat vrijwel iedere stap van de aanval plaatsvindt in identiteits- en samenwerkingstoepassingen die dagelijks intensief worden gebruikt door ambtenaren, beleidsteams en uitvoerders. Alleen wanneer het volledige aanvalsscenario is vastgelegd, kan een organisatie gericht bepalen waar extra detectie, logging en procesbewaking nodig is.

Waar traditionele dreigingsinformatie vaak generiek blijft, dwingt een APT-profiel Nederlandse overheidsorganisaties om hun eigen context centraal te stellen. Welke beleidsdossiers interesseren buitenlandse inlichtingendiensten, welke vitale processen leunen zwaar op SharePoint-omgevingen, welke ketenpartners hebben toegang tot Teams-kanalen en waar liggen de knelpunten rondom legacy-authenticatie? Door deze vragen te beantwoorden per actor ontstaat een directe link tussen geopolitieke ontwikkelingen en de configuratiekaders van Microsoft 365. Het profiel biedt bestuurders houvast omdat het uitlegt waarom bijvoorbeeld investering in FIPS-gecertificeerde hardware-tokens voor bestuurders zinvol is, of waarom de bewaartermijn van Entra ID auditlogs moet worden verdubbeld. Daarmee wordt threat intelligence een instrument voor strategische besluitvorming en niet slechts een SOC-artefact.

Een doordacht profiel combineert informatie uit meerdere lagen. Strategisch gaat het om de doelstellingen van de actor, zoals het beïnvloeden van Nederlandse standpunten in internationale onderhandelingen of het ontregelen van besluitvorming rond infrastructuurprojecten. Tactisch gaat het over veelgebruikte aanvalspatronen binnen Microsoft 365: spear-phishing via vertrouwelijke briefings, compromitteren van gastaccounts die toegang hebben tot samenwerkingsomgevingen, misbruik van gedeelde mailboxen om laterale beweging te verbergen en het manipuleren van Teams-vergaderingen om social engineering te faciliteren. Operationeel worden deze tactieken vertaald naar logische observaties, bijvoorbeeld afwijkende aanmeldlocaties met onmogelijke reispatronen, plotselinge aanmaak van mailbox forwarding rules of ongebruikelijke Graph API-calls naar gevoelige SharePoint-sites. Door deze beschrijvingen te verankeren in MITRE ATT&CK ontstaat een gemeenschappelijke taal tussen analisten, ontwikkelaars van detecties en leveranciers.

Belangrijk is dat een APT-profiel niet in een lade verdwijnt maar fungeert als leidraad voor meerdere disciplines. Architecten gebruiken het om zero-trustprincipes te prioriteren, privacy officers koppelen het aan effectbeoordelingen en SOC-teams beschouwen het als catalogus voor hunting-sessies. Ook communicatie- en crisisteams profiteren omdat het profiel aangeeft welke informatie de actor probeert te stelen en welke maatschappelijke impact dat kan hebben. Hierdoor kan reputatieschade worden beperkt en kunnen bestuurders sneller beslissen over openbaarmaking of juridische stappen. Het profiel vormt zo de spil van een volwassen, intelligence-gestuurde beveiligingsorganisatie.

Stapsgewijs opbouwen van APT-profielen voor Nederlandse overheidsorganisaties

Het ontwikkelen van een APT-profiel start met een formele opdracht van het bestuur of de CISO, waarin wordt vastgelegd dat dreigingsgestuurde beveiliging een strategische prioriteit is. Vervolgens wordt een eigenaar benoemd, meestal het hoofd threat intelligence of een senior analist binnen het SOC, die verantwoordelijk is voor de levenscyclus van de profielen. Deze eigenaar definieert een intakeproces voor bronnen waarin NCSC-rapporten, sectorale threat advisories, Microsoft threat intelligence updates en lessons learned uit eigen incidenten worden verzameld. Alle informatie wordt geclassificeerd op betrouwbaarheid en relevantie en direct vertaald naar MITRE ATT&CK-technieken, zodat de overlap met bestaande detectieregels zichtbaar wordt. Door al in deze vroege fase de structuur van het profiel te kiezen (strategisch, tactisch, operationeel) ontstaat consistentie tussen verschillende actoren en kunnen nieuwe bronnen snel worden ingepast.

De volgende fase draait om contextverrijking en validatie. Een multidisciplinair team met vertegenwoordigers van architectuur, privacy, juridische zaken en primaire procesonderdelen bekijkt het ruwe profiel en toetst of het scenario realistisch is voor de organisatie. Zij bepalen welke kroonjuwelen het meest aantrekkelijk zijn voor de beschreven actor, welke gebruikerspersona's waarschijnlijk doelwit zijn en welke bestaande beveiligingsgaten het risico vergroten. Denk aan onvoldoende afgedwongen phishing-resistente MFA voor beleidsmedewerkers, Teams-kanalen waarin externe partners structureel bewerken of gedeelde mailboxen waar beheerderrechten op rusten. Door deze dialoog ontstaat een lijst met concrete aanvalspaden die de actor waarschijnlijk zal volgen in de lokale context. Het profiel wordt aangevuld met voorbeelden van documenten of systemen die gevaar lopen, wat later essentieel is voor crisiscommunicatie.

Wanneer de context staat, wordt de informatie vertaald naar operationele use cases. Voor elk geïdentificeerd scenario beschrijft het team welke logbronnen minimaal nodig zijn, welke drempelwaarden gelden en welke correlaties moeten worden gelegd in Microsoft Sentinel of Defender XDR. Hierbij wordt nadrukkelijk uitgewerkt hoe lang logs beschikbaar moeten blijven om dwell time van de actor te kunnen reconstrueren en welke datakwaliteitscontroles nodig zijn om false positives te beperken. Ook wordt bepaald welke configuratie-instellingen in Microsoft 365 gekoppeld worden aan het profiel: Conditional Access-policy's voor specifieke rollen, strengere DLP op gevoelige SharePoint-sites, verscherpte monitoring van OAuth-consent en periodieke review van gedelegeerde mailboxpermissies. Elk onderdeel krijgt een eigenaar en een updatefrequentie zodat de relatie tussen dreiging en maatregel traceerbaar blijft.

Ten slotte wordt het profiel ingebed in governanceprocessen. Er komt een updatecyclus waarin minimaal elk kwartaal wordt gecontroleerd of de dreigingsactor nieuwe tactieken inzet en of incidenten binnen of buiten de organisatie extra bewijs leveren. Wijzigingen worden vastgelegd in versiebeheer, gekoppeld aan risicoregisters en gedeeld met het crisismanagementteam zodat iedereen werkt met dezelfde aannames. Bij elke wijziging wordt beoordeeld of er gevolgen zijn voor bestaande detectieregels, beleidsdocumenten of awareness-campagnes. Hierdoor ontstaat een levende kennisbron die direct impact heeft op auditvoorbereiding, rapportages richting toezichthouders en beslissingen over budget of prioriteitstelling. Het profiel fungeert zo als verbindend element tussen strategische doelen en dagelijkse security-operations.

Van APT-profielen naar concrete detectie in Microsoft Defender XDR en Sentinel

Gebruik PowerShell-script apt-threat-profiles.ps1 (functie Invoke-AptThreatProfileAssessment) – PowerShell-script dat basiscontroles uitvoert op logging- en configuratievoorwaarden om APT-profielen effectief te kunnen toepassen in Microsoft 365..

Operationalisatie begint met het doorvertalen van elke beschreven tactiek naar een concreet datapunt dat binnen Microsoft 365 kan worden gemeten. Voor identiteitsgerichte stappen betekent dit dat Entra ID auditlogs, sign-in logs en provisioning events volledig moeten worden ontsloten naar Microsoft Sentinel. Voor postbusmisbruik zijn Exchange Online mailbox audit logs en regels omtrent forwarding essentieel, terwijl exfiltratie via OneDrive of SharePoint vraagt om gedetailleerde access logs en integratie met Microsoft Defender for Cloud Apps. De bewaartermijnen worden afgestemd op de verwachte verblijfsduur van de actor; voor statelijke tegenstanders wordt minimaal 180 dagen logging aanbevolen zodat anomalieën ook achteraf kunnen worden gereconstrueerd. Het PowerShell-script dat bij dit artikel hoort controleert of basale randvoorwaarden zoals Graph-connectiviteit en toegang tot auditlogs aanwezig zijn en geeft het SOC direct feedback over ontbrekende permissies.

Vervolgens worden detectieregels ontworpen die de unieke modus operandi van de actor weerspiegelen. In plaats van generieke regels baseert het SOC zich op de scenario's uit het profiel en schrijft het KQL-query's die meerdere indicatoren combineren, zoals het opeenvolgend inschakelen van legacy-authenticatie, het aanmaken van verdachte inbox rules en opvallende aanmeldingen vanaf diplomatieke locaties. Defender XDR-hunting query's richten zich op de interactie tussen endpoints en cloud-identiteiten zodat laterale beweging zichtbaar wordt. Elke detectieregel krijgt een duidelijke drempelwaarde en een verwijzing naar het betreffende APT-profiel zodat analisten onmiddellijk begrijpen waarom de alert belangrijk is. Onderhoudsprocedures zorgen ervoor dat query's worden bijgewerkt zodra de actor nieuwe technieken inzet.

Naast detectie hoort bij ieder profiel een set playbooks voor respons en communicatie. SOC-analisten leggen stap voor stap vast hoe een vermoeden van activiteit van deze actor moet worden onderzocht: welke aanvullende logs moeten worden veiliggesteld, welke forensische acties zijn toegestaan binnen het juridische kader en welke functionarissen moeten direct worden geïnformeerd. Deze playbooks worden geïmplementeerd als Logic Apps of automatiseringen in Microsoft Sentinel, aangevuld met handmatige beslismomenten voor gevoelige stappen zoals het informeren van departementale SG's. Door het playbook aan het profiel te koppelen ontstaat een duidelijk auditspoor dat laat zien dat incidentafhandeling proportioneel en gebaseerd op actuele dreigingsinformatie plaatsvindt.

Tot slot wordt een feedbacklus ingericht. Elk incident, near miss of threat intelligence-update wordt beoordeeld op relevantie voor het profiel. Wanneer nieuwe TTP's verschijnen, worden detectieregels aangepast, configuraties opnieuw geëvalueerd en trainingsmateriaal voor analisten geactualiseerd. Het profiel fungeert als versiebeheerd document waarin wijzigingen worden gelogd met datum, bron en verantwoordelijke. Hierdoor kunnen toezichthouders zien dat de organisatie leert van ervaringen en voortdurend investeert in situational awareness, terwijl bestuurders inzicht krijgen in de voortgang van risicobeperking. Door deze cyclus te borgen ontstaat een duurzame, intelligence-gedreven werkwijze waarin Microsoft 365 niet alleen technisch maar ook organisatorisch is voorbereid op geavanceerde dreigingen.

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 Controleert basisvoorwaarden voor het toepassen van APT-threat profiles in Microsoft 365. .DESCRIPTION Dit script voert een aantal niet-invasieve controles uit om te bepalen of de Microsoft 365-tenant klaar is voor het effectief toepassen van APT-threat profiles. Het controleert of: - Een geldige Microsoft Graph-context aanwezig is (of maakt verbinding indien nodig) - Belangrijke audit- en sign-inlogs beschikbaar zijn (voor zover mogelijk via Graph) - Microsoft 365 Defender / Defender XDR gegevensbronnen beschikbaar lijken Het script voert GEEN wijzigingen uit in de tenantconfiguratie. Het is bedoeld als ondersteunende check bij het artikel 'apt-threat-profiles' binnen de Nederlandse Baseline voor Veilige Cloud. .NOTES Filename : apt-threat-profiles.ps1 Author : Nederlandse Baseline voor Veilige Cloud Created : 2025-11-27 Version : 1.0 Gerelateerd JSON-artikel: content/m365/threat-intelligence/apt-threat-profiles.json .EXAMPLE .\apt-threat-profiles.ps1 -Assessment Voert een basisassessment uit voor de randvoorwaarden om APT-profielen effectief toe te passen. .EXAMPLE .\apt-threat-profiles.ps1 -WhatIf Toont welke controles zouden worden uitgevoerd zonder daadwerkelijk verbindingen op te zetten. #> #Requires -Version 5.1 #Requires -Modules Microsoft.Graph [CmdletBinding()] param( [Parameter()] [switch]$WhatIf, [Parameter()] [switch]$Assessment ) $ErrorActionPreference = 'Stop' $VerbosePreference = 'SilentlyContinue' function Connect-NbvvcGraphContext { <# .SYNOPSIS Zorgt voor een geldige Microsoft Graph-verbinding. #> [CmdletBinding()] param() Write-Verbose "Controleren van bestaande Microsoft Graph-context..." try { $ctx = Get-MgContext -ErrorAction SilentlyContinue if (-not $ctx) { if ($WhatIf) { Write-Host "WhatIf: zou Connect-MgGraph uitvoeren met minimumbereik voor security- en auditcontroles." -ForegroundColor Yellow return } Write-Host "Verbinding maken met Microsoft Graph..." -ForegroundColor Yellow Connect-MgGraph -Scopes @( "Directory.Read.All", "AuditLog.Read.All", "SecurityEvents.Read.All" ) -ErrorAction Stop $ctx = Get-MgContext -ErrorAction Stop Write-Host "Verbonden met Microsoft Graph tenant: $($ctx.TenantId)" -ForegroundColor Green } else { Write-Verbose "Bestaande Microsoft Graph-context gevonden voor tenant $($ctx.TenantId)" } } catch { Write-Error "Kon geen geldige Microsoft Graph-context verkrijgen: $_" throw } } function Test-AptThreatProfileReadiness { <# .SYNOPSIS Voert basiscontroles uit voor APT-profieltoepassing. .OUTPUTS PSCustomObject met resultaten van de readiness-check. #> [CmdletBinding()] param() $result = [PSCustomObject]@{ TenantId = $null HasDirectoryRead = $false HasAuditLogAccess = $false HasSecurityEventsAccess = $false HasUnifiedAuditLogConfigured = $null Issues = @() Recommendations = @() } try { $ctx = Get-MgContext -ErrorAction SilentlyContinue if ($ctx) { $result.TenantId = $ctx.TenantId } Write-Host "`nAPT Threat Profile Readiness Check" -ForegroundColor Cyan Write-Host "=====================================" -ForegroundColor Cyan # Directory-toegang controleren try { Write-Verbose "Controleren van directorytoegang..." if (-not $WhatIf) { $org = Get-MgOrganization -ErrorAction Stop $result.HasDirectoryRead = $true Write-Host " OK: Directory.Read.All is actief en basistenantinformatie is beschikbaar ($($org.DisplayName))." -ForegroundColor Green } else { Write-Host " WhatIf: zou Get-MgOrganization aanroepen om directorytoegang te verifiëren." -ForegroundColor Yellow $result.HasDirectoryRead = $true } } catch { $result.Issues += "Kon tenantinformatie niet ophalen; controleer of Directory.Read.All is toegestaan." Write-Warning " Tenantinformatie niet beschikbaar. Directory.Read.All rechten ontbreken mogelijk." } # AuditLog-toegang controleren (Unified Audit Log / Sign-in logs) try { Write-Verbose "Controleren van auditlog- en sign-intoegang..." if (-not $WhatIf) { $null = Get-MgAuditLogSignIn -Top 1 -ErrorAction Stop $result.HasAuditLogAccess = $true Write-Host " OK: AuditLog.Read.All is actief en sign-inlogs zijn beschikbaar voor analyse." -ForegroundColor Green } else { Write-Host " WhatIf: zou Get-MgAuditLogSignIn gebruiken om auditlogtoegang te verifiëren." -ForegroundColor Yellow $result.HasAuditLogAccess = $true } } catch { $result.Issues += "Sign-inlogs zijn niet toegankelijk; APT-detectie op accountniveau is beperkt." Write-Warning " Sign-inlogs niet beschikbaar of rechten ontbreken." } # SecurityEvents / Defender XDR-scope controleren try { Write-Verbose "Controleren van security events-toegang (Defender XDR)..." if (-not $WhatIf) { # In veel tenants is SecurityEvents beperkt; test daarom defensief $null = Get-MgSecurityAlert -Top 1 -ErrorAction Stop $result.HasSecurityEventsAccess = $true Write-Host " OK: SecurityEvents.Read.All is actief en Defender XDR-incidenten zijn beschikbaar." -ForegroundColor Green } else { Write-Host " WhatIf: zou Get-MgSecurityAlert aanroepen om toegang tot Defender XDR-incidenten te verifiëren." -ForegroundColor Yellow $result.HasSecurityEventsAccess = $true } } catch { $result.Issues += "Defender XDR-incidenten zijn niet toegankelijk; koppeling tussen APT-profielen en incidenten is beperkt." Write-Warning " Geen toegang tot Defender XDR-incidenten of SecurityEvents.Read.All ontbreekt." } # Unified Audit Log configuratie – indicatief (geen config-wijzigingen) try { Write-Verbose "Indicatieve controle op Unified Audit Log configuratie..." if (-not $WhatIf) { # Een directe configcheck vereist Exchange Online; hier checken we alleen of logs binnenkomen. $signins = Get-MgAuditLogSignIn -Top 5 -ErrorAction Stop $result.HasUnifiedAuditLogConfigured = ($signins.Count -gt 0) if ($result.HasUnifiedAuditLogConfigured) { Write-Host " OK: Auditlogging lijkt actief en er zijn recente sign-in events beschikbaar." -ForegroundColor Green } else { Write-Host " Er zijn geen sign-in events gevonden; controleer auditlogconfiguratie handmatig." -ForegroundColor Yellow $result.Issues += "Geen sign-in events aangetroffen; Unified Audit Log-configuratie moet worden geverifieerd." } } else { Write-Host " WhatIf: zou recente sign-in events ophalen om auditlogactiviteit te verifiëren." -ForegroundColor Yellow $result.HasUnifiedAuditLogConfigured = $null } } catch { $result.Issues += "Kon geen indicatieve controle op auditlogging uitvoeren; controleer Unified Audit Log handmatig." Write-Warning " Kon auditlogactiviteit niet verifiëren." } # Aanbevelingen op basis van bevindingen if (-not $result.HasDirectoryRead) { $result.Recommendations += "Vraag Directory.Read.All-toegang aan voor het securityteam om APT-profielen aan tenantgegevens te koppelen." } if (-not $result.HasAuditLogAccess) { $result.Recommendations += "Zorg dat AuditLog.Read.All is geautoriseerd en dat Unified Audit Log is ingeschakeld voor minimaal 90 dagen." } if (-not $result.HasSecurityEventsAccess) { $result.Recommendations += "Activeer toegang tot Defender XDR-incidenten (SecurityEvents.Read.All) voor SOC- en threat intelligence-teams." } if ($result.HasUnifiedAuditLogConfigured -eq $false) { $result.Recommendations += "Controleer in het Microsoft 365 compliance center of auditlogging is ingeschakeld en of bewaartermijnen aansluiten bij NIS2/BIO-eisen." } Write-Host "`nSamenvatting:" -ForegroundColor Cyan Write-Host " TenantId : $($result.TenantId)" -ForegroundColor White Write-Host " Directory.Read.All : $($result.HasDirectoryRead)" -ForegroundColor White Write-Host " AuditLog.Read.All : $($result.HasAuditLogAccess)" -ForegroundColor White Write-Host " SecurityEvents.Read.All : $($result.HasSecurityEventsAccess)" -ForegroundColor White Write-Host " Auditlogging indicatief OK : $($result.HasUnifiedAuditLogConfigured)" -ForegroundColor White if ($result.Issues.Count -gt 0) { Write-Host "`nGevonden aandachtspunten:" -ForegroundColor Yellow foreach ($issue in $result.Issues) { Write-Host " - $issue" -ForegroundColor Yellow } } if ($result.Recommendations.Count -gt 0) { Write-Host "`nAanbevolen vervolgstappen:" -ForegroundColor Green foreach ($rec in $result.Recommendations) { Write-Host " - $rec" -ForegroundColor Green } } } catch { Write-Error "Fout tijdens APT readiness-check: $_" $result.Issues += "Algemene fout tijdens readiness-check: $_" } return $result } function Invoke-AptThreatProfileAssessment { <# .SYNOPSIS Publieke functie die wordt aangeroepen vanuit documentatie en automation. #> [CmdletBinding()] param() if (-not $WhatIf) { Connect-NbvvcGraphContext } $assessment = Test-AptThreatProfileReadiness return $assessment } if ($Assessment) { Invoke-AptThreatProfileAssessment | Out-Null }