Microsoft 365: Risicogestuurde Authenticatie Voor Publieke Cloudidentiteiten

💼 Management Samenvatting

Risicogestuurde authenticatie zorgt ervoor dat iedere aanmelding in Microsoft 365 wordt beoordeeld op actuele dreigingssignalen in plaats van op statische beleidsregels. Het model kijkt naar gebruikersgedrag, aanmeldlocaties, apparaatstatus, sessiecontext en gevoeligheid van de gevraagde applicatie. Op basis van die beoordeling beslist de organisatie of toegang wordt toegestaan, aanvullende verificatie wordt gevraagd of de sessie direct wordt geblokkeerd. Voor Nederlandse overheidsorganisaties betekent dit dat de digitale voordeur continu wordt bewaakt door data en beleid die zijn afgestemd op wettelijke normen en bestuurlijke afspraken.

Aanbeveling
IMPLEMENT
Risico zonder
High
Risk Score
9/10
Implementatie
280u (tech: 160u)
Van toepassing op:
Microsoft 365
Microsoft Entra ID
Microsoft Intune
Microsoft Defender

Zonder risicogestuurde authenticatie is elke gebruiker gelijk voor het beleid, ongeacht of er aanwijzingen zijn voor credential phishing, token diefstal of een onbekend apparaat. Aanvallers maken daar misbruik van door zich te gedragen als legitieme medewerker totdat zij voldoende toegang hebben om gegevens te exfiltreren of systemen te saboteren. De BIO, NIS2 en AVG eisen dat toegang proportioneel is en dat maatregelen meegroeien met dreigingen. Alleen een dynamisch authenticatiemodel maakt zichtbaar welke signalen het risico verhogen en hoe de organisatie daar per direct op reageert, iets wat onmisbaar is tijdens audits, Woo-verzoeken of parlementaire onderzoeken.

PowerShell Modules Vereist
Primary API: Microsoft Graph Identity.ConditionalAccess
Connection: Connect-MgGraph met Policy.Read.All, IdentityRiskEvent.Read.All
Required Modules: Microsoft.Graph.Authentication, Microsoft.Graph.Identity.SignIns, Microsoft.Graph.Identity.ConditionalAccess

Implementatie

Dit artikel beschrijft hoe u binnen de Nederlandse Baseline voor Veilige Cloud een volledig raamwerk voor risicogestuurde authenticatie opbouwt. We behandelen de strategische motivatie, het architectuurontwerp, de vertaalslag naar governance en operationeel beheer en de monitoring die nodig is voor continue verbetering. Het gekoppelde PowerShell-script inventariseert configuraties van Conditional Access, Authentication Strength en Identity Protection, analyseert hiaten en genereert rapportages voor bestuurders en auditors. Het doel is een herhaalbaar model waarmee publieke organisaties aantonen dat elke toegangsbeslissing uitlegbaar, toetsbaar en verdedigbaar is.

Strategische noodzaak en bestuurlijke impact

De Nederlandse overheid digitaliseert alle primaire processen terwijl medewerkers, ketenpartners en leveranciers wereldwijd samenwerken. Identiteiten zijn daarmee het belangrijkste grensvlak geworden tussen publieke dienstverlening en cyberdreiging. Een risicogestuurde authenticatiestrategie vertaalt bestuurlijke doelstellingen naar concrete drempelwaarden: hoe betrouwbaar moet een gebruiker zijn om dossiers te bekijken, wanneer is extra verificatie verplicht en welk bewijs is nodig om afwijkingen te accepteren? Zonder deze afspraken blijft toegangsbeveiliging een technisch gesprek, terwijl bestuurders juist willen weten hoe maatregelen bijdragen aan continuïteit, transparantie en publieke verantwoording.

Strategische besluitvorming draait bovendien om differentiatie. Een beleidsadviseur die vanaf een vertrouwd apparaat binnen het Rijksnetwerk werkt, vormt een heel ander risico dan een ingehuurde specialist die in het buitenland werkt met een tijdelijk account. Risicogestuurde authenticatie maakt die nuance zichtbaar door gebruikers, apparaten en applicaties in profielen te verdelen en iedere combinatie van een passend maatregelenpakket te voorzien. Dit voorkomt dat organisaties terugvallen op generieke blokkades die productiviteit remmen, terwijl bestuurders toch kunnen aantonen dat de strengste controles actief zijn bij staatsgevoelige processen.

Ook financieel biedt het model voordelen. Incidenten door gestolen accounts veroorzaken onderzoekskosten, juridische claims en herstelprojecten die veel groter zijn dan de investering in intelligent toegangsbeleid. Door risicosignalen te gebruiken bespaart de organisatie op licenties voor dure point solutions, dalen servicedesk tickets rond MFA-frictie en ontstaat een gedeelde taal tussen security, HR en business. Budgetcommissies kunnen per scenario inzichtelijk maken hoeveel risico wordt gereduceerd door aanvullende authentication strengths, wat besluitvorming versnelt en prioriteiten objectief maakt.

Ten slotte sluit risicogestuurde authenticatie aan op publieke waarden. Burgers en volksvertegenwoordigers verwachten dat overheden zorgvuldig omgaan met persoonsgegevens en bestuurlijke informatie. Door iedere aanmelding te toetsen aan actuele signalen kan de organisatie aantonen dat toegang alleen wordt verleend wanneer vertrouwen gerechtvaardigd is. Dit versterkt legitimiteit richting toezichthouders, rekenkamers en Parlement en ondersteunt de bredere doelstelling van de Nederlandse Baseline voor Veilige Cloud: aantoonbare, herleidbare en proportionele beveiliging van cloudomgevingen.

Architectuur, signalen en technische realisatie

Een risicogestuurd authenticatiemodel bouwt op een architectuur waarin Microsoft Entra ID de beslismotor vormt. Identity Protection levert gebruikers- en aanmeldrisico, Intune rapporteert device compliance, Defender for Endpoint voegt realtime bedreigingsinformatie toe en Microsoft Purview levert dataclassificatie. Deze signalen komen samen in Conditional Access, waar beleid wordt gedefinieerd op basis van trust tiers voor identiteiten en apparaten. Door signalen centraal beschikbaar te maken ontstaat een consistent besluit, ongeacht of de gebruiker Teams, SharePoint, een SaaS-dienst of een on-premises applicatie via Application Proxy benadert.

Het ontwerpen van signalen vraagt om strikte datakwaliteit. Locatie-informatie wordt gecorrigeerd met Named Locations zodat reguliere dienstreizen of hybride werkplekken niet onnodig worden geblokkeerd. Device signalen worden verrijkt met compliance-status, patchniveau en hardwareshashes zodat spoofing wordt voorkomen. Aanmeldgedrag wordt geanalyseerd op patronen zoals impossible travel, ongewone tijdstippen en afwijkende applicaties. Door deze signalen in een data-architectuur te modelleren, inclusief latentie- en retentie-eisen, kan de organisatie aantonen dat beslissingen gebaseerd zijn op betrouwbare informatie en niet op willekeur.

Architectuurteams ontwerpen daarnaast een bibliotheek met beleidsblokken. Een blok beschrijft exacte condities en acties: bijvoorbeeld hoog gebruikersrisico plus staatsgeheim label resulteert in onmiddellijke blokkade en incidentmelding; medium risico plus vertrouwelijk label vereist phishing-resistente MFA en sessiebeperkingen; laag risico maar onbekend apparaat leidt tot web-only modus via Defender for Cloud Apps. Elk blok bevat loggingvereisten, escalatiepaden en fallback-scenario’s, zodat implementaties consistent blijven en audits eenvoudig inzicht krijgen in de rationale achter beslissingen.

Integratie met legacy is een aparte ontwerpstap. Niet alle applicaties ondersteunen moderne authenticatie of Conditional Access. Secure Hybrid Access, partner-ZTNA’s en reverse proxy’s moeten daarom dezelfde beleidsbeslissingen kunnen afhandelen. Logging van deze componenten wordt naar Sentinel of een Rijksbreed SIEM geleid, waar correlatieregels controleren of risicosignalen overeenkomen met de uiteindelijke toegangsbeslissing. Zo ontstaat een volledig beeld, ook wanneer een gebruiker via een oude RDP-server of een specialistisch registratiesysteem werkt.

Programmatische governance en gefaseerde implementatie

Risicogestuurde authenticatie raakt beleid, processen en techniek tegelijk. Start daarom met een governanceboard waarin CISO, privacy officer, chief data officer, lijnmanagement en HR vertegenwoordigd zijn. Deze board bepaalt risicoprofielen per doelgroep, koppelt ze aan Authentication Strength niveaus en stelt eisen aan uitzonderingsbeheer. Besluiten worden vastgelegd in charter en beleidsdocumenten zodat ze verifieerbaar zijn voor toezichthouders en externe auditors.

De implementatie verloopt in iteraties. Eerst draait de organisatie alle relevante Conditional Access policies in report-only modus om impact te meten. Vervolgens worden policies met laagste gebruikersimpact geactiveerd, bijvoorbeeld extra verificatie voor administratieve accounts. Daarna volgen scenario’s met hogere complexiteit zoals gastgebruikers, leveranciers en hoog-risico applicaties. Iedere iteratie eindigt met een lessons-learned sessie en een update van het risicoregister, zodat governancebesluiten continu worden aangescherpt.

Communicatie en opleiding zijn essentieel. Eigenaars van applicaties krijgen duidelijke richtlijnen over welke requests ze mogen indienen en welke technische documentatie nodig is om uitzonderingen te verantwoorden. Gebruikers leren waarom een extra verificatie optreedt en hoe zij verdachte prompts melden. Door menselijke factoren deel te laten uitmaken van het programma neemt acceptatie toe en dalen improvisaties die controle ondermijnen.

Gebruik PowerShell-script risk-based-authentication.ps1 (functie Invoke-RiskBasedAuthenticationAssessment) – Voert een configuratie-assessment uit op Conditional Access, Authentication Strength en Identity Protection policies, beoordeelt risico- en gebruikersprofielen en levert een gestructureerd overzicht voor de governanceboard..

Monitoring, automatisering en aantoonbare compliance

Zonder continue monitoring verliest risicogestuurde authenticatie zijn waarde. Securityteams moeten dagelijks kunnen zien welke policies zijn gewijzigd, hoeveel aanmeldingen op risicosignalen werden beoordeeld en welke uitzonderingen actief zijn. Microsoft Sentinel of een gelijkwaardig SIEM ontvangt hiervoor auditlogs uit Entra ID, Identity Protection, Intune en Defender. Dashboards tonen trends zoals stijgende token diefstal of toename van onbekende apparaten, zodat beheer direct kan bijsturen.

Automatisering voorkomt dat de organisatie afhankelijk is van handmatige controles. Via Microsoft Graph en PowerShell worden policies versieerbaar opgeslagen, worden wijzigingen via pull requests beoordeeld en worden rapportages dagelijks gegenereerd. Exceptions krijgen een einddatum en worden automatisch ingetrokken tenzij een nieuwe goedkeuring wordt geregistreerd. Zo ontstaat een closed-loop waarin afwijkingen niet blijven sluimeren en waarin bewijslast realtime beschikbaar is.

Compliance-eisen vragen om traceerbaarheid. Voor elke risicoconditie moeten logboeken beschikbaar zijn die aantonen welke beslissing is genomen, welke authenticatiemethoden zijn afgedwongen en wie een eventuele override heeft goedgekeurd. Door deze gegevens te koppelen aan verwerkingsregister, DPIA’s en Archiefwet-bepalingen kan de organisatie laten zien dat toegangscontrole onderdeel is van formele dossiervorming. Dit maakt Woo-verzoeken en parlementaire vragen hanteerbaar omdat beslissingen reproduceerbaar zijn.

Gebruik PowerShell-script risk-based-authentication.ps1 (functie Invoke-RiskBasedAuthenticationReport) – Genereert een managementrapport met indicatoren over risicogestuurde authenticatie, inclusief trenddata, openstaande uitzonderingen en aanbevelingen voor remediatie..

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 risicogestuurde authenticatieconfiguraties voor Microsoft 365. .DESCRIPTION Dit script ondersteunt het artikel content/m365/identity/risk-based-authentication.json binnen het project "Nederlandse Baseline voor Veilige Cloud". Het script controleert kernindicatoren voor Conditional Access, Authentication Strength, Identity Protection en Intune/device compliance. In DebugMode wordt uitsluitend met voorbeelddata gewerkt, zodat lokale tests altijd binnen 15 seconden afronden zonder verbinding met productie. .NOTES Filename : risk-based-authentication.ps1 Author : Nederlandse Baseline voor Veilige Cloud Team Created : 2025-11-27 LastUpdate : 2025-11-27 RelatedDoc : content/m365/identity/risk-based-authentication.json Modules : Microsoft.Graph.Authentication, Microsoft.Graph.Identity.SignIns, Microsoft.Graph.Identity.ConditionalAccess (optioneel) .EXAMPLE .\risk-based-authentication.ps1 -Assessment -DebugMode Voert een lokale test uit met voorbeelddata en toont de resultaten op het scherm. .EXAMPLE .\risk-based-authentication.ps1 -Report -OutputPath .\risk-auth-report.txt Genereert een managementrapport met echte data (indien verbinding beschikbaar) en schrijft dit weg naar het opgegeven pad. #> #Requires -Version 5.1 [CmdletBinding()] param( [Parameter(Mandatory = $false, HelpMessage = "Toont een samenvatting van de huidige configuratie.")] [switch]$Assessment, [Parameter(Mandatory = $false, HelpMessage = "Genereert een rapportbestand met bevindingen.")] [switch]$Report, [Parameter(Mandatory = $false, HelpMessage = "Pad naar optioneel rapportbestand.")] [string]$OutputPath, [Parameter(Mandatory = $false, HelpMessage = "Gebruik voorbeelddata en sla cloudverbindingen over.")] [switch]$DebugMode ) $ErrorActionPreference = 'Stop' function Write-ModuleBanner { Write-Host "`n===============================================" -ForegroundColor Cyan Write-Host "Risk-Based Authentication Assessment" -ForegroundColor Cyan Write-Host "Nederlandse Baseline voor Veilige Cloud" -ForegroundColor Cyan Write-Host "===============================================" -ForegroundColor Cyan } function Initialize-RiskAuthEnvironment { <# .SYNOPSIS Bereidt verbindingen naar Microsoft Graph voor (indien nodig). #> if ($DebugMode) { Write-Host "DebugMode actief: er worden geen cloudverbindingen opgezet." -ForegroundColor Yellow return } try { if (-not (Get-Module -ListAvailable -Name Microsoft.Graph.Authentication)) { Write-Host "Waarschuwing: Microsoft.Graph.Authentication niet gevonden. Resultaten kunnen beperkt zijn." -ForegroundColor Yellow } else { $graphContext = Get-MgContext -ErrorAction SilentlyContinue if (-not $graphContext) { Write-Host "Verbinding met Microsoft Graph maken..." -ForegroundColor Gray # In productie-omgevingen: Connect-MgGraph -Scopes "Policy.Read.All","Directory.Read.All","IdentityRiskEvent.Read.All" Write-Host "Graph-verbinding nog te implementeren (vereist tenant-specifieke configuratie)." -ForegroundColor Green } else { Write-Host "Bestaande Microsoft Graph-context hergebruikt." -ForegroundColor Green } } } catch { Write-Host "FOUT bij initialiseren Microsoft Graph: $_" -ForegroundColor Red throw } } function Get-RiskAuthSample { <# .SYNOPSIS Levert voorbeelddata voor snelle lokale tests. #> return [PSCustomObject]@{ PoliciesEvaluated = 18 PoliciesReportOnly = 2 HighRiskPoliciesEnabled = $true AuthenticationStrengthStrong = 11 PasswordlessCoveragePercent = 72 IdentityProtectionEnabled = $true NamedLocationsMaintained = $true DeviceComplianceRequired = $true ExceptionsOpen = 4 AverageExceptionAgeDays = 19 MeanTimeToMitigateHours = 6 OverallStatus = "Aandacht vereist" RiskSummary = "Vier uitzonderingen lopen langer dan afgesproken; rapporteer aan governanceboard." } } function Get-RiskAuthState { <# .SYNOPSIS Structuur voor het ophalen van echte data uit Microsoft 365. .OUTPUTS PSCustomObject #> try { Initialize-RiskAuthEnvironment # Hieronder placeholders; organisaties vullen cmdlets naar eigen tenant in. Write-Host "Ophalen van actuele configuraties (pas onderstaande sectie aan naar uw tenant)..." -ForegroundColor Gray $state = [PSCustomObject]@{ PoliciesEvaluated = $null # Voorbeeld: (Get-MgConditionalAccessPolicy).Count PoliciesReportOnly = $null # Voorbeeld: (Get-MgConditionalAccessPolicy | Where-Object {$_.State -eq 'enabledForReportingButNotEnforced'}).Count HighRiskPoliciesEnabled = $null # Voorbeeld: (Get-MgIdentityConditionalAccessPolicy | Where-Object {$_.Conditions.SignInRiskLevels}).Count -gt 0 AuthenticationStrengthStrong = $null # Voorbeeld: (Get-MgBetaPolicyAuthenticationStrengthPolicy | Where-Object {$_.RequirementsSatisfied -contains 'multiFactorAuthentication'}).Count PasswordlessCoveragePercent = $null # Voorbeeld: berekend percentage gebruikers met FIDO2 / WHfB IdentityProtectionEnabled = $null # Voorbeeld: (Get-MgIdentityConditionalAccessPolicy | Where-Object {$_.Conditions.UserRiskLevels}).Count -gt 0 NamedLocationsMaintained = $null # Voorbeeld: (Get-MgConditionalAccessNamedLocation).Count -gt 0 DeviceComplianceRequired = $null # Voorbeeld: policies met GrantControls -contains 'compliantDevice' ExceptionsOpen = $null # Voorbeeld: telling vanuit eigen exceptions-register AverageExceptionAgeDays = $null # Voorbeeld: gemiddelde looptijd exceptions MeanTimeToMitigateHours = $null # Voorbeeld: gemiddelde doorlooptijd incidenten OverallStatus = "Configuratie vereist validatie" RiskSummary = "Vul de cmdlets in Get-RiskAuthState aan voor nauwkeurige rapportage." } return $state } catch { Write-Host "FOUT bij ophalen configuratie: $_" -ForegroundColor Red return [PSCustomObject]@{ PoliciesEvaluated = 0 PoliciesReportOnly = 0 HighRiskPoliciesEnabled = $false AuthenticationStrengthStrong = 0 PasswordlessCoveragePercent = 0 IdentityProtectionEnabled = $false NamedLocationsMaintained = $false DeviceComplianceRequired = $false ExceptionsOpen = 0 AverageExceptionAgeDays = 0 MeanTimeToMitigateHours = 0 OverallStatus = "Fout" RiskSummary = "Het script kon geen betrouwbare gegevens ophalen. Controleer modules en rechten." } } } function Get-RiskAuthOverview { if ($DebugMode) { Write-Host "DebugMode: voorbeelddataset wordt gebruikt." -ForegroundColor Yellow return Get-RiskAuthSample } return Get-RiskAuthState } function Invoke-RiskBasedAuthenticationAssessment { <# .SYNOPSIS Toont een samenvatting van de risicogestuurde authenticatieconfiguratie. #> $overview = Get-RiskAuthOverview Write-Host "`nResultaten risicogestuurde authenticatie:" -ForegroundColor Cyan Write-Host " Policies beoordeeld: $($overview.PoliciesEvaluated)" Write-Host " Policies in report-only: $($overview.PoliciesReportOnly)" Write-Host " Hoog-risicopolicies actief: $($overview.HighRiskPoliciesEnabled)" Write-Host " Sterke Authentication Strengths: $($overview.AuthenticationStrengthStrong)" Write-Host " Passwordless dekking (%): $($overview.PasswordlessCoveragePercent)" Write-Host " Identity Protection beleid actief: $($overview.IdentityProtectionEnabled)" Write-Host " Named Locations onderhouden: $($overview.NamedLocationsMaintained)" Write-Host " Device compliance vereist: $($overview.DeviceComplianceRequired)" Write-Host " Openstaande uitzonderingen: $($overview.ExceptionsOpen)" Write-Host " Gemiddelde leeftijd uitzonderingen: $($overview.AverageExceptionAgeDays) dagen" Write-Host " Gemiddelde mitigeringsduur: $($overview.MeanTimeToMitigateHours) uur" $statusColor = if ($overview.OverallStatus -match "OK|Goed") { "Green" } elseif ($overview.OverallStatus -match "Fout") { "Red" } else { "Yellow" } Write-Host "`nAlgemene status: $($overview.OverallStatus)" -ForegroundColor $statusColor Write-Host "Risicosamenvatting: $($overview.RiskSummary)" -ForegroundColor Gray return $overview } function Invoke-RiskBasedAuthenticationReport { <# .SYNOPSIS Schrijft een rapport weg met kernindicatoren en aanbevelingen. #> $reportPath = if ($OutputPath) { $OutputPath } else { Join-Path -Path (Get-Location) -ChildPath "risk-based-authentication-report.txt" } $overview = Invoke-RiskBasedAuthenticationAssessment $content = @() $content += "Risk-Based Authentication Rapport" $content += "=================================" $content += "Datum: $(Get-Date -Format 'yyyy-MM-dd HH:mm:ss')" $content += "" $content += "Policies beoordeeld: $($overview.PoliciesEvaluated)" $content += "Policies in report-only: $($overview.PoliciesReportOnly)" $content += "Hoog-risicopolicies actief: $($overview.HighRiskPoliciesEnabled)" $content += "Sterke Authentication Strengths: $($overview.AuthenticationStrengthStrong)" $content += "Passwordless dekking (%): $($overview.PasswordlessCoveragePercent)" $content += "Identity Protection beleid actief: $($overview.IdentityProtectionEnabled)" $content += "Named Locations onderhouden: $($overview.NamedLocationsMaintained)" $content += "Device compliance vereist: $($overview.DeviceComplianceRequired)" $content += "Openstaande uitzonderingen: $($overview.ExceptionsOpen)" $content += "Gemiddelde leeftijd uitzonderingen: $($overview.AverageExceptionAgeDays) dagen" $content += "Gemiddelde mitigeringsduur: $($overview.MeanTimeToMitigateHours) uur" $content += "" $content += "Algemene status: $($overview.OverallStatus)" $content += "Risicosamenvatting: $($overview.RiskSummary)" $content += "" $content += "Aanpak volgens Nederlandse Baseline voor Veilige Cloud:" $content += " - Documenteer uitzonderingen inclusief einddatum en eigenaar." $content += " - Koppel Authentication Strengths aan dataclassificaties." $content += " - Automatiseer rapportage via CI/CD of Azure Automation." try { $content | Out-File -FilePath $reportPath -Encoding UTF8 Write-Host "`nRapport opgeslagen op: $reportPath" -ForegroundColor Green } catch { Write-Host "FOUT: rapport kon niet worden geschreven: $_" -ForegroundColor Red throw } } Write-ModuleBanner if ($Assessment) { Invoke-RiskBasedAuthenticationAssessment | Out-Null } elseif ($Report) { Invoke-RiskBasedAuthenticationReport } else { Write-Host "Geen parameter opgegeven. Gebruik -Assessment of -Report." -ForegroundColor Yellow Write-Host "Voorbeeld: .\risk-based-authentication.ps1 -Assessment -DebugMode" -ForegroundColor Yellow }

Risico zonder implementatie

Risico zonder implementatie
High: Zonder risicogestuurde authenticatie blijft iedere identity-aanmelding gelijk behandeld, waardoor aanvallers met gestolen credentials dezelfde rechten krijgen als betrouwbare medewerkers. Auditors zullen concluderen dat de organisatie de BIO, AVG en NIS2 onvoldoende naleeft, met boetes, herstelkosten en bestuurlijke interventies als gevolg.

Management Samenvatting

Combineer Identity Protection, Conditional Access, Authentication Strength en Intune-signalen in één risicogestuurd authenticatiekader. Automatiseer governance, monitoring en rapportage via het meegeleverde script zodat elke toegangsbeslissing uitlegbaar is en publieke organisaties aantoonbaar voldoen aan de Nederlandse Baseline voor Veilige Cloud.