Microsoft 365: Adaptieve Toegangscontrole Voor Hoogwaardige Identiteitsbescherming

💼 Management Samenvatting

Adaptieve toegangscontrole combineert signalen over identiteit, apparaat, locatie, sessierisico en gegevenssensitiviteit om elke aanmelding in Microsoft 365 contextbewust te beoordelen. Waar traditionele policies statisch zijn, passen adaptieve beleidsregels zich real-time aan op basis van machine learning signaalstromen en beslissen ze of toegang wordt toegestaan, extra verificatie nodig is, of dat de sessie moet worden geblokkeerd. Hierdoor ontstaat een Zero Trust-beveiligingsmodel dat aansluit op de hoge eisen van Nederlandse overheidsorganisaties.

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

Aanvallen op identiteiten verlopen niet meer lineair en maken gebruik van combinaties van gestolen credentials, geautomatiseerde botnet-aanmeldingen, gecompromitteerde apparaten en tactieken waarbij aanvallers de hele keten van cloudservices testen op zwakke schakels. Een uniforme policy voor alle gebruikers is daarom niet langer voldoende. De Baseline Informatiebeveiliging Overheid, NIS2 en het Rijksbrede programma Digitale Veiligheid vereisen expliciet dat organisaties contextuele signalen betrekken in toegangsbeslissingen en realtime kunnen schakelen tussen toestaan, verifiëren en blokkeren. Zonder adaptieve toegangscontrole blijven privileges openstaan wanneer het risico stijgt, ontstaan er blinde vlekken in hybride werkmodellen en wordt het vrijwel onmogelijk om audits overtuigend aan te tonen dat Zero Trust-principes daadwerkelijk worden nageleefd.

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

Implementatie

Dit artikel beschrijft hoe u een volwaardig adaptief toegangsprogramma bouwt in Microsoft Entra ID voor het volledige Microsoft 365-landschap. We behandelen de businesscase, de architectuur van benodigde signaalstromen, de vertaling naar Conditional Access policies en Authentication Strength profielen, de koppeling met device compliance en identity protection, en de manieren waarop u dit alles monitort, automatiseert en verifieert voor audits. U ontvangt concrete richtlijnen voor het ontwerpen van flexibele policies, het inrichten van experimenten, het opbouwen van governance rond uitzonderingen en het inzetten van het bijbehorende PowerShell-script om configuraties continu te toetsen.

Strategische Context en Business Case

Adaptieve toegangscontrole is geen geïsoleerd technisch project maar een strategische capability die rechtstreeks bijdraagt aan beleidsdoelen zoals digitale soevereiniteit, datagedreven besluitvorming en continuïteit van publieke dienstverlening. Overheidsorganisaties verwerken persoonsgegevens, staatsgeheime informatie en kritieke infrastructuren in Microsoft 365, waardoor elke identiteitsaanmelding potentieel een toegangspoort is tot staatsgevoelige gegevens. Door adaptieve policies centraal te stellen in de roadmap voor de Nederlandse Baseline voor Veilige Cloud wordt beveiliging een ingebouwde eigenschap van de digitale werkplek in plaats van een set losse maatregelen. Het bestuur kan aantonen dat risicoklassen zijn gekoppeld aan concrete maatregelen: een gebruiker die vanuit een bekend device op een Rijksnetwerk werkt, krijgt een andere ervaring dan een extern ingehuurde specialist die via een onbekende locatie inlogt en toegang vraagt tot dezelfde data. Deze differentiatie vergroot niet alleen de veiligheid, maar schept vertrouwen bij burgerlijke toezichthouders omdat beleid meetbaar en uitlegbaar wordt.

Daarnaast levert adaptieve toegangscontrole een aantoonbare kostenbesparing op. Zonder contextuele policies worden securityteams overspoeld met uitzonderingsverzoeken, tijdelijke blokkades en handmatige herbeoordelingen zodra gebruikers van werklocatie of apparaat wisselen. Door Conditional Access en Identity Protection te laten oordelen op basis van risicosignalen daalt het aantal ondersteuningsverzoeken met tientallen procenten. Gebruikers ervaren minder frictie omdat zij alleen extra verificatie hoeven uit te voeren wanneer er daadwerkelijk een afwijking is. Tegelijkertijd kan de organisatie strenger zijn op gevoelige workflows omdat de policies weten welke applicaties staatsgeheim, vertrouwelijk of publiek zijn en het beveiligingsniveau hierop afstemmen. Hierdoor verbetert de productiviteit terwijl de veiligheid stijgt, wat voor CIO's en CISO's een zeldzame combinatie is die de investeringsbeslissing vereenvoudigt.

Een ander strategisch argument is de aansluiting op landelijke en Europese wetgeving. De BIO vraagt expliciet om risicogestuurde toegangscontrole, de AVG legt nadruk op dataminimalisatie en logging, en NIS2 vereist aantoonbare maatregelen voor risicobeheer. Adaptieve toegang maakt het mogelijk om beleid te koppelen aan dataclassificaties uit Microsoft Purview, zodat bijvoorbeeld persoonsgegevens onder de AVG automatisch strengere eisen krijgen dan open data. Wanneer een gebruiker probeert om gevoelige dossiers via een niet-goedgekeurd apparaat te openen, kan de policy de download blokkeren, sessiecontrole activeren en een compliance-log registreren. Deze maatregelen zijn vanuit audits te herleiden naar de precieze juridische eisen, waardoor discussies met auditors verschuiven van bewijsvoering naar optimalisatie.

Tot slot vormt adaptieve toegangscontrole een sleutelelement in de Zero Trust-architectuur van het Rijk. Zero Trust veronderstelt dat geen enkele aanmelding impliciet vertrouwd mag worden, zelfs niet binnen het interne netwerk. Door adaptieve policies te combineren met real-time telemetry uit Defender, Entra ID Protection en Intune kunnen organisaties automatisch reageren op gebeurtenissen zoals malwaredetecties, verdachte reeksen aanmeldingen, of aflopende certificaten. Beleid kan zelfs context meenemen uit SOC-analyses: wanneer het CSIRT een verhoogde dreigingswaarschuwing afgeeft, schakelt het adaptieve framework onmiddellijk over op strengere maatregelen. Dit soort automatisering is onmogelijk in klassieke toegangsmodellen maar wordt essentieel nu dreigingen zich razendsnel ontwikkelen.

Architectuur, Signalen en Referentieontwerp

Een adaptief toegangslandschap bouwt u op basis van vier signalen: identiteit, apparaat, locatie en sessierisico. Microsoft Entra ID fungeert als centrale besluitmotor en combineert de risk events uit Identity Protection met device compliance uit Intune, netwerkcontext via Named Locations en applicatiegevoeligheid via Conditional Access filters. Deze signalen worden aangevuld met informatie uit Defender for Cloud Apps, Microsoft Defender for Endpoint en externe feeds zoals het Nationaal Detectie Netwerk. Het referentieontwerp definieert per signaal hoe gegevens worden verzameld, welke latentie acceptabel is en hoe de data beschikbaar komt voor policies. Zo moeten device compliance signalen binnen vijf minuten beschikbaar zijn, terwijl geolocatie-informatie direct wordt bijgewerkt via Azure AD sign-in telemetry. Door deze architectuur vooraf vast te leggen, voorkomt u dat policies afhankelijk zijn van bronnen met verschillende betrouwbaarheid en zorgt u voor consistente beslissingen.

Vervolgens vertaalt u de signalen naar trust tiers. In het basisontwerp onderscheiden we lage, normale en hoge vertrouwensniveaus voor zowel gebruikers als apparaten. Een gebruiker met recente risicosignalen (bijvoorbeeld onmogelijke reis of brute-force detecties) valt automatisch in een lage trust tier en moet passwordless of phishing-resistente MFA uitvoeren voordat toegang wordt verleend. Apparaten die niet compliant zijn met Intune-beleid of die niet hybride zijn gekoppeld, krijgen dezelfde behandeling. Door trust tiers te combineren kunt u beslissingen nemen op basis van de zwakste schakel: zelfs een vertrouwde gebruiker wordt beperkt als het apparaat niet aan eisen voldoet. Dit voorkomt dat aanvallers de policy omzeilen door ofwel de identiteit ofwel het apparaat te misbruiken.

Het referentieontwerp bevat daarnaast een bibliotheek van beleidsblokken die u kunt hergebruiken. Denk aan blokken voor klassieke scenario’s zoals ‘hoog gebruikersrisico, blok toegang’, maar ook aan fijnmazige varianten zoals ‘medium sign-in risico, vereist passwordless authenticatie en beperkt sessie naar web-only’. Elk blok beschrijft de benodigde signalen, de beleidsinstellingen, fallback-gedrag en de logging die moet worden verzameld voor audits. Door deze blokken te parametriseren (bijvoorbeeld via Azure AD groups of Entra ID filters) kunt u dezelfde logica toepassen op verschillende organisatieonderdelen zonder telkens vanaf nul te beginnen. Dit bevordert consistentie en maakt het eenvoudiger om wijzigingen te beheren via Infrastructure as Code of Policy-as-Code benaderingen.

Een laatste architectuurelement is de koppeling met data-classificatie en applicatietypen. Microsoft Purview levert labels die aangeven of documenten staatsgeheim, vertrouwelijk, intern of publiek zijn. Adaptieve policies kunnen deze labels gebruiken om toegang te beperken. Wanneer een gebruiker met een medium risicoscore een applicatie benadert die staatsgeheime gegevens bevat, kan de policy beslissen om de download te blokkeren, de sessie te isoleren via Defender for Cloud Apps of extra goedkeuring te eisen van een toezichthoudende rol. Op deze manier worden gegevensbescherming en identiteitsbeveiliging geïntegreerd, wat essentieel is voor compliance met de AVG en het Rijksbrede informatiebeveiligingsbeleid.

Implementatieroadmap en Operationele Verankering

De implementatie van adaptieve toegangscontrole verloopt in vier fasen die elk hun eigen deliverables kennen. In fase één richt u een discovery-programma in waarbij aanmeldingslogboeken, IaaS/SaaS-inventarissen en dataclassificaties worden geanalyseerd. Het doel is vast te leggen welke applicaties bedrijfskritisch zijn, welke gebruikersgroepen over verhoogde privileges beschikken en welke uitzonderingen op dit moment zijn goedgekeurd. Deze fase eindigt met een beslisdocument waarin per risicocategorie is gedefinieerd welke maatregelen minimaal vereist zijn. Door security, compliance, HR en bedrijfsvoering gezamenlijk te laten tekenen, creëert u bestuurlijk draagvlak en voorkomt u dat de uitvoering later wordt vertraagd door governance-discussies.

Fase twee richt zich op het bouwen van de policybibliotheek. Werk met Infrastructure as Code (bijvoorbeeld Bicep of Terraform) of gebruik het Microsoft Graph API-schema zodat policies versioneerbaar worden en wijzigingen via pull requests verlopen. Definieer voor elke policy de exacte condities (gebruikers, Cloud apps, device platforms, locaties, sign-in risk), de vereiste controls (Authentication Strength, compliant device, session restrictions) en de logging die naar het centraal SIEM moet worden gestuurd. Test policies eerst in report-only mode en gebruik de sign-in logs om impactanalyses te maken. Documenteer bevindingen in een runbook zodat toekomstige beheerders exact weten hoe zij policies moeten bijwerken wanneer nieuwe applicaties of gebruikersgroepen worden toegevoegd.

In fase drie voert u een gecontroleerde uitrol uit. Start met een pilotgroep die representatief is voor complexe scenario’s, zoals medewerkers met dubbele functies, externe consultants of gebruikers die regelmatig van device wisselen. Houd de pilot twee tot vier weken actief en verzamel kwalitatieve feedback naast technische metrics. Gebruik deze data om communicatie, supportprocessen en exception-handling te verbeteren. Zodra de pilot stabiel is, volgt een gefaseerde uitrol per organisatieonderdeel, waarbij elke fase pas start nadat de vorige succesvol is afgerond en de lessons learned zijn verwerkt. Door deze iteratieve aanpak voorkomt u dat kritieke diensten onverwacht worden geblokkeerd en behoudt u vertrouwen bij het management.

De laatste fase draait om operationalisatie. Adaptieve policies moeten onderdeel worden van het standaard changeproces, het SOC-runbook en de onboarding van nieuwe systemen. Definieer Service Level Agreements voor het verwerken van uitzonderingsverzoeken en leg vast hoe tijdelijke uitzonderingen automatisch worden beëindigd. Koppel policies aan business continuity plannen, zodat bijvoorbeeld tijdens een crisissituatie tijdelijk andere risicodrempels gelden maar alle acties worden gelogd en achteraf beoordeeld. Door deze organisatorische borging voorkomt u dat adaptieve toegang verwatert nadat het projectteam is ontbonden.

Monitoring, Automatisering en Continue Verbetering

Zonder continue monitoring verliest adaptieve toegangscontrole haar waarde. Securityteams moeten dagelijks inzicht hebben in welke policies actief zijn, welke signalen binnenkomen en waar uitzonderingen zijn toegekend. Het Security Operations Center dient dashboards te onderhouden die sign-in risicotrends, device compliance en Named Location-triggers combineren. Automatische alerts informeren het team wanneer een policy onverwacht wordt uitgeschakeld, wanneer er plots veel uitzonderingen worden aangevraagd of wanneer een regio plotseling veel afwijkende aanmeldingen laat zien. Deze signalen worden gekoppeld aan het incident response-proces zodat analisten binnen minuten weten of zij maatregelen moeten aanscherpen of gebruikers moeten informeren.

Automatisering is cruciaal om schaal te houden. Door het Microsoft Graph API-oppervlak te gebruiken kunnen organisaties policies uitlezen, compliance rapporteren en afwijkingen herstellen zonder handmatige stappen. Integraties met Azure DevOps of GitHub Actions zorgen ervoor dat elke wijziging aan een policy via code reviews verloopt, waardoor vier-ogen-principes worden afgedwongen. Bovendien kan dezelfde automatisering worden ingezet om uitzonderingen tijdelijk toe te staan op basis van goedgekeurde verzoeken, waarbij een timer ervoor zorgt dat de uitzondering automatisch vervalt. Dit minimaliseert menselijke fouten en creëert een volledig audit-trail over wie, wanneer en waarom een wijziging heeft aangebracht.

Gebruik PowerShell-script adaptive-access-control.ps1 (functie Invoke-Monitoring) – Controleert via Microsoft Graph of adaptieve Conditional Access policies actief zijn, beoordeelt of risicogestuurde beslissingen worden afgedwongen en genereert samenvattingen voor compliance-rapportages..

Het gekoppelde PowerShell-script wordt idealiter dagelijks uitgevoerd in een geautomatiseerde pipeline en ad hoc ingezet door security engineers tijdens audits of incidenten. Het script controleert of er policies actief zijn die sign-in risico's interpreteren, of device compliance daadwerkelijk vereist wordt bij gevoelige applicaties en of sessiesturing is ingeschakeld voor dataclassificaties met hoge gevoeligheid. De uitvoer wordt opgeslagen in het compliance-dossier en vormt de basis voor kwartaalrapportages aan het CIO-beraad. Door deze aanpak ontstaat een closed-loop systeem: signalen worden gemonitord, afwijkingen worden geautomatiseerd gecorrigeerd en bestuurders ontvangen begrijpelijke rapporten met beslisinformatie.

Compliance, Auditing en Remediatie

Adaptieve toegangscontrole ondersteunt meerdere compliancekaders tegelijk. De BIO-paragrafen 09.04 en 12.01 verlangen dat organisaties toegang beperken op basis van risico’s, terwijl ISO 27001:2022 controles A.5.15 en A.5.17 nadruk leggen op dynamische toegangsbeveiliging en constante monitoring. De NIS2-richtlijn vereist aantoonbaar risicobeheer en passende technische maatregelen; adaptieve policies vormen daarvoor het tastbare bewijs. Door policies te koppelen aan dataclassificaties toont u bovendien naleving van de AVG omdat alleen geautoriseerde, gecontroleerde apparaten toegang krijgen tot persoonsgegevens en auditlogboeken exact vastleggen wie welke data heeft aangeraakt. Auditors verwachten dat organisaties deze keten kunnen uitleggen, inclusief de parameters, change-historie en herstelprocedures. Dit artikel levert de blauwdruk en de bijbehorende tooling.

Gebruik PowerShell-script adaptive-access-control.ps1 (functie Invoke-Remediation) – Biedt beheerders een gestructureerde checklist voor het herstellen van ontbrekende of uitgeschakelde adaptieve policies en adviseert over het opnieuw activeren van beleidsblokken..

Remediatieprocessen moeten vooraf zijn vastgelegd. Wanneer monitoring aangeeft dat een risicogestuurde policy ontbreekt, activeert het beheerteam een runbook waarin staat hoe de policy via Infrastructure as Code wordt hersteld, welke testen opnieuw moeten worden uitgevoerd en wie de goedkeuring verleent. Tijdelijke maatregelen, zoals het blokkeren van alle toegang voor een kritieke applicatie, worden vastgelegd inclusief einddatum en verantwoordelijke eigenaar. Na herstel wordt de gebeurtenis geëvalueerd binnen het Change Advisory Board zodat structurele verbeteringen worden opgenomen. Door deze governanceaanpak blijft adaptieve toegangscontrole niet alleen technisch robuust, maar ook bestuurlijk houdbaar.

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 of adaptieve Conditional Access policies actief zijn en afdwingbare risicogestuurde beslissingen nemen. .DESCRIPTION Dit script hoort bij het artikel 'adaptive-access-control' van de Nederlandse Baseline voor Veilige Cloud. Het script voert drie hoofdcontroles uit: 1. Zijn er ingeschakelde Conditional Access policies die sign-in of user risk gebruiken? 2. Worden device compliance, hybride join of sessiecontroles afgedwongen voor gevoelige applicaties? 3. Zijn Named Locations, Authentication Strength of session controls aanwezig om adaptief gedrag te realiseren? Het script kan worden gebruikt voor monitoring (-Monitoring) en remediatieadvies (-Remediation). Gebruik -DebugMode om veilige lokale tests uit te voeren zonder Graph-verbinding. .NOTES Filename: adaptive-access-control.ps1 Author: Nederlandse Baseline voor Veilige Cloud Created: 2025-10-15 Last Modified: 2025-10-15 Version: 1.0 Related JSON: content/m365/identity/adaptive-access-control.json .EXAMPLE .\adaptive-access-control.ps1 -Monitoring -DebugMode Voert een lokale test uit met voorbeelddata. .EXAMPLE .\adaptive-access-control.ps1 -Monitoring Controleert live in de tenant welke adaptieve policies actief zijn. .EXAMPLE .\adaptive-access-control.ps1 -Remediation -WhatIf Toont welke acties nodig zijn wanneer vereiste policies ontbreken. #> #Requires -Version 5.1 [CmdletBinding()] param( [Parameter(HelpMessage = "Voer de adaptieve toegangscontrole uit en toon het resultaat")] [switch]$Monitoring, [Parameter(HelpMessage = "Geef remediatie-advies op basis van de meetresultaten")] [switch]$Remediation, [Parameter(HelpMessage = "Voer een veilige lokale test uit zonder Microsoft Graph te benaderen")] [switch]$DebugMode, [Parameter(HelpMessage = "Toon welke acties zouden worden uitgevoerd zonder ze daadwerkelijk uit te voeren")] [switch]$WhatIf ) $ErrorActionPreference = 'Stop' $VerbosePreference = 'Continue' function Test-RequiredModules { param( [string[]]$ModuleNames ) $missing = @() foreach ($name in $ModuleNames) { if (-not (Get-Module -ListAvailable -Name $name)) { $missing += $name } } if ($missing.Count -gt 0) { throw "Ontbrekende modules: $($missing -join ', '). Installeer deze eerst met Install-Module." } } function Get-AdaptivePolicies { <# .SYNOPSIS Haalt alle Conditional Access policies op en filtert op adaptieve kenmerken. #> [CmdletBinding()] param() $policies = @() $uri = "https://graph.microsoft.com/v1.0/identity/conditionalAccess/policies?`$top=20" while ($uri) { $response = Invoke-MgGraphRequest -Method GET -Uri $uri -ErrorAction Stop if ($response.value) { $policies += $response.value } $uri = $response.'@odata.nextLink' } return $policies | Where-Object { $_.state -eq "enabled" } } function Invoke-Monitoring { [CmdletBinding()] param() Write-Host "" Write-Host "Adaptieve Toegangscontrole - Monitoring" -ForegroundColor Cyan Write-Host "======================================" -ForegroundColor Cyan if ($DebugMode) { $sample = [PSCustomObject]@{ PolicyCount = 4 RiskAwarePolicies = 2 DeviceContextPolicies = 3 NamedLocationPolicies = 2 SessionControlsEnabled = $true AuthenticationStrength = $true ComplianceStatus = "Compliant" AdaptivePolicies = @( [PSCustomObject]@{ Name = "CA - Sign-in risk (pilot)" HasSignInRisk = $true HasUserRisk = $false RequiresPhishingResMFA = $true RequiresCompliantDevice = $false HasSessionControls = $true ScopedLocations = "Nederland, EU Cloud" } ) } Write-Host "[DEBUG] Voorbeeldresultaten:" -ForegroundColor Yellow $sample | Format-List return $sample } try { Test-RequiredModules -ModuleNames @("Microsoft.Graph.Authentication", "Microsoft.Graph.Identity.SignIns") Connect-MgGraph -Scopes "Policy.Read.All","Policy.ReadWrite.ConditionalAccess","Directory.Read.All" -NoWelcome -ErrorAction Stop | Out-Null $policies = Get-AdaptivePolicies if ($policies.Count -eq 0) { Write-Host "[WAARSCHUWING] Er zijn geen ingeschakelde Conditional Access policies gevonden." -ForegroundColor Yellow } $adaptivePolicies = @() $hasRiskPolicy = $false $hasDevicePolicy = $false $hasLocationPolicy = $false $hasSessionPolicy = $false $hasAuthStrength = $false foreach ($policy in $policies) { $grantControls = $policy.grantControls $sessionControls = $policy.sessionControls $conditions = $policy.conditions $hasSignInRisk = $conditions.signInRiskLevels -and $conditions.signInRiskLevels.Count -gt 0 $hasUserRisk = $conditions.userRiskLevels -and $conditions.userRiskLevels.Count -gt 0 $requiresCompliantDevice = $false $requiresHybridJoin = $false $requiresPhishingResMfa = $false if ($grantControls -and $grantControls.builtInControls) { $requiresCompliantDevice = $grantControls.builtInControls -contains "compliantDevice" $requiresHybridJoin = $grantControls.builtInControls -contains "domainJoinedDevice" $requiresPhishingResMfa = ($grantControls.authenticationStrength -and $grantControls.authenticationStrength.displayName -match "phishing") if ($grantControls.authenticationStrength) { $hasAuthStrength = $true } } if ($sessionControls) { if ($sessionControls.applicationEnforcedRestrictions -or $sessionControls.persistentBrowser -or $sessionControls.signInFrequency) { $hasSessionPolicy = $true } } $locationScope = "Alle locaties" if ($conditions.locations -and $conditions.locations.includeLocations) { if ($conditions.locations.includeLocations -notcontains "All") { $hasLocationPolicy = $true $locationScope = ($conditions.locations.includeLocations -join ", ") } } if ($requiresCompliantDevice -or $requiresHybridJoin) { $hasDevicePolicy = $true } if ($hasSignInRisk -or $hasUserRisk) { $hasRiskPolicy = $true } $adaptivePolicies += [PSCustomObject]@{ Name = $policy.displayName HasSignInRisk = $hasSignInRisk HasUserRisk = $hasUserRisk RequiresCompliantDevice = $requiresCompliantDevice RequiresHybridJoin = $requiresHybridJoin RequiresPhishingResMFA = $requiresPhishingResMfa HasSessionControls = $hasSessionPolicy ScopedLocations = $locationScope State = $policy.state } } $requirements = [ordered]@{ RiskPolicies = $hasRiskPolicy DevicePolicies = $hasDevicePolicy LocationPolicies = $hasLocationPolicy SessionPolicies = $hasSessionPolicy AuthStrengthUsage = $hasAuthStrength } $met = ($requirements.GetEnumerator() | Where-Object { $_.Value }).Count $complianceStatus = if ($met -ge 4) { "Compliant" } elseif ($met -ge 2) { "Partially Compliant" } else { "Non-Compliant" } Write-Host "" Write-Host "Resultaten:" -ForegroundColor Cyan foreach ($req in $requirements.GetEnumerator()) { $color = if ($req.Value) { 'Green' } else { 'Yellow' } Write-Host (" {0,-20}: {1}" -f $req.Name, $req.Value) -ForegroundColor $color } Write-Host "" Write-Host ("Totaal ingeschakelde policies: {0}" -f $policies.Count) -ForegroundColor Cyan if ($adaptivePolicies.Count -gt 0) { $adaptivePolicies | Select-Object Name,HasSignInRisk,RequiresCompliantDevice,RequiresPhishingResMFA,HasSessionControls,ScopedLocations | Format-Table | Out-String | Write-Host } Write-Host "" switch ($complianceStatus) { "Compliant" { Write-Host "[OK] Adaptieve toegangscontrole voldoet aan de minimumeisen." -ForegroundColor Green } "Partially Compliant" { Write-Host "[WAARSCHUWING] Er zijn adaptieve elementen, maar niet alle eisen worden afgedwongen." -ForegroundColor Yellow } default { Write-Host "[FAIL] Adaptieve policies ontbreken of zijn niet actief." -ForegroundColor Red } } return [PSCustomObject]@{ PolicyCount = $policies.Count RiskAwarePolicies = ($adaptivePolicies | Where-Object { $_.HasSignInRisk -or $_.HasUserRisk }).Count DeviceContextPolicies = ($adaptivePolicies | Where-Object { $_.RequiresCompliantDevice -or $_.RequiresHybridJoin }).Count NamedLocationPolicies = ($hasLocationPolicy) SessionControlsEnabled = $hasSessionPolicy AuthenticationStrength = $hasAuthStrength ComplianceStatus = $complianceStatus AdaptivePolicies = $adaptivePolicies } } catch { Write-Error "Fout tijdens monitoring: $_" throw } finally { if (-not $DebugMode) { Disconnect-MgGraph -ErrorAction SilentlyContinue | Out-Null } } } function Invoke-Remediation { [CmdletBinding()] param() Write-Host "" Write-Host "Adaptieve Toegangscontrole - Remediatie" -ForegroundColor Cyan Write-Host "=======================================" -ForegroundColor Cyan $result = Invoke-Monitoring if ($result.ComplianceStatus -eq "Compliant") { Write-Host "[INFO] Geen remediatie vereist. Alle adaptieve eisen zijn aanwezig." -ForegroundColor Green return } Write-Host "" Write-Host "Aanbevolen acties:" -ForegroundColor Cyan if ($result.RiskAwarePolicies -eq 0) { if ($WhatIf) { Write-Host " WhatIf: zou een Sign-in risk policy aanmaken die Medium+ risico vereist passwordless authenticatie." -ForegroundColor Yellow } else { Write-Host " - Maak een policy aan: Conditions → Sign-in risk = Medium/High, Grant → Authentication Strength (Phishing-resistant)." -ForegroundColor Yellow } } if (-not $result.DeviceContextPolicies) { if ($WhatIf) { Write-Host " WhatIf: zou device compliance afdwingen voor workloads zoals Exchange, SharePoint en Teams." -ForegroundColor Yellow } else { Write-Host " - Voeg 'Require compliant device' toe aan policies die staatsgeheime data beschermen." -ForegroundColor Yellow } } if (-not $result.NamedLocationPolicies) { Write-Host " - Definieer Named Locations (bijv. Rijksnetwerk, EU) en koppel deze aan policies voor hybride werken." -ForegroundColor Yellow } if (-not $result.SessionControlsEnabled) { Write-Host " - Activeer session controls zoals Sign-in frequency (12 uur) en Application enforced restrictions voor browsertoegang." -ForegroundColor Yellow } if (-not $result.AuthenticationStrength) { Write-Host " - Configureer Authentication Strength profielen zodat phishing-resistente methoden verplicht zijn bij hoog risico." -ForegroundColor Yellow } Write-Host "" Write-Host "Documenteer elke wijziging via het changeproces en koppel het aan het adaptive access runbook." -ForegroundColor Cyan } try { Write-Host "" Write-Host "========================================" -ForegroundColor Cyan Write-Host "Adaptieve Toegangscontrole" -ForegroundColor Cyan Write-Host "Nederlandse Baseline voor Veilige Cloud" -ForegroundColor Cyan Write-Host "========================================" -ForegroundColor Cyan if (-not $Monitoring -and -not $Remediation) { Write-Host "" Write-Host "Geen modus opgegeven." -ForegroundColor Yellow Write-Host "Gebruik -Monitoring voor een auditrapport of -Remediation voor hersteladvies." -ForegroundColor Yellow Write-Host "Voeg -DebugMode toe voor een lokale test." -ForegroundColor Yellow return } if ($Monitoring) { Invoke-Monitoring | Out-Null } if ($Remediation) { Invoke-Remediation } } catch { Write-Error "Fout in adaptive-access-control.ps1: $_" throw } finally { Write-Host "" Write-Host "========================================" -ForegroundColor Cyan }

Risico zonder implementatie

Risico zonder implementatie
Critical: Het ontbreken van adaptieve toegangscontrole betekent dat toegangsbeslissingen niet reageren op actuele dreigingen, waardoor gestolen accounts, onbeheerde apparaten en ongewenste locaties alsnog toegang krijgen tot staatsgevoelige data. Dit leidt direct tot niet-naleving van BIO, NIS2 en AVG-verplichtingen en vergroot de kans op incidenten met hoge maatschappelijke impact.

Management Samenvatting

Introduceer een adaptief toegangsraamwerk in Entra ID dat risicosignalen uit Identity Protection, Intune en Defender gebruikt om policies dynamisch aan te passen. Bouw een herbruikbare policybibliotheek, automatiseer beheer via Microsoft Graph en gebruik het PowerShell-script om naleving dagelijks te verifiëren. Dit is een Zero Trust-basiseis voor Nederlandse overheidsorganisaties.