Microsoft 365: MFA-configuratie Via Conditional Access Policies

💼 Management Samenvatting

Multi-Factor Authentication (MFA) afdwingen via Conditional Access policies is de meest effectieve manier om identiteitsbeveiliging te implementeren in Microsoft 365. In tegenstelling tot per-user MFA-instellingen biedt Conditional Access de mogelijkheid om MFA dynamisch te vereisen op basis van contextuele factoren zoals locatie, apparaatstatus, applicatietype en gebruikersrisico, waardoor zowel beveiliging als gebruikerservaring worden geoptimaliseerd.

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

Hoewel per-user MFA-instellingen een eerste stap vormen, bieden Conditional Access policies een veel krachtigere en flexibelere benadering voor MFA-implementatie. Zonder Conditional Access policies moet MFA handmatig per gebruiker worden ingeschakeld via Azure AD-beveiligingsinstellingen, wat schaalbaarheidsproblemen veroorzaakt bij grote organisaties en beperkte mogelijkheden biedt voor contextgevoelige beveiliging. Bovendien kunnen per-user MFA-instellingen niet worden gecombineerd met andere beveiligingssignalen zoals apparaatcompliance, risicodetectie of sessiecontroles. Dit leidt tot een alles-of-niets benadering waarbij gebruikers altijd MFA moeten uitvoeren, ook wanneer zij vanuit een vertrouwd netwerk en op een beheerd apparaat werken, wat de gebruikerservaring onnodig belast en tot weerstand kan leiden binnen de organisatie. Zonder Conditional Access policies ontbreekt ook de mogelijkheid om risicogebaseerde MFA toe te passen waarbij alleen bij verdachte aanmeldpogingen extra verificatie wordt gevraagd, of om verschillende MFA-methoden te vereisen voor verschillende risiconiveaus. Dit alles leidt tot een suboptimale balans tussen beveiliging en gebruiksvriendelijkheid, wat uiteindelijk kan resulteren in lagere adoptiegraad van MFA of pogingen om de beveiligingsmaatregel te omzeilen. Voor Nederlandse overheidsorganisaties is dit bijzonder problematisch omdat NIS2, BIO en ISO 27001 expliciet vragen om risicogebaseerde toegangscontrole die rekening houdt met contextuele factoren.

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

Implementatie

Dit artikel beschrijft in detail hoe u MFA configureert en afdwingt via Conditional Access policies in Microsoft Entra ID. We beginnen met de fundamentele architectuur van MFA binnen Conditional Access, waarbij we uitleggen hoe grant controls, sessiecontroles en risicogebaseerde triggers samenkomen om een intelligente MFA-implementatie te vormen. Vervolgens behandelen we de verschillende MFA-methoden die beschikbaar zijn binnen Conditional Access en hoe u deze configureert voor optimale beveiliging, waarbij we specifiek aandacht besteden aan phishing-resistente methoden zoals FIDO2 en Windows Hello for Business. Daarna werken we uit hoe u MFA-beleid ontwerpt voor verschillende scenario's: universele MFA voor alle gebruikers en cloudapplicaties, specifieke MFA-vereisten voor beheerdersrollen, risicogebaseerde MFA die alleen wordt geactiveerd bij verdachte aanmeldingen, en locatie- of apparaatgebaseerde uitzonderingen die de gebruikerservaring verbeteren zonder de beveiliging te compromitteren. Tot slot behandelen we geavanceerde configuraties zoals sessiecontroles die MFA opnieuw vereisen na een bepaalde tijd, combinaties van meerdere grant controls voor extra beveiliging, en integratie met Identity Protection voor automatische risicodetectie en respons.

Architectuur van MFA binnen Conditional Access

De architectuur van MFA binnen Conditional Access is gebaseerd op een contextuele evaluatie van elke aanmeldpoging waarbij meerdere signalen worden gecombineerd om te bepalen of aanvullende verificatie vereist is. Wanneer een gebruiker probeert in te loggen op een Microsoft 365-cloudapplicatie, evalueert Entra ID eerst de basisauthenticatie (gebruikersnaam en wachtwoord) en verzamelt vervolgens contextuele informatie zoals de IP-adreslocatie, het apparaattype, de clientapplicatie (browser, mobiele app, desktop-app), de gebruikersrol en eventuele risicosignalen van Identity Protection. Deze signalen worden vervolgens geëvalueerd tegen alle actieve Conditional Access policies die van toepassing zijn op de gebruiker en de doelapplicatie. Als een policy van toepassing is die MFA vereist als grant control, wordt de gebruiker doorgestuurd naar de MFA-registratie- en verificatiepagina, tenzij de gebruiker recentelijk (binnen de geconfigureerde sessieduur) al MFA heeft uitgevoerd voor dezelfde of een vergelijkbare context.

Grant controls vormen het hart van MFA-configuratie binnen Conditional Access. De 'Require multi-factor authentication' grant control zorgt ervoor dat gebruikers een tweede verificatiefactor moeten voltooien voordat toegang wordt verleend. Binnen deze grant control kunt u specifieke MFA-methoden vereisen of uitsluiten: bijvoorbeeld kunt u configureren dat alleen phishing-resistente methoden zoals FIDO2-security keys, Windows Hello for Business of Microsoft Authenticator app met number matching zijn toegestaan, terwijl SMS en voice calls worden uitgesloten voor hoog-risico scenario's. Daarnaast biedt Conditional Access de mogelijkheid om meerdere grant controls te combineren: bijvoorbeeld kunt u vereisen dat gebruikers zowel MFA voltooien als een compliant apparaat gebruiken, of MFA combineren met goedkeuring via Privileged Identity Management voor zeer gevoelige acties. Deze combinaties maken het mogelijk om een gelaagde beveiligingsaanpak te implementeren waarbij meerdere factoren tegelijkertijd worden geverifieerd.

Sessiecontroles vormen een cruciaal aanvullend element in MFA-architectuur binnen Conditional Access. Terwijl grant controls bepalen of toegang wordt verleend, bepalen sessiecontroles hoe lang deze toegang geldig blijft en onder welke voorwaarden opnieuw verificatie vereist is. De 'Sign-in frequency' sessiecontrole stelt bijvoorbeeld in dat gebruikers periodiek opnieuw MFA moeten uitvoeren, bijvoorbeeld elke 8 uur of elke keer dat zij toegang zoeken tot een gevoelige applicatie. De 'App enforced restrictions' sessiecontrole kan ervoor zorgen dat applicaties die SharePoint Online of Exchange Online gebruiken, hun eigen sessiecontroles kunnen toepassen die aanvullende MFA-prompts kunnen triggeren. Voor beheerders en hoog-risico rollen is het gebruikelijk om kortere sessieduren te configureren, bijvoorbeeld 1 uur of zelfs 'Every time', om het risico op sessiehijacking te minimaliseren. Deze sessiecontroles werken naadloos samen met grant controls om een continue verificatie te bieden zonder de gebruikerservaring onnodig te belasten.

Risicogebaseerde MFA integreert Conditional Access met Identity Protection om automatisch MFA te vereisen wanneer Entra ID verdachte activiteiten detecteert. Identity Protection analyseert continu aanmeldpatronen en identificeert risicosignalen zoals onmogelijke reizen (inloggen vanaf twee geografisch ver uit elkaar liggende locaties binnen korte tijd), inloggen vanaf anonieme IP-adressen, inlogpogingen vanaf bekende gecompromitteerde credentials of onbekende locaties. Wanneer Identity Protection een hoog of gemiddeld risico signaleert, kan Conditional Access automatisch MFA vereisen als compenserende maatregel, zelfs als de gebruiker normaal gesproken vanuit een vertrouwde locatie of op een beheerd apparaat werkt. Deze risicogebaseerde benadering biedt de optimale balans tussen beveiliging en gebruiksvriendelijkheid: gebruikers merken alleen extra verificatie wanneer er daadwerkelijk een verhoogd risico is, terwijl de beveiliging aanzienlijk wordt verbeterd door automatische detectie en respons op verdachte activiteiten.

MFA-methoden en configuratie-opties

Microsoft Entra ID ondersteunt verschillende MFA-methoden die variëren in beveiligingsniveau, gebruiksvriendelijkheid en compatibiliteit met verschillende apparaten en scenario's. De keuze voor specifieke MFA-methoden heeft aanzienlijke invloed op zowel de beveiligingssterkte als de gebruikerservaring van uw Conditional Access policies. FIDO2-security keys vertegenwoordigen de hoogste beveiligingsstandaard en zijn volledig phishing-resistent, wat betekent dat aanvallers deze niet kunnen kapen via phishing-aanvallen of man-in-the-middle attacks. FIDO2-keys werken op basis van public-key cryptografie waarbij de private key nooit de key verlaat, en authenticatie vereist fysieke bezit van de key plus een PIN-code of biometrische verificatie. Voor Nederlandse overheidsorganisaties die werken met bijzonder gevoelige informatie of die voldoen aan hoog beveiligingsniveau vereisten, vormen FIDO2-keys de aanbevolen keuze. Windows Hello for Business biedt vergelijkbare beveiligingsvoordelen voor Windows-apparaten door lokale biometrische authenticatie of PIN-code te gebruiken die is gebonden aan de Trusted Platform Module (TPM) van het apparaat. Dit maakt het mogelijk om passwordless authenticatie te implementeren waarbij gebruikers alleen hun biometrische gegevens of PIN hoeven te gebruiken, zonder dat een aparte fysieke token nodig is.

Microsoft Authenticator app is de meest gebruiksvriendelijke en flexibele MFA-methode die geschikt is voor de meeste gebruikers en scenario's. De app ondersteunt verschillende verificatiemodi: push notifications met number matching (waarbij gebruikers een nummer op hun scherm moeten bevestigen dat overeenkomt met een nummer op hun telefoon), passwordless phone sign-in (waarbij de app volledig de rol van wachtwoord overneemt), en tijdgebaseerde one-time passwords (TOTP) voor compatibiliteit met andere services. De push notification-methode met number matching is phishing-resistent omdat aanvallers het specifieke nummer dat wordt getoond niet kunnen voorspellen, wat SIM-swapping aanvallen effectief voorkomt. Voor organisaties die een balans zoeken tussen beveiliging en gebruiksvriendelijkheid, is Microsoft Authenticator met push notifications de aanbevolen standaardkeuze. SMS en voice calls worden door Microsoft en security experts als minder veilig beschouwd omdat deze methoden vatbaar zijn voor SIM-swapping, social engineering aanvallen en interceptie via onbeveiligde telecommunicatienetwerken. Deze methoden moeten daarom alleen worden gebruikt als fallback optie wanneer andere methoden niet beschikbaar zijn, en idealiter worden gecombineerd met aanvullende controles zoals locatie- of apparaatbeperkingen.

Binnen Conditional Access policies kunt u specifieke MFA-methoden vereisen of uitsluiten via de Authentication strength-functie. Authentication strengths stellen u in staat om verschillende combinaties van authenticatiemethoden te definiëren en deze te koppelen aan verschillende Conditional Access policies op basis van risico of gevoeligheid. U kunt bijvoorbeeld een 'Phishing Resistant'-authentication strength definiëren die alleen FIDO2, Windows Hello for Business en Microsoft Authenticator met number matching toestaat, en deze koppelen aan policies voor beheerders of toegang tot gevoelige applicaties. Een 'Standard'-authentication strength kan alle beschikbare methoden toestaan inclusief SMS als fallback, en worden gebruikt voor reguliere gebruikersscenario's. Deze granulariteit maakt het mogelijk om een risicogebaseerde aanpak te implementeren waarbij hoog-risico gebruikers of applicaties strengere authenticatie-eisen hebben, terwijl reguliere gebruikers flexibeler kunnen zijn zonder de algehele beveiliging te compromitteren. Bovendien kunnen authentication strengths worden gebruikt in combinatie met Identity Protection om automatisch strengere authenticatie te vereisen wanneer verdachte activiteiten worden gedetecteerd.

Voor beheerders en service accounts die programmatische toegang vereisen, biedt Conditional Access de mogelijkheid om certificaatgebaseerde authenticatie of managed identities te gebruiken in plaats van interactieve MFA. Certificaatgebaseerde authenticatie gebruikt clientcertificaten die zijn gebonden aan specifieke apparaten of applicaties, waardoor geautomatiseerde processen veilig kunnen authenticeren zonder menselijke interventie. Managed identities zijn Azure AD-serviceprincipals die automatisch worden beheerd en waarvoor geen credentials hoeven te worden opgeslagen in code of configuratiebestanden. Deze methoden zijn essentieel voor scenario's zoals CI/CD-pipelines, geautomatiseerde scripts, service-to-service authenticatie en andere niet-interactieve use cases waarbij traditionele MFA niet praktisch of mogelijk is. Wanneer u Conditional Access policies configureert, is het belangrijk om deze service accounts expliciet te identificeren en passende uitzonderingen of alternatieve authenticatiemethoden te configureren om te voorkomen dat kritieke automatiseringsprocessen worden geblokkeerd.

Ontwerp van MFA Conditional Access policies

Het ontwerpen van effectieve MFA Conditional Access policies vereist een systematische aanpak waarbij u verschillende scenario's identificeert en voor elk scenario een passend beleid ontwerpt dat de juiste balans vindt tussen beveiliging en gebruiksvriendelijkheid. Begin met een basisbeleid voor universele MFA dat van toepassing is op alle gebruikers en alle cloudapplicaties, met als doel om minimaal twee-factor authenticatie te vereisen voor alle Microsoft 365-toegang. Dit basisbeleid vormt de fundamentlaag van uw identiteitsbeveiliging en zorgt ervoor dat geen enkele gebruiker per ongeluk buiten de MFA-vereisten valt. Configureer dit beleid met 'All users' als scope, met uitzondering van break-glass emergency access accounts die expliciet worden uitgesloten om lockout-scenario's te voorkomen. Stel de grant control in op 'Require multi-factor authentication' en gebruik een standaard authentication strength die de meeste beschikbare methoden toestaat. Dit basisbeleid moet in report-only mode worden geactiveerd voor een periode van minimaal twee weken om de impact te monitoren en eventuele onvoorziene gevolgen te identificeren voordat het wordt geactiveerd.

Voor beheerders en geprivilegieerde rollen ontwerpt u een afzonderlijk, strenger MFA-beleid dat aanvullende eisen stelt. Dit beleid moet specifiek directory roles targeten (zoals Global Administrator, Security Administrator, Exchange Administrator) en een phishing-resistente authentication strength vereisen die alleen FIDO2, Windows Hello for Business en Microsoft Authenticator met number matching toestaat. Bovendien kunt u aanvullende grant controls toevoegen zoals 'Require compliant device' of 'Require hybrid Azure AD joined device' om ervoor te zorgen dat beheerders alleen vanaf beheerde en geverifieerde apparaten kunnen werken. Configureer ook kortere sessiecontroles voor beheerders, bijvoorbeeld 'Sign-in frequency' van 1 uur of 'Every time' voor zeer gevoelige acties, zodat beheerders regelmatig opnieuw moeten authenticeren. Dit voorkomt dat gestolen beheerderssessies langdurig kunnen worden misbruikt en vermindert de impact van sessiehijacking-aanvallen. Voor zeer gevoelige rollen kunt u zelfs 'Require password change' toevoegen als extra grant control wanneer Identity Protection een hoog risico signaleert, wat beheerders dwingt om hun wachtwoord te wijzigen voordat toegang wordt verleend.

Risicogebaseerde MFA policies maken gebruik van Identity Protection-signalen om MFA alleen te vereisen wanneer er daadwerkelijk een verhoogd risico is, wat de gebruikerservaring aanzienlijk verbetert zonder de beveiliging te compromitteren. Configureer een Conditional Access policy met de voorwaarde 'Sign-in risk' ingesteld op 'Medium' of 'High', en stel de grant control in op 'Require multi-factor authentication'. Dit zorgt ervoor dat gebruikers alleen extra verificatie hoeven uit te voeren wanneer Entra ID verdachte activiteiten detecteert, zoals onmogelijke reizen, inloggen vanaf anonieme IP-adressen of bekende gecompromitteerde credentials. U kunt zelfs verschillende authentication strengths koppelen aan verschillende risiconiveaus: bijvoorbeeld een standaard authentication strength voor medium risico en een phishing-resistente authentication strength voor high risico. Deze risicogebaseerde aanpak reduceert het aantal MFA-prompts voor gebruikers die normaal gesproken vanuit vertrouwde locaties werken, terwijl automatisch extra beveiliging wordt toegepast wanneer dit het meest nodig is. Het is echter belangrijk om te beseffen dat risicogebaseerde MFA niet voldoende is als enige maatregel; het moet worden gecombineerd met het universele MFA-basisbeleid om ervoor te zorgen dat alle gebruikers minimaal één keer MFA uitvoeren bij hun eerste aanmelding.

Locatie- en apparaatgebaseerde uitzonderingen kunnen de gebruikerservaring verbeteren zonder de beveiliging te compromitteren, maar moeten zorgvuldig worden ontworpen om niet onbedoeld kwetsbaarheden te introduceren. U kunt bijvoorbeeld een Conditional Access policy configureren die MFA niet vereist wanneer gebruikers inloggen vanaf vertrouwde IP-adressen (zoals het kantoornetwerk) EN vanaf een compliant of hybrid Azure AD joined apparaat. Deze combinatie van voorwaarden zorgt ervoor dat alleen wanneer beide factoren aanwezig zijn (vertrouwde locatie EN beheerd apparaat) MFA kan worden overgeslagen, wat het risico op misbruik minimaliseert. Het is echter kritisch om te beseffen dat locatie alleen nooit een voldoende beveiligingsfactor is, omdat IP-adressen kunnen worden gespoofd of omdat aanvallers toegang kunnen krijgen tot het netwerk via andere methoden. Daarom moeten locatiegebaseerde uitzonderingen altijd worden gecombineerd met aanvullende factoren zoals apparaatcompliance. Bovendien moet u periodiek reviewen of de vertrouwde IP-adressen nog steeds relevant zijn en of er nieuwe locaties moeten worden toegevoegd of verwijderd. Voor mobiele gebruikers en externe locaties moet MFA altijd vereist blijven, ongeacht andere factoren, omdat deze scenario's inherent risicovoller zijn.

Implementatie en gefaseerde uitrol

De implementatie van MFA Conditional Access policies vereist een zorgvuldige, gefaseerde aanpak om te voorkomen dat gebruikers onverwacht worden geblokkeerd of dat kritieke processen worden verstoord. Begin met een grondige nulmeting waarbij u de huidige MFA-status inventariseert: hoeveel gebruikers hebben al MFA geregistreerd, welke methoden gebruiken zij, welke applicaties zijn kritiek voor de business en welke legacy-systemen of externe partners hebben mogelijk beperkte MFA-ondersteuning? Gebruik Azure AD-sign-in logs en Conditional Access insights om inzicht te krijgen in huidige aanmeldpatronen en om te identificeren welke gebruikersgroepen of applicaties mogelijk problemen kunnen veroorzaken bij de implementatie. Deze nulmeting vormt de basis voor uw communicatiestrategie en helpt u om potentiële knelpunten vooraf te identificeren en mitigerende maatregelen te ontwikkelen.

De eerste fase van implementatie bestaat uit het opstellen van policies in report-only mode, waarbij Conditional Access policies worden geconfigureerd maar nog geen daadwerkelijke toegangsbeslissingen nemen. In plaats daarvan worden alle evaluaties gelogd zodat u kunt zien welke gebruikers, applicaties en scenario's zouden worden beïnvloed als het beleid actief zou zijn. Deze report-only fase moet minimaal twee weken duren, zodat u een volledig beeld krijgt van de impact onder verschillende omstandigheden zoals piekuren, weekenden en verschillende locaties. Analyseer de sign-in logs dagelijks om te identificeren welke scenario's frequent voorkomen en of er onverwachte patronen zijn die aanvullende configuratie vereisen. Gebruik deze periode ook om gebruikers te informeren over de komende wijzigingen en om hen te vragen om hun MFA-registratie te voltooien voordat de policies actief worden. Stel duidelijke deadlines in en bied ondersteuning via helpdesk, trainingen en documentatie om ervoor te zorgen dat gebruikers voldoende tijd en hulpmiddelen hebben om zich voor te bereiden.

Zodra de report-only fase is afgerond en u vertrouwen heeft in de configuratie, activeert u de policies eerst voor een kleine pilotgroep die bestaat uit technisch vaardige gebruikers, security team-leden en IT-beheerders. Deze pilotgroep fungeert als early adopters die eventuele problemen kunnen identificeren en feedback kunnen geven voordat de policies tenant-breed worden geactiveerd. Monitor de pilotgroep intensief gedurende minimaal een week, waarbij u dagelijks sign-in logs analyseert, supporttickets monitort en direct feedback verzamelt van de gebruikers. Als er problemen optreden, pas dan de configuratie aan of voeg uitzonderingen toe voor specifieke scenario's, maar documenteer altijd waarom uitzonderingen nodig zijn en wanneer ze kunnen worden opgeheven. Na een succesvolle pilotperiode breidt u de scope geleidelijk uit naar grotere gebruikersgroepen, bijvoorbeeld per afdeling of business unit, met telkens een periode van monitoring en fine-tuning tussen elke uitbreiding. Deze gefaseerde aanpak minimaliseert het risico op grootschalige verstoringen en zorgt ervoor dat u problemen vroegtijdig kunt identificeren en oplossen.

Gedurende de hele implementatiefase is continue monitoring en communicatie cruciaal. Stel automatische rapporten in die dagelijks of wekelijks worden gegenereerd en die belangrijke metrics tonen zoals het percentage gebruikers dat MFA heeft geregistreerd, het aantal succesvolle en mislukte MFA-pogingen, de meest gebruikte MFA-methoden, en eventuele blokkades of fouten. Deze rapporten helpen u om de voortgang te volgen en om problemen snel te identificeren voordat ze kritiek worden. Communiceer regelmatig met de organisatie via e-mail, intranet, Teams-berichten of andere kanalen om updates te delen over de voortgang, om herinneringen te sturen aan gebruikers die nog geen MFA hebben geregistreerd, en om success stories te delen van gebruikers die de nieuwe processen al hebben doorlopen. Organiseer ook Q&A-sessies of office hours waar gebruikers vragen kunnen stellen en hulp kunnen krijgen bij registratie. Door transparant en proactief te communiceren, bouwt u vertrouwen op en vermindert u weerstand tegen de wijzigingen, wat uiteindelijk leidt tot een snellere en soepelere adoptie van MFA binnen de organisatie.

Monitoring en continue verbetering

Gebruik PowerShell-script conditional-access-policy-mfa.ps1 (functie Invoke-Monitoring) – Controleert of MFA Conditional Access policies correct zijn geconfigureerd en actief zijn voor alle gebruikers en cloudapplicaties..

Effectieve monitoring van MFA Conditional Access policies is essentieel om te garanderen dat de beveiligingsmaatregelen daadwerkelijk werken zoals bedoeld en om problemen vroegtijdig te identificeren voordat ze kritiek worden. Azure AD biedt verschillende ingebouwde rapporten en dashboards die inzicht geven in de status en effectiviteit van uw Conditional Access policies. Het Conditional Access insights dashboard toont bijvoorbeeld een overzicht van alle policies, het aantal evaluaties per policy, en de resultaten (toegang verleend, geblokkeerd, of MFA vereist). Dit dashboard helpt u om snel te identificeren of policies correct functioneren en of er onverwachte patronen zijn die nader onderzoek vereisen. Daarnaast biedt het Authentication methods usage report gedetailleerde informatie over welke MFA-methoden worden gebruikt, hoe vaak ze worden gebruikt, en door welke gebruikers, wat helpt om te identificeren welke methoden populair zijn en welke mogelijk ondersteuning of training vereisen.

Sign-in logs vormen de primaire bron van informatie voor diepgaande analyse van MFA-gedrag en -effectiviteit. Deze logs bevatten gedetailleerde informatie over elke aanmeldpoging, inclusief of MFA is vereist, of MFA succesvol is voltooid, welke MFA-methode is gebruikt, en eventuele fouten of blokkades. U kunt deze logs filteren en analyseren om specifieke patronen te identificeren, bijvoorbeeld: welke gebruikers regelmatig MFA-fouten hebben, welke applicaties de meeste MFA-prompts genereren, of er geografische patronen zijn in MFA-gebruik, en of er ongebruikelijke activiteiten zijn die mogelijk wijzen op aanvallen of misbruik. Voor geavanceerde monitoring kunt u deze logs exporteren naar Azure Monitor, Microsoft Sentinel of een SIEM-systeem waar u geavanceerde queries en analyses kunt uitvoeren, automatische waarschuwingen kunt configureren, en langetermijn trends kunt analyseren. Configureer bijvoorbeeld waarschuwingen voor wanneer meerdere MFA-fouten optreden voor hetzelfde account binnen korte tijd, wat kan wijzen op een brute-force aanval, of voor wanneer gebruikers plotseling beginnen in te loggen vanaf nieuwe locaties zonder MFA te voltooien, wat kan wijzen op accountcompromittering.

Automatische monitoring via PowerShell-scripts maakt het mogelijk om regelmatig te controleren of MFA Conditional Access policies nog steeds actief zijn, correct geconfigureerd zijn, en of er wijzigingen zijn aangebracht die mogelijk de beveiliging hebben verzwakt. Deze scripts kunnen worden geïntegreerd in CI/CD-pijplijnen, Azure Automation runbooks, of geplande taken die dagelijks, wekelijks of maandelijks worden uitgevoerd. De scripts controleren bijvoorbeeld of er minimaal één actieve policy is die MFA vereist voor alle gebruikers, of de juiste authentication strengths zijn geconfigureerd voor verschillende gebruikersgroepen, of er onverwachte uitzonderingen zijn toegevoegd die de beveiliging kunnen verzwakken, en of policies nog steeds de juiste scopes en voorwaarden bevatten. Wanneer afwijkingen worden gedetecteerd, kunnen de scripts automatisch waarschuwingen genereren, rapporten verzenden naar beheerders, of zelfs automatische herstelacties uitvoeren indien geconfigureerd. Deze geautomatiseerde monitoring zorgt ervoor dat wijzigingen of configuratiefouten snel worden gedetecteerd en opgelost, wat essentieel is voor het behouden van een sterke beveiligingspostuur over tijd.

Continue verbetering van MFA Conditional Access policies vereist regelmatige reviews en aanpassingen op basis van nieuwe dreigingen, veranderende gebruikerspatronen, en feedback van gebruikers en beheerders. Organiseer bijvoorbeeld maandelijks een review meeting waarbij security, IT-beheer en business stakeholders samenkomen om de effectiviteit van de policies te evalueren, nieuwe use cases te bespreken, en wijzigingen voor te stellen. Gebruik metrics zoals MFA-adoptiegraad, gebruikerservaring scores, aantal supporttickets gerelateerd aan MFA, en security incidenten om te bepalen of de huidige configuratie optimaal is of aanpassingen vereist. Houd ook rekening met externe factoren zoals nieuwe Microsoft-features, veranderende compliance-vereisten (bijvoorbeeld nieuwe NIS2-vereisten), of nieuwe dreigingspatronen die aanvullende maatregelen vereisen. Documenteer alle wijzigingen in een change log en koppel deze aan risicoanalyses en business case studies, zodat u achteraf kunt aantonen waarom bepaalde beslissingen zijn genomen. Door deze continue verbeteringscyclus te volgen, zorgt u ervoor dat uw MFA-implementatie evolueert met de veranderende behoeften en dreigingen, wat leidt tot een steeds sterkere en effectievere beveiligingspostuur.

Remediatie en troubleshooting

Gebruik PowerShell-script conditional-access-policy-mfa.ps1 (functie Invoke-Remediation) – Biedt beheerders een gestructureerde aanpak voor het oplossen van veelvoorkomende problemen met MFA Conditional Access policies en het herstellen van ontbrekende of verkeerd geconfigureerde policies..

Wanneer monitoring of gebruikersrapporten problemen identificeren met MFA Conditional Access policies, is een gestructureerde troubleshooting-aanpak essentieel om snel de oorzaak te identificeren en het probleem op te lossen. Veelvoorkomende problemen zijn gebruikers die MFA niet kunnen voltooien ondanks dat zij zijn geregistreerd, policies die niet worden geactiveerd wanneer dat verwacht wordt, gebruikers die worden geblokkeerd terwijl zij toegang zouden moeten hebben, of policies die inconsistente resultaten geven in verschillende scenario's. Begin met het verzamelen van gedetailleerde informatie over het probleem: wanneer trad het op, welke gebruiker of gebruikersgroep is betrokken, welke applicatie of cloud service, welke MFA-methode werd gebruikt of geprobeerd, en wat was de exacte foutmelding of het gedrag? Gebruik Azure AD-sign-in logs om de specifieke aanmeldpoging te vinden en analyseer de Conditional Access-evaluatie details om te zien welke policies zijn geëvalueerd, welke voorwaarden zijn gecontroleerd, en wat de uiteindelijke toegangsbeslissing was.

Voor gebruikers die problemen hebben met MFA-registratie of -verificatie, controleer eerst of de gebruiker daadwerkelijk is geregistreerd voor MFA en of de geregistreerde methoden nog steeds geldig en toegankelijk zijn. Gebruikers kunnen bijvoorbeeld hun telefoon hebben verloren, hun SIM-kaart hebben vervangen, of hun Microsoft Authenticator-app hebben verwijderd zonder een nieuwe methode te registreren. In dergelijke gevallen moet de gebruiker worden geholpen om nieuwe MFA-methoden te registreren, mogelijk met tijdelijke uitzonderingen in Conditional Access policies terwijl de registratie wordt voltooid. Controleer ook of er technische problemen zijn met specifieke MFA-methoden, bijvoorbeeld of er bekende problemen zijn met SMS-leveranciers in bepaalde regio's, of of de Microsoft Authenticator-app de nieuwste versie gebruikt die vereist is voor bepaalde features. Voor gebruikers die worden geblokkeerd ondanks dat zij zouden moeten worden toegelaten, controleer of zij zijn uitgesloten van relevante Conditional Access policies, of dat er conflicterende policies zijn die elkaar tegenspreken. Conditional Access policies worden geëvalueerd in een specifieke volgorde, en als een policy toegang blokkeert, worden latere policies die toegang zouden toestaan niet meer geëvalueerd.

Wanneer Conditional Access policies niet worden geactiveerd zoals verwacht, controleer of de policies daadwerkelijk zijn ingeschakeld (niet alleen in report-only mode), of de scope correct is geconfigureerd (gebruikers, groepen, rollen, applicaties), en of de voorwaarden overeenkomen met het scenario waarin het beleid zou moeten worden geactiveerd. Veelvoorkomende configuratiefouten zijn bijvoorbeeld policies die alleen specifieke applicaties targeten terwijl de gebruiker toegang zoekt tot een andere applicatie, policies met te specifieke voorwaarden (zoals een combinatie van vertrouwde IP EN compliant apparaat) waardoor het beleid zelden wordt geactiveerd, of policies die zijn geconfigureerd met 'Block' als actie maar die niet worden geëvalueerd omdat eerdere policies al toegang hebben verleend. Gebruik de Conditional Access What If-tool in Azure Portal om te simuleren of een specifieke aanmeldpoging zou worden beïnvloed door uw policies, wat helpt om configuratiefouten te identificeren voordat gebruikers problemen ervaren. Voor complexe scenario's met meerdere policies die mogelijk conflicteren, overweeg om een stapsgewijze aanpak te gebruiken waarbij u tijdelijk andere policies uitschakelt om te isoleren welke policy het probleem veroorzaakt.

Voor kritieke problemen die wijdverspreide impact hebben, zoals een policy die per ongeluk alle gebruikers blokkeert of een configuratiefout die toegang tot kritieke applicaties verhindert, is het belangrijk om snel te kunnen terugkeren naar een werkende staat. Zorg daarom altijd voor een back-up van uw Conditional Access-policyconfiguraties, bijvoorbeeld door regelmatig exports te maken van alle policies via PowerShell of door gebruik te maken van Infrastructure as Code-tools zoals Terraform of Bicep die uw configuratie in versiebeheer houden. In noodsituaties kunt u snel alle problematische policies uitschakelen, terugkeren naar een eerdere werkende configuratie, of break-glass accounts gebruiken die expliciet zijn uitgesloten van Conditional Access policies om toegang te krijgen tot de tenant en het probleem op te lossen. Documenteer alle incidenten en oplossingen in een knowledge base zodat soortgelijke problemen in de toekomst sneller kunnen worden opgelost. Voer na het oplossen van een probleem ook een post-mortem review uit om te identificeren wat de oorzaak was, hoe het probleem sneller had kunnen worden gedetecteerd, en welke preventieve maatregelen kunnen worden genomen om soortgelijke problemen in de toekomst te voorkomen.

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 MFA-configuratie via Conditional Access Policies .DESCRIPTION Controleert of MFA correct is geconfigureerd en afgedwongen via Conditional Access policies in Microsoft Entra ID. Dit script valideert dat MFA-beleid is ingesteld voor alle gebruikers en cloudapplicaties, en biedt mogelijkheden voor remediatie. .NOTES Filename: conditional-access-policy-mfa.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/conditional-access-policy-mfa.json .LINK https://github.com/[org]/m365-tenant-best-practise .EXAMPLE .\conditional-access-policy-mfa.ps1 -Monitoring Controleert of MFA Conditional Access policies correct zijn geconfigureerd .EXAMPLE .\conditional-access-policy-mfa.ps1 -Remediation Biedt beheerders een gestructureerde aanpak voor het oplossen van problemen #> #Requires -Version 5.1 #Requires -Modules Microsoft.Graph, Microsoft.Graph.Identity.SignIns [CmdletBinding()] param( [Parameter(Mandatory = $false)] [switch]$Monitoring, [Parameter(Mandatory = $false)] [switch]$Remediation, [Parameter(Mandatory = $false)] [switch]$WhatIf ) $ErrorActionPreference = 'Stop' $VerbosePreference = 'Continue' # ============================================================================ # HEADER # ============================================================================ Write-Host "`n========================================" -ForegroundColor Cyan Write-Host "MFA Conditional Access Policy Monitoring" -ForegroundColor Cyan Write-Host "Nederlandse Baseline voor Veilige Cloud" -ForegroundColor Cyan Write-Host "========================================`n" -ForegroundColor Cyan # ============================================================================ # FUNCTIONS # ============================================================================ function Connect-RequiredServices { <# .SYNOPSIS Verbindt met benodigde Microsoft services #> [CmdletBinding()] param( [Parameter(Mandatory = $false)] [string[]]$RequiredScopes = @("Policy.Read.All") ) Write-Verbose "Controleren van Microsoft Graph verbinding..." try { $context = Get-MgContext -ErrorAction SilentlyContinue if (-not $context) { Write-Host "Verbinding maken met Microsoft Graph..." -ForegroundColor Yellow Connect-MgGraph -Scopes $RequiredScopes -ErrorAction Stop -NoWelcome Write-Host "Verbonden met Microsoft Graph" -ForegroundColor Green } else { $currentScopes = $context.Scopes $missingScopes = $RequiredScopes | Where-Object { $_ -notin $currentScopes } if ($missingScopes) { Write-Host "Huidige sessie heeft niet alle benodigde scopes. Opnieuw verbinden..." -ForegroundColor Yellow Connect-MgGraph -Scopes $RequiredScopes -ErrorAction Stop -NoWelcome Write-Host "Verbonden met Microsoft Graph met benodigde scopes" -ForegroundColor Green } else { Write-Verbose "Reeds verbonden met Microsoft Graph met alle benodigde scopes" } } } catch { Write-Error "Kon niet verbinden met Microsoft Graph: $_" throw } } function Test-MFAConditionalAccessPolicy { <# .SYNOPSIS Test of MFA Conditional Access policies correct zijn geconfigureerd .OUTPUTS PSCustomObject met compliance resultaten #> [CmdletBinding()] param() Write-Verbose "Controleren van MFA Conditional Access policies..." try { # Haal alle Conditional Access policies op Write-Host "Ophalen van Conditional Access policies..." -ForegroundColor Gray $policies = Invoke-MgGraphRequest -Method GET -Uri "https://graph.microsoft.com/v1.0/identity/conditionalAccess/policies" if (-not $policies.value -or $policies.value.Count -eq 0) { Write-Host " Geen Conditional Access policies gevonden in de tenant" -ForegroundColor Red return @{ IsCompliant = $false TotalPolicies = 0 EnabledPolicies = 0 MFAPolicies = 0 UniversalMFAPolicy = $false AdminMFAPolicy = $false RiskBasedMFAPolicy = $false PolicyDetails = @() Issues = @("Geen Conditional Access policies gevonden") } } $enabledPolicies = $policies.value | Where-Object { $_.state -eq 'enabled' } $mfaPolicies = @() $universalMFAPolicy = $false $adminMFAPolicy = $false $riskBasedMFAPolicy = $false $issues = @() $policyDetails = @() Write-Host " Totaal aantal policies: $($policies.value.Count)" -ForegroundColor Cyan Write-Host " Ingeschakelde policies: $($enabledPolicies.Count)" -ForegroundColor Cyan foreach ($policy in $enabledPolicies) { # Check of policy MFA vereist $requiresMFA = $false if ($policy.grantControls -and $policy.grantControls.builtInControls) { $requiresMFA = $policy.grantControls.builtInControls -contains 'mfa' } if ($requiresMFA) { $mfaPolicies += $policy # Check scope $includesAllUsers = $false $includesAllApps = $false $targetsAdminRoles = $false $hasRiskCondition = $false if ($policy.conditions.users) { $includesAllUsers = $policy.conditions.users.includeUsers -contains 'All' } if ($policy.conditions.applications) { $includesAllApps = $policy.conditions.applications.includeApplications -contains 'All' } if ($policy.conditions.users -and $policy.conditions.users.includeRoles) { $targetsAdminRoles = $policy.conditions.users.includeRoles.Count -gt 0 } if ($policy.conditions.signInRisk) { $hasRiskCondition = $policy.conditions.signInRisk.riskLevels.Count -gt 0 } $policyInfo = @{ Name = $policy.displayName Id = $policy.id IncludesAllUsers = $includesAllUsers IncludesAllApps = $includesAllApps TargetsAdminRoles = $targetsAdminRoles HasRiskCondition = $hasRiskCondition } $policyDetails += $policyInfo # Check voor universeel MFA-beleid if ($includesAllUsers -and $includesAllApps) { $universalMFAPolicy = $true Write-Host " [OK] Universeel MFA-beleid gevonden: $($policy.displayName)" -ForegroundColor Green } # Check voor beheerders MFA-beleid if ($targetsAdminRoles) { $adminMFAPolicy = $true Write-Host " [OK] Beheerders MFA-beleid gevonden: $($policy.displayName)" -ForegroundColor Green } # Check voor risicogebaseerd MFA-beleid if ($hasRiskCondition) { $riskBasedMFAPolicy = $true Write-Host " [OK] Risicogebaseerd MFA-beleid gevonden: $($policy.displayName)" -ForegroundColor Green } } } # Validatie if (-not $universalMFAPolicy) { $issues += "Geen universeel MFA-beleid gevonden dat van toepassing is op alle gebruikers en alle applicaties" Write-Host " [WARN] Geen universeel MFA-beleid gevonden" -ForegroundColor Yellow } if ($mfaPolicies.Count -eq 0) { $issues += "Geen Conditional Access policies gevonden die MFA vereisen" Write-Host " [FAIL] Geen MFA-beleid gevonden" -ForegroundColor Red } $isCompliant = $universalMFAPolicy -and $mfaPolicies.Count -gt 0 return @{ IsCompliant = $isCompliant TotalPolicies = $policies.value.Count EnabledPolicies = $enabledPolicies.Count MFAPolicies = $mfaPolicies.Count UniversalMFAPolicy = $universalMFAPolicy AdminMFAPolicy = $adminMFAPolicy RiskBasedMFAPolicy = $riskBasedMFAPolicy PolicyDetails = $policyDetails Issues = $issues } } catch { Write-Error "Fout bij controleren van MFA Conditional Access policies: $_" throw } } function Invoke-Monitoring { <# .SYNOPSIS Monitort de compliance status van MFA Conditional Access policies #> [CmdletBinding()] param() Write-Host "`nMonitoring: MFA Conditional Access Policies" -ForegroundColor Yellow Write-Host "=============================================" -ForegroundColor Yellow try { Connect-RequiredServices -RequiredScopes @("Policy.Read.All") $result = Test-MFAConditionalAccessPolicy Write-Host "`nResultaten:" -ForegroundColor Cyan Write-Host " Totaal policies: $($result.TotalPolicies)" -ForegroundColor Cyan Write-Host " Ingeschakelde policies: $($result.EnabledPolicies)" -ForegroundColor Cyan Write-Host " MFA-policies: $($result.MFAPolicies)" -ForegroundColor $(if ($result.MFAPolicies -gt 0) { "Green" } else { "Red" }) Write-Host " Universeel MFA-beleid: $(if ($result.UniversalMFAPolicy) { "Aanwezig" } else { "Afwezig" })" -ForegroundColor $(if ($result.UniversalMFAPolicy) { "Green" } else { "Yellow" }) Write-Host " Beheerders MFA-beleid: $(if ($result.AdminMFAPolicy) { "Aanwezig" } else { "Afwezig" })" -ForegroundColor $(if ($result.AdminMFAPolicy) { "Green" } else { "Gray" }) Write-Host " Risicogebaseerd MFA-beleid: $(if ($result.RiskBasedMFAPolicy) { "Aanwezig" } else { "Afwezig" })" -ForegroundColor $(if ($result.RiskBasedMFAPolicy) { "Green" } else { "Gray" }) if ($result.PolicyDetails.Count -gt 0) { Write-Host "`n MFA-policy details:" -ForegroundColor Cyan foreach ($detail in $result.PolicyDetails) { Write-Host " - $($detail.Name)" -ForegroundColor Gray Write-Host " * Alle gebruikers: $(if ($detail.IncludesAllUsers) { "Ja" } else { "Nee" })" -ForegroundColor Gray Write-Host " * Alle apps: $(if ($detail.IncludesAllApps) { "Ja" } else { "Nee" })" -ForegroundColor Gray Write-Host " * Beheerdersrollen: $(if ($detail.TargetsAdminRoles) { "Ja" } else { "Nee" })" -ForegroundColor Gray Write-Host " * Risicoconditie: $(if ($detail.HasRiskCondition) { "Ja" } else { "Nee" })" -ForegroundColor Gray } } if ($result.Issues.Count -gt 0) { Write-Host "`n Gevonden problemen:" -ForegroundColor Red foreach ($issue in $result.Issues) { Write-Host " - $issue" -ForegroundColor Red } } if ($result.IsCompliant) { Write-Host "`n✅ COMPLIANT - MFA Conditional Access policies zijn correct geconfigureerd" -ForegroundColor Green exit 0 } else { Write-Host "`n❌ NON-COMPLIANT - MFA Conditional Access policies vereisen aandacht" -ForegroundColor Red Write-Host " Gebruik -Remediation voor een gestructureerde aanpak" -ForegroundColor Yellow exit 1 } } catch { Write-Error "Fout tijdens monitoring: $_" exit 2 } } function Invoke-Remediation { <# .SYNOPSIS Biedt beheerders een gestructureerde aanpak voor het oplossen van problemen #> [CmdletBinding()] param() Write-Host "`nRemediatie: MFA Conditional Access Policy Problemen" -ForegroundColor Yellow Write-Host "====================================================" -ForegroundColor Yellow try { Connect-RequiredServices -RequiredScopes @("Policy.Read.All") $result = Test-MFAConditionalAccessPolicy Write-Host "`nGestructureerde remediatie-aanpak:" -ForegroundColor Cyan if (-not $result.UniversalMFAPolicy) { Write-Host "`n1. Universeel MFA-beleid ontbreekt" -ForegroundColor Yellow Write-Host " Acties:" -ForegroundColor Gray Write-Host " - Maak een Conditional Access policy aan met:" -ForegroundColor Gray Write-Host " * Users: Alle gebruikers (exclusief break-glass accounts)" -ForegroundColor Gray Write-Host " * Cloud apps: Alle cloud apps" -ForegroundColor Gray Write-Host " * Grant controls: Multi-factor authentication vereisen" -ForegroundColor Gray Write-Host " - Start in report-only mode om impact te monitoren" -ForegroundColor Gray Write-Host " - Schakel na validatie over naar enabled mode" -ForegroundColor Gray Write-Host " - Zie Azure Portal > Conditional Access > Policies" -ForegroundColor Gray } if ($result.MFAPolicies -eq 0) { Write-Host "`n2. Geen MFA Conditional Access policies gevonden" -ForegroundColor Yellow Write-Host " Acties:" -ForegroundColor Gray Write-Host " - Controleer of Conditional Access is ingeschakeld voor uw tenant" -ForegroundColor Gray Write-Host " - Controleer of u Azure AD Premium P1 of hoger hebt" -ForegroundColor Gray Write-Host " - Maak minimaal één MFA-policy aan zoals beschreven in stap 1" -ForegroundColor Gray } if ($result.MFAPolicies -gt 0 -and -not $result.UniversalMFAPolicy) { Write-Host "`n3. Bestaande MFA-policies dekken niet alle gebruikers/apps" -ForegroundColor Yellow Write-Host " Acties:" -ForegroundColor Gray Write-Host " - Review bestaande policies in Azure Portal" -ForegroundColor Gray Write-Host " - Pas scope aan om alle gebruikers en apps te dekken" -ForegroundColor Gray Write-Host " - Of maak aanvullende policies voor ontbrekende scenario's" -ForegroundColor Gray } Write-Host "`nAlgemene aanbevelingen:" -ForegroundColor Cyan Write-Host " - Gebruik authentication strengths voor phishing-resistente methoden" -ForegroundColor Gray Write-Host " - Configureer separate policies voor beheerders met strengere eisen" -ForegroundColor Gray Write-Host " - Overweeg risicogebaseerd MFA-beleid via Identity Protection" -ForegroundColor Gray Write-Host " - Documenteer alle policies en uitzonderingen" -ForegroundColor Gray Write-Host " - Test nieuwe policies eerst in report-only mode" -ForegroundColor Gray Write-Host "`nZie het artikel voor gedetailleerde implementatie-instructies:" -ForegroundColor Cyan Write-Host " content/m365/identity-protection/conditional-access-policy-mfa.json" -ForegroundColor Gray exit 0 } catch { Write-Error "Fout tijdens remediatie: $_" exit 2 } } # ============================================================================ # MAIN EXECUTION # ============================================================================ try { if ($Monitoring) { Invoke-Monitoring } elseif ($Remediation) { Invoke-Remediation } else { # Default: run monitoring Write-Host "Gebruik:" -ForegroundColor Yellow Write-Host " -Monitoring Controleer compliance status" -ForegroundColor Gray Write-Host " -Remediation Toon remediatie-aanpak" -ForegroundColor Gray Write-Host "`nVoer monitoring uit als standaard..." -ForegroundColor Cyan Invoke-Monitoring } } catch { Write-Error "Fout: $_" throw } finally { Write-Host "`n========================================`n" -ForegroundColor Cyan }

Risico zonder implementatie

Risico zonder implementatie
Hoog: Kritiek - Zonder MFA Conditional Access policies blijft de organisatie afhankelijk van zwakke, statische authenticatie die kwetsbaar is voor moderne aanvallen. Accountcompromittering leidt tot datalekken, fraude, en verstoring van kritieke processen. MFA via Conditional Access is een fundamentele Zero Trust-control en verplicht onder NIS2, BIO en ISO 27001.

Management Samenvatting

Implementeer MFA via Conditional Access policies voor alle gebruikers en cloudapplicaties. Gebruik risicogebaseerde triggers en phishing-resistente methoden. Configureer strengere eisen voor beheerders. Monitor continu en pas aan op basis van dreigingen en gebruikerspatronen. Voldoet aan CIS 1.1.5 L1, BIO 9.04, NIS2 Artikel 21.