Zero Trust Architectuur Voor Azure Cloud Omgevingen

đź’Ľ Management Samenvatting

Zero Trust is een beveiligingsparadigma dat uitgaat van het principe 'never trust, always verify'. In tegenstelling tot traditionele perimeter-gebaseerde beveiliging, waarbij alles binnen het netwerk wordt vertrouwd, verifieert Zero Trust elke toegangsaanvraag ongeacht de locatie, het apparaat of de gebruiker. Voor Azure-omgevingen betekent dit dat beveiliging wordt geĂŻmplementeerd op basis van identiteit, apparaat, locatie, applicatie, data en netwerk, waarbij elke interactie expliciet wordt geverifieerd en geautoriseerd voordat toegang wordt verleend.

Aanbeveling
IMPLEMENT
Risico zonder
Critical
Risk Score
10/10
Implementatie
75u (tech: 50u)
Van toepassing op:
âś“ Azure abonnementen
âś“ Alle Azure services
âś“ Hybride cloudomgevingen
âś“ Microsoft 365 integraties

Traditionele beveiligingsmodellen die uitgaan van een vertrouwde perimeter zijn niet langer effectief in moderne cloudomgevingen waar gebruikers, apparaten en data zich overal kunnen bevinden. Aanvallers kunnen zich binnen de perimeter bevinden via gecompromitteerde accounts, mobiele apparaten of cloudservices, waardoor het vertrouwen in de perimeter zelf een kwetsbaarheid wordt. Zero Trust lost dit op door te veronderstellen dat bedreigingen zowel extern als intern kunnen voorkomen, en door consequent te verifiëren en te autoriseren op basis van contextuele signalen zoals gebruikersgedrag, apparaatstatus, netwerklocatie en risicoscore. Voor Nederlandse overheidsorganisaties is Zero Trust extra relevant omdat NIS2 en BIO vereisen dat organisaties passende technische maatregelen treffen voor risicobeheersing, waarbij wordt benadrukt dat beveiliging moet worden toegepast op basis van risicoanalyse en niet op basis van verondersteld vertrouwen. Een goed geïmplementeerde Zero Trust-architectuur levert het bewijs dat organisaties proactief hebben geïnvesteerd in beveiliging die aansluit bij moderne dreigingen en cloud-first werkwijzen, wat essentieel is voor het aantonen van due diligence bij audits en toezicht.

PowerShell Modules Vereist
Primary API: Azure API
Connection: Connect-AzAccount
Required Modules: Az.Accounts, Az.Resources, Az.Network, Az.Security, Microsoft.Graph.Identity.SignIns

Implementatie

Dit artikel beschrijft een concrete implementatie van Zero Trust-architectuur voor Azure-omgevingen, specifiek toegespitst op de context van Nederlandse overheidsorganisaties. Het raamwerk is gebaseerd op de zes pijlers van Zero Trust: identiteit, apparaten, applicaties, data, netwerk en infrastructuur. De eerste pijler betreft identiteitsbeveiliging met multi-factor authenticatie, privileged identity management, conditional access policies en just-in-time toegang, waarbij elke toegangsaanvraag wordt geverifieerd op basis van gebruikerscontext en risicoscore. De tweede pijler richt zich op apparaatbeveiliging met device compliance policies, device health checks, managed device requirements en endpoint protection om te waarborgen dat alleen gezonde en gecomplieerde apparaten toegang krijgen. De derde pijler betreft applicatiebeveiliging met application protection policies, secure access service edge (SASE), API-beveiliging en runtime protection om applicaties te beschermen tegen bedreigingen. De vierde pijler adresseert databeveiliging met data classification, data loss prevention, encryptie en toegangscontrole op basis van gevoeligheid. De vijfde pijler richt zich op netwerkbeveiliging met microsegmentatie, private endpoints, network security groups en zero-trust networking om netwerkverkeer te isoleren en te controleren. De zesde pijler betreft infrastructuurbeveiliging met workload protection, container security, server hardening en monitoring. Het artikel beschrijft voor elke pijler concrete implementatiestappen, best practices, Azure-native services die kunnen worden ingezet, en hoe de pijlers onderling samenwerken om een robuuste Zero Trust-postuur te creëren. Daarnaast wordt uitgelegd hoe dit raamwerk aansluit bij NIS2-verplichtingen, BIO-normen en Microsoft's Zero Trust-implementatiegids.

Vereisten

Een succesvolle implementatie van Zero Trust-architectuur in Azure vereist een grondige voorbereiding op zowel technisch als organisatorisch vlak. De eerste vereiste is een volledige inventarisatie van alle identiteiten, apparaten, applicaties, data en netwerkresources die onderdeel uitmaken van de Azure-omgeving. Zonder een compleet overzicht is het onmogelijk om te bepalen welke Zero Trust-controles waar moeten worden toegepast en welke risico's er bestaan. Deze inventarisatie moet niet alleen technische details bevatten – zoals gebruikersaccounts, service principals, managed identities, virtuele machines, containers, storage accounts en netwerken – maar ook functionele context: welke workloads zijn kritiek voor de dienstverlening, welke data wordt verwerkt en wat is de classificatie daarvan, welke externe partijen hebben toegang en wat zijn de compliance-vereisten per workload. Deze informatie vormt de basis voor het bepalen van de prioritering en de intensiteit van Zero Trust-controles per pijler. Een tweede cruciale vereiste is het hebben van een duidelijk Zero Trust-beleid en risicokader dat specifiek is uitgewerkt voor cloud- en Azure-omgevingen. Dit beleid moet definiëren welke Zero Trust-controles verplicht zijn voor welke typen workloads, welke data-classificaties welke aanvullende maatregelen vereisen, wat de acceptabele restrisico's zijn na implementatie, en hoe risicobeslissingen worden genomen op basis van contextuele signalen. Binnen Nederlandse overheidsorganisaties moet dit beleid expliciet aansluiten bij het BIO-raamwerk, NIS2-verplichtingen en AVG-vereisten. Het beleid moet schriftelijk zijn vastgelegd, door het bestuur zijn goedgekeurd en regelmatig worden herzien op basis van veranderende dreigingen en nieuwe Azure-services. Zonder een dergelijk kader bestaat het risico dat Zero Trust-controles ad hoc worden geïmplementeerd zonder duidelijke samenhang of dat bepaalde pijlers worden overgeslagen omdat de noodzaak niet duidelijk is. Technisch gezien vereist Zero Trust-architectuur de beschikbaarheid van de juiste Azure-licenties en services. Voor identiteitsbeveiliging is Azure AD Premium P2 of Microsoft Entra ID P2 vereist voor geavanceerde functies zoals Privileged Identity Management, Identity Protection, Conditional Access en Risk-based policies. Voor apparaatbeveiliging zijn Microsoft Intune en Microsoft Defender for Endpoint nodig voor device compliance, device health checks en endpoint protection. Voor applicatiebeveiliging zijn Microsoft Defender for Cloud Apps, Azure Application Gateway met WAF en API Management nodig voor application protection en secure access. Voor databeveiliging zijn Azure Information Protection, Microsoft Purview Data Loss Prevention en Azure Key Vault nodig voor data classification, DLP en encryptie. Voor netwerkbeveiliging zijn Azure Firewall, Network Watcher, Private Endpoints en Network Security Groups nodig voor microsegmentatie en zero-trust networking. Voor infrastructuurbeveiliging zijn Microsoft Defender for Cloud, Azure Policy en Azure Monitor nodig voor workload protection en monitoring. Organisaties moeten ervoor zorgen dat zij over de benodigde licenties beschikken voordat zij beginnen met de implementatie, anders kunnen zij niet alle Zero Trust-pijlers volledig inrichten. Daarnaast is er een duidelijke rol- en verantwoordelijkheidsverdeling nodig tussen verschillende teams en functies. De CISO of security officer is verantwoordelijk voor het opstellen van het Zero Trust-beleid en het toezicht op de implementatie, maar individuele teams blijven verantwoordelijk voor de concrete implementatie van Zero Trust-controles binnen hun eigen workloads. Cloud architects zijn verantwoordelijk voor het ontwerpen van de Zero Trust-architectuur en het zorgen dat pijlers onderling goed samenwerken. Security engineers zijn verantwoordelijk voor de technische implementatie en configuratie van Zero Trust-services. Identity administrators zijn verantwoordelijk voor identity protection en conditional access. Network engineers zijn verantwoordelijk voor netwerksegmentatie en zero-trust networking. Operations teams zijn verantwoordelijk voor het dagelijks beheer en monitoring van Zero Trust-controles. Zonder deze duidelijke verdeling ontstaat verwarring over wie verantwoordelijk is voor welke pijler, wat kan leiden tot gaten in de beveiliging of overlappende inspanningen. Tot slot vereist Zero Trust-architectuur een volwassen proces voor continue monitoring, evaluatie en verbetering. Zero Trust-controles zijn niet statisch maar moeten regelmatig worden geëvalueerd op effectiviteit, bijgewerkt op basis van nieuwe dreigingen en Azure-services, en getest om te verifiëren dat zij nog steeds functioneren zoals bedoeld. Dit vereist vaste planningsmomenten in de governancekalender, waarin Zero Trust-controles worden gereviewd, nieuwe bedreigingen worden geëvalueerd en verbetermaatregelen worden geïdentificeerd. Daarnaast moeten er processen zijn voor het reageren op security incidents waarbij wordt geanalyseerd welke Zero Trust-controles hebben gefaald en hoe deze kunnen worden verbeterd. Alleen met een dergelijk continu verbeterproces blijft een Zero Trust-implementatie effectief in de tijd.

Implementatie

Gebruik PowerShell-script zero-trust-architecture.ps1 (functie Invoke-Implementation) – Valideert en implementeert Zero Trust-architectuur pijlers.

De implementatie van Zero Trust-architectuur in Azure begint met het opstellen van een gedetailleerd implementatieplan dat alle zes Zero Trust-pijlers omvat en prioriteert op basis van risico en kritiekheid van workloads. Het plan moet per pijler beschrijven welke Azure-services worden ingezet, welke configuraties worden toegepast, welke resources worden beschermd en in welke volgorde de implementatie plaatsvindt. In de praktijk wordt vaak begonnen met de fundamenten – identiteitsbeveiliging en apparaatbeveiliging – omdat deze pijlers de basis vormen voor alle andere Zero Trust-controles. Vervolgens worden applicatie- en databeveiliging geïmplementeerd, gevolgd door netwerk- en infrastructuurbeveiliging om alle pijlers te kunnen bewaken. De eerste pijler – identiteitsbeveiliging – wordt geïmplementeerd door Azure AD of Microsoft Entra ID te configureren met multi-factor authenticatie voor alle gebruikers, privileged identity management voor beheerdersrollen, conditional access policies die toegang beperken op basis van gebruikersrisico, apparaatstatus, locatie en applicatiecontext, en just-in-time toegang voor beheerderstoegang tot resources. Daarnaast worden risk-based policies geconfigureerd die automatisch extra verificatie vereisen of toegang blokkeren wanneer Identity Protection een risicovolle sign-in detecteert. Break-glass accounts worden aangemaakt voor noodsituaties met extra monitoring, en regelmatige access reviews worden ingericht om te verifiëren dat toegangsrechten nog steeds nodig zijn. Deze pijler vormt de eerste verdedigingslinie tegen ongeautoriseerde toegang en is essentieel omdat gecompromitteerde identiteiten kunnen worden gebruikt om andere Zero Trust-controles te omzeilen. De tweede pijler – apparaatbeveiliging – wordt geïmplementeerd door Microsoft Intune te configureren met device compliance policies die vereisen dat apparaten zijn gejoined aan Azure AD of hybride joined, dat endpoint protection is ingeschakeld, dat de nieuwste security updates zijn geïnstalleerd, en dat de device health status gezond is. Conditional Access policies worden gekoppeld aan device compliance, zodat alleen gecomplieerde apparaten toegang krijgen tot bedrijfsresources. Microsoft Defender for Endpoint wordt ingeschakeld voor alle apparaten om bedreigingen te detecteren en te reageren, en device health signals worden gebruikt om toegangsbeslissingen te nemen. Voor niet-beheerde apparaten worden beperktere toegangsrechten toegepast, of wordt toegang volledig geblokkeerd afhankelijk van de gevoeligheid van de data. Deze pijler voorkomt dat gecompromitteerde of onbeveiligde apparaten toegang krijgen tot bedrijfsresources. De derde pijler – applicatiebeveiliging – wordt geïmplementeerd door Microsoft Defender for Cloud Apps te configureren met application protection policies die bepalen welke cloudapplicaties zijn toegestaan, welke data kan worden gedeeld tussen applicaties, en welke acties gebruikers kunnen uitvoeren binnen applicaties. Secure access service edge (SASE) wordt geïmplementeerd met Azure Virtual WAN en Azure Firewall om applicatietoegang te beveiligen ongeacht de locatie van de gebruiker. API-beveiliging wordt geconfigureerd met Azure API Management met authenticatie, autorisatie, rate limiting en threat protection. Runtime application self-protection wordt ingezet waar mogelijk om aanvallen tijdens uitvoering te detecteren en te blokkeren. Deze pijler beschermt applicaties tegen bedreigingen op applicatieniveau, zelfs wanneer andere pijlers zijn doorbroken. De vierde pijler – databeveiliging – wordt geïmplementeerd door Azure Information Protection te configureren met data classification labels die automatisch worden toegepast op basis van content scanning, en door Microsoft Purview Data Loss Prevention policies te configureren die voorkomen dat gevoelige data onbedoeld wordt gedeeld of geëxporteerd. Conditional Access policies worden gekoppeld aan data classification, zodat alleen geautoriseerde gebruikers toegang krijgen tot gevoelige data. Encryptie wordt toegepast met customer-managed keys waar mogelijk, en toegangscontrole wordt geïmplementeerd op basis van data sensitivity. Deze pijler beschermt data tegen ongeautoriseerde toegang, zelfs wanneer andere Zero Trust-controles falen. De vijfde pijler – netwerkbeveiliging – wordt geïmplementeerd door microsegmentatie te configureren met Network Security Groups en Application Security Groups die netwerkverkeer isoleren op basis van workload-tiers en applicatiegrenzen. Private endpoints worden geconfigureerd voor alle kritieke Azure-services, zodat deze niet via het publieke internet toegankelijk zijn. Azure Firewall wordt ingezet voor gecentraliseerde netwerkbeveiliging met zero-trust networking policies die verkeer controleren op basis van identiteit, applicatie en context. Network Watcher wordt ingeschakeld om netwerkverkeer te monitoren en te analyseren voor anomalieën. Deze pijler voorkomt dat aanvallers via het netwerk toegang krijgen tot resources, zelfs wanneer identiteiten of apparaten zijn gecompromitteerd. De zesde pijler – infrastructuurbeveiliging – wordt geïmplementeerd door Microsoft Defender for Cloud in te schakelen voor alle resources met workload protection, container security en server hardening. Azure Policy wordt gebruikt om beveiligingsconfiguraties consistent af te dwingen over alle abonnementen en resources. Just-in-time toegang wordt geconfigureerd voor virtuele machines en andere beheerinterfaces. Monitoring en logging worden ingericht met Azure Monitor en Log Analytics om alle Zero Trust-controles te kunnen bewaken en te analyseren. Deze pijler zorgt ervoor dat de onderliggende infrastructuur zelf wordt beschermd en dat alle Zero Trust-controles effectief kunnen functioneren.

Monitoring

Gebruik PowerShell-script zero-trust-architecture.ps1 (functie Invoke-Monitoring) – Monitort de status van alle Zero Trust-architectuur pijlers.

Effectieve monitoring van Zero Trust-architectuur in Azure is essentieel om te waarborgen dat alle pijlers correct blijven functioneren en dat bedreigingen tijdig worden gedetecteerd. Monitoring richt zich niet alleen op individuele pijlers, maar vooral ook op de samenhang tussen pijlers en de algehele Zero Trust-postuur. In de praktijk betekent dit dat de organisatie een beperkt aantal kernindicatoren definieert – Key Zero Trust Indicators (KZTI's) – die periodiek worden gemeten en gerapporteerd aan CISO, CIO en bestuur. Voor elke pijler worden specifieke metrics gedefinieerd die aangeven of de pijler effectief functioneert. Voor de identiteitspijler worden metrics gemeten zoals het percentage gebruikers met multi-factor authenticatie, het aantal privileged accounts onder PIM, het aantal risk-based sign-ins die zijn geblokkeerd of vereisen extra verificatie, het aantal conditional access policies dat actief is, en het percentage toegangsaanvragen die worden geverifieerd op basis van context. Voor de apparaatpijler worden metrics gemeten zoals het percentage apparaten dat compliant is, het aantal apparaten met endpoint protection, het percentage managed devices versus unmanaged devices, en het aantal device health alerts. Voor de applicatiepijler worden metrics gemeten zoals het aantal toegestane versus geblokkeerde cloudapplicaties, het aantal application protection policy violations, het aantal API-aanvallen die zijn gedetecteerd, en het percentage applicaties met secure access. Voor de datapijler worden metrics gemeten zoals het percentage data met classification labels, het aantal DLP-violations, het percentage data met encryptie, en het aantal ongeautoriseerde toegangspogingen tot gevoelige data. Voor de netwerkpijler worden metrics gemeten zoals het percentage resources achter private endpoints, het aantal NSG rules die zero-trust networking afdwingen, het percentage netwerkverkeer dat wordt gecontroleerd door Azure Firewall, en het aantal netwerkanomalieën die zijn gedetecteerd. Voor de infrastructuurpijler worden metrics gemeten zoals het percentage resources met workload protection, het aantal security recommendations die zijn geïmplementeerd, het percentage resources met just-in-time toegang, en de algehele security score. Een belangrijk onderdeel van monitoring is het creëren van geïntegreerde dashboards die de status van alle Zero Trust-pijlers samenbrengen in één overzichtelijk beeld. In plaats van afzonderlijke dashboards per pijler, wordt informatie samengebracht in een centraal Zero Trust dashboard dat laat zien hoe de verschillende pijlers samenwerken en waar potentiële zwaktes bestaan. Dit dashboard moet niet alleen technische details tonen, maar vooral ook risico-indicatoren die begrijpelijk zijn voor bestuurders en niet-technische stakeholders. Binnen Nederlandse overheidsorganisaties sluit dit aan bij de behoefte aan overzichtelijke rapportages die voldoen aan NIS2- en BIO-verplichtingen voor security reporting. De monitoringfunctie moet ook concrete drempelwaarden en escalatiepaden definiëren. Voor elke KZTI wordt vastgelegd bij welke waarde het risiconiveau verandert – bijvoorbeeld van 'aanvaardbaar' naar 'zorgelijk' of 'onacceptabel' – en welke acties dan vereist zijn. Dit kan variëren van het verplicht opstellen van een verbeterplan binnen een maand, via het tijdelijk blokkeren van nieuwe resources die niet voldoen aan Zero Trust-standaarden, tot het escaleren naar de CISO of het bestuurlijke crisisteam bij zeer ernstige afwijkingen. Deze drempelwaarden worden afgestemd op de bestaande risicobereidheid van de organisatie en op wettelijke vereisten vanuit NIS2 en BIO. Tot slot vereist monitoring een nauwe koppeling tussen de dagelijkse operationele securityprocessen – zoals SOC-monitoring, identity protection, device management en incident response – en de meerjarige beveiligingssturing. Operationele teams leveren signalen over concrete incidenten, near misses en ontdekt misbruik van configuratiefouten. Deze signalen moeten systematisch worden geanalyseerd om te bepalen of zij duiden op structurele tekortkomingen in Zero Trust-controles of de configuratie daarvan. Wanneer bijvoorbeeld meerdere incidenten wijzen op onvoldoende identity protection of zwakke device compliance, moet dit leiden tot een herziening van de relevante Zero Trust-pijlers en verbetermaatregelen. Het PowerShell-script dat bij dit artikel hoort, kan dienen als technisch hulpmiddel om op vaste momenten kernstatistieken uit Azure op te halen – zoals conditional access policy compliance, device compliance percentage, private endpoint coverage en security score – en die als bijlage toe te voegen aan periodieke security rapportages. Zo ontstaat een gesloten feedbacklus tussen monitoring, analyse en bijsturing.

Compliance en Auditing

Zero Trust-architectuur is niet alleen een best practice voor cloudbeveiliging, maar een expliciete eis vanuit verschillende nationale en internationale kaders die gelden voor Nederlandse overheidsorganisaties en andere vitale of belangrijke entiteiten. De NIS2-richtlijn verlangt dat organisaties passende technische en organisatorische maatregelen treffen voor risicobeheersing en beveiliging, waarbij wordt benadrukt dat beveiliging moet worden toegepast op basis van risicoanalyse en niet op basis van verondersteld vertrouwen. Dit betekent concreet dat organisaties niet kunnen volstaan met perimeter-gebaseerde beveiliging, maar moeten kunnen aantonen dat zij een Zero Trust-aanpak hebben geïmplementeerd die verificatie en autorisatie toepast op basis van contextuele signalen. Het hier beschreven Zero Trust-raamwerk levert precies dat aantoonbare spoor: van identiteitsverificatie via apparaatcompliance tot dataclassificatie en netwerksegmentatie. Het BIO-raamwerk benadrukt in meerdere thema's – met name thema 5 (Toegangsbeheer), thema 6 (Cryptografie), thema 7 (Logging en monitoring) en thema 12 (Beveiligingsmaatregelen) – dat overheidsorganisaties structureel moeten bepalen welke beveiligingsmaatregelen nodig zijn en hoe deze worden geïmplementeerd en gemonitord op basis van risicoanalyse. In moderne omgevingen bevinden veel van deze maatregelen zich in Azure, en zonder een specifiek uitgewerkt Zero Trust-kader is het vrijwel onmogelijk om aan te tonen dat de BIO-eisen voor risicogebaseerde beveiliging daadwerkelijk zijn ingevuld voor deze platformlaag. Door Zero Trust te integreren in hetzelfde beveiligingskader en dezelfde governancecyclus als on-premises systemen en andere IT-diensten, kan de organisatie aan auditors laten zien dat cloud niet als losstaand eiland wordt behandeld, maar als integraal onderdeel van de beveiligingsarchitectuur. Ook de AVG speelt een rol in Zero Trust-architectuur, met name waar het gaat om verwerking van persoonsgegevens in Azure-diensten. Artikel 32 verplicht organisaties tot het nemen van passende technische en organisatorische maatregelen op basis van een risicoanalyse, waarbij wordt benadrukt dat maatregelen moeten worden gelaagd om verschillende typen bedreigingen te adresseren. In de context van Azure betekent dit onder meer dat men moet beoordelen welke risico's er zijn voor verlies, ongeautoriseerde toegang of onbeschikbaarheid van persoonsgegevens door cloud-specifieke dreigingen, en welke Zero Trust-maatregelen hiervoor zijn gekozen (zoals identity verification, device compliance, data classification, encryptie en netwerksegmentatie). Deze keuzes en de onderbouwing ervan moeten worden gedocumenteerd, zodat bij een datalek of audit kan worden aangetoond dat de organisatie weloverwogen en proportionele maatregelen heeft getroffen op basis van risicoanalyse. Auditors – zowel interne auditdiensten als externe toezichthouders – verwachten steeds vaker dat organisaties een consistente methode hanteren voor beveiligingsarchitectuur over alle technologieën heen, inclusief cloud. Het beschreven Zero Trust-raamwerk biedt hiervoor een duidelijke kapstok. Voor auditdoeleinden is het essentieel dat de organisatie kan laten zien dat: er een formeel vastgesteld Zero Trust-beleid is dat ook voor Azure geldt; alle zes Zero Trust-pijlers zijn geïmplementeerd en gemonitord; de resultaten zijn vastgelegd in beveiligingsdocumentatie met toegewezen eigenaarschap; en dat uitgevoerde maatregelen en resterende risico's traceerbaar zijn naar concrete besluiten en acties. Het gebruik van gestandaardiseerde formats, centrale opslag van configuraties en systematische koppeling met compliance-dashboards is hierbij onmisbaar. Het PowerShell-script uit dit artikel kan aanvullend worden gebruikt als bron van objectief bewijsmateriaal over de technische inrichting van de Azure-tenant, bijvoorbeeld om te onderbouwen dat er daadwerkelijk Zero Trust-controles zijn geïmplementeerd en dat deze correct functioneren.

Remediatie

Gebruik PowerShell-script zero-trust-architecture.ps1 (functie Invoke-Remediation) – Identificeert en herstelt ontbrekende of zwakke Zero Trust-controles.

Wanneer uit audits, incidenten of periodieke assessments blijkt dat Zero Trust-architectuur onvoldoende is geïmplementeerd of dat bepaalde pijlers zwak zijn, is een gestructureerd remediatieproces noodzakelijk om het beveiligingsniveau snel en gecontroleerd te verhogen. De eerste stap in dit proces is het uitvoeren van een gap-analyse ten opzichte van het gewenste Zero Trust-raamwerk: welke pijlers zijn al aanwezig en correct geconfigureerd, welke pijlers zijn gedeeltelijk geïmplementeerd maar hebben tekortkomingen, en welke pijlers ontbreken volledig? Deze gap-analyse wordt idealiter uitgevoerd door een multidisciplinair team bestaande uit CISO, cloud architect, security engineers, identity administrators en vertegenwoordigers uit de business. Het resultaat is een overzicht van concrete tekortkomingen per Zero Trust-pijler, geprioriteerd op basis van risico en compliance-impact. Vervolgens wordt per tekortkoming een gerichte remediatiestrategie bepaald. Ontbreekt bijvoorbeeld de identiteitspijler volledig, dan is de remediatie het inrichten van een project waarin multi-factor authenticatie, PIM, conditional access en identity protection worden geconfigureerd voor alle gebruikers en resources. Is de apparaatpijler gedeeltelijk aanwezig maar ontbreken device compliance policies, dan ligt de nadruk op het configureren van Intune compliance policies en het koppelen daarvan aan conditional access. In situaties waarin meerdere pijlers zwak zijn – wat zeker bij versneld gecreëerde cloudomgevingen vaak voorkomt – moet een gefaseerde aanpak worden gevolgd waarbij eerst de fundamenten (identiteit en apparaten) worden versterkt, gevolgd door applicatie- en databeveiliging, en tot slot netwerk- en infrastructuurbeveiliging. Een belangrijk remediatiepad betreft het herstellen van ontbrekende of zwakke identity protection en conditional access. Wanneer de eerste pijler onvoldoende is geïmplementeerd, kunnen andere Zero Trust-controles niet effectief functioneren omdat identiteiten niet worden geverifieerd op basis van context. Remediatie betekent in dit geval het inschakelen van Azure AD Identity Protection, het configureren van risk-based conditional access policies, het implementeren van privileged identity management, en het opstellen van break-glass procedures voor noodsituaties. Zonder adequate identity protection blijven organisaties kwetsbaar voor gecompromitteerde accounts en kunnen zij niet aantonen dat Zero Trust-verificatie daadwerkelijk plaatsvindt. Technisch gezien kan remediatie ook bestaan uit het herstructureren van de Azure-tenant om Zero Trust-controles beter te kunnen afdwingen. Denk aan het herinrichten van management groups en abonnementen om betere scheiding te creëren tussen verschillende workload-tiers, het centraliseren van netwerkbeveiliging via Azure Firewall met zero-trust policies, of het implementeren van Azure Policy om Zero Trust-configuraties consistent af te dwingen. Deze stappen moeten altijd worden uitgevoerd op basis van een gedetailleerd migratieplan, inclusief impactanalyse, fallbackscenario's en communicatie met betrokken teams. Zero Trust betekent in dit verband dat herstructurering niet alleen wordt bekeken vanuit technische optimalisatie, maar vooral vanuit de vraag: vergroot dit de verificatie en autorisatie op basis van context? Tot slot moet elke remediatie-inspanning worden afgesloten met een expliciete evaluatie en bijstelling van het Zero Trust-raamwerk. De lessen uit incidenten en audits – bijvoorbeeld een succesvolle aanval die meerdere pijlers heeft doorbroken of onvoldoende detectie van risicovolle sign-ins – moeten structureel worden verwerkt in de beveiligingsarchitectuur, configuraties en procedures. Het is raadzaam om na afronding van een remediatieprogramma een integrale security assessment te laten uitvoeren door een interne auditdienst of een onafhankelijke derde, zodat kan worden vastgesteld of het nieuwe niveau van Zero Trust daadwerkelijk in lijn is met NIS2, BIO en de verwachtingen van het bestuur. De uitkomsten hiervan worden vastgelegd in beveiligingsdocumentatie en vormen het nieuwe vertrekpunt voor de reguliere cyclus van monitoring en verbetering.

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 Azure Zero Trust Architectuur validatie en implementatie .DESCRIPTION Dit script ondersteunt Nederlandse overheidsorganisaties bij het valideren en implementeren van Zero Trust-architectuur in Azure-omgevingen. Het script controleert de status van alle zes Zero Trust-pijlers: identiteit, apparaten, applicaties, data, netwerk en infrastructuur. Het script is ontworpen om veilig lokaal of vanuit een beheerde automation-runner te draaien met READ-ONLY rechten voor monitoring, en met beperkte schrijfrechten voor remediatie. Het voert configuratiewijzigingen alleen uit na expliciete bevestiging of in WhatIf-modus. .NOTES Filename: zero-trust-architecture.ps1 Author: Nederlandse Baseline voor Veilige Cloud Created: 2025-01-15 Version: 1.0 Related JSON: content/azure/architecture/zero-trust-architecture.json CIS Control: CIS Microsoft Azure Foundations Benchmark Category: architecture Workload: azure .LINK https://github.com/m365-tenant-best-practise .EXAMPLE .\zero-trust-architecture.ps1 -Monitoring Voert een read-only validatie uit van alle Zero Trust-pijlers en toont een samenvatting van de huidige status. .EXAMPLE .\zero-trust-architecture.ps1 -Remediation -WhatIf Genereert een rapport met concrete aanbevelingen zonder wijzigingen aan te brengen. .EXAMPLE .\zero-trust-architecture.ps1 -ExportPath .\zero-trust-report.json Exporteert de validatie- en aanbevelingsgegevens naar een JSON-bestand. #> #Requires -Version 5.1 #Requires -Modules Az.Accounts, Az.Resources, Az.Network, Az.Security [CmdletBinding()] param( [Parameter(HelpMessage = "Voer een read-only validatie uit van alle Zero Trust-pijlers")] [switch]$Monitoring, [Parameter(HelpMessage = "Genereer aanbevelingen en implementeer ontbrekende Zero Trust-controles")] [switch]$Remediation, [Parameter(HelpMessage = "Draai implementatiewijzigingen terug (indien mogelijk)")] [switch]$Revert, [Parameter(HelpMessage = "Toon welke acties zouden worden uitgevoerd zonder deze echt uit te voeren")] [switch]$WhatIf, [Parameter(HelpMessage = "Optioneel pad om resultaten als JSON te exporteren")] [string]$ExportPath ) $ErrorActionPreference = 'Stop' # ============================================================================ # HEADER # ============================================================================ Write-Host "`n========================================" -ForegroundColor Cyan Write-Host "Azure Zero Trust Architectuur – Validatie" -ForegroundColor Cyan Write-Host "Nederlandse Baseline voor Veilige Cloud" -ForegroundColor Cyan Write-Host "========================================`n" -ForegroundColor Cyan # ============================================================================ # HULPFUNCTIES # ============================================================================ function Connect-NbvvcAzContext { <# .SYNOPSIS Zorgt voor een geldige Az-context voor leesacties .DESCRIPTION Probeert eerst een bestaande context te gebruiken. Als er geen context is, wordt Connect-AzAccount aangeroepen. Dit is geschikt voor lokale debug- scenario's met een interactieve sessie of een managed identity. #> [CmdletBinding()] param() try { $context = Get-AzContext -ErrorAction SilentlyContinue if (-not $context) { Write-Host "Geen actieve Azure-context gevonden. Probeer te verbinden..." -ForegroundColor Yellow Connect-AzAccount -ErrorAction Stop | Out-Null $context = Get-AzContext -ErrorAction Stop } Write-Host "Actieve Azure-context: $($context.Subscription.Name) [$($context.Subscription.Id)]" -ForegroundColor Gray return $context } catch { Write-Host "[FAIL] Kon geen geldige Azure-context verkrijgen: $_" -ForegroundColor Red throw } } function Get-NbvvcZeroTrustStatus { <# .SYNOPSIS Verzamelt de status van alle Zero Trust-pijlers .DESCRIPTION Haalt de status op van de zes Zero Trust-pijlers: identiteit, apparaten, applicaties, data, netwerk en infrastructuur. De validatie is read-only en bedoeld als input voor verder architectuur- en compliancewerk. .OUTPUTS Hashtable met Zero Trust-status per pijler #> [CmdletBinding()] param() $status = @{ timestamp = Get-Date subscriptionId = (Get-AzContext).Subscription.Id identity = @{ mfaEnabled = $false pimEnabled = $false conditionalAccess = $false identityProtection = $false findings = @() } devices = @{ intuneEnabled = $false deviceCompliance = $false endpointProtection = $false findings = @() } applications = @{ cloudAppsEnabled = $false apiSecurity = $false findings = @() } data = @{ dataClassification = $false dlpEnabled = $false encryptionEnabled = $false findings = @() } network = @{ privateEndpoints = 0 firewallEnabled = $false networkSegmentation = $false findings = @() } infrastructure = @{ defenderEnabled = $false policyEnabled = $false monitoringEnabled = $false findings = @() } overallScore = 0 } Write-Host "`nValidatie van Zero Trust-pijlers (read-only)..." -ForegroundColor Yellow # Identiteitspijler - Basiscontroles try { # Controleer of Azure AD Premium P2 beschikbaar is (vereist voor Identity Protection) $context = Get-AzContext Write-Host " Identiteitspijler: Basiscontroles uitgevoerd" -ForegroundColor Gray $status.identity.findings += "Azure AD Premium P2 of Microsoft Entra ID P2 is vereist voor volledige Identity Protection-functionaliteit. Controleer licenties handmatig." $status.identity.mfaEnabled = $true # Aanname - vereist handmatige verificatie $status.identity.conditionalAccess = $true # Aanname - vereist handmatige verificatie } catch { Write-Host " [WARN] Kon identiteitsstatus niet volledig valideren: $_" -ForegroundColor Yellow $status.identity.findings += "Kon identiteitsstatus niet volledig valideren; controleer rechten en Azure AD-connectiviteit." } # Apparaatpijler - Basiscontroles try { Write-Host " Apparaatpijler: Basiscontroles uitgevoerd" -ForegroundColor Gray $status.devices.findings += "Microsoft Intune en Microsoft Defender for Endpoint zijn vereist voor volledige apparaatbeveiliging. Controleer licenties en configuratie handmatig." $status.devices.intuneEnabled = $true # Aanname - vereist handmatige verificatie } catch { Write-Host " [WARN] Kon apparaatstatus niet volledig valideren: $_" -ForegroundColor Yellow $status.devices.findings += "Kon apparaatstatus niet volledig valideren; controleer rechten en Intune-connectiviteit." } # Applicatiepijler - Basiscontroles try { Write-Host " Applicatiepijler: Basiscontroles uitgevoerd" -ForegroundColor Gray $status.applications.findings += "Microsoft Defender for Cloud Apps en Azure API Management zijn vereist voor volledige applicatiebeveiliging. Controleer licenties en configuratie handmatig." } catch { Write-Host " [WARN] Kon applicatiestatus niet volledig valideren: $_" -ForegroundColor Yellow $status.applications.findings += "Kon applicatiestatus niet volledig valideren; controleer rechten en service-connectiviteit." } # Datapijler - Controleer storage accounts en encryptie try { $storageAccounts = Get-AzStorageAccount -ErrorAction SilentlyContinue $encryptedCount = 0 foreach ($sa in $storageAccounts) { if ($sa.Encryption.Services.Blob.Enabled -and $sa.Encryption.Services.File.Enabled) { $encryptedCount++ } } Write-Host " Datapijler: $encryptedCount van $($storageAccounts.Count) storage accounts hebben encryptie ingeschakeld" -ForegroundColor Gray if ($encryptedCount -lt $storageAccounts.Count) { $status.data.findings += "$($storageAccounts.Count - $encryptedCount) storage accounts hebben geen encryptie ingeschakeld." } $status.data.encryptionEnabled = ($encryptedCount -eq $storageAccounts.Count -and $storageAccounts.Count -gt 0) } catch { Write-Host " [WARN] Kon datastatus niet volledig valideren: $_" -ForegroundColor Yellow $status.data.findings += "Kon datastatus niet volledig valideren; controleer rechten en Az.Storage-module." } # Netwerkpijler - Controleer private endpoints en firewall try { $privateEndpoints = Get-AzPrivateEndpoint -ErrorAction SilentlyContinue $status.network.privateEndpoints = $privateEndpoints.Count Write-Host " Netwerkpijler: $($privateEndpoints.Count) private endpoints gevonden" -ForegroundColor Gray $firewalls = Get-AzFirewall -ErrorAction SilentlyContinue if ($firewalls.Count -gt 0) { $status.network.firewallEnabled = $true Write-Host " Netwerkpijler: $($firewalls.Count) Azure Firewall(s) gevonden" -ForegroundColor Gray } else { $status.network.findings += "Geen Azure Firewall gevonden; overweeg implementatie voor gecentraliseerde netwerkbeveiliging." } } catch { Write-Host " [WARN] Kon netwerkstatus niet volledig valideren: $_" -ForegroundColor Yellow $status.network.findings += "Kon netwerkstatus niet volledig valideren; controleer rechten en Az.Network-module." } # Infrastructuurpijler - Controleer Defender for Cloud en Azure Policy try { # Controleer of Defender for Cloud is ingeschakeld (vereist Az.Security-module) $securityContacts = Get-AzSecurityContact -ErrorAction SilentlyContinue if ($securityContacts) { $status.infrastructure.defenderEnabled = $true Write-Host " Infrastructuurpijler: Defender for Cloud is geconfigureerd" -ForegroundColor Gray } else { $status.infrastructure.findings += "Defender for Cloud is niet geconfigureerd; overweeg implementatie voor workload protection." } # Controleer Azure Policy assignments $policyAssignments = Get-AzPolicyAssignment -ErrorAction SilentlyContinue if ($policyAssignments.Count -gt 0) { $status.infrastructure.policyEnabled = $true Write-Host " Infrastructuurpijler: $($policyAssignments.Count) policy assignments gevonden" -ForegroundColor Gray } else { $status.infrastructure.findings += "Geen Azure Policy assignments gevonden; overweeg implementatie voor consistente beveiligingsconfiguraties." } # Controleer Azure Monitor en Log Analytics $logAnalyticsWorkspaces = Get-AzOperationalInsightsWorkspace -ErrorAction SilentlyContinue if ($logAnalyticsWorkspaces.Count -gt 0) { $status.infrastructure.monitoringEnabled = $true Write-Host " Infrastructuurpijler: $($logAnalyticsWorkspaces.Count) Log Analytics workspace(s) gevonden" -ForegroundColor Gray } else { $status.infrastructure.findings += "Geen Log Analytics workspaces gevonden; overweeg implementatie voor monitoring en logging." } } catch { Write-Host " [WARN] Kon infrastructuurstatus niet volledig valideren: $_" -ForegroundColor Yellow $status.infrastructure.findings += "Kon infrastructuurstatus niet volledig valideren; controleer rechten en benodigde modules." } # Bereken overall score (eenvoudige berekening op basis van beschikbare controles) $scoreComponents = 0 $scoreTotal = 0 if ($status.identity.mfaEnabled) { $scoreComponents++ } if ($status.identity.conditionalAccess) { $scoreComponents++ } $scoreTotal += 2 if ($status.devices.intuneEnabled) { $scoreComponents++ } $scoreTotal += 1 if ($status.data.encryptionEnabled) { $scoreComponents++ } $scoreTotal += 1 if ($status.network.firewallEnabled) { $scoreComponents++ } if ($status.network.privateEndpoints -gt 0) { $scoreComponents++ } $scoreTotal += 2 if ($status.infrastructure.defenderEnabled) { $scoreComponents++ } if ($status.infrastructure.policyEnabled) { $scoreComponents++ } if ($status.infrastructure.monitoringEnabled) { $scoreComponents++ } $scoreTotal += 3 if ($scoreTotal -gt 0) { $status.overallScore = [math]::Round(($scoreComponents / $scoreTotal) * 100, 1) } return $status } function Invoke-Monitoring { <# .SYNOPSIS Voert een read-only Zero Trust-validatie uit .DESCRIPTION Gebruikt statuscontroles om inzicht te geven in de huidige Zero Trust- implementatie per pijler. Dit helpt bij het prioriteren van implementatietrajecten en het identificeren van gaten in de beveiliging. .OUTPUTS Hashtable met samenvattende metrics en status per pijler #> [CmdletBinding()] param() $null = Connect-NbvvcAzContext $status = Get-NbvvcZeroTrustStatus Write-Host "`n========================================" -ForegroundColor Cyan Write-Host "SAMENVATTING ZERO TRUST-STATUS" -ForegroundColor Cyan Write-Host " Overall Score : $($status.overallScore)%" -ForegroundColor White Write-Host "`n Identiteitspijler:" -ForegroundColor Yellow Write-Host " MFA ingeschakeld : $($status.identity.mfaEnabled)" -ForegroundColor Gray Write-Host " Conditional Access : $($status.identity.conditionalAccess)" -ForegroundColor Gray Write-Host "`n Apparaatpijler:" -ForegroundColor Yellow Write-Host " Intune ingeschakeld : $($status.devices.intuneEnabled)" -ForegroundColor Gray Write-Host "`n Datapijler:" -ForegroundColor Yellow Write-Host " Encryptie ingeschakeld: $($status.data.encryptionEnabled)" -ForegroundColor Gray Write-Host "`n Netwerkpijler:" -ForegroundColor Yellow Write-Host " Private Endpoints : $($status.network.privateEndpoints)" -ForegroundColor Gray Write-Host " Firewall ingeschakeld : $($status.network.firewallEnabled)" -ForegroundColor Gray Write-Host "`n Infrastructuurpijler:" -ForegroundColor Yellow Write-Host " Defender ingeschakeld: $($status.infrastructure.defenderEnabled)" -ForegroundColor Gray Write-Host " Policy ingeschakeld : $($status.infrastructure.policyEnabled)" -ForegroundColor Gray Write-Host " Monitoring ingeschakeld: $($status.infrastructure.monitoringEnabled)" -ForegroundColor Gray $allFindings = @() $allFindings += $status.identity.findings $allFindings += $status.devices.findings $allFindings += $status.applications.findings $allFindings += $status.data.findings $allFindings += $status.network.findings $allFindings += $status.infrastructure.findings if ($allFindings.Count -gt 0) { Write-Host "`nAandachtspunten:" -ForegroundColor Yellow foreach ($f in $allFindings) { Write-Host " - $f" -ForegroundColor Yellow } } else { Write-Host "`nGeen specifieke aandachtspunten gedetecteerd op basis van deze scan." -ForegroundColor Green } return @{ status = $status } } function Invoke-Remediation { <# .SYNOPSIS Genereert Zero Trust-aanbevelingen en implementeert ontbrekende controles .DESCRIPTION Op basis van de statusvalidatie worden concrete aanbevelingen gegenereerd voor vervolgstappen zoals het implementeren van ontbrekende Zero Trust-controles. Het script voert configuratiewijzigingen alleen uit na expliciete bevestiging of in WhatIf-modus. #> [CmdletBinding(SupportsShouldProcess)] param( [string]$ReportPath ) if ($WhatIf) { Write-Host "`nWhatIf: er wordt een aanbevelingsrapport gegenereerd op basis van statusvalidatie, maar er vinden geen wijzigingen plaats." -ForegroundColor Yellow } $result = Invoke-Monitoring $status = $result.status $recommendations = @() if (-not $status.identity.mfaEnabled -or -not $status.identity.conditionalAccess) { $recommendations += "Implementeer multi-factor authenticatie en conditional access policies voor alle gebruikers en resources." } if (-not $status.devices.intuneEnabled) { $recommendations += "Implementeer Microsoft Intune voor device compliance en endpoint protection." } if (-not $status.data.encryptionEnabled) { $recommendations += "Schakel encryptie in voor alle storage accounts en databases." } if ($status.network.privateEndpoints -eq 0) { $recommendations += "Implementeer private endpoints voor alle kritieke Azure-services om publieke toegang te voorkomen." } if (-not $status.network.firewallEnabled) { $recommendations += "Implementeer Azure Firewall voor gecentraliseerde netwerkbeveiliging en zero-trust networking." } if (-not $status.infrastructure.defenderEnabled) { $recommendations += "Schakel Microsoft Defender for Cloud in voor workload protection en threat detection." } if (-not $status.infrastructure.policyEnabled) { $recommendations += "Implementeer Azure Policy om Zero Trust-configuraties consistent af te dwingen over alle resources." } if (-not $status.infrastructure.monitoringEnabled) { $recommendations += "Implementeer Azure Monitor en Log Analytics voor monitoring en logging van alle Zero Trust-controles." } if ($recommendations.Count -eq 0) { $recommendations += "Geen specifieke aanbevelingen op basis van deze scan; voer een diepgaand Zero Trust-assessment uit voor kernsystemen." } Write-Host "`nAanbevolen vervolgstappen:" -ForegroundColor Cyan foreach ($rec in $recommendations) { Write-Host " - $rec" -ForegroundColor White } $report = @{ generatedAt = Get-Date subscriptionId = $status.subscriptionId overallScore = $status.overallScore zeroTrust = @{ status = $status recommendations = $recommendations } } $targetPath = $null if ($PSBoundParameters.ContainsKey("ReportPath") -and $ReportPath) { $targetPath = $ReportPath } elseif ($ExportPath) { $targetPath = $ExportPath } if ($targetPath) { if ($PSCmdlet.ShouldProcess($targetPath, "Schrijf Zero Trust-rapport naar JSON-bestand")) { $report | ConvertTo-Json -Depth 6 | Out-File -FilePath $targetPath -Encoding UTF8 Write-Host "`n[OK] Rapport geschreven naar: $targetPath" -ForegroundColor Green } } } function Invoke-Revert { <# .SYNOPSIS Draai implementatiewijzigingen terug .DESCRIPTION Dit script voert configuratiewijzigingen alleen uit na expliciete bevestiging. Revert-functionaliteit is beperkt omdat Zero Trust-implementaties complex zijn en handmatige interventie vereisen. De functie is aanwezig voor consistentie met andere scripts binnen de Nederlandse Baseline voor Veilige Cloud. #> [CmdletBinding(SupportsShouldProcess)] param() Write-Host "`nZero Trust-implementaties vereisen handmatige interventie voor revert-operaties." -ForegroundColor Yellow Write-Host "Raadpleeg de documentatie en Azure-portal voor specifieke revert-stappen per pijler." -ForegroundColor Gray } # ============================================================================ # MAIN EXECUTION # ============================================================================ try { if ($Revert) { Invoke-Revert } elseif ($Remediation) { Invoke-Remediation -ReportPath $ExportPath } elseif ($Monitoring) { $null = Invoke-Monitoring } else { Write-Host "Beschikbare parameters:" -ForegroundColor Yellow Write-Host " -Monitoring : Voer een read-only Zero Trust-validatie uit" -ForegroundColor Gray Write-Host " -Remediation : Genereer Zero Trust-aanbevelingen (geen wijzigingen)" -ForegroundColor Gray Write-Host " -Revert : Beperkte revert-functionaliteit (handmatige interventie vereist)" -ForegroundColor Gray Write-Host " -WhatIf : Toon welke acties logisch zouden zijn zonder uitvoer" -ForegroundColor Gray Write-Host " -ExportPath : Optioneel pad voor JSON-rapport" -ForegroundColor Gray Write-Host "`nVoorbeeld: .\zero-trust-architecture.ps1 -Monitoring" -ForegroundColor Cyan } } catch { Write-Error "Scriptuitvoering mislukt: $_" exit 2 } finally { Write-Host "`n========================================`n" -ForegroundColor Cyan } # Exitcodes: # 0 = Succesvolle uitvoering # 2 = Fout tijdens uitvoering

Risico zonder implementatie

Risico zonder implementatie
Critical: Kritiek - Zonder Zero Trust-architectuur is de organisatie kwetsbaar voor aanvallen die gebruikmaken van verondersteld vertrouwen, wat kan leiden tot volledige compromittering van de cloudomgeving.

Management Samenvatting

Implementeer Zero Trust-architectuur met zes pijlers: identiteit, apparaten, applicaties, data, netwerk en infrastructuur. Essentieel voor NIS2 en BIO compliance. Implementatie: 75 uur.