Microsoft 365: Entra Threat Protection Voor Identiteiten

💼 Management Samenvatting

Microsoft Entra Threat Protection vormt de identity-intelligencelaag binnen de Nederlandse Baseline voor Veilige Cloud en combineert risicosignalen, gedragspatronen en beleidsmaatregelen om geavanceerde aanvallen op accounts, apparaten en service-principals te blokkeren voordat zij zich kunnen verspreiden in het M365-landschap.

Aanbeveling
IMPLEMENT
Risico zonder
Hoog
Risk Score
9/10
Implementatie
100u (tech: 60u)
Van toepassing op:
M365
Entra ID

Aanvallen op identiteiten zijn verantwoordelijk voor het grootste deel van de gerapporteerde incidenten bij zowel Rijksoverheid als vitale aanbieders. Credential dumping, pass-the-cookie, OAuth-misbruik en gerichte social engineering omzeilen traditionele netwerkperimeters en zoeken naar onbeschermde cloud-identiteiten. Zonder een geïntegreerd Entra Threat Protection-programma ontbreekt het aan realtime zicht op risico-indicatoren, waardoor beslissingen over blokkeren, forceren van herauthenticatie of forensisch onderzoek te laat worden genomen. De BIO, AVG en NIS2 verlangen dat organisaties aantoonbaar passende technische en operationele maatregelen treffen; het negeren van identity-threat intelligence leidt tot onacceptabele bestuurlijke en juridische exposure.

PowerShell Modules Vereist
Primary API: Microsoft Graph API
Connection: Connect-MgGraph
Required Modules: Microsoft.Graph.Identity.SignIns, Microsoft.Graph.Identity.Protection

Implementatie

Dit artikel beschrijft hoe security- en compliance-teams een volwassen Entra Threat Protection-architectuur ontwerpen, implementeren en beheren. We behandelen het datamodel achter Identity Protection, de inrichting van risk policies voor gebruikers, aanmeldingen en service-principals, de koppeling met Conditional Access en Microsoft Sentinel, en de governance- en rapportageprocessen die nodig zijn om bewijs te leveren richting toezichthouders. Ook lichten we toe hoe geautomatiseerde PowerShell-controles continu kunnen aantonen dat risk policies actief zijn en dat high-risk entiteiten binnen gedefinieerde termijnen worden gesaneerd.

Context en dreigingen in de Nederlandse werkelijkheid

Nederlandse overheidsorganisaties en vitale aanbieders hebben de afgelopen jaren een duidelijke verschuiving gezien van generieke malwarecampagnes naar doelgerichte identity-aanvallen. Aanvallers verzamelen gedetailleerde informatie uit openbare bronnen, combineren dit met gelekte wachtwoorden en richten zich vervolgens op beleidsmedewerkers, financieel controllers of IT-beheerders die toegang hebben tot cloudresources. In een gemiddelde M365-tenant vinden per dag duizenden aanmeldingspogingen plaats vanaf atypische locaties of anonieme netwerken. Zonder geconsolideerde dreigingsinformatie blijft het bij losse meldingen uit het Security Operations Center, waardoor de werkelijke urgentie niet doordringt tot bestuur en lijnmanagement. Entra Threat Protection biedt een uniform risicobeeld dat direct zichtbaar maakt welke identiteiten worden aangevallen, met welke technieken en welke beleidsmaatregelen wel of niet zijn aangeslagen.

Bijzondere aandacht is nodig voor de dreigingen die voortkomen uit nieuwe werkvormen, zoals hybride vergaderen en ketensamenwerking met gemeenten, provincies en uitvoeringsorganisaties. Gedeelde teamsites, gasttoegang en federatieve identiteiten creëren een stedelijk netwerk van vertrouwensrelaties. Een gecompromitteerde externe identiteit kan zich stilletjes bewegen tussen meerdere tenants, waardoor één phishingcampagne snel uitgroeit tot een interbestuurlijke crisis. Entra Threat Protection correleert signalen uit Identity Protection, Defender for Cloud Apps en Microsoft Sentinel zodat analisten ineens zien dat een gastaccount binnen vier uur inlogt vanuit drie continenten, een OAuth-app registreert en vervolgens gevoelige SharePoint-data exfiltreert. Zulke inzichten zijn cruciaal om de drempel te verlagen voor onmiddellijke containmaatregelen, zoals het blokkeren van specifieke sessies of het intrekken van tokenrechten.

Daarnaast moeten organisaties erkennen dat machine-identiteiten een volwaardig aanvalsoppervlak vormen. Service-principals die legacy scripts of integraties vertegenwoordigen, beschikken vaak over langdurige geheimen zonder moderne bescherming. Aanvallers gebruiken open-source tooling om mis-geconfigureerde app-registraties op te sporen en proberen client secrets te stelen via repository-lekken of build pipelines. Entra Threat Protection monitort risky service principals, signaleert wanneer een app zich ineens vanuit een nieuwe infrastructuur aanmeldt en koppelt dat signaal terug naar Azure Monitor of Sentinel. Door deze signalen te combineren met beleidsregels die gebruik van certificaatauthenticatie afdwingen en geheimen periodiek roteren, wordt het risico van supply-chain misbruik substantieel verlaagd.

Tot slot dwingen Nederlandse wet- en regelgeving tot een bredere interpretatie van identity threats dan enkel technische indicatoren. De NIS2-richtlijn vraagt expliciet om continue risico-assessments, scenario-oefeningen en bewijs dat maatregelen effectief blijven na organisatorische wijzigingen. Entra Threat Protection levert hiervoor de basis door risico-ontwikkelingen te koppelen aan concrete personen, applicaties en processen. Door deze inzichten te delen in maandelijkse CIO-rapportages en de bestuurlijke escalatielijn mee te nemen in runbooks, ontstaat een cultuur waarin identity-beveiliging net zo meetbaar wordt als financiële controles. Daarmee wordt de identiteit het ankertje van Zero Trust in plaats van de zwakste schakel.

Architectuur en implementatie van Entra Threat Protection

Een robuuste Entra Threat Protection-architectuur start met een licentie- en datafundament. Azure AD Premium P2 is noodzakelijk om risk policies voor gebruikers en aanmeldingen te activeren, maar het is even belangrijk om logging te standaardiseren. Activeer daarom Unified Audit Log, stuur Entra sign-in logs realtime naar een centrale Log Analytics workspace en zorg dat Defender for Cloud Apps en Microsoft Sentinel dezelfde workspace gebruiken. Hierdoor kunnen risk events worden verrijkt met context uit endpoint telemetrie of netwerkgegevens. Maak vervolgens een logisch scheidingsmodel waarin production tenants, testomgevingen en leveranciers-tenants hun eigen risk policies krijgen, maar wel onder dezelfde governance vallen. Dit voorkomt dat proof-of-concepts of inhuuraccounts buiten het detectiekader blijven.

De configuratie van risk policies vraagt om een balans tussen bescherming en bedrijfscontinuïteit. Voor user risk policies hanteert de Nederlandse Baseline het principe dat high risk altijd leidt tot blokkeren tot na een wachtwoordreset, terwijl medium risk een gefaseerde aanpak volgt met zelf-service verificatie en escalatie naar het SOC bij herhaaldelijke meldingen. Sign-in risk policies moeten minimaal medium en high risk aanmeldingen afdekken en conditional access inzetten om MFA te forceren of sessies te blokkeren. Gebruik de nieuwe authentication strengths om phishing-resistente methoden verplicht te stellen voor hooggevoelige rollen. Documenteer alle uitzonderingen, bijvoorbeeld voor diplomatieke posten met beperkte connectiviteit, en geef ze een automatische verloopdatum zodat tijdelijke versoepelingen niet permanent worden.

Integreer Entra Threat Protection met bestaande detectie- en responsecapaciteiten. Configureer Sentinel playbooks die bij high risk users automatisch een case aanmaken, de verantwoordelijke CISO informeren en eventuele eerder verleende privileged roles via Privileged Identity Management intrekken. Voor service-principals kunnen Defender for Cloud Apps policies een extra laag toevoegen door OAuth-apps te labelen en risicovolle toestemmingen te blokkeren. Denk ook aan het koppelen van Entra-idrisicogegevens aan HR-systemen voor snelle verificatie of een medewerker nog werkzaam is wanneer een risicosignaal binnenkomt; dit voorkomt dat voormalige medewerkers maandenlang actief blijven als guest account in partner-tenants.

Test de architectuur met realistische scenario’s voordat u deze in productie afdwingt. Organiseer red-team oefeningen waarbij social engineers proberen een wethouder of directeur te verleiden tot het goedkeuren van een malafide OAuth-app, en meet hoe snel Entra Threat Protection dit detecteert. Gebruik de risk simulation functionaliteit om te zien hoe policies reageren op gelekte credentials en impossible travel. Documenteer de beslisregels die het SOC hanteert bij elke risicocategorie en borg dat deze regels terugkomen in change management, zodat toekomstige beleidswijzigingen dezelfde kwaliteit behouden. Door iteratief te testen en lessons learned te delen in het CIO-beraad, groeit het vertrouwen in automatisering en durft men risk policies strenger te maken zonder angst voor onnodige verstoringen.

Governance, monitoring en compliance-eisen

Een Entra Threat Protection-programma staat of valt met bestuurlijke verankering. Stel een identity risk board samen waarin CISO, CIO, Chief Privacy Officer en vertegenwoordigers van kritieke primaire processen maandelijks de risk dashboards beoordelen. Deze groep bepaalt de risicodrempels, keurt uitzonderingen goed en zorgt dat identity-threat metrics onderdeel worden van de reguliere managementrapportages. Gebruik daarvoor indicatoren zoals percentage high risk users dat binnen 24 uur is gesaneerd, aantal service-principals met expiring secrets en trendlijnen van risk detections per ketenpartner. Door dezelfde indicatoren in jaarplannen en strategische veranderprogramma’s op te nemen, ontstaat een directe koppeling tussen beleidsambities en operationele beveiliging.

Compliance-eisen uit BIO, AVG en NIS2 vereisen aantoonbaarheid over de volledige levenscyclus van een risico. Maak daarom een evidence catalogus waarin voor elke control de bijbehorende bron wordt vastgelegd: exports van risk policy-configuraties, Sentinel-rapportages, SOC-tickets en beslisnotities van het risk board. Automatiseer waar mogelijk de aanlevering van bewijsmateriaal door periodiek Graph-exports te laten draaien en deze in een verifieerbaar archief op te slaan. Geef auditors read-only toegang tot de betreffende dashboards zodat zij real-time kunnen meekijken in plaats van op snapshots te vertrouwen. Dit verlaagt de auditdruk en vergroot de geloofwaardigheid van het programma.

Voor governance is ook aandacht nodig voor menselijk gedrag. Leg in HR-procedures vast dat iedere indiensttreding, functiewijziging of vertrek automatisch leidt tot een beoordeling van toegewezen roles en app-registraties. Koppel awarenesscampagnes aan concrete threat intelligence door medewerkers te laten zien hoe een echte risk detection eruitziet en welke stappen onmiddellijk volgen. Dit vergroot het begrip voor strenge policies en vermindert de neiging om spoofed MFA-prompts toch te bevestigen. Zorg dat privacy officers worden betrokken bij het ontwerp van logging- en bewaartermijnen, zodat risk data niet onnodig wordt bewaard maar wel beschikbaar blijft voor onderzoek naar georganiseerde misdaad of statelijke actoren.

Een volwassen governancecyclus betekent tot slot dat inzichten uit Entra Threat Protection terugvloeien naar strategische besluitvorming. Als risk data laat zien dat bepaalde ketenpartners structureel high risk sign-ins veroorzaken, hoort dat thuis in contractmanagement en in de eisen aan gegevensuitwisseling. Wanneer bepaalde processen telkens uitzonderingen nodig hebben, moet de business case voor technische verbeteringen op tafel komen. Documenteer deze terugkoppeling expliciet, bijvoorbeeld in de verplichte NIS2-rapportages richting toezichthouders, zodat duidelijk is dat identity risks niet alleen operationeel worden afgehandeld maar ook leiden tot beleidsaanpassingen. Daarmee voldoet de organisatie aan het principe van voortdurende verbetering dat alle relevante kaders verlangen.

Automatisering, respons en continue verbetering

Traditionele handmatige controles zijn niet langer voldoende om identity threats voor te blijven. Entra Threat Protection levert een rijk ecosysteem aan API’s waarmee controles, rapportages en respons kunnen worden geautomatiseerd. Ontwikkel PowerShell-runbooks die dagelijks policy-status, risk detections en onafgehandelde high risk users ophalen en de resultaten rechtstreeks in het SOC-ticketingsysteem plaatsen. Koppel dezelfde runbooks aan Microsoft Teams-notificaties voor functionarissen met bijzondere verantwoordelijkheden, zoals de Chief Data Officer of de Privacy Officer, zodat besluitvormers direct zicht hebben op de impact van een risicovolle aanmelding. Automatiseer ook de feedbackloop door elk afgehandeld incident te labelen met oorzaak, getroffen maatregelen en doorlooptijd; deze metadata voedt trendanalyses waarmee u kunt aantonen dat de organisatie daadwerkelijk sneller en consistenter reageert.

Automatisering mag echter nooit een black box worden. Bouw een lokale debugmodus in scripts zodat analisten logs kunnen reproduceren zonder verbinding te maken met productie-tenant, en documenteer duidelijk welke Graph-scopes noodzakelijk zijn. Leg vast dat iedere aanpassing aan een runbook door een peer wordt gereviewd en dat unit tests aantonen dat foutscenario’s, zoals ontbrekende policies of netwerkstoringen, netjes worden afgehandeld. Dit voorkomt dat automatisering zelf een risico wordt en sluit aan op de eisen van de CIO voor betrouwbare IT-dienstverlening. Werk nauw samen met het change management board om te bepalen wanneer geautomatiseerde acties daadwerkelijk blokkades mogen uitdelen en wanneer menselijke goedkeuring nodig blijft.

Continue verbetering vraagt om gestructureerde evaluatiemomenten. Gebruik kwartaalreviews om scriptuitvoer, Sentinel-use cases en real-life incidenten naast elkaar te leggen. Analyseer waar false positives analisten onnodig belasten en waar high risk users te laat worden opgevolgd. Pas vervolgens policies, runbooks en awareness aan op basis van deze inzichten. Door verbetermaatregelen te koppelen aan KPI’s, zoals reductie van gemiddelde risicotijd of het percentage phishing-resistente authenticatoren binnen privileged accounts, ontstaat een meetbaar groeipad dat bestuurders vertrouwen geeft. Veranker deze cyclus in het strategisch informatiebeveiligingsplan zodat budget en capaciteit tijdig beschikbaar zijn.

Het bijbehorende PowerShell-script uit de Nederlandse Baseline voor Veilige Cloud ondersteunt deze aanpak door zowel productiecontroles als lokale simulaties mogelijk te maken. Analisten kunnen de monitoringfunctie tijdens kantooruren draaien met volledige Graph-verbinding, terwijl ontwikkelaars dezelfde logica in LocalDebug-modus testen binnen vijftien seconden zonder gevoelige data te benaderen. De scriptoutput sluit aan op de standaard SOC-rapportage en levert concrete aanbevelingen voor remediatie. Door dit script te integreren in CI/CD-pipelines voor beleidsconfiguraties wordt iedere wijziging automatisch gevalideerd voordat deze naar productie gaat, wat de kans op configuratiefouten drastisch verlaagt.

Gebruik PowerShell-script entra-threat-protection.ps1 (functie Invoke-Monitoring) – Voert een geautomatiseerde controle uit op Entra Identity Protection policies, risky users en risky service-principals en geeft direct aan of aanvullende remediatie noodzakelijk is..

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 Monitoring en governance script voor Entra Threat Protection. .DESCRIPTION Voert een geautomatiseerde controle uit op Entra Identity Protection risk policies, risky users en risky service-principals. Het script ondersteunt zowel productie- controles (Graph API) als een LocalDebug-modus om de logica te testen zonder verbinding met de tenant. Het script voert geen automatische wijzigingen uit maar geeft duidelijke aanbevelingen voor remediatie. .NOTES Project : Nederlandse Baseline voor Veilige Cloud Filename : entra-threat-protection.ps1 Requires : PowerShell 5.1+, Microsoft.Graph.Identity.SignIns, Microsoft.Graph.Identity.Protection Scopes : Policy.Read.All, IdentityRiskEvent.Read.All, IdentityRiskyUser.Read.All, IdentityRiskyServicePrincipal.Read.All .EXAMPLE .\entra-threat-protection.ps1 -Monitoring Voert de volledige monitoringcontrole uit met live Graph-gegevens. .EXAMPLE .\entra-threat-protection.ps1 -Monitoring -LocalDebug Draait de controle met gesimuleerde data voor lokale tests binnen 15 seconden. .EXAMPLE .\entra-threat-protection.ps1 -Remediation Toont een remediatiechecklist op basis van de meest recente monitoringresultaten. #> #Requires -Version 5.1 [CmdletBinding()] param( [switch]$Monitoring, [switch]$Remediation, [switch]$LocalDebug ) $ErrorActionPreference = 'Stop' $script:UseLocalDebug = $LocalDebug $script:Scopes = @( 'Policy.Read.All', 'IdentityRiskEvent.Read.All', 'IdentityRiskyUser.Read.All', 'IdentityRiskyServicePrincipal.Read.All' ) if (-not $script:UseLocalDebug) { foreach ($moduleName in @('Microsoft.Graph.Identity.SignIns', 'Microsoft.Graph.Identity.Protection')) { if (-not (Get-Module -ListAvailable -Name $moduleName)) { throw "Benodigde module '$moduleName' is niet geïnstalleerd. Installeer deze module voordat u het script zonder -LocalDebug uitvoert." } } } function Write-Header { param([string]$Title) Write-Host "`n========================================" -ForegroundColor Cyan Write-Host $Title -ForegroundColor Cyan Write-Host "Nederlandse Baseline voor Veilige Cloud" -ForegroundColor Cyan Write-Host "========================================`n" -ForegroundColor Cyan } function Connect-EntraGraph { if ($script:UseLocalDebug) { Write-Host "[DEBUG] LocalDebug ingeschakeld – Graph-verbinding wordt overgeslagen." -ForegroundColor Yellow return } $context = Get-MgContext -ErrorAction SilentlyContinue if (-not $context -or ($context.Scopes | Sort-Object -Unique) -notcontains 'Policy.Read.All') { Write-Host "[INFO] Verbinden met Microsoft Graph..." -ForegroundColor Gray Connect-MgGraph -Scopes $script:Scopes -NoWelcome -ErrorAction Stop | Out-Null Write-Host "[OK] Verbonden met Microsoft Graph." -ForegroundColor Green } else { Write-Host "[OK] Bestaande Graph-sessie wordt hergebruikt." -ForegroundColor Green } } function Get-EntraThreatProtectionState { if ($script:UseLocalDebug) { $now = Get-Date return [pscustomobject]@{ SignInPolicies = @( [pscustomobject]@{ displayName = 'DEBUG Sign-in Risk Policy' state = 'enabled' conditions = @{ signInRiskLevels = @('medium', 'high'); users = @{ includeUsers = @('All') } } grantControls = @{ builtInControls = @('mfa') } } ) UserPolicies = @( [pscustomobject]@{ displayName = 'DEBUG User Risk Policy' state = 'enabled' conditions = @{ userRiskLevels = @('high'); users = @{ includeUsers = @('All') } } actions = @{ enforcePasswordChange = $true } } ) RiskyUsers = @( [pscustomobject]@{ userPrincipalName = 'debug.user@veiligcloud.nl' riskLevel = 'medium' riskState = 'atRisk' riskDetail = 'anomalousIP' detectedDateTime = $now.AddHours(-6) } ) RiskyServicePrincipals = @() RiskDetections = @( [pscustomobject]@{ riskEventType = 'anomalousIP' detectedDateTime = $now.AddHours(-2) userDisplayName = 'Debug User' additionalInfo = 'Simulatie' } ) } } $signInPolicies = Invoke-MgGraphRequest -Method GET -Uri "https://graph.microsoft.com/v1.0/identityProtection/policies/signInRiskPolicies" -ErrorAction Stop $userPolicies = Invoke-MgGraphRequest -Method GET -Uri "https://graph.microsoft.com/v1.0/identityProtection/policies/userRiskPolicies" -ErrorAction Stop $riskyUsers = Invoke-MgGraphRequest -Method GET -Uri "https://graph.microsoft.com/v1.0/identityProtection/riskyUsers?`$filter=riskState ne 'remediated'&`$top=50" -ErrorAction Stop $riskyServicePrincipals = Invoke-MgGraphRequest -Method GET -Uri "https://graph.microsoft.com/v1.0/identityProtection/riskyServicePrincipals?`$filter=riskState ne 'remediated'&`$top=50" -ErrorAction Stop $riskDetections = Invoke-MgGraphRequest -Method GET -Uri "https://graph.microsoft.com/v1.0/identityProtection/riskDetections?`$top=20" -ErrorAction Stop return [pscustomobject]@{ SignInPolicies = $signInPolicies.value UserPolicies = $userPolicies.value RiskyUsers = $riskyUsers.value RiskyServicePrincipals = $riskyServicePrincipals.value RiskDetections = $riskDetections.value } } function Test-EntraThreatCompliance { param([pscustomobject]$State) $signInCompliant = $State.SignInPolicies | Where-Object { $_.state -eq 'enabled' -and $_.conditions.signInRiskLevels.Count -gt 0 -and ($_.grantControls.builtInControls -contains 'mfa' -or $_.grantControls.builtInControls -contains 'block') } $userCompliant = $State.UserPolicies | Where-Object { $_.state -eq 'enabled' -and $_.conditions.userRiskLevels.Count -gt 0 } $highRiskUsers = $State.RiskyUsers | Where-Object { $_.riskLevel -eq 'high' -and $_.riskState -ne 'remediated' } $highRiskServicePrincipals = $State.RiskyServicePrincipals | Where-Object { $_.riskLevel -eq 'high' -and $_.riskState -ne 'remediated' } $isCompliant = ($signInCompliant.Count -gt 0) -and ($userCompliant.Count -gt 0) -and ($highRiskUsers.Count -eq 0) -and ($highRiskServicePrincipals.Count -eq 0) return [pscustomobject]@{ SignInPolicies = $signInCompliant UserPolicies = $userCompliant HighRiskUsers = $highRiskUsers HighRiskServicePrincipals = $highRiskServicePrincipals IsCompliant = $isCompliant } } function Invoke-Monitoring { Write-Header -Title "Entra Threat Protection - Monitoring" try { Connect-EntraGraph $state = Get-EntraThreatProtectionState $compliance = Test-EntraThreatCompliance -State $state Write-Host "[INFO] Ingeschakelde sign-in risk policies: $($state.SignInPolicies.Count)" -ForegroundColor Gray foreach ($policy in $state.SignInPolicies) { Write-Host " • $($policy.displayName) (State: $($policy.state), RiskLevels: $([string]::Join(',', $policy.conditions.signInRiskLevels)))" -ForegroundColor Cyan } Write-Host "`n[INFO] Ingeschakelde user risk policies: $($state.UserPolicies.Count)" -ForegroundColor Gray foreach ($policy in $state.UserPolicies) { Write-Host " • $($policy.displayName) (State: $($policy.state), RiskLevels: $([string]::Join(',', $policy.conditions.userRiskLevels)))" -ForegroundColor Cyan } Write-Host "`n[INFO] Onopgeloste risky users: $($state.RiskyUsers.Count)" -ForegroundColor Gray if ($state.RiskyUsers.Count -gt 0) { $state.RiskyUsers | Select-Object -First 10 | ForEach-Object { Write-Host " - $($_.userPrincipalName) | Risk: $($_.riskLevel) | State: $($_.riskState) | Detail: $($_.riskDetail)" -ForegroundColor Yellow } } Write-Host "`n[INFO] Onopgeloste risky service-principals: $($state.RiskyServicePrincipals.Count)" -ForegroundColor Gray if ($state.RiskyServicePrincipals.Count -gt 0) { $state.RiskyServicePrincipals | Select-Object -First 5 | ForEach-Object { Write-Host " - $($_.displayName) | AppId: $($_.appId) | Risk: $($_.riskLevel)" -ForegroundColor Yellow } } Write-Host "`n[INFO] Laatste risk detections:" -ForegroundColor Gray foreach ($detection in $state.RiskDetections | Select-Object -First 5) { Write-Host " - $($detection.detectedDateTime) | $($detection.riskEventType) | $($detection.userDisplayName)" -ForegroundColor Gray } if ($compliance.IsCompliant) { Write-Host "`n[OK] COMPLIANT – risk policies actief en geen onopgeloste high risk entiteiten." -ForegroundColor Green return 0 } Write-Host "`n[WARN] PARTIËLE COMPLIANCE – controleer onderstaande aandachtspunten." -ForegroundColor Yellow if ($compliance.SignInPolicies.Count -eq 0) { Write-Host " • Geen ingeschakelde sign-in risk policy met MFA of blokkerende actie." -ForegroundColor Red } if ($compliance.UserPolicies.Count -eq 0) { Write-Host " • Geen user risk policy die high risk gebruikers blokkeert of wachtwoordreset afdwingt." -ForegroundColor Red } if ($compliance.HighRiskUsers.Count -gt 0) { Write-Host " • $($compliance.HighRiskUsers.Count) high risk gebruiker(s) wachten op remediatie." -ForegroundColor Red } if ($compliance.HighRiskServicePrincipals.Count -gt 0) { Write-Host " • $($compliance.HighRiskServicePrincipals.Count) high risk service-principal(s) zonder opvolging." -ForegroundColor Red } return 1 } catch { Write-Host "[FAIL] Monitoring mislukt: $($_.Exception.Message)" -ForegroundColor Red return 2 } finally { Write-Host "`n========================================`n" -ForegroundColor Cyan } } function Invoke-Remediation { Write-Header -Title "Entra Threat Protection - Remediatiechecklist" try { Connect-EntraGraph $state = Get-EntraThreatProtectionState $compliance = Test-EntraThreatCompliance -State $state Write-Host "Gebruik onderstaande stappen om non-compliance te herstellen:" -ForegroundColor Cyan Write-Host "1. Valideer dat er minimaal één sign-in risk policy actief is die medium en high risk aanmeldingen blokkeert of MFA afdwingt." -ForegroundColor Gray Write-Host "2. Controleer of user risk policies high risk gebruikers blokkeren totdat zij een beveiligde wachtwoordreset hebben uitgevoerd." -ForegroundColor Gray Write-Host "3. Gebruik Microsoft Sentinel of het SOC-ticketingsysteem om high risk users en service-principals direct te escaleren naar verantwoordelijke proceseigenaren." -ForegroundColor Gray Write-Host "4. Documenteer elke uitzondering inclusief einddatum, risicoafweging en goedkeuring van het identity risk board." -ForegroundColor Gray Write-Host "5. Herhaal dit script met -Monitoring nadat maatregelen zijn uitgevoerd om aantoonbaarheid vast te leggen." -ForegroundColor Gray if ($compliance.HighRiskUsers.Count -gt 0) { Write-Host "`n[ACTIE] High risk users die nu aandacht vereisen:" -ForegroundColor Yellow $compliance.HighRiskUsers | Select-Object -First 10 | ForEach-Object { Write-Host " - $($_.userPrincipalName) ($($_.riskDetail))" -ForegroundColor Yellow } } if ($compliance.HighRiskServicePrincipals.Count -gt 0) { Write-Host "`n[ACTIE] High risk service-principals zonder remediatie:" -ForegroundColor Yellow $compliance.HighRiskServicePrincipals | ForEach-Object { Write-Host " - $($_.displayName) | AppId: $($_.appId)" -ForegroundColor Yellow } } Write-Host "`n[INFO] Documenteer alle acties in het auditdossier en koppel het resultaat aan de NIS2-rapportage." -ForegroundColor Cyan return 0 } catch { Write-Host "[FAIL] Remediatiechecklist kon niet worden gegenereerd: $($_.Exception.Message)" -ForegroundColor Red return 2 } finally { Write-Host "`n========================================`n" -ForegroundColor Cyan } } try { if ($Monitoring) { exit (Invoke-Monitoring) } elseif ($Remediation) { exit (Invoke-Remediation) } else { Write-Header -Title "Entra Threat Protection" Write-Host "Gebruik -Monitoring voor de live controle of -Monitoring -LocalDebug voor een lokale test." -ForegroundColor Cyan Write-Host "Gebruik -Remediation voor een begeleide checklist op basis van de laatste status." -ForegroundColor Cyan Write-Host "`nVoorbeeld:" -ForegroundColor Gray Write-Host " .\\entra-threat-protection.ps1 -Monitoring" -ForegroundColor Gray Write-Host " .\\entra-threat-protection.ps1 -Monitoring -LocalDebug" -ForegroundColor Gray Write-Host "`n========================================`n" -ForegroundColor Cyan exit 0 } } catch { Write-Host "[FAIL] Onverwachte fout: $($_.Exception.Message)" -ForegroundColor Red exit 2 }

Risico zonder implementatie

Risico zonder implementatie
Hoog: Zonder geïntegreerde Entra Threat Protection blijven risk policies fragmentarisch, worden risky users te laat opgeschoond en kunnen aanvallers maandenlang misbruik maken van gestolen sessies of app-registraties. Dit resulteert in langdurige verstoringen, reputatieschade en zware sancties onder BIO, AVG en NIS2.

Management Samenvatting

Richt Entra Threat Protection in met P2-licenties, risk policies voor gebruikers, aanmeldingen en service-principals, koppel de signalen aan Sentinel en automatiseer monitoring en remediatie via Microsoft Graph. Daarmee wordt identity dreigingsinformatie aantoonbaar onderdeel van Zero Trust-governance.