Zero Trust: Overzicht, Principes En Implementatie Voor Azure-omgevingen In De Nederlandse Publieke Sector

💼 Management Samenvatting

Zero Trust is een fundamenteel 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 Nederlandse overheidsorganisaties die Azure gebruiken, vormt Zero Trust een essentiële basis voor het voldoen aan NIS2-verplichtingen, BIO-normen en moderne beveiligingsstandaarden. Dit index-artikel schetst de overkoepelende principes, pijlers en implementatiestrategieën voor Zero Trust in Azure-omgevingen en fungeert als kapstok voor meer specifieke artikelen over identiteitsbeveiliging, apparaatbeveiliging, netwerksegmentatie en andere Zero Trust-componenten.

Aanbeveling
IMPLEMENT
Risico zonder
Critical
Risk Score
10/10
Implementatie
220u (tech: 120u)
Van toepassing op:
Azure
M365
Hybride cloudomgevingen

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. Zonder Zero Trust-architectuur ontstaat het risico dat organisaties niet kunnen aantonen dat zij voldoen aan NIS2-verplichtingen voor risicobeheersing en BIO-normen voor toegangsbeheer. Dit kan leiden tot niet-naleving van wet- en regelgeving, verhoogde risico's op datalekken en cyberaanvallen, bestuurlijke aansprakelijkheid bij incidenten, en verlies van vertrouwen bij burgers en toezichthouders. 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.

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

Implementatie

Dit index-artikel positioneert Zero Trust binnen de 'Nederlandse Baseline voor Veilige Cloud' en beschrijft hoe organisaties een samenhangend Zero Trust-raamwerk kunnen opbouwen in Azure-omgevingen. We behandelen de zes fundamentele pijlers van Zero Trust: identiteit, apparaten, applicaties, data, netwerk en infrastructuur. Voor elke pijler beschrijven we de principes, concrete Azure-services die kunnen worden ingezet, en hoe de pijlers onderling samenwerken om een robuuste Zero Trust-postuur te creëren. Het artikel fungeert als kapstok voor meer specifieke artikelen over zero trust architectuur, conditional access design, netwerksegmentatie, data classification en andere Zero Trust-componenten. Daarnaast biedt het artikel handvatten voor governance, monitoring en periodieke evaluatie van de Zero Trust-volwassenheid, en beschrijft het hoe Zero Trust aansluit bij NIS2-verplichtingen, BIO-normen en Microsoft's Zero Trust-implementatiegids.

Fundamentele principes van Zero Trust

Zero Trust is gebaseerd op drie fundamentele principes die elk aspect van beveiliging in Azure-omgevingen beïnvloeden. Het eerste principe is 'verify explicitly': elke toegangsaanvraag moet expliciet worden geverifieerd op basis van alle beschikbare contextuele signalen, ongeacht waar de gebruiker zich bevindt of welk apparaat wordt gebruikt. Dit betekent dat organisaties niet langer kunnen vertrouwen op het feit dat iemand zich binnen het bedrijfsnetwerk bevindt, maar dat elke toegangspoging moet worden beoordeeld op basis van identiteit, apparaatstatus, locatie, applicatiecontext, data-classificatie en risicoscore. In Azure wordt dit geïmplementeerd via Conditional Access policies die deze signalen combineren om toegangsbeslissingen te nemen, Identity Protection die risicovolle sign-ins detecteert, en Privileged Identity Management die just-in-time toegang biedt voor beheerdersrollen.

Het tweede principe is 'use least privilege access': gebruikers en services krijgen alleen de minimale toegangsrechten die nodig zijn om hun taken uit te voeren, en deze rechten worden regelmatig geëvalueerd en ingetrokken wanneer zij niet langer nodig zijn. Dit betekent dat organisaties niet langer kunnen volstaan met brede toegangsrechten die 'voor het geval dat' worden verleend, maar dat toegang moet worden beperkt op basis van specifieke taken, tijdsperioden en context. In Azure wordt dit geïmplementeerd via Role-Based Access Control (RBAC) met minimale roltoewijzingen, Privileged Identity Management voor tijdgebonden toegang tot beheerdersrollen, Access Reviews voor regelmatige evaluatie van toegangsrechten, en Application Security Groups voor netwerksegmentatie op basis van workload-tiers.

Het derde principe is 'assume breach': organisaties moeten uitgaan van het scenario dat bedreigingen al aanwezig zijn in de omgeving en daarom beveiligingsmaatregelen implementeren die de impact van een compromittering minimaliseren en de detectietijd verkorten. Dit betekent dat organisaties niet alleen moeten focussen op preventie, maar ook op detectie, respons en herstel. In Azure wordt dit geïmplementeerd via Microsoft Defender for Cloud voor continue threat detection, Azure Monitor en Log Analytics voor uitgebreide logging en monitoring, Network Security Groups en Azure Firewall voor microsegmentatie die laterale beweging beperkt, en geautomatiseerde incident response via Azure Sentinel playbooks. Door uit te gaan van een compromittering worden beveiligingsmaatregelen ontworpen om de schade te beperken, zelfs wanneer preventieve controles falen.

Deze drie principes werken samen om een fundamenteel andere benadering van beveiliging te creëren dan traditionele perimeter-gebaseerde modellen. Waar traditionele modellen uitgaan van vertrouwen binnen de perimeter en wantrouwen buiten de perimeter, gaat Zero Trust uit van wantrouwen overal en verifieert elke interactie expliciet. Dit maakt Zero Trust bijzonder geschikt voor moderne cloudomgevingen waar de perimeter niet langer duidelijk gedefinieerd is, waar gebruikers overal vandaan werken, en waar data zich in verschillende cloudservices bevindt. Voor Nederlandse overheidsorganisaties sluit deze benadering direct aan bij NIS2-verplichtingen die vereisen dat beveiliging wordt toegepast op basis van risicoanalyse en niet op basis van verondersteld vertrouwen, en bij BIO-normen die benadrukken dat toegangsbeheer moet worden gebaseerd op het principe van minimale rechten.

De zes pijlers van Zero Trust in Azure

Zero Trust-architectuur in Azure is gebouwd op zes fundamentele pijlers die elk een specifiek aspect van beveiliging adresseren. De eerste pijler is identiteitsbeveiliging, die ervoor zorgt dat alleen geautoriseerde gebruikers toegang krijgen tot resources. In Azure wordt dit geïmplementeerd via Azure Active Directory of Microsoft Entra ID 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, Identity Protection voor risicogebaseerde detectie, en regelmatige Access Reviews 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 is apparaatbeveiliging, die ervoor zorgt dat alleen gezonde en gecomplieerde apparaten toegang krijgen tot bedrijfsresources. In Azure wordt dit geïmplementeerd via Microsoft Intune 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. 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. Deze pijler voorkomt dat gecompromitteerde of onbeveiligde apparaten toegang krijgen tot bedrijfsresources.

De derde pijler is applicatiebeveiliging, die applicaties beschermt tegen bedreigingen op applicatieniveau. In Azure wordt dit geïmplementeerd via Microsoft Defender for Cloud Apps 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.

De vierde pijler is databeveiliging, die data beschermt tegen ongeautoriseerde toegang en verlies. In Azure wordt dit geïmplementeerd via Azure Information Protection met data classification labels die automatisch worden toegepast op basis van content scanning, Microsoft Purview Data Loss Prevention policies die voorkomen dat gevoelige data onbedoeld wordt gedeeld of geëxporteerd, Conditional Access policies die zijn gekoppeld aan data classification zodat alleen geautoriseerde gebruikers toegang krijgen tot gevoelige data, encryptie met customer-managed keys waar mogelijk, en toegangscontrole op basis van data sensitivity. Deze pijler beschermt data tegen ongeautoriseerde toegang, zelfs wanneer andere Zero Trust-controles falen.

De vijfde pijler is netwerkbeveiliging, die netwerkverkeer isoleert en controleert. In Azure wordt dit geïmplementeerd via microsegmentatie met Network Security Groups en Application Security Groups die netwerkverkeer isoleren op basis van workload-tiers en applicatiegrenzen, Private Endpoints voor alle kritieke Azure-services zodat deze niet via het publieke internet toegankelijk zijn, Azure Firewall voor gecentraliseerde netwerkbeveiliging met zero-trust networking policies die verkeer controleren op basis van identiteit, applicatie en context, en Network Watcher 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 is infrastructuurbeveiliging, die de onderliggende infrastructuur beschermt en ervoor zorgt dat alle Zero Trust-controles effectief kunnen functioneren. In Azure wordt dit geïmplementeerd via Microsoft Defender for Cloud voor alle resources met workload protection, container security en server hardening, Azure Policy om beveiligingsconfiguraties consistent af te dwingen over alle abonnementen en resources, Just-in-time toegang voor virtuele machines en andere beheerinterfaces, en Azure Monitor en Log Analytics voor uitgebreide monitoring en logging van alle Zero Trust-controles. Deze pijler zorgt ervoor dat de onderliggende infrastructuur zelf wordt beschermd en dat alle Zero Trust-controles effectief kunnen functioneren.

Implementatieroadmap: van basis naar volwassen Zero Trust

De implementatie van Zero Trust-architectuur in Azure verloopt zelden in één grote stap, maar groeit geleidelijk van een solide basis naar een geavanceerd, geoptimaliseerd raamwerk. In de eerste fase wordt de fundamentele basis gelegd: multi-factor authenticatie wordt ingeschakeld voor alle gebruikers, basis Conditional Access policies worden geconfigureerd om legacy authentication te blokkeren en MFA af te dwingen, device compliance policies worden opgezet in Microsoft Intune, en Microsoft Defender for Cloud wordt ingeschakeld voor alle resources. Deze basislaag zorgt ervoor dat de belangrijkste Zero Trust-controles vanaf het begin worden toegepast en dat er een duidelijke scheiding is tussen gecomplieerde en niet-gecomplieerde apparaten. In deze fase worden ook de eerste governance-mechanismen ingericht, zoals het opstellen van een Zero Trust-beleid en het definiëren van rollen en verantwoordelijkheden.

In de volgende fase wordt Zero Trust uitgebreid met geavanceerde beveiligingsmaatregelen en contextuele verificatie. Risk-based Conditional Access policies worden geconfigureerd die automatisch extra verificatie vereisen of toegang blokkeren wanneer Identity Protection een risicovolle sign-in detecteert, Privileged Identity Management wordt ingericht voor just-in-time toegang tot beheerdersrollen, data classification wordt geïmplementeerd met Azure Information Protection, Private Endpoints worden geconfigureerd voor kritieke Azure-services, en microsegmentatie wordt toegepast met Network Security Groups en Application Security Groups. In deze fase worden ook monitoring en logging uitgebreid met Azure Monitor, Log Analytics en Microsoft Sentinel voor centrale security monitoring en incident response. Geautomatiseerde Access Reviews worden ingericht om regelmatig te verifiëren dat toegangsrechten nog steeds nodig zijn.

In de volwassenheidsfase wordt Zero Trust geoptimaliseerd en geautomatiseerd. Geavanceerde threat protection wordt ingeschakeld met Microsoft Defender for Cloud Apps, Azure Firewall Premium en Azure API Management voor geavanceerde API-beveiliging. Behavioral analytics en machine learning-gebaseerde detectie helpen om zero-day aanvallen en geavanceerde persistent threats (APT's) vroegtijdig te identificeren. Geautomatiseerde incident response wordt geïmplementeerd via Azure Sentinel playbooks die automatisch reageren op gedetecteerde bedreigingen. Governance wordt volwassen met geautomatiseerde rapportages, dashboards voor bestuurders en geïntegreerde change management processen. Door deze fasering expliciet te maken in een roadmap – met duidelijke mijlpalen, beslismomenten en success criteria – ontstaat voorspelbaarheid voor bestuurders en wordt het eenvoudiger om investeringen, risico's en baten te verantwoorden.

Governance, compliance en relatie met andere artikelen

Governance rond Zero Trust in Azure raakt meerdere disciplines: enterprise architectuur, informatiebeveiliging, cloud governance, compliance en risk management. Zonder een helder governance-model ontstaat het risico dat Zero Trust-controles versnipperd worden geïmplementeerd, dat verschillende teams verschillende standaarden hanteren, en dat niemand zich eigenaar voelt van de integrale Zero Trust-architectuur. Een effectief governance-model benoemt daarom ten minste een CISO of security officer die verantwoordelijk is voor het Zero Trust-beleid en het toezicht op de implementatie, een cloud architect die de technische Zero Trust-architectuur beheert, een security architect die beveiligingsaspecten waarborgt, en expliciete rollen voor identity administrators, device managers, network engineers en operations teams. Deze rollen worden vertaald naar concrete taken: wie keurt nieuwe Zero Trust-controles goed, wie beoordeelt afwijkingen van standaarden, wie beheert de Zero Trust-documentatie, en wie beslist over het uitfaseren van verouderde controles.

Op compliancegebied vormt Zero Trust een kruispunt van verschillende wettelijke kaders. De NIS2-richtlijn vereist dat organisaties passende technische en organisatorische maatregelen treffen voor risicobeheersing en beveiliging op basis van risicoanalyse, waarbij wordt benadrukt dat beveiliging moet worden toegepast op basis van risicoanalyse en niet op basis van verondersteld vertrouwen. De BIO benadrukt in meerdere thema's dat overheidsorganisaties structureel moeten bepalen welke beveiligingsmaatregelen nodig zijn en hoe deze worden geïmplementeerd en gemonitord op basis van risicoanalyse. De AVG vereist dat persoonsgegevens adequaat worden beveiligd en dat organisaties kunnen aantonen welke technische en organisatorische maatregelen zijn genomen. ISO 27001 biedt een internationaal erkend framework voor informatiebeveiligingsmanagement. Deze compliance-vereisten moeten expliciet worden vertaald naar Zero Trust-controles: welke verificatiemethoden worden gebruikt, hoe wordt toegang gecontroleerd, hoe worden logs bewaard, en hoe wordt incident response georganiseerd.

Dit index-artikel moet expliciet worden gelezen in samenhang met andere artikelen binnen de 'Nederlandse Baseline voor Veilige Cloud'. Het artikel over zero trust architectuur beschrijft de concrete implementatie van alle zes Zero Trust-pijlers. Het artikel over conditional access design beschrijft hoe Zero Trust-principes worden toegepast op basis van identiteit en context. Het artikel over netwerksegmentatie beschrijft hoe microsegmentatie wordt geïmplementeerd voor zero-trust networking. Het artikel over data classification beschrijft hoe data wordt geclassificeerd en beschermd. Samen vormen zij een consistent raamwerk: dit index-artikel schetst de overkoepelende lijnen en het governance-kader, terwijl de deelartikelen verdieping bieden op specifieke Zero Trust-componenten en technische implementaties.

Monitoring van Zero Trust-implementatie

Gebruik PowerShell-script index.ps1 (functie Invoke-Monitoring) – Geeft een overzicht van de Zero Trust-implementatiestatus en controleert of alle zes pijlers correct zijn geconfigureerd..

Effectieve monitoring van Zero Trust-implementatie 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 identiteit het percentage gebruikers met MFA en het aantal risk-based sign-ins die zijn geblokkeerd, voor apparaten het percentage compliant devices, voor applicaties het aantal toegestane versus geblokkeerde cloudapplicaties, voor data het percentage data met classification labels, voor netwerk het percentage resources achter private endpoints, en voor infrastructuur het percentage resources met workload protection.

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. Het index-script bij dit artikel inventariseert de belangrijkste Zero Trust-componenten en vertaalt die naar een compacte managementsamenvatting: welke pijlers zijn geïmplementeerd, welke configuraties zijn actief, en voor welke onderdelen aanvullende acties nodig zijn.

Remediatie en volwassenwording van Zero Trust

Gebruik PowerShell-script index.ps1 (functie Invoke-Remediation) – Genereert overzichten van Zero Trust-hiaten en biedt handvatten voor gerichte verbeteracties om de Zero Trust-volwassenheid te verhogen..

Remediatie binnen het Zero Trust-domein betekent in de praktijk dat u gaten dicht tussen de gewenste Zero Trust-status en de werkelijkheid. In veel organisaties bestaan al wel beleidsdocumenten over Zero Trust, maar ontbreekt concrete vastlegging van hoe deze worden vertaald naar Azure-configuraties, welke controles daadwerkelijk zijn geïmplementeerd, en hoe Zero Trust wordt gemonitord en verbeterd. Het index-script ondersteunt remediatie door automatisch te inventariseren waar Zero Trust-controles ontbreken, waar belangrijke configuraties niet zijn toegepast, waar pijlers onvolledig zijn geïmplementeerd, en waar documentatie verouderd of incompleet is. Op basis van deze inventarisatie kunnen gerichte verbeteracties worden gepland en uitgevoerd, waarbij prioriteit wordt gegeven aan de meest kritieke hiaten die de grootste impact hebben op beveiliging en compliance.

Een volwassen Zero Trust-raamwerk groeit stap voor stap door continue verbetering. Na elke monitoringsronde worden de belangrijkste verbeterpunten vastgelegd, van een eigenaar voorzien en ingepland in het reguliere change- of verbeterportfolio. Denk aan het implementeren van ontbrekende Conditional Access policies, het activeren van Identity Protection, het configureren van device compliance policies, het implementeren van data classification, het configureren van private endpoints, of het invoeren van geautomatiseerde monitoring en rapportage. Door de resultaten van het index-script te combineren met de uitkomsten van gespecialiseerde scripts voor specifieke Zero Trust-componenten ontstaat een integraal beeld van de voortgang. Uiteindelijk wordt Zero Trust zo niet alleen een set van technische configuraties en processen, maar een aantoonbaar beheerst en verantwoord ingericht raamwerk dat continu wordt geëvalueerd en verbeterd om te blijven voldoen aan veranderende eisen, dreigingen en regelgeving.

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 Overzicht en Implementatiestatus .DESCRIPTION Dit script ondersteunt Nederlandse overheidsorganisaties bij het monitoren en evalueren van de Zero Trust-implementatiestatus in Azure-omgevingen. Het script geeft een overzicht 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: index.ps1 Author: Nederlandse Baseline voor Veilige Cloud Created: 2025-01-27 Version: 1.0 Related JSON: content/azure/zero-trust/index.json Category: zero-trust Workload: azure .LINK https://github.com/m365-tenant-best-practise .EXAMPLE .\index.ps1 -Monitoring Geeft een overzicht van de Zero Trust-implementatiestatus en controleert of alle zes pijlers correct zijn geconfigureerd. .EXAMPLE .\index.ps1 -Remediation -WhatIf Genereert een rapport met concrete aanbevelingen zonder wijzigingen aan te brengen. .EXAMPLE .\index.ps1 -ExportPath .\zero-trust-overview.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 = "Geeft een overzicht van de Zero Trust-implementatiestatus")] [switch]$Monitoring, [Parameter(HelpMessage = "Genereert overzichten van Zero Trust-hiaten en biedt handvatten voor gerichte verbeteracties")] [switch]$Remediation, [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 Overzicht – Status" -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-NbvvcZeroTrustOverview { <# .SYNOPSIS Verzamelt een overzicht van de Zero Trust-implementatiestatus .DESCRIPTION Haalt een overzicht op van de zes Zero Trust-pijlers: identiteit, apparaten, applicaties, data, netwerk en infrastructuur. De validatie is read-only en bedoeld als input voor managementsamenvattingen en compliance-rapportages. .OUTPUTS Hashtable met Zero Trust-overzicht per pijler #> [CmdletBinding()] param() $overview = @{ timestamp = Get-Date subscriptionId = (Get-AzContext).Subscription.Id subscriptionName = (Get-AzContext).Subscription.Name pillars = @{ identity = @{ status = "Onbekend" implemented = $false keyIndicators = @() findings = @() } devices = @{ status = "Onbekend" implemented = $false keyIndicators = @() findings = @() } applications = @{ status = "Onbekend" implemented = $false keyIndicators = @() findings = @() } data = @{ status = "Onbekend" implemented = $false keyIndicators = @() findings = @() } network = @{ status = "Onbekend" implemented = $false keyIndicators = @() findings = @() } infrastructure = @{ status = "Onbekend" implemented = $false keyIndicators = @() findings = @() } } overallMaturity = "Onbekend" overallScore = 0 keyZeroTrustIndicators = @() } Write-Host "`nInventarisatie van Zero Trust-pijlers (read-only)..." -ForegroundColor Yellow # Identiteitspijler try { Write-Host " Identiteitspijler: Basiscontroles uitgevoerd" -ForegroundColor Gray $overview.pillars.identity.findings += "Azure AD Premium P2 of Microsoft Entra ID P2 is vereist voor volledige Identity Protection-functionaliteit. Controleer licenties en configuratie handmatig." $overview.pillars.identity.keyIndicators += "MFA-percentage gebruikers" $overview.pillars.identity.keyIndicators += "Aantal risk-based sign-ins geblokkeerd" $overview.pillars.identity.keyIndicators += "Aantal Conditional Access policies actief" $overview.pillars.identity.status = "Gedeeltelijk geïmplementeerd" } catch { Write-Host " [WARN] Kon identiteitsstatus niet volledig valideren: $_" -ForegroundColor Yellow $overview.pillars.identity.findings += "Kon identiteitsstatus niet volledig valideren; controleer rechten en Azure AD-connectiviteit." $overview.pillars.identity.status = "Niet gevalideerd" } # Apparaatpijler try { Write-Host " Apparaatpijler: Basiscontroles uitgevoerd" -ForegroundColor Gray $overview.pillars.devices.findings += "Microsoft Intune en Microsoft Defender for Endpoint zijn vereist voor volledige apparaatbeveiliging. Controleer licenties en configuratie handmatig." $overview.pillars.devices.keyIndicators += "Percentage compliant devices" $overview.pillars.devices.keyIndicators += "Aantal apparaten met endpoint protection" $overview.pillars.devices.keyIndicators += "Percentage managed devices" $overview.pillars.devices.status = "Gedeeltelijk geïmplementeerd" } catch { Write-Host " [WARN] Kon apparaatstatus niet volledig valideren: $_" -ForegroundColor Yellow $overview.pillars.devices.findings += "Kon apparaatstatus niet volledig valideren; controleer rechten en Intune-connectiviteit." $overview.pillars.devices.status = "Niet gevalideerd" } # Applicatiepijler try { Write-Host " Applicatiepijler: Basiscontroles uitgevoerd" -ForegroundColor Gray $overview.pillars.applications.findings += "Microsoft Defender for Cloud Apps en Azure API Management zijn vereist voor volledige applicatiebeveiliging. Controleer licenties en configuratie handmatig." $overview.pillars.applications.keyIndicators += "Aantal toegestane versus geblokkeerde cloudapplicaties" $overview.pillars.applications.keyIndicators += "Aantal application protection policy violations" $overview.pillars.applications.keyIndicators += "Percentage applicaties met secure access" $overview.pillars.applications.status = "Gedeeltelijk geïmplementeerd" } catch { Write-Host " [WARN] Kon applicatiestatus niet volledig valideren: $_" -ForegroundColor Yellow $overview.pillars.applications.findings += "Kon applicatiestatus niet volledig valideren; controleer rechten en service-connectiviteit." $overview.pillars.applications.status = "Niet gevalideerd" } # Datapijler 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) { $overview.pillars.data.findings += "$($storageAccounts.Count - $encryptedCount) storage accounts hebben geen encryptie ingeschakeld." } $overview.pillars.data.keyIndicators += "Percentage data met classification labels" $overview.pillars.data.keyIndicators += "Aantal DLP-violations" $overview.pillars.data.keyIndicators += "Percentage data met encryptie" if ($encryptedCount -eq $storageAccounts.Count -and $storageAccounts.Count -gt 0) { $overview.pillars.data.status = "Geïmplementeerd" $overview.pillars.data.implemented = $true } else { $overview.pillars.data.status = "Gedeeltelijk geïmplementeerd" } } catch { Write-Host " [WARN] Kon datastatus niet volledig valideren: $_" -ForegroundColor Yellow $overview.pillars.data.findings += "Kon datastatus niet volledig valideren; controleer rechten en Az.Storage-module." $overview.pillars.data.status = "Niet gevalideerd" } # Netwerkpijler try { $privateEndpoints = Get-AzPrivateEndpoint -ErrorAction SilentlyContinue $overview.pillars.network.keyIndicators += "Percentage resources achter private endpoints: $($privateEndpoints.Count) gevonden" Write-Host " Netwerkpijler: $($privateEndpoints.Count) private endpoints gevonden" -ForegroundColor Gray $firewalls = Get-AzFirewall -ErrorAction SilentlyContinue if ($firewalls.Count -gt 0) { $overview.pillars.network.keyIndicators += "Azure Firewall ingeschakeld: $($firewalls.Count) firewall(s) gevonden" Write-Host " Netwerkpijler: $($firewalls.Count) Azure Firewall(s) gevonden" -ForegroundColor Gray $overview.pillars.network.status = "Gedeeltelijk geïmplementeerd" } else { $overview.pillars.network.findings += "Geen Azure Firewall gevonden; overweeg implementatie voor gecentraliseerde netwerkbeveiliging." $overview.pillars.network.status = "Gedeeltelijk geïmplementeerd" } $overview.pillars.network.keyIndicators += "Percentage netwerkverkeer gecontroleerd door Azure Firewall" $overview.pillars.network.keyIndicators += "Aantal netwerkanomalieën gedetecteerd" } catch { Write-Host " [WARN] Kon netwerkstatus niet volledig valideren: $_" -ForegroundColor Yellow $overview.pillars.network.findings += "Kon netwerkstatus niet volledig valideren; controleer rechten en Az.Network-module." $overview.pillars.network.status = "Niet gevalideerd" } # Infrastructuurpijler try { $securityContacts = Get-AzSecurityContact -ErrorAction SilentlyContinue if ($securityContacts) { $overview.pillars.infrastructure.keyIndicators += "Defender for Cloud is geconfigureerd" Write-Host " Infrastructuurpijler: Defender for Cloud is geconfigureerd" -ForegroundColor Gray $overview.pillars.infrastructure.implemented = $true } else { $overview.pillars.infrastructure.findings += "Defender for Cloud is niet geconfigureerd; overweeg implementatie voor workload protection." } $policyAssignments = Get-AzPolicyAssignment -ErrorAction SilentlyContinue if ($policyAssignments.Count -gt 0) { $overview.pillars.infrastructure.keyIndicators += "$($policyAssignments.Count) policy assignments gevonden" Write-Host " Infrastructuurpijler: $($policyAssignments.Count) policy assignments gevonden" -ForegroundColor Gray $overview.pillars.infrastructure.implemented = $true } else { $overview.pillars.infrastructure.findings += "Geen Azure Policy assignments gevonden; overweeg implementatie voor consistente beveiligingsconfiguraties." } $logAnalyticsWorkspaces = Get-AzOperationalInsightsWorkspace -ErrorAction SilentlyContinue if ($logAnalyticsWorkspaces.Count -gt 0) { $overview.pillars.infrastructure.keyIndicators += "$($logAnalyticsWorkspaces.Count) Log Analytics workspace(s) gevonden" Write-Host " Infrastructuurpijler: $($logAnalyticsWorkspaces.Count) Log Analytics workspace(s) gevonden" -ForegroundColor Gray $overview.pillars.infrastructure.implemented = $true } else { $overview.pillars.infrastructure.findings += "Geen Log Analytics workspaces gevonden; overweeg implementatie voor monitoring en logging." } if ($overview.pillars.infrastructure.implemented) { $overview.pillars.infrastructure.status = "Geïmplementeerd" } else { $overview.pillars.infrastructure.status = "Gedeeltelijk geïmplementeerd" } $overview.pillars.infrastructure.keyIndicators += "Percentage resources met workload protection" $overview.pillars.infrastructure.keyIndicators += "Algehele security score" } catch { Write-Host " [WARN] Kon infrastructuurstatus niet volledig valideren: $_" -ForegroundColor Yellow $overview.pillars.infrastructure.findings += "Kon infrastructuurstatus niet volledig valideren; controleer rechten en benodigde modules." $overview.pillars.infrastructure.status = "Niet gevalideerd" } # Bereken overall maturity $implementedCount = 0 $totalPillars = 6 foreach ($pillar in $overview.pillars.Values) { if ($pillar.implemented) { $implementedCount++ } } if ($implementedCount -eq $totalPillars) { $overview.overallMaturity = "Volwassen" $overview.overallScore = 100 } elseif ($implementedCount -ge ($totalPillars * 0.75)) { $overview.overallMaturity = "Gevorderd" $overview.overallScore = 75 } elseif ($implementedCount -ge ($totalPillars * 0.5)) { $overview.overallMaturity = "Basis" $overview.overallScore = 50 } elseif ($implementedCount -ge ($totalPillars * 0.25)) { $overview.overallMaturity = "Begin" $overview.overallScore = 25 } else { $overview.overallMaturity = "Niet gestart" $overview.overallScore = 0 } # Verzamel Key Zero Trust Indicators foreach ($pillar in $overview.pillars.Values) { $overview.keyZeroTrustIndicators += $pillar.keyIndicators } return $overview } function Invoke-Monitoring { <# .SYNOPSIS Geeft een overzicht van de Zero Trust-implementatiestatus .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. Vertaalt de technische details naar een compacte managementsamenvatting. .OUTPUTS Hashtable met samenvattende metrics en status per pijler #> [CmdletBinding()] param() $null = Connect-NbvvcAzContext $overview = Get-NbvvcZeroTrustOverview Write-Host "`n========================================" -ForegroundColor Cyan Write-Host "ZERO TRUST-OVERZICHT" -ForegroundColor Cyan Write-Host " Abonnement : $($overview.subscriptionName)" -ForegroundColor White Write-Host " Algehele volwassenheid : $($overview.overallMaturity) ($($overview.overallScore)%)" -ForegroundColor White Write-Host "`n Pijler Status:" -ForegroundColor Yellow Write-Host " Identiteit : $($overview.pillars.identity.status)" -ForegroundColor Gray Write-Host " Apparaten : $($overview.pillars.devices.status)" -ForegroundColor Gray Write-Host " Applicaties : $($overview.pillars.applications.status)" -ForegroundColor Gray Write-Host " Data : $($overview.pillars.data.status)" -ForegroundColor Gray Write-Host " Netwerk : $($overview.pillars.network.status)" -ForegroundColor Gray Write-Host " Infrastructuur : $($overview.pillars.infrastructure.status)" -ForegroundColor Gray $allFindings = @() $allFindings += $overview.pillars.identity.findings $allFindings += $overview.pillars.devices.findings $allFindings += $overview.pillars.applications.findings $allFindings += $overview.pillars.data.findings $allFindings += $overview.pillars.network.findings $allFindings += $overview.pillars.infrastructure.findings if ($allFindings.Count -gt 0) { Write-Host "`n Aandachtspunten:" -ForegroundColor Yellow foreach ($f in $allFindings) { Write-Host " - $f" -ForegroundColor Yellow } } else { Write-Host "`n Geen specifieke aandachtspunten gedetecteerd op basis van deze scan." -ForegroundColor Green } Write-Host "`n Key Zero Trust Indicators (KZTI's):" -ForegroundColor Cyan foreach ($ktzi in $overview.keyZeroTrustIndicators) { Write-Host " - $ktzi" -ForegroundColor Gray } return @{ overview = $overview } } function Invoke-Remediation { <# .SYNOPSIS Genereert overzichten van Zero Trust-hiaten en biedt handvatten voor gerichte verbeteracties .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. Ondersteunt remediatie door automatisch te inventariseren waar Zero Trust-controles ontbreken en waar belangrijke configuraties niet zijn toegepast. #> [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 $overview = $result.overview $recommendations = @() $gaps = @() # Identificeer hiaten per pijler if ($overview.pillars.identity.status -ne "Geïmplementeerd") { $gaps += "Identiteitspijler: Implementeer multi-factor authenticatie, Conditional Access policies, Identity Protection en Privileged Identity Management." $recommendations += "Prioriteit Hoog: Versterk identiteitsbeveiliging als fundament voor alle andere Zero Trust-controles." } if ($overview.pillars.devices.status -ne "Geïmplementeerd") { $gaps += "Apparaatpijler: Implementeer Microsoft Intune voor device compliance en Microsoft Defender for Endpoint voor endpoint protection." $recommendations += "Prioriteit Hoog: Zorg dat alleen gezonde en gecomplieerde apparaten toegang krijgen tot bedrijfsresources." } if ($overview.pillars.applications.status -ne "Geïmplementeerd") { $gaps += "Applicatiepijler: Implementeer Microsoft Defender for Cloud Apps en Azure API Management voor applicatiebeveiliging." $recommendations += "Prioriteit Medium: Bescherm applicaties tegen bedreigingen op applicatieniveau." } if ($overview.pillars.data.status -ne "Geïmplementeerd") { $gaps += "Datapijler: Implementeer data classification, Data Loss Prevention en encryptie voor alle gevoelige data." $recommendations += "Prioriteit Hoog: Bescherm data tegen ongeautoriseerde toegang, zelfs wanneer andere controles falen." } if ($overview.pillars.network.status -ne "Geïmplementeerd") { $gaps += "Netwerkpijler: Implementeer private endpoints voor kritieke services, Azure Firewall en netwerksegmentatie." $recommendations += "Prioriteit Medium: Voorkom dat aanvallers via het netwerk toegang krijgen tot resources." } if ($overview.pillars.infrastructure.status -ne "Geïmplementeerd") { $gaps += "Infrastructuurpijler: Implementeer Microsoft Defender for Cloud, Azure Policy en Azure Monitor voor workload protection." $recommendations += "Prioriteit Medium: Zorg dat de onderliggende infrastructuur zelf wordt beschermd." } if ($gaps.Count -eq 0) { $gaps += "Geen specifieke hiaten gedetecteerd op basis van deze scan; voer een diepgaand Zero Trust-assessment uit voor kernsystemen." $recommendations += "Voer een periodieke evaluatie uit om de Zero Trust-volwassenheid te blijven verbeteren." } Write-Host "`n========================================" -ForegroundColor Cyan Write-Host "ZERO TRUST-HIATEN EN AANBEVELINGEN" -ForegroundColor Cyan Write-Host "========================================" -ForegroundColor Cyan Write-Host "`n Geïdentificeerde hiaten:" -ForegroundColor Yellow foreach ($gap in $gaps) { Write-Host " - $gap" -ForegroundColor White } Write-Host "`n Aanbevolen verbeteracties:" -ForegroundColor Cyan foreach ($rec in $recommendations) { Write-Host " - $rec" -ForegroundColor White } $report = @{ generatedAt = Get-Date subscriptionId = $overview.subscriptionId subscriptionName = $overview.subscriptionName overallMaturity = $overview.overallMaturity overallScore = $overview.overallScore zeroTrust = @{ overview = $overview gaps = $gaps 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-overzichtsrapport naar JSON-bestand")) { $report | ConvertTo-Json -Depth 6 | Out-File -FilePath $targetPath -Encoding UTF8 Write-Host "`n[OK] Rapport geschreven naar: $targetPath" -ForegroundColor Green } } } # ============================================================================ # MAIN EXECUTION # ============================================================================ try { if ($Remediation) { Invoke-Remediation -ReportPath $ExportPath } elseif ($Monitoring) { $null = Invoke-Monitoring } else { Write-Host "Beschikbare parameters:" -ForegroundColor Yellow Write-Host " -Monitoring : Geeft een overzicht van de Zero Trust-implementatiestatus" -ForegroundColor Gray Write-Host " -Remediation : Genereert overzichten van Zero Trust-hiaten en verbeteracties" -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: .\index.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, niet-naleving van NIS2 en BIO, bestuurlijke aansprakelijkheid bij incidenten, en verlies van vertrouwen bij burgers en toezichthouders.

Management Samenvatting

Zero Trust is een fundamenteel beveiligingsparadigma dat uitgaat van 'never trust, always verify'. Dit index-artikel schetst de overkoepelende principes, zes pijlers (identiteit, apparaten, applicaties, data, netwerk, infrastructuur) en implementatiestrategieën voor Zero Trust in Azure-omgevingen. Essentieel voor NIS2 en BIO compliance. Implementatie: 220 uur.