Microsoft 365: Ontwerp En Implementatie Van Conditional Access Policies

💼 Management Samenvatting

Conditional Access is het hart van moderne identiteitsbeveiliging in Microsoft 365: het bepaalt onder welke voorwaarden een gebruiker, apparaat of sessie daadwerkelijk toegang krijgt tot data en applicaties. In plaats van statische 'alles-of-niets' regels, combineert Conditional Access signalen zoals locatie, apparaatstatus, gebruikersrisico en applicatietype om elke toegangspoging dynamisch te beoordelen.

Aanbeveling
IMPLEMENT
Risico zonder
Hoog
Risk Score
8/10
Implementatie
28u (tech: 16u)
Van toepassing op:
M365
Entra ID

Binnen de Nederlandse overheid en andere vitale sectoren is het dreigingslandschap de afgelopen jaren fundamenteel veranderd. Aanvallers richten zich niet langer primair op perimeternetwerken, maar op identiteiten: gestolen wachtwoorden via phishing, password-spray tegen duizenden accounts tegelijk, misbruik van OAuth-appregistraties of het kapen van sessiecookies. Tegelijkertijd zijn organisaties massaal overgestapt op hybride werken: medewerkers werken vanuit huis, onderweg of via externe partners, vaak met een mix van beheerde en niet-beheerde apparaten. Traditionele netwerkauthenticatie of simpele IP-whitelists zijn in zo’n context onvoldoende. Zonder goed ontworpen Conditional Access beleid ontstaat een situatie waarin iedereen overal kan inloggen zolang gebruikersnaam en wachtwoord kloppen, ongeacht of het apparaat besmet is, het verzoek uit een risicoland komt of het account net op een verboden website is ingevoerd. Dat leidt niet alleen tot verhoogd risico op accountovername en datalekken, maar ook tot non-compliance met kaders als de BIO, NIS2 en AVG, die expliciet vragen om proportionele, risicogebaseerde toegangscontrole. Een robuuste set Conditional Access policies maakt het mogelijk om precies die combinatie van factoren af te dwingen die past bij de gevoeligheid van de dienst: bijvoorbeeld strengere eisen voor beheerders en toegang tot staatsgeheime informatie, en meer gebruiksvriendelijke maar nog steeds veilige bescherming voor reguliere medewerkers.

PowerShell Modules Vereist
Primary API: Microsoft Graph API
Connection: Connect-MgGraph
Required Modules: Microsoft.Graph

Implementatie

Dit artikel beschrijft hoe u als CISO, security architect of Microsoft 365-beheerder een samenhangende set Conditional Access policies ontwerpt, documenteert en implementeert voor een Nederlandse overheidsorganisatie. We starten met de uitgangspunten van Zero Trust (nooit vertrouwen op basis van alleen netwerkpositie, altijd expliciet verifiëren, en aannemen dat een inbreuk al heeft plaatsgevonden) en vertalen die naar concrete beleidsregels. Vervolgens werken we uit welke basisconfiguratie minimaal nodig is: onder andere verplichte multi-factor-authenticatie (MFA) voor alle gebruikers, strengere eisen voor beheerders, blokkeren van legacy authenticatie, eisen aan compliant en hybride joined apparaten, en scheiding van hoog-risico- en laag-risico-scenario’s. Daarna verdiepen we ons in ontwerpprincipes zoals least privilege, break-glass accounts, staged rollout, testgroepen, en het voorkomen van lock-outs. Tot slot behandelen we governance: hoe u policies versiebeheert, wijzigingen test, periodiek herijkt op basis van NCSC-adviezen en dreigingsrapporten, en hoe u auditbaar kunt aantonen dat Conditional Access beleid is ingericht, wordt gemonitord en daadwerkelijk effectief is.

Ontwerpprincipes voor een robuust Conditional Access beleid

Een effectief Conditional Access ontwerp begint bij een helder beeld van de kroonjuwelen van de organisatie: welke informatie, applicaties en functionaliteit mogen onder geen beding ongecontroleerd toegankelijk zijn? Voor overheidsorganisaties gaat het bijvoorbeeld om dossiersystemen, zaaksystemen, registers met persoonsgegevens, onderzoeksomgevingen of systemen met vitale procesbesturing. In plaats van direct voor elk individueel systeem aparte policies te maken, werkt u vanuit een gelaagd model: eerst generieke basisbeveiliging voor alle cloudtoegang, vervolgens aanvullende lagen voor beheerders, externe gebruikers en hoog-risico-applicaties. Deze gelaagde aanpak voorkomt een wildgroei aan overlappingen en uitzonderingen en maakt het eenvoudiger om beleid te onderhouden en uit te leggen aan auditors en bestuurders.

Belangrijke ontwerpprincipes zijn onder andere: ‘MFA by default’, ‘blokkeer legacy authenticatie’, ‘vertrouw nooit alleen op locatie’ en ‘gebruik device-compliance als harde randvoorwaarde voor gevoelige data’. MFA by default betekent dat iedere gebruiker standaard minimaal twee factoren gebruikt, ongeacht of hij of zij zich in het kantoornetwerk bevindt of niet. In de praktijk vertaalt dit zich naar Conditional Access policies die voor alle cloudapps en alle gebruikers MFA vereisen, met beperkte uitzonderingen voor break-glass accounts. Legacy authenticatie via oude protocollen (zoals IMAP en POP zonder moderne auth) moet structureel worden geblokkeerd, omdat deze protocollen MFA omzeilen en nog steeds veel wordt misbruikt door aanvallers. Locatie kan als aanvullend signaal worden gebruikt (bijvoorbeeld om inlogpogingen vanuit risicolanden extra te controleren), maar mag nooit de enige factor zijn die toegang bepaalt. Ten slotte moeten beheerde apparaten – Intune compliant of hybrid Azure AD joined – een expliciete voorwaarde zijn voor toegang tot gevoelige workloads als SharePoint-sites met vertrouwelijke informatie, Teams-channels voor crisisteams of applicaties met bijzondere persoonsgegevens.

Een ander cruciaal principe is gecontroleerde complexiteit. Conditional Access biedt tientallen configuratieopties: gebruikers- en groepsselectie, rolgebaseerde targeting, cloudapps, sessiecontroles, client-app-types, risiconiveaus, device filters en meer. Als u al deze mogelijkheden zonder duidelijke architectuur gebruikt, ontstaat snel een ondoorzichtig en foutgevoelig geheel. Daarom werkt u idealiter met een klein aantal ‘policy-sjablonen’ die u consistent toepast: bijvoorbeeld een basisbeleid voor alle gebruikers, een streng beheerdersbeleid, een gastgebruikersbeleid, en specifieke beleidsregels voor hoog-risico- of hoog-waarde applicaties. Elk sjabloon heeft een eigen doelbeschrijving, risicoanalyse en change-proces. Documenteer per policy expliciet: het doel, de doelgroep, de in scope-applicaties, de voorwaarden (conditions), de toegangsbeslissing (grant controls) en eventuele sessiecontroles. Deze documentatie maakt het eenvoudiger om wijzigingen te beoordelen, incidenten te analyseren en aan interne en externe auditors uit te leggen hoe de toegang wordt beheerst.

Tot slot moet u vanaf het ontwerp rekening houden met bedrijfscontinuïteit en beheerbaarheid. Break-glass accounts zijn strikt noodzakelijk om te voorkomen dat een misconfiguratie van Conditional Access de volledige tenant buiten gebruik stelt. Deze accounts worden expliciet uitgesloten van de meeste policies, maar zijn voorzien van zeer sterke wachtwoorden, strikt beheerd, offline gedocumenteerd en periodiek getest. Daarnaast werkt u met gefaseerde uitrol: u activeert nieuwe policies eerst in report-only mode, monitort de impact via sign-in logs, en schakelt ze vervolgens gecontroleerd in voor pilotgroepen voordat u ze tenant-breed toepast. Door changes te koppelen aan CAB-processen, testscenario’s en duidelijke terugrolplannen, voorkomt u verstoringen en bouwt u vertrouwen op bij zowel IT-beheer als de business.

Stap-voor-stap implementatie van Conditional Access policies

De implementatie van Conditional Access in een bestaande Microsoft 365-tenant vraagt om een gestructureerde aanpak. Begin met een inventarisatie van de huidige situatie: welke policies zijn al geconfigureerd, welke gebruikersgroepen en rollen bestaan er, welke cloudapps zijn bedrijfskritisch en welke vormen van toegang (browser, mobiele apps, legacy clients) worden gebruikt? Gebruik de Azure Portal (Entra admin center) en de sign-in logs om inzicht te krijgen in huidige inlogpatronen. Identificeer accounts zonder MFA, veelgebruikte locaties, aanmeldingen vanaf niet-beheerde apparaten en gebruik van legacy protocollen. Deze nulmeting vormt de basis voor uw ontwerpbeslissingen en maakt het mogelijk om later de effectiviteit van de nieuwe policies aan te tonen.

Vervolgens definieert u een minimale set basisbeleidsregels die u in vrijwel iedere overheidsorganisatie terugziet. Ten eerste een beleid ‘MFA voor alle gebruikers’ dat alle gebruikers en alle cloudapps target, waarbij in ieder geval break-glass accounts worden uitgesloten. In dit beleid stelt u in dat toegang alleen wordt verleend wanneer MFA is voltooid, bij voorkeur met phishing-resistente methoden zoals FIDO2, Windows Hello for Business of Passkeys waar mogelijk. Ten tweede een specifiek beleid voor beheerdersrollen, waarin u strengere eisen opneemt: toegang uitsluitend vanaf compliant of hybrid joined apparaten, verplichte sterke MFA-methoden, en eventueel extra sessiecontroles zoals beperkte sessieduur of continuous access evaluation. Ten derde een beleid dat alle legacy authenticatie blokkeert door client-app-types zoals ‘other clients’ of ‘legacy protocols’ expliciet te weren. In veel tenants is dit beleid één van de meest effectieve maatregelen om geautomatiseerde aanvallen direct te reduceren. Afhankelijk van uw risicoprofiel voegt u hieraan policies toe rond aanmeldlocaties (bijvoorbeeld blokkeren van aanmeldingen uit landen waar u geen activiteiten heeft), gastgebruikers, en toegang tot zeer gevoelige applicaties.

Tijdens de realisatie is communicatie met de organisatie cruciaal. MFA, strengere eisen voor apparaten en geblokkeerde legacy protocollen hebben direct impact op het dagelijks werk van medewerkers, leveranciers en ketenpartners. Ontwikkel daarom een communicatieplan waarin u uitlegt waarom Conditional Access wordt aangescherpt, welke concrete wijzigingen gebruikers merken (bijvoorbeeld vaker een MFA-prompt, het verplicht gebruik van de Authenticator-app, of het uitfaseren van oude e-mailclients), en op welke manier ondersteuning wordt geboden bij problemen. Combineer dit met duidelijke handleidingen, servicedesk-scripts en FAQ’s gericht op eindgebruikers. Voor beheerders en IT-partners organiseert u aparte sessies waarin u dieper ingaat op de technische werking, de impact op beheerprocessen en de afstemming met andere beveiligingsmaatregelen zoals Intune compliance policies en Privileged Identity Management.

Na de eerste uitrol volgt een periode van fine-tuning. Analyseer sign-in logs, Conditional Access insights en rapportages uit Defender for Cloud Apps om te beoordelen of de policies het gewenste effect hebben zonder onnodige verstoringen te veroorzaken. Let daarbij op indicatoren zoals geblokkeerde aanmeldingen vanuit verdachte IP-ranges, afname van inlogpogingen via legacy protocollen, stijging van MFA-succespercentages en eventuele pieken in supporttickets. Waar nodig past u de scope van policies aan, verfijnt u uitzonderingen (bijvoorbeeld voor specifieke applicaties die nog geen moderne authenticatie ondersteunen) en borgt u dat uitzonderingen altijd tijdelijk en goed gedocumenteerd zijn. Leg alle wijzigingen vast in change- en configuratiemanagementsystemen, zodat u achteraf kunt reconstrueren waarom een bepaald beleid op een bepaalde manier is ingericht.

Governance, monitoring en continue verbetering

Conditional Access is geen eenmalig project, maar een doorlopend programma. Dreigingen, gebruikerspatronen en technologische mogelijkheden veranderen continu. Nieuwe authenticatiemethoden, aanvullende risicosignalen uit Entra ID Protection of Defender, en gewijzigde wettelijke kaders zoals NIS2 of sectorale normen vragen om periodieke herijking van beleid. Daarom hoort Conditional Access expliciet onderdeel te zijn van de bredere governance rond informatiebeveiliging en identity & access management. Het CISO-office definieert de kaders en risicobereidheid, de security architect vertaalt deze naar technische ontwerpprincipes, en het beheerteam inricht en onderhoudt de policies. Rollen en verantwoordelijkheden worden vastgelegd, inclusief goedkeuringsprocessen voor nieuwe of gewijzigde policies en een lifecycle voor uitzonderingen.

Monitoring speelt hierbij een centrale rol. Via sign-in logs, risk reports, en specifieke rapportages voor Conditional Access krijgt u inzicht in de effectiviteit van het beleid. Automatische controles – bijvoorbeeld via PowerShell scripts die periodiek controleren of essentiële policies nog ingeschakeld zijn en de juiste condities bevatten – helpen voorkomen dat wijzigingen of nood-excepties ongemerkt blijven bestaan. Deze scripts kunnen worden geïntegreerd in bestaande compliance dashboards of CI/CD-pijplijnen voor configuratie as code. Daarnaast is het verstandig om periodiek scenario-gebaseerde oefeningen uit te voeren: wat gebeurt er als een aanvaller een wachtwoord van een medewerker buitmaakt, of als een beheeraccount wordt misbruikt? Worden de juiste policies geactiveerd, wordt toegang daadwerkelijk geblokkeerd, en worden relevante teams tijdig gewaarschuwd? De uitkomsten van dergelijke oefeningen gebruikt u om beleid, logging en alarmering verder aan te scherpen.

Voor compliance en verantwoording richting toezichthouders en audits is aantoonbaarheid essentieel. Documenteer daarom niet alleen de actuele configuratie, maar ook de achterliggende rationale: waarom is gekozen voor deze drempelwaarden, uitzonderingen en scope? Koppel Conditional Access beleid expliciet aan controls in de BIO, ISO 27001 en CIS-benchmarks, zodat u bij audits direct kunt laten zien welke maatregelen welke vereisten afdekken. Bewaar audit evidence zoals exports van policyconfiguraties, rapportages van periodieke controlescripts, en verslagen van change- en reviewmeetings. Op die manier wordt Conditional Access niet alleen een technisch krachtige beveiligingsmaatregel, maar ook een stevig verankerd onderdeel van de bredere governance van de organisatie.

Technische monitoring met PowerShell

Gebruik PowerShell-script conditional-access-policies.ps1 (functie Invoke-Monitoring) – Controleert of kern-Conditional-Access policies aanwezig en ingeschakeld zijn (MFA voor alle gebruikers en blokkeren van legacy authenticatie)..

Operationele opvolging en remediatie

Gebruik PowerShell-script conditional-access-policies.ps1 (functie Invoke-Remediation) – Geeft beheerteams een gestructureerde checklist voor het herstellen van ontbrekende of verkeerd geconfigureerde Conditional Access policies..

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 Conditional Access Policies - Basisbeveiliging controleren .DESCRIPTION Controleert of in Microsoft Entra ID (Azure AD) kern-Conditional-Access policies aanwezig en ingeschakeld zijn: - Ten minste één beleid dat voor (nagenoeg) alle gebruikers MFA afdwingt - Ten minste één beleid dat legacy authenticatie blokkeert Het script voert GEEN automatische wijzigingen uit, maar geeft een duidelijk overzicht en exit-codes die gebruikt kunnen worden in geautomatiseerde controles of CI/CD-pijplijnen. .NOTES NL Baseline: Nederlandse Baseline voor Veilige Cloud Workload : Microsoft 365 / Entra ID Vereist : Microsoft.Graph PowerShell (Policy.Read.All) .EXAMPLE .\conditional-access-policies.ps1 -Monitoring Controleert de aanwezigheid van basis-Conditional-Access policies. #> #Requires -Version 5.1 #Requires -Modules Microsoft.Graph [CmdletBinding()] param( [Parameter(Mandatory = $false)] [switch]$Monitoring ) $ErrorActionPreference = 'Stop' Write-Host "`n========================================" -ForegroundColor Cyan Write-Host "Conditional Access - Basis Policies" -ForegroundColor Cyan Write-Host "========================================`n" -ForegroundColor Cyan function Invoke-Monitoring { <# .SYNOPSIS Controleert of basis-Conditional-Access policies aanwezig zijn. .DESCRIPTION Valideert of er: - Minimaal één ingeschakelde policy is die MFA afdwingt - Minimaal één ingeschakelde policy is die legacy authenticatie blokkeert De controle is bewust generiek gehouden zodat deze toepasbaar is op verschillende tenants, zonder exacte beleidsnamen te vereisen. #> try { Write-Host "[INFO] Verbinden met Microsoft Graph..." -ForegroundColor Gray Connect-MgGraph -Scopes "Policy.Read.All" -ErrorAction Stop -NoWelcome Write-Host "[INFO] Ophalen Conditional Access policies..." -ForegroundColor Gray $policies = Invoke-MgGraphRequest -Method GET -Uri "https://graph.microsoft.com/v1.0/identity/conditionalAccess/policies" if (-not $policies.value) { Write-Host "[WARN] Er zijn geen Conditional Access policies gevonden in de tenant." -ForegroundColor Yellow Write-Host "[FAIL] NON-COMPLIANT - Basisbeleid ontbreekt volledig." -ForegroundColor Red exit 1 } $enabledPolicies = $policies.value | Where-Object { $_.state -eq 'enabled' } Write-Host "`n Totaal aantal policies : $($policies.value.Count)" -ForegroundColor Cyan Write-Host " Ingeschakelde policies : $($enabledPolicies.Count)" -ForegroundColor Cyan # MFA-beleid: we zoeken naar ingeschakelde policies waarbij 'mfa' als built-in control is geconfigureerd $mfaPolicies = $enabledPolicies | Where-Object { $_.grantControls -and $_.grantControls.builtInControls -contains 'mfa' } # Legacy authenticatie blokkeren: we zoeken naar policies die client apps van het type 'other' targeten # en een 'block' ingebouwde control hebben. $legacyBlockPolicies = $enabledPolicies | Where-Object { $_.conditions.clientAppTypes -contains 'other' -and $_.grantControls -and $_.grantControls.builtInControls -contains 'block' } Write-Host "`n Kernbeleidsregels:" -ForegroundColor Cyan if ($mfaPolicies) { Write-Host " [OK] MFA-beleid gevonden:" -ForegroundColor Green foreach ($policy in $mfaPolicies) { Write-Host " - $($policy.displayName)" -ForegroundColor Gray } } else { Write-Host " [FAIL] Geen ingeschakeld MFA-beleid gevonden dat 'mfa' afdwingt." -ForegroundColor Red } if ($legacyBlockPolicies) { Write-Host " [OK] Policy voor blokkeren legacy authenticatie gevonden:" -ForegroundColor Green foreach ($policy in $legacyBlockPolicies) { Write-Host " - $($policy.displayName)" -ForegroundColor Gray } } else { Write-Host " [FAIL] Geen ingeschakelde policy gevonden die legacy authenticatie blokkeert." -ForegroundColor Red } $hasMfaPolicy = [bool]$mfaPolicies $hasLegacyBlock = [bool]$legacyBlockPolicies if ($hasMfaPolicy -and $hasLegacyBlock) { Write-Host "`n[OK] COMPLIANT - Basis-Conditional-Access policies zijn aanwezig." -ForegroundColor Green exit 0 } else { Write-Host "`n[FAIL] NON-COMPLIANT - Eén of meer basis-Conditional-Access policies ontbreken." -ForegroundColor Red Write-Host " Controleer of er beleid is voor MFA voor alle gebruikers en het blokkeren van legacy authenticatie." -ForegroundColor Yellow exit 1 } } catch { Write-Host "`n[FAIL] Fout tijdens controle: $_" -ForegroundColor Red exit 2 } } function Invoke-Remediation { <# .SYNOPSIS Biedt beheerders een remediatiechecklist. .DESCRIPTION Voert zelf geen wijzigingen door, maar verwijst beheerders naar de monitoringuitvoer en beschrijft welke typen Conditional Access policies minimaal nodig zijn. #> [CmdletBinding()] param() Write-Host "[INFO] Dit script voert geen automatische configuratiewijzigingen uit." -ForegroundColor Yellow Write-Host "[INFO] Gebruik de volgende checklist om Conditional Access op orde te brengen:" -ForegroundColor Cyan Write-Host " 1. Configureer een policy 'MFA voor alle gebruikers' (All users, All cloud apps, grant: require multi-factor authentication)." -ForegroundColor Gray Write-Host " 2. Configureer een apart, strenger beleid voor beheerdersrollen (alleen compliant/hybrid joined devices, sterke MFA-methoden)." -ForegroundColor Gray Write-Host " 3. Schakel legacy authenticatie uit door client-app-types 'other' te blokkeren via een CA-policy." -ForegroundColor Gray Write-Host " 4. Test nieuwe policies eerst in report-only mode en met pilotgroepen voordat u ze tenant-breed activeert." -ForegroundColor Gray Write-Host " 5. Documenteer alle policies, uitzonderingen en change-requests in het configuratie- en changemanagementproces." -ForegroundColor Gray Write-Host "`n[INFO] Start nu de monitoring-check om de actuele situatie te controleren..." -ForegroundColor Cyan Invoke-Monitoring } try { if ($Monitoring) { Invoke-Monitoring } else { Write-Host "Gebruik: .\conditional-access-policies.ps1 -Monitoring" -ForegroundColor Yellow Write-Host "Dit script controleert of basis-Conditional-Access policies (MFA & blokkeren legacy auth) aanwezig zijn." -ForegroundColor Cyan } } catch { throw } finally { Write-Host "`n========================================`n" -ForegroundColor Cyan }

Risico zonder implementatie

Risico zonder implementatie
Hoog: Zonder goed ingericht Conditional Access beleid blijft de organisatie afhankelijk van enkelvoudige authenticatie en ad-hoc regels. Aanvallers hebben dan een veel grotere kans om met gestolen of geraden credentials toegang te krijgen tot gevoelige systemen, wat kan leiden tot langdurige compromittering en aanzienlijke schade aan vertrouwen, reputatie en continuïteit.

Management Samenvatting

Richt een samenhangende set Conditional Access policies in met MFA voor alle gebruikers, strengere eisen voor beheerders, blokkeren van legacy authenticatie en eisen aan beheerde apparaten. Koppel deze policies aan Zero Trust-principes, borg governance en monitoring, en documenteer de koppeling met BIO, ISO 27001 en NIS2.