Azure Data Sovereignty: Strategie En Implementatie Voor Gegevenssoevereiniteit In De Publieke Sector

💼 Management Samenvatting

Data sovereignty in Azure is een fundamenteel vereiste voor Nederlandse overheidsorganisaties die volledige controle en transparantie moeten hebben over waar hun gegevens worden opgeslagen, verwerkt en wie er toegang toe heeft. Deze index pagina biedt een uitgebreid overzicht van strategieën en implementatie-aanpakken voor gegevenssoevereiniteit in Azure en Microsoft 365, met specifieke aandacht voor de vereisten uit de Baseline Informatiebeveiliging Overheid (BIO), de NIS2 richtlijn en de Algemene Verordening Gegevensbescherming (AVG).

Aanbeveling
IMPLEMENT
Risico zonder
High
Risk Score
9/10
Implementatie
220u (tech: 100u)
Van toepassing op:
Azure Tenant
Azure Subscriptions
Microsoft 365

Nederlandse overheidsorganisaties worden geconfronteerd met toenemende eisen rondom gegevenssoevereiniteit en data residency. De Baseline Informatiebeveiliging Overheid (BIO) vereist dat overheidsgegevens bij voorkeur binnen Nederland worden opgeslagen, terwijl de AVG strikte voorwaarden stelt aan internationale overdrachten van persoonsgegevens. De NIS2 richtlijn verlangt dat kritieke infrastructuurgegevens binnen de Europese Unie blijven. Zonder een doordachte data sovereignty strategie ontstaat het risico dat gegevens onbedoeld in niet-EU regio's terechtkomen, dat organisaties niet kunnen aantonen waar gegevens zich bevinden, dat er schendingen plaatsvinden van contractuele verplichtingen met klanten en partners, en dat toezichthouders boetes opleggen of verplichte herstelmaatregelen eisen. Bovendien kunnen datalekken of incidenten waarbij gegevens buiten de geografische grenzen komen leiden tot ernstige reputatieschade, verlies van vertrouwen bij burgers en bestuurlijke aansprakelijkheid.

PowerShell Modules Vereist
Primary API: Azure API, Azure Policy, Microsoft Graph API
Connection: Connect-AzAccount, Connect-MgGraph
Required Modules: Az.Accounts, Az.Resources, Az.PolicyInsights, Microsoft.Graph.Identity.DirectoryManagement, Microsoft.Graph.Users

Implementatie

Dit index-artikel fungeert als centrale verzamelplaats voor alle data sovereignty gerelateerde artikelen binnen de Azure-domein van de 'Nederlandse Baseline voor Veilige Cloud'. We behandelen de belangrijkste aspecten van gegevenssoevereiniteit: het begrijpen van het verschil tussen data residency en data sovereignty, de configuratie van Azure-regio's en resource placement policies, de implementatie van de EU Data Boundary voor Microsoft 365, de evaluatie van sovereign cloud opties zoals Azure Government, het beheer van grensoverschrijdende gegevensoverdrachten en standaardcontractuele clausules, het monitoren en controleren van geografische locaties van resources en gegevens, en het documenteren van gegevensstromen voor audit- en compliance-doeleinden. Het artikel verbindt specifieke implementatie-artikelen en biedt handvatten voor het opzetten van een volwassen data sovereignty framework dat voldoet aan Nederlandse en Europese wet- en regelgeving.

Fundamenten van data sovereignty in de publieke sector

Data sovereignty gaat verder dan alleen data residency. Waar data residency vooral focust op de fysieke locatie waar gegevens worden opgeslagen, omvat data sovereignty ook de juridische, bestuurlijke en technische controle die een organisatie heeft over haar gegevens. Voor Nederlandse overheidsorganisaties betekent dit dat zij niet alleen moeten weten waar gegevens staan, maar ook moeten kunnen garanderen dat deze gegevens vallen onder Nederlandse en Europese rechtsmacht, dat toegang wordt gecontroleerd volgens Nederlandse wet- en regelgeving, en dat gegevens kunnen worden verwijderd of gemigreerd wanneer dat nodig is, zonder afhankelijk te zijn van buitenlandse jurisdicties. Dit principe is vooral belangrijk voor gevoelige overheidsgegevens, persoonsgegevens van burgers, en informatie die betrekking heeft op nationale veiligheid of vitale infrastructuur.

De Baseline Informatiebeveiliging Overheid (BIO) legt in norm 11.01.01 expliciet vast dat overheidsgegevens bij voorkeur binnen Nederland moeten worden opgeslagen en verwerkt. Deze norm is gebaseerd op het principe dat Nederlandse overheidsorganisaties verantwoordelijk zijn voor de gegevens van burgers en dat deze verantwoordelijkheid niet kan worden overgedragen aan jurisdicties waar Nederlandse wetten niet direct van toepassing zijn. Voor zeer gevoelige gegevens, zoals geclassificeerde informatie, politiegegevens of financiële gegevens van burgers, is opslag binnen Nederland niet alleen een voorkeur maar een verplichting. Voor minder gevoelige gegevens kan worden uitgeweken naar andere EU-lidstaten, maar dit moet worden gedocumenteerd en gemotiveerd in een risicoanalyse die aantoont dat de bescherming van gegevens voldoende is gewaarborgd.

De Algemene Verordening Gegevensbescherming (AVG) stelt in artikelen 44 tot en met 50 strenge voorwaarden aan internationale overdrachten van persoonsgegevens. Na het Schrems II-arrest van het Europese Hof van Justitie zijn organisaties zelf verantwoordelijk voor het verifiëren dat passende waarborgen daadwerkelijk effectief zijn wanneer gegevens buiten de Europese Economische Ruimte (EER) worden overgedragen. Dit betekent dat het simpelweg gebruiken van standaardcontractuele clausules (SCC's) niet voldoende is; organisaties moeten ook beoordelen of de wetgeving in het ontvangende land voldoende bescherming biedt tegen toegang door overheidsdiensten. Voor veel organisaties is de meest praktische en veilige oplossing daarom om gegevens gewoon binnen de EU te houden, waardoor deze complexe beoordeling niet nodig is en het risico op schending van de AVG wordt geminimaliseerd.

De NIS2 richtlijn versterkt de eisen rondom gegevenssoevereiniteit voor operators van essentiële diensten en belangrijke entiteiten. Organisaties die onder deze richtlijn vallen, zoals energiebedrijven, financiële instellingen, gezondheidszorgorganisaties en digitale dienstverleners, moeten ervoor zorgen dat kritieke infrastructuurgegevens binnen de EU blijven, niet alleen voor opslag maar ook voor verwerking. Dit betekent dat cloud-services die kritieke infrastructuur ondersteunen, geconfigureerd moeten worden met expliciete regionale beperkingen en dat organisaties moeten kunnen aantonen dat gegevens en verwerkingen binnen de EU plaatsvinden. De NIS2-richtlijn versterkt hiermee de trend naar Europese data sovereignty en maakt duidelijk dat gegevenssoevereiniteit geen optionele best practice is, maar een verplichte vereiste voor organisaties in kritieke sectoren.

Microsoft erkent het belang van data sovereignty en biedt verschillende opties om hieraan tegemoet te komen. De EU Data Boundary garandeert dat klantgegevens binnen de Europese Unie blijven voor alle Microsoft 365, Azure, Power Platform en Dynamics 365 services. Voor organisaties die extra garanties nodig hebben, biedt Microsoft sovereign cloud opties zoals Azure Government, dat specifiek is ontworpen voor overheidsorganisaties en extra isolatie en compliance-certificeringen biedt. Daarnaast zijn er initiatieven voor Europese cloud infrastructuren waarbij gegevens volledig onder Europese jurisdictie blijven. Het is belangrijk dat organisaties deze opties evalueren op basis van hun specifieke vereisten en risicoprofiel, en dat zij begrijpen welke garanties elke optie biedt en welke beperkingen dit met zich meebrengt.

Implementatieframework: van strategie naar praktijk

Het implementeren van een volwassen data sovereignty framework begint met het formuleren van een duidelijke strategie die is gebaseerd op wettelijke vereisten, risicoanalyses en bestuurlijke afwegingen. Deze strategie moet expliciet maken welke gegevens binnen Nederland moeten blijven, welke gegevens binnen de EU kunnen worden opgeslagen, en welke gegevens eventueel buiten de EU mogen worden verwerkt met passende waarborgen. De strategie moet ook beschrijven hoe deze vereisten worden vertaald naar concrete technische configuraties in Azure en Microsoft 365, welke processen worden ingericht om compliance te monitoren en te handhaven, en hoe afwijkingen worden behandeld. Door deze strategie vast te leggen in een formeel beleidsdocument, creëert de organisatie een heldere basis voor alle technische en organisatorische maatregelen die vervolgens worden geïmplementeerd.

Voor Azure betekent data sovereignty implementatie in de eerste plaats het configureren van Azure Policy regels die alleen implementaties toestaan in goedgekeurde regio's. Dit begint bij het identificeren van welke Azure-regio's geschikt zijn voor de organisatie. Voor Nederlandse overheidsorganisaties zijn dit typisch West-Europa (Nederland) en mogelijk Noord-Europa (Ierland) als secundaire optie. Deze regio's moeten worden vastgelegd in een policy definition die wordt toegepast op management groups of subscriptions, met een DenyAction die automatisch voorkomt dat resources in niet-toegestane regio's worden aangemaakt. Daarnaast moeten bestaande resources worden geïnventariseerd en gecontroleerd op compliance, waarbij niet-conforme resources worden gemarkeerd voor migratie of uitzondering met documentatie en risicoacceptatie.

Voor Microsoft 365 begint data sovereignty met het verifiëren en configureren van de tenant-regio. De tenant-regio wordt bepaald tijdens het aanmaken van de tenant en kan niet achteraf worden gewijzigd zonder een volledige migratie. Organisaties moeten daarom bij het opzetten van een nieuwe tenant expliciet kiezen voor de EU-geografie. Voor bestaande tenants moet worden gecontroleerd waar de tenant-regio zich bevindt en of dit voldoet aan de vereisten. Microsoft biedt de EU Data Boundary functionaliteit die garandeert dat klantgegevens voor alle Microsoft 365 services binnen de EU blijven. Deze functionaliteit moet expliciet worden geactiveerd en gemonitord om te verifiëren dat alle services en functies binnen de boundary vallen. Voor organisaties die geavanceerde controle nodig hebben over waar specifieke gebruikersgegevens worden opgeslagen, kan Microsoft 365 Multi-Geo worden overwogen, hoewel dit aanvullende licenties en complexiteit met zich meebrengt.

Een kritiek aspect van data sovereignty is het beheren van geografische replicatie en back-up configuraties. Veel Azure-services bieden standaard geo-redundante opslag of replicatie naar secundaire regio's voor hoge beschikbaarheid en disaster recovery. Voor data sovereignty moet worden gecontroleerd of deze secundaire regio's ook binnen de toegestane geografische grenzen vallen. Opslagaccounts moeten bijvoorbeeld worden geconfigureerd met LRS (Local Redundant Storage) of ZRS (Zone Redundant Storage) binnen dezelfde regio, in plaats van GRS (Geo Redundant Storage) die naar een secundaire regio repliceert. Azure SQL Database actieve geo-replicatie moet worden uitgeschakeld of beperkt tot EU-regio's. Azure Cosmos DB multi-region deployments moeten expliciete regionale beperkingen hebben. Deze configuraties moeten worden geverifieerd bij het aanmaken van nieuwe resources en regelmatig worden gecontroleerd bij bestaande resources, omdat wijzigingen in replicatie-instellingen kunnen leiden tot onbedoelde gegevensoverdrachten buiten de toegestane grenzen.

Monitoring en controle vormen het sluitstuk van een volwassen data sovereignty framework. Organisaties moeten continu kunnen verifiëren dat alle resources en gegevens zich binnen de toegestane geografische grenzen bevinden. Dit vereist geautomatiseerde monitoring via Azure Policy compliance checks, Azure Resource Graph queries om resources te inventariseren en te controleren op regionale compliance, en regelmatige audits van gegevenslocaties in Microsoft 365 via het Admin Center en Microsoft Graph API. Het bijbehorende PowerShell-script biedt functionaliteit om deze controles uit te voeren, resources te identificeren die niet voldoen aan regionale vereisten, en rapportages te genereren voor compliance- en audit-doeleinden. Door deze monitoring te integreren in reguliere governance-processen en dashboards te creëren die de compliance-status real-time tonen, wordt data sovereignty geen eenmalige configuratie maar een continu bewaakte en verbeterde capability.

Monitoring, verificatie en continue bewaking

Gebruik PowerShell-script index.ps1 (functie Invoke-Monitoring) – Voert een uitgebreide controle uit van de data sovereignty status in Azure en Microsoft 365, inclusief verificatie van resource locaties, Azure Policy compliance, Microsoft 365 tenant-regio configuratie en geografische replicatie-instellingen..

Effectieve monitoring van data sovereignty vereist een combinatie van geautomatiseerde controles en periodieke handmatige verificaties. Azure Policy biedt de mogelijkheid om automatisch te controleren of resources voldoen aan regionale beperkingen, maar deze controles moeten worden aangevuld met actieve inventarisaties van alle resources in de Azure-omgeving. Het bijbehorende monitoring-script gebruikt Azure Resource Graph om alle resources te queryen, hun geografische locaties te identificeren, en te beoordelen of deze voldoen aan de geconfigureerde data sovereignty vereisten. Het script genereert gedetailleerde rapportages die per subscription, resource group en resource type laten zien welke resources compliant zijn en welke niet, wat essentieel is voor gerichte remediatie en risicomanagement.

Voor Microsoft 365 omvat monitoring het verifiëren van de tenant-regio configuratie, het controleren of de EU Data Boundary is geactiveerd en correct functioneert, en het inventariseren van waar gebruikersgegevens daadwerkelijk worden opgeslagen. Dit kan worden gecontroleerd via het Microsoft 365 Admin Center, waar organisatie-instellingen de geografische locatie van de tenant tonen, en via Microsoft Graph API voor programmatische verificatie. Daarnaast moeten organisaties regelmatig controleren welke Microsoft 365 services en functies mogelijk gegevens buiten de EU verwerken, bijvoorbeeld voor AI-features of geavanceerde analytics, en expliciete keuzes maken over het gebruik van deze functies op basis van data sovereignty vereisten.

Een belangrijk aspect van data sovereignty monitoring is het identificeren van onbedoelde geografische replicatie of back-up configuraties die gegevens buiten de toegestane grenzen kunnen brengen. Dit vereist regelmatige controles van opslagaccount redundantie-instellingen, database replicatie-configuraties, back-up policies en disaster recovery configuraties. Het monitoring-script kan deze configuraties controleren en waarschuwingen genereren wanneer replicatie-instellingen niet voldoen aan de data sovereignty vereisten. Daarnaast moeten organisaties alert zijn op wijzigingen in service configuraties, nieuwe resource deployments en wijzigingen in bestaande resources die mogelijk impact hebben op geografische locaties van gegevens.

Rapportage is een essentieel onderdeel van data sovereignty monitoring. Bestuurders, compliance officers en auditors moeten regelmatig kunnen zien wat de status is van data sovereignty compliance, welke resources niet voldoen en welke acties zijn ondernomen om compliance te verbeteren. Het monitoring-script genereert gedetailleerde rapportages die kunnen worden gebruikt voor compliance-dashboards, audit-documentatie en bestuurlijke rapportages. Deze rapportages moeten ook worden gebruikt voor trendanalyse: door de compliance-status over tijd te monitoren kunnen organisaties zien of zij vooruitgang boeken, of er nieuwe risico's ontstaan, en of de geïmplementeerde maatregelen effectief zijn. Door deze rapportages te koppelen aan dashboards en ze op te nemen in reguliere governance-overleggen, wordt data sovereignty een integraal onderdeel van de organisatiebrede compliance- en risicomanagement-processen.

Remediatie en herstel van data sovereignty compliance

Gebruik PowerShell-script index.ps1 (functie Invoke-Remediation) – Biedt handvatten en automatiseringsopties voor het herstellen van data sovereignty compliance, inclusief het toepassen van Azure Policies voor regionale beperkingen, het configureren van Microsoft 365 EU Data Boundary, en het identificeren van resources die migratie of configuratiewijziging vereisen..

Remediatie van data sovereignty compliance-hiaten begint met een grondige analyse van de bevindingen uit monitoring. Niet alle resources die niet voldoen aan regionale vereisten kunnen zomaar worden verplaatst of gewijzigd; sommige resources kunnen afhankelijkheden hebben die migratie complex maken, andere kunnen actief worden gebruikt in productie-omgevingen waar downtime niet acceptabel is. Het is daarom belangrijk om een gestructureerde aanpak te volgen waarbij eerst een risicoanalyse wordt uitgevoerd: welke resources vormen het grootste risico op schending van data sovereignty vereisten, wat is de impact van niet-compliance, en wat zijn de opties voor remediatie? Op basis van deze analyse kunnen resources worden geprioriteerd en kunnen migratie- of configuratieplannen worden opgesteld die rekening houden met business impact, technische complexiteit en beschikbare resources.

Voor nieuwe resources kan remediatie relatief eenvoudig zijn door Azure Policy regels te implementeren die automatisch voorkomen dat resources in niet-toegestane regio's worden aangemaakt. Deze policies moeten worden toegepast op management groups of subscriptions en moeten een DenyAction hebben zodat implementaties worden geblokkeerd in plaats van alleen geaudit. Het remediatie-script kan helpen bij het implementeren van deze policies door automatisch de juiste policy definitions te selecteren, te configureren met de toegestane regio's (bijvoorbeeld alleen West-Europa en Noord-Europa), en toe te wijzen aan de juiste scopes. Voor bestaande resources die niet voldoen, kan het script een inventarisatie genereren van resources die migratie vereisen, inclusief informatie over resource types, dependencies, en geschatte inspanning voor migratie.

Voor Microsoft 365 is remediatie complexer omdat de tenant-regio niet kan worden gewijzigd zonder een volledige tenant-migratie, wat een zeer grote operatie is. Voor bestaande tenants die niet in de EU-regio staan, moet daarom worden geëvalueerd of migratie haalbaar en noodzakelijk is, of dat alternatieve maatregelen zoals het gebruik van standaardcontractuele clausules en aanvullende waarborgen voldoende zijn. Voor tenants die wel in de EU staan maar waar de EU Data Boundary nog niet is geactiveerd, kan het remediatie-script helpen bij het activeren van deze functionaliteit en het verifiëren dat alle services binnen de boundary vallen. Voor organisaties die Multi-Geo gebruiken, moet worden gecontroleerd of gegevenslocaties voor alle gebruikers voldoen aan de vereisten en of configuraties correct zijn.

Geografische replicatie configuraties vormen een veelvoorkomende bron van data sovereignty risico's. Veel organisaties realiseren zich niet dat geo-redundante opslag of database replicatie gegevens naar secundaire regio's kan brengen die buiten de toegestane grenzen vallen. Remediatie vereist daarom een systematische controle van alle opslagaccounts, databases en andere resources die replicatie ondersteunen. Het remediatie-script kan helpen bij het identificeren van deze resources en het genereren van aanbevelingen voor het wijzigen van replicatie-instellingen naar LRS, ZRS of beperkte geo-replicatie binnen toegestane regio's. Het is belangrijk om te benadrukken dat wijzigingen in replicatie-instellingen impact kunnen hebben op beschikbaarheid en disaster recovery capaciteit, dus deze wijzigingen moeten worden geëvalueerd in samenhang met business continuity requirements en moeten worden getest voordat ze in productie worden geïmplementeerd.

Na remediatie is verificatie essentieel om te bevestigen dat wijzigingen daadwerkelijk hebben geleid tot verbeterde compliance. Het monitoring-script moet opnieuw worden uitgevoerd na elke remediatie-ronde om te verifiëren dat resources nu voldoen aan de vereisten en dat nieuwe configuraties correct zijn geïmplementeerd. Deze verificatie moet worden gedocumenteerd voor audit-doeleinden en moet worden gebruikt om te leren van de remediatie-processen en deze te verbeteren voor toekomstige implementaties. Door remediatie en verificatie te integreren in een continue verbetercyclus, wordt data sovereignty niet alleen een eenmalige compliance-check maar een blijvende capability die wordt gemonitord, verbeterd en onderhouden als onderdeel van de reguliere cloud governance-processen.

Governance en relatie met andere artikelen

Data sovereignty is geen geïsoleerde discipline, maar moet worden ingebed in een breder governance-raamwerk dat cloud architectuur, compliance management, risicomanagement en change management met elkaar verbindt. Zonder duidelijke governance ontstaat het risico dat data sovereignty wordt gezien als een technische configuratie die eenmalig wordt ingesteld, in plaats van een strategisch principe dat doorlopend wordt bewaakt en verbeterd. Een effectief governance-model benoemt daarom expliciete rollen en verantwoordelijkheden: wie is eindverantwoordelijk voor data sovereignty (vaak de CISO of data protection officer), wie beheert Azure Policies en regionale configuraties (vaak een cloud architect of security architect), wie voert data sovereignty assessments uit (vaak compliance of internal audit), en wie rapporteert richting bestuur en toezichthouders? Deze rollen worden vertaald naar concrete taken en processen die vastgelegd worden in governance-documenten en die worden geïntegreerd in reguliere governance-overleggen en besluitvormingsprocessen.

Dit index-artikel moet expliciet worden gelezen in samenhang met andere artikelen binnen de 'Nederlandse Baseline voor Veilige Cloud'. Het artikel over data residency controls beschrijft de technische configuraties voor het beperken van geografische locaties van gegevens in Azure. Het artikel over EU Data Boundary configuratie gaat dieper in op het activeren en verifiëren van Microsoft's EU Data Boundary voor Microsoft 365 services. Het artikel over government cloud opties behandelt de keuzes die organisaties hebben tussen publieke Azure, Azure Government en andere sovereign cloud opties. Het artikel over compliance automation beschrijft hoe geautomatiseerde controles en policies kunnen worden gebruikt om data sovereignty compliance continu te bewaken en af te dwingen. Het artikel over data processing agreements behandelt de contractuele aspecten van data sovereignty, inclusief standaardcontractuele clausules en gegevensverwerkingsovereenkomsten met cloud providers en andere processors. Samen vormen deze artikelen een compleet beeld: dit index-artikel schetst de overkoepelende strategie en het governance-kader, terwijl de deelartikelen verdieping bieden op specifieke aspecten en technische implementaties.

Voor auditors en toezichthouders is vooral van belang dat de samenhang tussen data sovereignty strategie, technische configuraties, monitoring en remediatie aantoonbaar is. Dat betekent dat organisaties niet alleen beleidsdocumenten moeten hebben over data sovereignty, maar ook concreet moeten kunnen laten zien welke Azure Policies zijn toegepast voor regionale beperkingen, hoe Microsoft 365 is geconfigureerd voor EU Data Boundary, welke resources waar zijn geplaatst, hoe vaak compliance-assessments worden uitgevoerd, en welke verbeteracties zijn ondernomen. De in dit domein beschreven PowerShell-scripts – waaronder het index-script bij dit artikel en de scripts voor specifieke data sovereignty-aspecten – helpen om deze informatie snel en reproduceerbaar te verzamelen. Door hun output te koppelen aan dashboards en rapportages wordt data sovereignty niet beperkt tot papieren documenten, maar ondersteund door actuele operationele data die aantoonbaar maakt dat het data sovereignty framework daadwerkelijk wordt nageleefd, gemonitord en verbeterd. Dit vormt de basis voor vertrouwen bij toezichthouders, het bestuur en burgers, en helpt om data sovereignty te positioneren als een proactieve, waarde-toevoegende capability die bijdraagt aan de bescherming van gevoelige overheidsgegevens en persoonsgegevens van burgers.

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 Data Sovereignty Monitoring en Remediatie .DESCRIPTION Controleert en handhaaft data sovereignty compliance in Azure en Microsoft 365 voor Nederlandse overheidsorganisaties conform BIO, NIS2 en AVG vereisten. .NOTES Author: Nederlandse Baseline voor Veilige Cloud Version: 1.0 Related JSON: content/azure/data-sovereignty/index.json #> #Requires -Version 5.1 #Requires -Modules Az.Accounts, Az.Resources, Az.PolicyInsights #Requires -Modules Microsoft.Graph.Identity.DirectoryManagement -ErrorAction SilentlyContinue [CmdletBinding()] param( [Parameter()][switch]$Monitoring, [Parameter()][switch]$Remediation, [Parameter()][switch]$Revert, [Parameter()][switch]$WhatIf ) $ErrorActionPreference = 'Stop' $script:PolicyName = "Azure Data Sovereignty" $script:AllowedRegions = @("westeurope", "northeurope") $script:AllowedRegionDisplayNames = @("West Europe", "North Europe") $script:ComplianceThreshold = 95 function Connect-RequiredServices { try { if (-not (Get-AzContext)) { Write-Host "Verbinden met Azure..." -ForegroundColor Yellow Connect-AzAccount -ErrorAction Stop | Out-Null } Write-Verbose "Azure verbinding: OK" if (-not (Get-MgContext)) { Write-Host "Verbinden met Microsoft Graph..." -ForegroundColor Yellow Connect-MgGraph -Scopes "Organization.Read.All", "User.Read.All" -ErrorAction SilentlyContinue } if (Get-MgContext) { Write-Verbose "Microsoft Graph verbinding: OK" } else { Write-Verbose "Microsoft Graph verbinding: Optioneel (niet beschikbaar)" } } catch { Write-Warning "Fout bij verbinden met services: $_" throw } } function Get-AzureResourceLocations { try { Write-Host " Inventariseren van Azure resources..." -ForegroundColor Gray $resources = Search-AzGraph -Query "Resources | project id, name, type, location, subscriptionId, resourceGroup" -ErrorAction Stop $locationAnalysis = @{ TotalResources = 0 CompliantResources = 0 NonCompliantResources = 0 ResourcesByRegion = @{} NonCompliantDetails = @() } foreach ($resource in $resources) { $locationAnalysis.TotalResources++ $location = $resource.location.ToLower() if (-not $locationAnalysis.ResourcesByRegion.ContainsKey($location)) { $locationAnalysis.ResourcesByRegion[$location] = 0 } $locationAnalysis.ResourcesByRegion[$location]++ if ($script:AllowedRegions -contains $location) { $locationAnalysis.CompliantResources++ } else { $locationAnalysis.NonCompliantResources++ $locationAnalysis.NonCompliantDetails += [PSCustomObject]@{ ResourceId = $resource.id Name = $resource.name Type = $resource.type Location = $resource.location SubscriptionId = $resource.subscriptionId ResourceGroup = $resource.resourceGroup } } } return $locationAnalysis } catch { Write-Warning "Fout bij inventariseren van resources: $_" return $null } } function Get-AzurePolicyCompliance { try { Write-Host " Controleren van Azure Policy compliance..." -ForegroundColor Gray $subscriptions = Get-AzSubscription -ErrorAction Stop $policyCompliance = @{ TotalPolicies = 0 CompliantPolicies = 0 NonCompliantResources = 0 PolicyDetails = @() } foreach ($sub in $subscriptions) { Set-AzContext -SubscriptionId $sub.Id -ErrorAction SilentlyContinue | Out-Null $assignments = Get-AzPolicyAssignment -ErrorAction SilentlyContinue | Where-Object { $_.Properties.DisplayName -like "*location*" -or $_.Properties.DisplayName -like "*region*" -or $_.Properties.DisplayName -like "*allowed locations*" } foreach ($assignment in $assignments) { $policyCompliance.TotalPolicies++ $states = Get-AzPolicyState -PolicyAssignmentName $assignment.Name -ErrorAction SilentlyContinue $compliant = ($states | Where-Object { $_.ComplianceState -eq "Compliant" }).Count $nonCompliant = ($states | Where-Object { $_.ComplianceState -ne "Compliant" }).Count $policyCompliance.PolicyDetails += [PSCustomObject]@{ PolicyName = $assignment.Properties.DisplayName PolicyId = $assignment.ResourceId Subscription = $sub.Name Compliant = $compliant NonCompliant = $nonCompliant } $policyCompliance.NonCompliantResources += $nonCompliant if ($nonCompliant -eq 0 -and $compliant -gt 0) { $policyCompliance.CompliantPolicies++ } } } return $policyCompliance } catch { Write-Warning "Fout bij controleren van Policy compliance: $_" return $null } } function Get-M365TenantRegion { try { if (-not (Get-MgContext)) { Write-Verbose "Microsoft Graph niet beschikbaar, M365 tenant-regio controle wordt overgeslagen" return $null } Write-Host " Controleren van Microsoft 365 tenant-regio..." -ForegroundColor Gray $org = Get-MgOrganization -ErrorAction Stop | Select-Object -First 1 $tenantInfo = @{ TenantId = $org.Id TenantName = $org.DisplayName VerifiedDomains = $org.VerifiedDomains } # EU Data Boundary verificatie vereist handmatige controle via Admin Center # Graph API biedt geen directe locatie-informatie $tenantInfo.EUDataBoundaryNote = "Verifieer handmatig via M365 Admin Center > Organisatie-instellingen > Organisatieprofiel" return $tenantInfo } catch { Write-Verbose "M365 tenant-regio controle niet beschikbaar: $_" return $null } } function Invoke-Monitoring { Write-Host "`n========================================" -ForegroundColor Cyan Write-Host "$script:PolicyName - Monitoring" -ForegroundColor Cyan Write-Host "========================================" -ForegroundColor Cyan try { Connect-RequiredServices $results = @{ IsCompliant = $false CompliancePercentage = 0 Details = @() } # Azure Resource Locations $resourceAnalysis = Get-AzureResourceLocations if ($resourceAnalysis) { Write-Host "`nAzure Resource Locaties:" -ForegroundColor Yellow Write-Host " Totaal resources: $($resourceAnalysis.TotalResources)" -ForegroundColor Gray Write-Host " Compliant (EU): $($resourceAnalysis.CompliantResources)" -ForegroundColor Green Write-Host " Non-compliant: $($resourceAnalysis.NonCompliantResources)" -ForegroundColor $(if ($resourceAnalysis.NonCompliantResources -gt 0) { "Red" } else { "Green" }) Write-Host "`n Resources per regio:" -ForegroundColor Gray foreach ($region in $resourceAnalysis.ResourcesByRegion.GetEnumerator() | Sort-Object Value -Descending) { $isAllowed = $script:AllowedRegions -contains $region.Key $color = if ($isAllowed) { "Green" } else { "Red" } Write-Host " $($region.Key): $($region.Value) resources" -ForegroundColor $color } if ($resourceAnalysis.NonCompliantResources -gt 0) { Write-Host "`n Non-compliant resources:" -ForegroundColor Red $resourceAnalysis.NonCompliantDetails | Select-Object -First 10 | ForEach-Object { Write-Host " - $($_.Name) ($($_.Type)) in $($_.Location)" -ForegroundColor Red } if ($resourceAnalysis.NonCompliantDetails.Count -gt 10) { Write-Host " ... en $($resourceAnalysis.NonCompliantDetails.Count - 10) meer" -ForegroundColor Red } } if ($resourceAnalysis.TotalResources -gt 0) { $compliancePercentage = ($resourceAnalysis.CompliantResources / $resourceAnalysis.TotalResources) * 100 $results.CompliancePercentage = $compliancePercentage $results.IsCompliant = $compliancePercentage -ge $script:ComplianceThreshold $results.Details += "Azure Resources: $($resourceAnalysis.CompliantResources)/$($resourceAnalysis.TotalResources) compliant ($([math]::Round($compliancePercentage, 1))%)" } } # Azure Policy Compliance $policyCompliance = Get-AzurePolicyCompliance if ($policyCompliance) { Write-Host "`nAzure Policy Compliance:" -ForegroundColor Yellow Write-Host " Region policies gevonden: $($policyCompliance.TotalPolicies)" -ForegroundColor Gray Write-Host " Compliant policies: $($policyCompliance.CompliantPolicies)" -ForegroundColor $(if ($policyCompliance.CompliantPolicies -eq $policyCompliance.TotalPolicies) { "Green" } else { "Yellow" }) Write-Host " Non-compliant resources: $($policyCompliance.NonCompliantResources)" -ForegroundColor $(if ($policyCompliance.NonCompliantResources -eq 0) { "Green" } else { "Red" }) if ($policyCompliance.PolicyDetails.Count -gt 0) { Write-Host "`n Policy details:" -ForegroundColor Gray foreach ($policy in $policyCompliance.PolicyDetails) { $status = if ($policy.NonCompliant -eq 0) { "OK" } else { "NOK" } $color = if ($policy.NonCompliant -eq 0) { "Green" } else { "Red" } Write-Host " $($policy.PolicyName): $status ($($policy.Compliant) compliant, $($policy.NonCompliant) non-compliant)" -ForegroundColor $color } } else { Write-Host " Geen region policies gevonden - overweeg implementatie" -ForegroundColor Yellow } $results.Details += "Azure Policies: $($policyCompliance.CompliantPolicies)/$($policyCompliance.TotalPolicies) policies compliant, $($policyCompliance.NonCompliantResources) non-compliant resources" } # M365 Tenant Region $m365Info = Get-M365TenantRegion if ($m365Info) { Write-Host "`nMicrosoft 365 Tenant:" -ForegroundColor Yellow Write-Host " Tenant: $($m365Info.TenantName)" -ForegroundColor Gray Write-Host " Tenant ID: $($m365Info.TenantId)" -ForegroundColor Gray Write-Host " EU Data Boundary: Verifieer handmatig via M365 Admin Center" -ForegroundColor Yellow $results.Details += "M365 Tenant: $($m365Info.TenantName) - handmatige verificatie vereist" } # Overall Compliance Write-Host "`n========================================" -ForegroundColor Cyan Write-Host "Compliance Status:" -ForegroundColor Yellow Write-Host " Percentage: $([math]::Round($results.CompliancePercentage, 1))%" -ForegroundColor $(if ($results.IsCompliant) { "Green" } else { "Yellow" }) Write-Host " Status: $(if ($results.IsCompliant) { "COMPLIANT" } else { "NON-COMPLIANT" })" -ForegroundColor $(if ($results.IsCompliant) { "Green" } else { "Red" }) Write-Host "========================================" -ForegroundColor Cyan if ($results.IsCompliant) { Write-Host "`n[OK] Data sovereignty compliance behaald" -ForegroundColor Green exit 0 } else { Write-Host "`n[WAARSCHUWING] Data sovereignty compliance niet behaald" -ForegroundColor Red Write-Host "Gebruik -Remediation voor hulp bij het oplossen van bevindingen" -ForegroundColor Yellow exit 1 } } catch { Write-Host "`n[ERROR] Monitoring gefaald: $_" -ForegroundColor Red exit 2 } } function Invoke-Remediation { Write-Host "`n========================================" -ForegroundColor Cyan Write-Host "$script:PolicyName - Remediatie" -ForegroundColor Cyan Write-Host "========================================" -ForegroundColor Cyan try { Connect-RequiredServices Write-Host "`nRemediatie-opties:" -ForegroundColor Yellow Write-Host " 1. Azure Policy voor regionale beperkingen implementeren" -ForegroundColor Gray Write-Host " 2. Bestaande resources inventariseren voor migratie" -ForegroundColor Gray Write-Host " 3. Microsoft 365 EU Data Boundary verificatie" -ForegroundColor Gray Write-Host "" # Check voor bestaande policies $existingPolicies = Get-AzPolicyDefinition -ErrorAction SilentlyContinue | Where-Object { $_.Properties.DisplayName -like "*allowed locations*" -or $_.Properties.DisplayName -like "*allowed resource locations*" } if ($existingPolicies.Count -gt 0) { Write-Host " Bestaande location policies gevonden:" -ForegroundColor Green foreach ($policy in $existingPolicies) { Write-Host " - $($policy.Properties.DisplayName)" -ForegroundColor Gray } Write-Host "`n Controleer of deze policies zijn toegewezen aan management groups of subscriptions" -ForegroundColor Yellow } else { Write-Host " Geen location policies gevonden" -ForegroundColor Yellow Write-Host " Overweeg implementatie van Azure Policy 'Allowed locations' voor resource groups en resources" -ForegroundColor Yellow } # Inventarisatie van non-compliant resources $resourceAnalysis = Get-AzureResourceLocations if ($resourceAnalysis -and $resourceAnalysis.NonCompliantResources -gt 0) { Write-Host "`n Non-compliant resources gevonden: $($resourceAnalysis.NonCompliantResources)" -ForegroundColor Red Write-Host " Maatregelen:" -ForegroundColor Yellow Write-Host " 1. Evalueer of resources kunnen worden gemigreerd naar EU-regio's" -ForegroundColor Gray Write-Host " 2. Documenteer resources die niet kunnen worden gemigreerd met risicoacceptatie" -ForegroundColor Gray Write-Host " 3. Implementeer Azure Policy om nieuwe resources in non-EU regio's te voorkomen" -ForegroundColor Gray if (-not $WhatIf) { $exportPath = ".\data-sovereignty-noncompliant-resources-$(Get-Date -Format 'yyyyMMdd-HHmmss').csv" $resourceAnalysis.NonCompliantDetails | Export-Csv -Path $exportPath -NoTypeInformation -Encoding UTF8 Write-Host "`n Inventarisatie geëxporteerd naar: $exportPath" -ForegroundColor Green } } Write-Host "`n Voor M365 EU Data Boundary:" -ForegroundColor Yellow Write-Host " - Verifieer tenant-regio via M365 Admin Center" -ForegroundColor Gray Write-Host " - Activeer EU Data Boundary indien beschikbaar" -ForegroundColor Gray Write-Host " - Controleer Multi-Geo configuraties indien van toepassing" -ForegroundColor Gray Write-Host "`n[INFO] Remediatie-advies gegenereerd" -ForegroundColor Cyan Write-Host "Voer monitoring opnieuw uit na implementatie van maatregelen" -ForegroundColor Yellow exit 0 } catch { Write-Host "`n[ERROR] Remediatie gefaald: $_" -ForegroundColor Red exit 2 } } function Invoke-Revert { Write-Host "`n========================================" -ForegroundColor Cyan Write-Host "$script:PolicyName - Revert" -ForegroundColor Cyan Write-Host "========================================" -ForegroundColor Cyan Write-Host "`n[INFO] Revert functionaliteit niet beschikbaar voor data sovereignty" -ForegroundColor Yellow Write-Host "Data sovereignty is een compliance-vereiste en moet worden behouden" -ForegroundColor Yellow exit 0 } # Main execution try { if ($Revert) { Invoke-Revert } elseif ($Monitoring) { Invoke-Monitoring } elseif ($Remediation) { Invoke-Remediation } else { Write-Host "`nGebruik: -Monitoring | -Remediation | -Revert" -ForegroundColor Yellow Write-Host "`nVoorbeelden:" -ForegroundColor Cyan Write-Host " .\index.ps1 -Monitoring" -ForegroundColor Gray Write-Host " .\index.ps1 -Remediation" -ForegroundColor Gray Write-Host " .\index.ps1 -Monitoring -WhatIf" -ForegroundColor Gray } } catch { Write-Host "`n[ERROR] Script execution failed: $_" -ForegroundColor Red exit 2 } finally { Write-Host "`n========================================`n" -ForegroundColor Cyan }

Risico zonder implementatie

Risico zonder implementatie
High: Zonder een volwassen data sovereignty framework in Azure en Microsoft 365 ontstaat het risico dat organisaties niet kunnen aantonen dat gegevens binnen de vereiste geografische grenzen blijven, dat gegevens onbedoeld buiten de EU of Nederland terechtkomen, en dat er schendingen plaatsvinden van BIO, NIS2 en AVG vereisten. Dit kan leiden tot boetes tot €20 miljoen of 4% van de jaaromzet (AVG), verplichte herstelmaatregelen, reputatieschade, verlies van vertrouwen bij burgers en bestuurlijke aansprakelijkheid bij datalekken of incidenten.

Management Samenvatting

Data sovereignty in Azure vereist een samenhangend framework dat strategie, technische configuraties, monitoring en remediatie integreert om te garanderen dat gegevens binnen de vereiste geografische grenzen blijven. Dit index-artikel fungeert als centrale verzamelplaats voor data sovereignty-artikelen en beschrijft governance, implementatie, monitoring en continue verbetering van gegevenssoevereiniteit in Azure en Microsoft 365-omgevingen voor Nederlandse overheidsorganisaties.