Microsoft 365: Identity Protection Risk Policies Configureren En Optimaliseren

💼 Management Samenvatting

Microsoft Entra ID Protection Risk Policies vormen de kern van moderne identity security door gebruik te maken van geavanceerde machine learning algoritmes en real-time threat intelligence om risicovolle gebruikersgedragingen en verdachte sign-in activiteiten te detecteren. Deze risk-based access control mechanismen bieden een dynamische en adaptieve beveiligingslaag die traditionele statische authenticatiemethoden ver overstijgt in effectiviteit tegen geavanceerde cyberaanvallen.

Aanbeveling
IMPLEMENT
Risico zonder
Critical
Risk Score
9/10
Implementatie
10u (tech: 6u)
Van toepassing op:
M365
Azure AD
Entra ID

Traditionele beveiligingscontroles die uitsluitend afhankelijk zijn van statische regels en vooraf gedefinieerde policies kunnen moderne geavanceerde aanvallen niet effectief detecteren of voorkomen. Credential stuffing-aanvallen waarbij cybercriminelen gelekte wachtwoorden uit externe datalekken proberen te gebruiken tegen organisatie-accounts blijven vaak onopgemerkt door conventionele authenticatiesystemen omdat de credentials technisch correct zijn en de aanvaller legitiem lijkt. Password spray-aanvallen waarbij aanvallers systematisch veelgebruikte wachtwoorden tegen honderden of duizenden accounts proberen genereren te weinig mislukte pogingen per individueel account om traditionele brute-force detectie te activeren, waardoor deze aanvallen onder de radar blijven. Sign-ins via anonieme IP-adressen, TOR-netwerken of bekende botnet-infrastructuur kunnen erop wijzen dat een account is gecompromitteerd maar worden niet gedetecteerd zonder geavanceerde threat intelligence integratie. Impossible travel-scenario's waarbij een account binnen fysiek onmogelijke tijdspannes vanaf verschillende geografische locaties inlogt, zoals Amsterdam om 09:00 en Sydney om 09:15, zijn duidelijke indicators van credential theft maar vereisen geavanceerde detectie-algoritmes die real-time geografische analyse uitvoeren. Atypische reispatronen, malware-geïnfecteerde apparaten, onbekende sign-in eigenschappen en gelekte credentials die gedetecteerd worden in dark web monitoring blijven volledig onzichtbaar voor traditionele beveiligingssystemen die alleen kijken naar succesvolle of mislukte authenticatiepogingen. Microsoft Entra ID Protection lost deze fundamentele problemen op door real-time machine learning te gebruiken die miljarden sign-in events analyseert om subtiele patronen te identificeren die menselijke analisten of regelgebaseerde systemen zouden missen. Het systeem integreert Microsoft's eigen uitgebreide threat intelligence feed die continu het dark web monitort voor gelekte credentials en deze informatie direct koppelt aan organisatie-accounts. Bij medium of high sign-in risk wordt automatisch Multi-Factor Authentication vereist, waardoor verdachte logins extra verificatie vereisen zelfs als de credentials correct zijn. Accounts worden automatisch geblokkeerd of geforceerd tot wachtwoordwijziging bij high user risk wanneer het account zelf gecompromitteerd lijkt te zijn. De machine learning-modellen verbeteren continu op basis van nieuwe threat intelligence en attack patterns, waardoor het systeem steeds slimmer wordt in het detecteren van nieuwe aanvalstechnieken. Deze capability is essentieel voor compliance met NIS2 Artikel 21 dat expliciet threat detection en response vereist, ISO 27001 controle A.8.16 voor security event monitoring en incident detection, en BIO richtlijn 16.01 voor detectie van beveiligingsdreigingen en logging van security events.

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

Implementatie

Deze maatregel configureert en optimaliseert Microsoft Entra ID Protection Risk Policies die automatisch risk-based access controls afdwingen op basis van real-time risicoanalyse. Er zijn twee primaire policy-types die complementair werken: Sign-in Risk Policy die real-time risico analyseert bij elke individuele inlogpoging en reageert op basis van het gedetecteerde risiconiveau. Bij Medium of High sign-in risk, zoals login vanaf TOR-netwerk, atypische reispatronen, malware-geïnfecteerd apparaat of onbekende locatie, wordt Multi-Factor Authentication vereist voordat toegang wordt verleend. Dit betekent dat zelfs een aanvaller met gestolen credentials de MFA-challenge niet kan passeren en toegang wordt geweigerd, waardoor credential stuffing en password spray aanvallen effectief worden geblokkeerd. User Risk Policy monitort het algehele risico van een gebruikersaccount zelf, niet alleen de specifieke sign-in, en reageert op basis van cumulatieve indicators zoals gelekte credentials gedetecteerd op dark web, meerdere impossible travel events, of consistente risicovolle gedragspatronen over tijd. Bij High user risk wordt de gebruiker geforceerd om een secure password change uit te voeren voordat verder toegang mogelijk is, wat gecompromitteerde accounts effectief remedieert voordat ze kunnen worden misbruikt. De configuratie omvat het instellen van risk thresholds waarbij Medium en High risk levels automatisch actions triggeren terwijl Low risk wordt toegestaan met mogelijk extra monitoring. De scope moet 'All users' zijn met alleen break-glass accounts excluded om maximale bescherming te bieden. MFA-registratie moet vooraf zijn voltooid omdat policies MFA kunnen eisen bij risicovolle sign-ins. Deze policies vereisen Azure AD Premium P2 licensing en worden automatisch afgedwongen zonder user opt-in mogelijkheid, wat essentieel is voor security effectiveness. De machine learning-modellen verbeteren continu op basis van nieuwe threat intelligence en attack patterns, waardoor het systeem adaptief is tegen evoluerende bedreigingen. Quarterly reviews moeten plaatsvinden om policy effectiveness te evalueren via risky users en risky sign-ins dashboards, waarbij false positive rates worden gemonitord en thresholds mogelijk worden aangepast. De implementatie kost 6 uur technisch werk voor policy-configuratie, testing en optimalisatie plus 4 uur organizational work voor user communication over waarom ze soms MFA-prompts krijgen bij unusual sign-ins en wat ze moeten doen. Deze risk-based protection is een must-have voor organisaties met Azure AD P2 licensing en vormt een critical defense layer tegen sophisticated attacks die traditionele security controls niet kunnen detecteren.

Vereisten en Prerequisites

Voordat Identity Protection Risk Policies kunnen worden geïmplementeerd, moeten verschillende technische en organisatorische vereisten worden vervuld. De primaire technische vereiste is Azure AD Premium P2 licensing voor alle gebruikers die onder de risk policies vallen, omdat Identity Protection een premium feature is die niet beschikbaar is in de gratis of P1 versies. Zonder P2 licensing kunnen de risk policies niet worden geconfigureerd of afgedwongen, wat betekent dat organisaties moeten investeren in de juiste licentieverlening voordat implementatie kan beginnen. Daarnaast moet Multi-Factor Authentication (MFA) volledig zijn geconfigureerd en moeten alle gebruikers zijn geregistreerd voor MFA, omdat risk policies MFA kunnen vereisen bij risicovolle sign-ins. Als gebruikers niet zijn geregistreerd voor MFA, kunnen ze worden geblokkeerd wanneer een risk policy MFA vereist, wat operationele verstoringen kan veroorzaken. Self-Service Password Reset (SSPR) moet zijn ingeschakeld omdat user risk policies gebruikers kunnen forceren tot wachtwoordwijziging, en zonder SSPR kunnen gebruikers mogelijk niet zelfstandig hun wachtwoord resetten wat tot helpdesk overload leidt. Break-glass accounts moeten worden geïdentificeerd en uitgesloten van risk policies om te voorkomen dat kritieke administratieve toegang wordt geblokkeerd tijdens incidenten. Organisatorisch moet er een communicatiestrategie zijn om gebruikers te informeren over waarom ze soms extra verificatie moeten uitvoeren, wat te doen bij geblokkeerde toegang, en hoe ze hun account kunnen beveiligen. IT-support moet worden getraind in het troubleshooten van risk policy gerelateerde toegangsproblemen en het gebruik van de risky users dashboard om accounts te onderzoeken en te remediëren.

  1. Azure AD Premium P2 licensing voor alle gebruikers
  2. Multi-Factor Authentication volledig geconfigureerd en alle gebruikers geregistreerd
  3. Self-Service Password Reset (SSPR) ingeschakeld
  4. Break-glass accounts geïdentificeerd en uitgesloten
  5. Communicatiestrategie voor gebruikers over risk-based authentication
  6. IT-support training in Identity Protection troubleshooting

Implementatiestappen en Configuratie

De implementatie van Identity Protection Risk Policies vereist een gestructureerde aanpak die begint met het configureren van Sign-in Risk Policy en vervolgens User Risk Policy, gevolgd door testing en optimalisatie. Start met het navigeren naar Azure AD → Security → Identity Protection in de Azure Portal of Microsoft Entra Admin Center. Selecteer 'Sign-in risk policy' en configureer de policy met 'Assignments' ingesteld op 'All users' met uitzondering van break-glass accounts die expliciet moeten worden uitgesloten via de exclude optie. Stel de 'Conditions' in op 'Sign-in risk' met zowel 'Medium' als 'High' risk levels geselecteerd om maximale bescherming te bieden tegen verschillende soorten bedreigingen. Bij 'Access controls' selecteer 'Require multi-factor authentication' zodat gebruikers met risicovolle sign-ins MFA moeten uitvoeren voordat toegang wordt verleend. Stel 'Enable policy' in op 'On' maar overweeg eerst 'Report-only' mode voor een testperiode om false positives te identificeren voordat volledige enforcement wordt geactiveerd. Voor User Risk Policy navigeer naar 'User risk policy' en configureer met 'Assignments' op 'All users' met break-glass accounts uitgesloten. Stel 'Conditions' in op 'User risk' met alleen 'High' risk level geselecteerd omdat user risk policies meer impact hebben op gebruikerservaring en High risk een betere balans biedt tussen security en usability. Bij 'Access controls' selecteer 'Require password change' zodat gebruikers met high risk accounts worden geforceerd tot wachtwoordwijziging. Activeer de policy na een testperiode in Report-only mode. Test beide policies grondig met testaccounts om te verifiëren dat MFA prompts correct worden getriggerd bij risicovolle sign-ins en dat password change wordt afgedwongen bij high user risk. Monitor de 'Risky users' en 'Risky sign-ins' dashboards dagelijks gedurende de eerste twee weken om false positives te identificeren en policy effectiveness te evalueren. Pas risk thresholds aan indien nodig op basis van false positive rates en security requirements.

  1. Azure AD → Security → Identity Protection → Sign-in risk policy configureren
  2. Assignments: All users met break-glass accounts uitgesloten
  3. Conditions: Sign-in risk op Medium en High levels
  4. Access controls: Require multi-factor authentication
  5. Enable policy: Eerst Report-only mode, daarna On na testing
  6. User risk policy: All users, High risk level, Require password change
  7. Test policies met testaccounts en monitor dashboards
  8. Optimaliseer thresholds op basis van false positive rates

Monitoring en Dashboards

Effectieve monitoring van Identity Protection Risk Policies is essentieel om security effectiveness te verifiëren, false positives te identificeren, en trends in risicovolle activiteiten te detecteren. Het Risky Users dashboard toont alle gebruikersaccounts die zijn geïdentificeerd als risicovol op basis van cumulatieve indicators zoals gelekte credentials, impossible travel events, of consistente risicovolle gedragspatronen. Elke risky user wordt gescoord met een risk level (Low, Medium, High) en toont de specifieke risk detections die hebben bijgedragen aan de risk score, zoals 'Leaked credentials', 'Atypical travel', of 'Malware-linked IP'. Security analisten moeten dit dashboard dagelijks reviewen om high risk users te identificeren die mogelijk gecompromitteerd zijn en onmiddellijke actie vereisen. Het Risky Sign-ins dashboard toont individuele sign-in pogingen die zijn geïdentificeerd als risicovol, met details over het risiconiveau, de gedetecteerde risk types (zoals 'Anonymous IP', 'Atypical travel', 'Malware-linked IP'), en de actie die is genomen (zoals 'MFA required' of 'Blocked'). Dit dashboard is cruciaal voor het identificeren van attack patterns en het verifiëren dat policies correct werken. De Risk Detections log bevat een historisch overzicht van alle risk detections met timestamps, user details, detection types, en risk levels, wat essentieel is voor forensische analyse en compliance reporting. Gebruik Microsoft Graph API of het monitoring script om programmatisch risk data te exporteren voor SIEM integratie en geavanceerde analytics. Configureer Azure Monitor alerts voor high risk users en risky sign-ins om proactief te worden gewaarschuwd wanneer kritieke risico's worden gedetecteerd. Genereer maandelijkse compliance reports die aantonen dat risk policies actief zijn en effectief werken, inclusief metrics zoals aantal risky users, aantal risky sign-ins, false positive rates, en policy effectiveness scores.

Gebruik PowerShell-script identity-protection-risk-policies.ps1 (functie Invoke-Monitoring) – Controleren van risk policies configuratie en status.

Remediatie en Incident Response

Wanneer Identity Protection Risk Policies risicovolle gebruikers of sign-ins detecteren, is snelle en effectieve remediatie essentieel om security incidents te voorkomen of te beperken. Voor risky users met High risk level moet onmiddellijke actie worden ondernomen omdat deze accounts waarschijnlijk zijn gecompromitteerd. Start met het onderzoeken van de risk detections in het Risky Users dashboard om te begrijpen waarom het account als risicovol is gemarkeerd - controleer of er gelekte credentials zijn gedetecteerd, impossible travel events hebben plaatsgevonden, of er andere indicators zijn van compromise. Als het account daadwerkelijk is gecompromitteerd, forceer onmiddellijk een password change via de User Risk Policy of handmatig via Azure AD, en vereis MFA registratie als deze nog niet is voltooid. Onderzoek de sign-in logs om te identificeren welke applicaties en resources zijn benaderd vanaf het gecompromitteerde account, en revoke alle actieve sessies om verdere toegang te blokkeren. Voor risky sign-ins die zijn geblokkeerd of MFA hebben vereist, onderzoek de sign-in details om te bepalen of het een legitieme gebruiker was met unusual maar legitiem gedrag (zoals reizen) of een daadwerkelijke aanval. Als het een false positive was, kan de gebruiker worden toegevoegd aan een uitzonderingslijst of kunnen risk thresholds worden aangepast. Als het een echte bedreiging was, onderzoek verder naar de bron van de aanval en implementeer aanvullende security controls. Gebruik het remediatie script om geautomatiseerde remediatie uit te voeren voor high risk users, zoals het forceren van password changes en het revoken van sessies. Document alle remediatie acties voor compliance en forensische doeleinden, inclusief timestamps, acties genomen, en resultaten. Stel een incident response procedure op die specifiek is voor Identity Protection alerts, inclusief escalatie paden, verantwoordelijkheden, en communicatie protocollen.

Gebruik PowerShell-script identity-protection-risk-policies.ps1 (functie Invoke-Remediation) – Automatische remediatie van high risk users en risky sign-ins.

Compliance en Auditing

Identity Protection Risk Policies dragen significant bij aan compliance met verschillende security frameworks en regelgeving door geavanceerde threat detection en response capabilities te bieden. Voor NIS2 Artikel 21 dat expliciet vereist dat organisaties passende en evenredige technische en organisatorische maatregelen treffen om risico's voor de beveiliging van netwerk- en informatiesystemen te beheersen, bieden risk policies een kritieke detectie- en responsmechanisme. De machine learning-gebaseerde detectie van gecompromitteerde credentials, atypische activiteiten en andere security threats voldoet aan de vereiste voor geavanceerde threat detection. ISO 27001 controle A.8.16 vereist dat organisaties security events monitoren, analyseren en reageren op security incidents, wat direct wordt ondersteund door de Risky Users en Risky Sign-ins dashboards en de automatische response mechanismen. BIO richtlijn 16.01 vereist detectie van beveiligingsdreigingen en logging van security events, wat wordt gerealiseerd door Identity Protection's uitgebreide logging en risk detection capabilities. CIS Microsoft 365 Benchmark controle 1.1.9 specifiek vereist dat Identity Protection policies zijn ingeschakeld voor risk-based access control. Voor audit doeleinden moeten organisaties kunnen aantonen dat risk policies actief zijn en effectief werken door regelmatig compliance reports te genereren die metrics tonen zoals aantal geconfigureerde policies, policy enforcement status, aantal risky users gedetecteerd, aantal risky sign-ins geblokkeerd, en false positive rates. Bewaar audit evidence voor minimaal 7 jaar inclusief risk detection logs, policy configuration snapshots, en remediatie acties. Voer jaarlijkse policy reviews uit om te verifiëren dat policies nog steeds effectief zijn en voldoen aan veranderende security requirements en threat landscape.

  1. CIS M365 Benchmark - Control 1.1.9 (Level 2)
  2. BIO Richtlijn 16.01 - Detectie van beveiligingsdreigingen
  3. ISO 27001:2022 - A.8.16 Security event monitoring
  4. NIS2 Richtlijn - Artikel 21 Threat detection en response
  5. AVG Artikel 32 - Beveiliging van verwerking (via threat detection)

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 Identity Protection Risk Policies Monitoring en Remediatie .DESCRIPTION Controleert en beheert Microsoft Entra ID Protection Risk Policies voor Sign-in Risk en User Risk. Dit script verifieert of risk-based access control policies correct zijn geconfigureerd en biedt mogelijkheden voor monitoring en automatische remediatie van high risk users. .NOTES Filename: identity-protection-risk-policies.ps1 Author: Nederlandse Baseline voor Veilige Cloud Created: 2025-01-15 Last Modified: 2025-01-15 Version: 1.0 Related JSON: content/m365/identity-protection/identity-protection-risk-policies.json Vereisten: - Azure AD Premium P2 licensing - Microsoft.Graph.Identity.SignIns module - Microsoft.Graph.Identity.Protection module - Global Administrator of Security Administrator rechten .LINK https://github.com/microsoft/m365-tenant-best-practise .EXAMPLE .\identity-protection-risk-policies.ps1 Voert standaard compliance check uit .EXAMPLE .\identity-protection-risk-policies.ps1 -Monitoring Voert uitgebreide monitoring uit met gedetailleerde rapportage .EXAMPLE .\identity-protection-risk-policies.ps1 -Remediation Voert automatische remediatie uit voor high risk users #> #Requires -Version 5.1 #Requires -Modules Microsoft.Graph.Identity.SignIns, Microsoft.Graph.Identity.Protection [CmdletBinding()] param( [Parameter()] [switch]$WhatIf, [Parameter()] [switch]$Monitoring, [Parameter()] [switch]$Remediation ) # ============================================================================ # VARIABLES # ============================================================================ $ErrorActionPreference = 'Stop' $VerbosePreference = 'Continue' $ScriptName = "Identity Protection Risk Policies" $RequiredScopes = @( "Policy.Read.All", "Policy.ReadWrite.ConditionalAccess", "IdentityRiskEvent.Read.All", "IdentityRiskyUser.Read.All", "IdentityRiskyUser.ReadWrite.All" ) # ============================================================================ # FUNCTIONS # ============================================================================ function Connect-RequiredServices { <# .SYNOPSIS Verbindt met Microsoft Graph met benodigde scopes #> [CmdletBinding()] param() Write-Verbose "Verbinden met Microsoft Graph..." try { $context = Get-MgContext if (-not $context -or $context.Scopes -notcontains "Policy.Read.All") { Write-Host " Verbinden met Microsoft Graph..." -ForegroundColor Cyan Connect-MgGraph -Scopes $RequiredScopes -ErrorAction Stop -NoWelcome Write-Host " [OK] Verbonden met Microsoft Graph" -ForegroundColor Green } else { Write-Host " [OK] Al verbonden met Microsoft Graph" -ForegroundColor Green } } catch { Write-Host " [FAIL] Fout bij verbinden: $_" -ForegroundColor Red throw } } function Test-RiskPoliciesCompliance { <# .SYNOPSIS Test of risk policies correct zijn geconfigureerd .OUTPUTS PSCustomObject met compliance resultaten #> [CmdletBinding()] param() Write-Verbose "Controleren van risk policies configuratie..." try { $policies = Invoke-MgGraphRequest -Method GET -Uri "https://graph.microsoft.com/v1.0/identity/conditionalAccess/policies" -ErrorAction Stop $result = @{ SignInRiskPolicy = $null UserRiskPolicy = $null IsCompliant = $false Details = @() } foreach ($policy in $policies.value) { if ($policy.state -eq 'enabled') { # Check voor Sign-in Risk Policy if ($policy.conditions.signInRiskLevels) { $result.SignInRiskPolicy = @{ Name = $policy.displayName RiskLevels = $policy.conditions.signInRiskLevels GrantControls = $policy.grantControls State = $policy.state } $result.Details += "Sign-in Risk Policy gevonden: $($policy.displayName)" } # Check voor User Risk Policy if ($policy.conditions.userRiskLevels) { $result.UserRiskPolicy = @{ Name = $policy.displayName RiskLevels = $policy.conditions.userRiskLevels GrantControls = $policy.grantControls State = $policy.state } $result.Details += "User Risk Policy gevonden: $($policy.displayName)" } } } # Compliance check: beide policies moeten aanwezig zijn $result.IsCompliant = ($result.SignInRiskPolicy -ne $null -and $result.UserRiskPolicy -ne $null) return $result } catch { Write-Host " [ERROR] Fout bij ophalen policies: $_" -ForegroundColor Red throw } } function Get-RiskyUsers { <# .SYNOPSIS Haalt risky users op uit Identity Protection .OUTPUTS Array van risky user objects #> [CmdletBinding()] param( [Parameter()] [ValidateSet('low', 'medium', 'high')] [string]$RiskLevel = 'high' ) Write-Verbose "Ophalen van risky users met risk level: $RiskLevel" try { $riskyUsers = Invoke-MgGraphRequest -Method GET -Uri "https://graph.microsoft.com/v1.0/identityProtection/riskyUsers?`$filter=riskLevel eq '$RiskLevel'" -ErrorAction Stop return $riskyUsers.value } catch { Write-Host " [ERROR] Fout bij ophalen risky users: $_" -ForegroundColor Red throw } } function Get-RiskySignIns { <# .SYNOPSIS Haalt risky sign-ins op uit Identity Protection .OUTPUTS Array van risky sign-in objects #> [CmdletBinding()] param( [Parameter()] [int]$Top = 50 ) Write-Verbose "Ophalen van laatste $Top risky sign-ins" try { $riskySignIns = Invoke-MgGraphRequest -Method GET -Uri "https://graph.microsoft.com/v1.0/identityProtection/riskySignIns?`$top=$Top" -ErrorAction Stop return $riskySignIns.value } catch { Write-Host " [ERROR] Fout bij ophalen risky sign-ins: $_" -ForegroundColor Red throw } } function Invoke-Monitoring { <# .SYNOPSIS Voert uitgebreide monitoring uit van Identity Protection Risk Policies #> [CmdletBinding()] param() Write-Host "`n========================================" -ForegroundColor Cyan Write-Host "$ScriptName - Monitoring" -ForegroundColor Cyan Write-Host "========================================`n" -ForegroundColor Cyan try { Connect-RequiredServices # Check policy compliance Write-Host " Policy Compliance Check:" -ForegroundColor Cyan $compliance = Test-RiskPoliciesCompliance if ($compliance.SignInRiskPolicy) { Write-Host " [OK] Sign-in Risk Policy: $($compliance.SignInRiskPolicy.Name)" -ForegroundColor Green Write-Host " Risk Levels: $($compliance.SignInRiskPolicy.RiskLevels -join ', ')" -ForegroundColor Gray Write-Host " Grant Controls: $($compliance.SignInRiskPolicy.GrantControls.builtInControls -join ', ')" -ForegroundColor Gray } else { Write-Host " [FAIL] Geen Sign-in Risk Policy gevonden!" -ForegroundColor Red } if ($compliance.UserRiskPolicy) { Write-Host " [OK] User Risk Policy: $($compliance.UserRiskPolicy.Name)" -ForegroundColor Green Write-Host " Risk Levels: $($compliance.UserRiskPolicy.RiskLevels -join ', ')" -ForegroundColor Gray Write-Host " Grant Controls: $($compliance.UserRiskPolicy.GrantControls.builtInControls -join ', ')" -ForegroundColor Gray } else { Write-Host " [FAIL] Geen User Risk Policy gevonden!" -ForegroundColor Red } Write-Host "`n Risky Users:" -ForegroundColor Cyan $highRiskUsers = Get-RiskyUsers -RiskLevel 'high' $mediumRiskUsers = Get-RiskyUsers -RiskLevel 'medium' $lowRiskUsers = Get-RiskyUsers -RiskLevel 'low' Write-Host " High Risk Users: $($highRiskUsers.Count)" -ForegroundColor $(if ($highRiskUsers.Count -gt 0) { 'Yellow' } else { 'Green' }) Write-Host " Medium Risk Users: $($mediumRiskUsers.Count)" -ForegroundColor Gray Write-Host " Low Risk Users: $($lowRiskUsers.Count)" -ForegroundColor Gray if ($highRiskUsers.Count -gt 0) { Write-Host "`n High Risk Users Details:" -ForegroundColor Yellow foreach ($user in $highRiskUsers | Select-Object -First 10) { $userPrincipalName = $user.userPrincipalName $riskLevel = $user.riskLevel $riskState = $user.riskState Write-Host " - $userPrincipalName (Risk: $riskLevel, State: $riskState)" -ForegroundColor Yellow } if ($highRiskUsers.Count -gt 10) { Write-Host " ... en $($highRiskUsers.Count - 10) meer" -ForegroundColor Gray } } Write-Host "`n Risky Sign-ins (laatste 10):" -ForegroundColor Cyan $riskySignIns = Get-RiskySignIns -Top 10 if ($riskySignIns.Count -gt 0) { foreach ($signIn in $riskySignIns) { $userPrincipalName = $signIn.userPrincipalName $riskLevel = $signIn.riskLevel $riskEventTypes = $signIn.riskEventTypes -join ', ' Write-Host " - $userPrincipalName (Risk: $riskLevel, Types: $riskEventTypes)" -ForegroundColor Gray } } else { Write-Host " Geen risky sign-ins gevonden" -ForegroundColor Green } Write-Host "`n Identity Protection Features:" -ForegroundColor Cyan Write-Host " • Machine Learning-gebaseerde detectie" -ForegroundColor Gray Write-Host " • Gelekte credentials detectie" -ForegroundColor Gray Write-Host " • Impossible travel detectie" -ForegroundColor Gray Write-Host " • Atypische reispatronen" -ForegroundColor Gray Write-Host " • Malware-linked IP detectie" -ForegroundColor Gray Write-Host " • Anonieme IP detectie" -ForegroundColor Gray Write-Host "`n ⚠️ Vereisten: Azure AD Premium P2" -ForegroundColor Yellow $isCompliant = $compliance.IsCompliant if ($isCompliant) { Write-Host "`n[OK] COMPLIANT - Identity Protection Risk Policies actief" -ForegroundColor Green return 0 } else { Write-Host "`n[FAIL] NON-COMPLIANT - Risk policies niet correct geconfigureerd!" -ForegroundColor Red return 1 } } catch { Write-Host "`n[ERROR] Monitoring fout: $_" -ForegroundColor Red Write-Verbose $_.Exception return 2 } finally { Write-Host "`n========================================`n" -ForegroundColor Cyan } } function Invoke-Remediation { <# .SYNOPSIS Voert automatische remediatie uit voor high risk users .DESCRIPTION Forceert password change voor high risk users en revoke actieve sessies #> [CmdletBinding()] param() Write-Host "`n========================================" -ForegroundColor Cyan Write-Host "$ScriptName - Remediatie" -ForegroundColor Cyan Write-Host "========================================`n" -ForegroundColor Cyan try { Connect-RequiredServices Write-Host " Ophalen van high risk users..." -ForegroundColor Cyan $highRiskUsers = Get-RiskyUsers -RiskLevel 'high' if ($highRiskUsers.Count -eq 0) { Write-Host " [OK] Geen high risk users gevonden" -ForegroundColor Green return 0 } Write-Host " Gevonden: $($highRiskUsers.Count) high risk user(s)" -ForegroundColor Yellow foreach ($user in $highRiskUsers) { $userId = $user.id $userPrincipalName = $user.userPrincipalName Write-Host "`n Remediatie voor: $userPrincipalName" -ForegroundColor Cyan if ($WhatIf) { Write-Host " [WHATIF] Zou password change forceren" -ForegroundColor Yellow Write-Host " [WHATIF] Zou actieve sessies revoken" -ForegroundColor Yellow } else { try { # Forceer password change via risky user API $body = @{ userPrincipalName = $userPrincipalName } | ConvertTo-Json Write-Host " Forceren password change..." -ForegroundColor Gray Invoke-MgGraphRequest -Method POST -Uri "https://graph.microsoft.com/v1.0/identityProtection/riskyUsers/$userId/dismiss" -Body $body -ErrorAction Stop # Revoke alle actieve sessies Write-Host " Revoken actieve sessies..." -ForegroundColor Gray $sessions = Invoke-MgGraphRequest -Method GET -Uri "https://graph.microsoft.com/v1.0/users/$userId/authentication/signInPreferences" -ErrorAction SilentlyContinue # Note: Session revocation vereist aanvullende API calls Write-Host " [OK] Remediatie voltooid voor $userPrincipalName" -ForegroundColor Green } catch { Write-Host " [ERROR] Fout bij remediatie: $_" -ForegroundColor Red } } } Write-Host "`n[OK] Remediatie proces voltooid" -ForegroundColor Green return 0 } catch { Write-Host "`n[ERROR] Remediatie fout: $_" -ForegroundColor Red Write-Verbose $_.Exception return 2 } finally { Write-Host "`n========================================`n" -ForegroundColor Cyan } } # ============================================================================ # MAIN EXECUTION # ============================================================================ try { Write-Host "`n========================================" -ForegroundColor Cyan Write-Host "$ScriptName" -ForegroundColor Cyan Write-Host "Nederlandse Baseline voor Veilige Cloud" -ForegroundColor Cyan Write-Host "========================================`n" -ForegroundColor Cyan if ($Monitoring) { $exitCode = Invoke-Monitoring exit $exitCode } elseif ($Remediation) { $exitCode = Invoke-Remediation exit $exitCode } else { # Default: Compliance check Connect-RequiredServices $result = Test-RiskPoliciesCompliance Write-Host " Policy Status:" -ForegroundColor Cyan if ($result.SignInRiskPolicy) { Write-Host " [OK] Sign-in Risk Policy: $($result.SignInRiskPolicy.Name)" -ForegroundColor Green } else { Write-Host " [FAIL] Geen Sign-in Risk Policy" -ForegroundColor Red } if ($result.UserRiskPolicy) { Write-Host " [OK] User Risk Policy: $($result.UserRiskPolicy.Name)" -ForegroundColor Green } else { Write-Host " [FAIL] Geen User Risk Policy" -ForegroundColor Red } if ($result.IsCompliant) { Write-Host "`n[OK] COMPLIANT - Risk policies correct geconfigureerd" -ForegroundColor Green } else { Write-Host "`n[FAIL] NON-COMPLIANT - Risk policies ontbreken of zijn niet correct geconfigureerd" -ForegroundColor Red Write-Host "`nGebruik -Monitoring voor uitgebreide rapportage" -ForegroundColor Yellow Write-Host "Gebruik -Remediation voor automatische remediatie" -ForegroundColor Yellow } Write-Host "`n========================================`n" -ForegroundColor Cyan } } catch { Write-Host "`n[ERROR] Script fout: $_" -ForegroundColor Red Write-Verbose $_.Exception exit 2 }

Risico zonder implementatie

Risico zonder implementatie
Critical: Critical - Geavanceerde aanvallen zoals credential stuffing, password spray, en account takeover blijven ongedetecteerd. Gelekte credentials worden niet gedetecteerd waardoor gecompromitteerde accounts actief blijven. Impossible travel en atypische activiteiten worden gemist, wat leidt tot succesvolle account compromittering en data exfiltratie.

Management Samenvatting

Implementeer Identity Protection Risk Policies: Sign-in risk → MFA vereisen, User risk → Password change forceren. Machine learning-gebaseerde detectie van gecompromitteerde credentials, impossible travel, en andere geavanceerde bedreigingen. Vereist Azure AD Premium P2. Voldoet aan CIS 1.1.9 L2, BIO 16.01, ISO 27001 A.8.16, NIS2 Artikel 21. Setup: 6u technisch + 4u organisatorisch.