Data Residency Compliance Voor Azure Workloads In De Publieke Sector

💼 Management Samenvatting

Data residency compliance vormt de juridische en technische basis voor het waarborgen dat gegevens worden opgeslagen en verwerkt binnen de geografische grenzen die zijn vastgelegd in wet- en regelgeving, contracten en beleidskaders. Voor Nederlandse overheidsorganisaties die werken onder de BIO, AVG, NIS2 en sectorale richtlijnen is data residency compliance essentieel om aantoonbaar te kunnen rapporteren over datalocaties, jurisdicties en naleving van regionale vereisten. Zonder gestructureerde compliance-processen en technische controls blijft data residency een theoretisch concept zonder concrete afdwinging en verifieerbaarheid.

Aanbeveling
IMPLEMENT
Risico zonder
High
Risk Score
9/10
Implementatie
250u (tech: 150u)
Van toepassing op:
Azure Tenant
Azure Resources
Publieke Sector
Overheidsorganisaties
Digitale Soevereiniteit

Zonder geïmplementeerde data residency compliance-processen kunnen organisaties niet aantoonbaar garanderen dat gegevens worden opgeslagen en verwerkt in overeenstemming met wet- en regelgeving en contractuele afspraken. Dit kan leiden tot juridische risico's, mogelijke schending van AVG-doorgiftebepalingen, kritieke bevindingen bij audits, bestuurlijke verantwoordelijkheid en mogelijke sancties van toezichthouders. Voor Nederlandse overheidsorganisaties die gevoelige, geclassificeerde of persoonsgegevens verwerken, kan het ontbreken van compliance-processen resulteren in reputatieschade, verlies van vertrouwen en niet-naleving van compliance-eisen zoals vastgelegd in de BIO-paragraaf 08.03.01, ISO 27001 control A.5.30 en NIS2 artikel 21. Bovendien verlangen normenkaders dat organisaties aantoonbaar kunnen beheersen waar gegevens worden verwerkt en opgeslagen, kunnen rapporteren over datalocaties en kunnen aantonen dat passende technische en organisatorische maatregelen zijn genomen. Zonder concrete compliance-processen, technische maatregelen zoals Azure Policies, resource locks en geautomatiseerde monitoring blijft data residency een papieren belofte zonder praktische afdwinging en verifieerbaarheid.

PowerShell Modules Vereist
Primary API: Azure API, Azure Policy, Azure Resource Graph
Connection: Connect-AzAccount
Required Modules: Az.Accounts, Az.Resources, Az.PolicyInsights, Az.ResourceGraph

Implementatie

Dit artikel beschrijft hoe Nederlandse publieke organisaties data residency compliance implementeren en handhaven binnen Azure-omgevingen. We beginnen met de uitleg van het concept en de relatie met compliance-eisen zoals de AVG, BIO en NIS2, gevolgd door architectuurprincipes voor regionale beheersing en compliance-frameworks. Vervolgens gaan we in op praktische implementatiestappen, zoals het opstellen van compliance-kaders, het configureren van Azure Policies die alleen goedgekeurde regio's toestaan, het instellen van resource locks om onbedoelde wijzigingen te voorkomen, het opzetten van geautomatiseerde monitoring en het implementeren van governance-processen. In de secties over monitoring, auditing en remediatie laten we zien hoe je met behulp van een PowerShell-script periodiek kunt toetsen of resources voldoen aan de data residency compliance-eisen en hoe je bevindingen vertaalt naar verbeteracties en rapportages richting bestuur en auditors. Het doel is een praktisch toepasbaar raamwerk dat technische teams, CISO's, privacy officers en auditors in staat stelt om data residency compliance niet alleen te definiëren, maar ook technisch af te dwingen, continu te monitoren en aantoonbaar te verifiëren.

Compliance-framework en juridische basis voor data residency

Data residency compliance is een multidimensionaal concept dat verschillende juridische, technische en organisatorische aspecten omvat. Voor Nederlandse overheidsorganisaties zijn verschillende wet- en regelgevingskaders van toepassing die eisen stellen aan waar gegevens worden opgeslagen en verwerkt. De Algemene Verordening Gegevensbescherming (AVG) stelt bijvoorbeeld eisen aan doorgifte van persoonsgegevens aan derde landen, waarbij organisaties moeten kunnen aantonen dat persoonsgegevens binnen de Europese Economische Ruimte blijven of dat passende waarborgen zijn getroffen wanneer gegevens buiten de EER worden verwerkt. De Baseline Informatiebeveiliging Overheid (BIO) benadrukt daarnaast beheersing van uitbesteding, contractmanagement en ketenverantwoordelijkheid: overheidsorganisaties moeten kunnen laten zien welke cloudleverancier welke data verwerkt, in welke regio's dat gebeurt en welke garanties er zijn rond continuïteit en beveiliging. De NIS2 richtlijn en de Wet beveiliging netwerk- en informatiesystemen vragen bovendien om aantoonbaar en proportioneel risicomanagement, inclusief systematische beoordeling en documentatie van risico's in de toeleveringsketen, waarbij data residency een belangrijke mitigerende maatregel kan zijn.

Vanuit compliance-perspectief vervult data residency compliance een centrale rol als technische en organisatorische voorziening om te waarborgen dat gegevens worden opgeslagen en verwerkt binnen de geografische grenzen die zijn vastgelegd in wet- en regelgeving, contracten en beleidskaders. De AVG schrijft in artikel 32 voor dat passende technische en organisatorische maatregelen moeten worden genomen om de beveiliging van persoonsgegevens te waarborgen, waarbij controle over datalocaties een belangrijk aspect vormt. De BIO benadrukt in hoofdstuk 08.03.01 dat organisaties moeten kunnen aantonen dat gegevens worden verwerkt in overeenstemming met wet- en regelgeving en contractuele afspraken. Door een volledige data residency compliance-aanpak te implementeren en de uitvoering te documenteren, kan eenvoudig worden aangetoond dat gegevens worden opgeslagen en verwerkt binnen de beoogde geografische grenzen en dat passende maatregelen zijn genomen om afwijkingen te voorkomen of te detecteren. Tijdens ENSIA-audits en interne controles kunnen compliance-rapportages, policy-configuraties en monitoringdata rechtstreeks worden gebruikt als evidence dat data residency compliance volwassen is ingericht en correct functioneert.

Een volwassen data residency compliance-framework omvat verschillende componenten: beleidskaders die beschrijven welke regio's zijn goedgekeurd voor welke datacategorieën, technische maatregelen zoals Azure Policies en resource locks die regionale restricties afdwingen, monitoring- en rapportageprocessen die aantoonbaar maken dat resources voldoen aan compliance-eisen, governance-processen die uitzonderingen en mitigerende maatregelen beoordelen en goedkeuren, en auditprocessen die regelmatig de effectiviteit van compliance-maatregelen evalueren. Voor Nederlandse overheidsorganisaties is het belangrijk om dit framework te koppelen aan bredere compliance-aanpakken, zoals dataprotectie-effectbeoordelingen (DPIA's), risicobeoordelingen volgens NIS2 en contractmanagementprocessen. Door expliciet te werken aan data residency compliance en deze te verankeren in de bredere governance-structuur, zorgt een organisatie ervoor dat zij aantoonbaar voldoet aan juridische en beleidsmatige eisen en dat zij transparant kan rapporteren over datalocaties en compliance-status.

Architectuurprincipes en policy-ontwerp voor data residency compliance

Een effectieve implementatie van data residency compliance begint bij heldere architectuurprincipes die richting geven aan regioselectie, policy-configuratie en workloadplaatsing. Het eerste principe is 'compliance-driven regioselectie': nieuwe Azure-resources mogen uitsluitend worden uitgerold in vooraf goedgekeurde regio's die voldoen aan de compliance-eisen van de organisatie en de toepasselijke wet- en regelgeving. Deze lijst wordt vastgelegd in Azure Policies en wordt automatisch gecontroleerd bij elke resource deployment. Het tweede principe is 'dataclassificatie-driven controls': verschillende datacategorieën krijgen verschillende regionale restricties op basis van hun classificatie en de toepasselijke compliance-eisen. Geclassificeerde informatie kan bijvoorbeeld alleen in specifieke EU-regio's worden opgeslagen, terwijl publieke data mogelijk in bredere regio's mag worden verwerkt. Persoonsgegevens moeten bovendien voldoen aan AVG-doorgiftebepalingen, wat betekent dat zij uitsluitend binnen de EER mogen worden verwerkt tenzij passende waarborgen zijn getroffen. Het derde principe is 'defense in depth': data residency compliance wordt niet alleen afgedwongen via policies, maar ook via resource locks, monitoring, governance-processen en auditprocessen die ervoor zorgen dat afwijkingen snel worden gedetecteerd en gecorrigeerd.

Binnen Azure vertaalt dit zich naar een architectuur waarin management groups, subscriptions en resource groups zijn ontworpen met data residency compliance in het achterhoofd. Productie-omgevingen met gevoelige, geclassificeerde of persoonsgegevens worden geconcentreerd in een beperkt aantal goedgekeurde regio's die voldoen aan de toepasselijke compliance-eisen, terwijl experimentele of minder gevoelige workloads eventueel in breder toegestane regio's kunnen draaien, mits goed gedocumenteerd en goedgekeurd. Door standaard deployment-templates en Infrastructure as Code (bijvoorbeeld Bicep of Terraform) te gebruiken, kan de regioselectie worden vastgelegd en geborgd in code, in plaats van overgelaten aan handmatige keuzes in de portal. Azure Policies worden ingezet om te voorkomen dat resources in niet-goedgekeurde regio's worden uitgerold, met automatische afwijzing van deployments die niet voldoen aan de regionale eisen. Resource locks worden bovendien gebruikt om te voorkomen dat resources onbedoeld worden verplaatst naar niet-goedgekeurde regio's of worden gewijzigd op manieren die de compliance-status kunnen beïnvloeden.

Architectuurprincipes moeten bovendien worden verankerd in governance: besluitvormingsstructuren, richtlijnen en standaarddocumentatie. Dat betekent dat elk nieuw cloudproject een expliciete data residency compliance-paragraaf in zijn architectuurdossier krijgt, waarin wordt beschreven welke regio's worden gebruikt, welke datacategorieën worden verwerkt, welke compliance-eisen van toepassing zijn en welke uitzonderingen worden aangevraagd. Deze informatie wordt hergebruikt in DPIA's, NIS2-risicobeoordelingen, contractdossiers en auditrapporten. Door de gekozen principes te koppelen aan meetbare criteria – bijvoorbeeld een maximaal percentage resources buiten goedgekeurde regio's, een verplichte lijst van toegestane regio's per dataclassificatie of een minimum compliance-score – ontstaat een basis voor geautomatiseerde controles en rapportage. Het bijbehorende PowerShell-script, zoals in dit artikel beschreven, kan deze architectuurprincipes vervolgens toetsen tegen de werkelijkheid door te analyseren in welke regio's Azure-resources daadwerkelijk draaien, of deze voldoen aan de gedefinieerde data residency compliance-eisen en waar afwijkingen optreden die moeten worden gecorrigeerd.

Implementatie van data residency compliance in Azure

Gebruik PowerShell-script data-residency-compliance.ps1 (functie Invoke-Implementation) – Gebruik dit PowerShell-script om Azure Policies voor data residency compliance te configureren, toegestane regio's te definiëren per dataclassificatie, resource locks in te stellen voor kritieke workloads en governance-processen in te richten..

De implementatie van data residency compliance start met het definiëren van de toegestane regio's per dataclassificatie en het opstellen van een compliance-kader dat beschrijft welke regio's zijn goedgekeurd voor welke datacategorieën, welke compliance-eisen van toepassing zijn en welke uitzonderingen mogelijk zijn. Voor Nederlandse overheidsorganisaties betekent dit meestal dat gevoelige en geclassificeerde data uitsluitend in EU-regio's mogen worden opgeslagen, terwijl persoonsgegevens uitsluitend binnen de EER mogen worden verwerkt tenzij passende waarborgen zijn getroffen. Deze lijst wordt vastgelegd in een centrale configuratie die wordt gebruikt voor Azure Policies, deployment-templates, monitoring en rapportage. Vervolgens worden Azure Policies geconfigureerd die automatisch controleren of nieuwe resources voldoen aan de regionale eisen en deployments afwijzen die niet voldoen aan de gedefinieerde restricties. Deze policies worden geïmplementeerd op management group-niveau om ervoor te zorgen dat alle subscriptions en resources binnen de organisatie voldoen aan de compliance-eisen.

Naast policies worden resource locks ingezet om te voorkomen dat resources onbedoeld worden verplaatst naar niet-goedgekeurde regio's of worden gewijzigd op manieren die de compliance-status kunnen beïnvloeden. CanNotDelete-locks worden gebruikt voor productie-omgevingen om te voorkomen dat resources worden verwijderd of verplaatst zonder expliciete goedkeuring, terwijl ReadOnly-locks worden gebruikt voor resources die niet mogen worden gewijzigd zonder goedkeuring. Governance-processen worden bovendien ingericht om uitzonderingen te beoordelen en goed te keuren wanneer resources om functionele redenen in niet-goedgekeurde regio's moeten draaien. Deze processen omvatten het documenteren van de uitzondering, het beoordelen van risico's en mitigerende maatregelen, het verkrijgen van goedkeuring van relevante stakeholders en het periodiek herzien van uitzonderingen om te bepalen of deze nog steeds nodig zijn. Door deze governance-processen te koppelen aan monitoring en rapportage kunnen organisaties aantoonbaar maken dat uitzonderingen worden beheerd en dat mitigerende maatregelen effectief zijn.

Het PowerShell-script data-residency-compliance.ps1 ondersteunt deze implementatie door automatisch te controleren of Azure Policies voor data residency compliance correct zijn geconfigureerd, of resources voldoen aan de gedefinieerde regionale eisen, of resource locks zijn ingesteld voor kritieke workloads en of governance-processen correct functioneren. Het script maakt verbinding met Azure via Connect-AzAccount, haalt policy-configuraties op via Azure Policy API's, analyseert resources via Azure Resource Graph en controleert of resources voldoen aan compliance-eisen. De uitvoer bevat zowel een totaalscore per tenant als een gedetailleerd overzicht per subscription en resource, waardoor teams gericht acties kunnen uitzetten naar de eigenaar van de betreffende resource. Het script kan herhaaldelijk worden gedraaid na configuratiewijzigingen om te verifiëren dat de verwachte configuratie inderdaad aanwezig is en dat compliance-eisen worden nageleefd.

Monitoring, auditing en rapportage van data residency compliance

Gebruik PowerShell-script data-residency-compliance.ps1 (functie Invoke-Monitoring) – Voert een periodieke controle uit op Azure-resources en rapporteert of deze voldoen aan de gedefinieerde data residency compliance-eisen, met ondersteuning voor een lokale debugmodus zonder cloudverbinding..

Monitoring van data residency compliance kan niet worden beperkt tot eenmalige configuratiecontroles. Nieuwe projecten, uitbreidingen en wijzigingen in de Azure-omgeving kunnen ertoe leiden dat resources alsnog buiten de beoogde regio's worden uitgerold, ondanks de ingestelde policies. Een volwassen monitoringaanpak combineert daarom geautomatiseerde controles met vaste rapportagemomenten en auditprocessen. Voor Azure betekent dit dat er periodiek – bijvoorbeeld maandelijks of per kwartaal – een inventarisatie wordt uitgevoerd van resources per subscription, inclusief hun regio, dataclassificatie en compliance-status. Op basis daarvan kan worden vastgesteld welk percentage van de resources voldoet aan de data residency compliance-eisen en waar uitzonderingen of afwijkingen optreden. Deze informatie wordt geaggregeerd naar een overzicht voor CISO, CIO en auditors, waarin bijvoorbeeld staat hoeveel subscriptions volledig compliant zijn, hoeveel resources nog moeten worden gecorrigeerd en welke trends zichtbaar zijn in compliance-status over tijd.

Auditprocessen vormen een essentieel onderdeel van data residency compliance omdat zij aantoonbaar maken dat compliance-maatregelen effectief zijn en dat organisaties voldoen aan juridische en beleidsmatige eisen. Regelmatige audits moeten worden uitgevoerd door interne auditafdelingen of externe auditors om te verifiëren dat data residency compliance correct is geïmplementeerd en wordt nageleefd. Deze audits omvatten het controleren van policy-configuraties, het analyseren van resource-locaties, het beoordelen van governance-processen, het evalueren van uitzonderingen en mitigerende maatregelen, en het verifiëren van monitoring- en rapportageprocessen. Auditrapporten moeten worden gedocumenteerd en beschikbaar worden gesteld aan relevante stakeholders, inclusief bestuurders, privacy officers en toezichthouders wanneer dit wordt gevraagd. Door expliciet te werken aan auditprocessen en deze te verankeren in de bredere governance-structuur, zorgt een organisatie ervoor dat data residency compliance aantoonbaar wordt geïmplementeerd en nageleefd.

Rapportage vormt de verbinding tussen monitoring, auditing en besluitvorming. Regelmatige rapportages moeten worden opgesteld die inzicht geven in compliance-status, trends, afwijkingen en verbeteracties. Deze rapportages moeten worden gedeeld met relevante stakeholders, inclusief bestuurders, CISO's, privacy officers en auditors, en moeten worden gebruikt om besluitvorming te ondersteunen over policy-aanpassingen, uitzonderingen en investeringen in compliance-maatregelen. Rapportages moeten bovendien geschikt zijn voor verschillende doelgroepen: technische rapportages voor beheerders en architecten die gedetailleerde informatie bevatten over resource-locaties en compliance-status, managementsamenvattingen voor bestuurders die inzicht geven in trends en risico's, en auditrapporten voor auditors die evidence bevatten over compliance-implementatie en -naleving. Door expliciet te werken aan rapportage en deze te koppelen aan monitoring en auditing, zorgt een organisatie ervoor dat data residency compliance transparant wordt gerapporteerd en dat besluitvorming wordt ondersteund door feitelijke informatie.

Governance, remediatie en continue verbetering

Gebruik PowerShell-script data-residency-compliance.ps1 (functie Invoke-Remediation) – Identificeert problemen met data residency compliance-configuraties en biedt aanbevelingen voor verbetering, inclusief het corrigeren van afwijkingen en het implementeren van mitigerende maatregelen..

Governance vormt de basis voor effectieve data residency compliance omdat het richting geeft aan besluitvorming, beleidsvorming en implementatie. Een volwassen governance-structuur omvat verschillende componenten: besluitvormingsstructuren die bepalen wie verantwoordelijk is voor het opstellen en goedkeuren van data residency compliance-beleid, richtlijnen die beschrijven welke regio's zijn goedgekeurd voor welke datacategorieën en welke processen moeten worden gevolgd, standaarddocumentatie die wordt gebruikt voor architectuurdossiers, DPIA's en contractdossiers, en governance-processen die uitzonderingen beoordelen en goedkeuren. Voor Nederlandse overheidsorganisaties is het belangrijk om deze governance-structuur te koppelen aan bredere governance-kaders, zoals informatiebeveiligingsbeleid, privacybeleid en contractmanagement. Door expliciet te werken aan governance en deze te verankeren in de organisatiestructuur, zorgt een organisatie ervoor dat data residency compliance wordt ondersteund door duidelijke besluitvormingsprocessen en dat beleidsvorming en implementatie consistent worden uitgevoerd.

Remediatie is een essentieel onderdeel van data residency compliance omdat het ervoor zorgt dat afwijkingen worden gedetecteerd en gecorrigeerd. Wanneer monitoring of auditing afwijkingen detecteert – bijvoorbeeld resources die in niet-goedgekeurde regio's draaien of policy-configuraties die niet correct zijn – moeten deze worden onderzocht en gecorrigeerd. Remediatieprocessen omvatten het analyseren van de oorzaak van de afwijking, het bepalen van de meest effectieve oplossing, het implementeren van de oplossing en het verifiëren dat de afwijking is gecorrigeerd. Voor kritieke afwijkingen moet bovendien worden beoordeeld of mitigerende maatregelen nodig zijn om risico's te verminderen totdat de afwijking is gecorrigeerd. Remediatie moet worden gedocumenteerd en gerapporteerd aan relevante stakeholders, zodat transparantie wordt geboden over afwijkingen en correcties. Door expliciet te werken aan remediatie en deze te koppelen aan monitoring en auditing, zorgt een organisatie ervoor dat data residency compliance continu wordt verbeterd en dat afwijkingen snel worden gecorrigeerd.

Continue verbetering is een essentieel aspect van een volwassen data residency compliance-programma omdat het ervoor zorgt dat compliance-maatregelen effectief blijven en dat nieuwe eisen en ontwikkelingen worden geadresseerd. Continue verbetering omvat het regelmatig evalueren van compliance-maatregelen, het identificeren van verbetermogelijkheden, het implementeren van verbeteringen en het monitoren van de effectiviteit van verbeteringen. Dit kan bijvoorbeeld betekenen dat policy-configuraties worden verfijnd op basis van ervaringen, dat monitoring-processen worden verbeterd om sneller afwijkingen te detecteren, of dat governance-processen worden gestroomlijnd om sneller beslissingen te kunnen nemen. Voor Nederlandse overheidsorganisaties is het belangrijk om continue verbetering te koppelen aan bredere verbeterprogramma's, zoals informatiebeveiligingsprogramma's en compliance-programma's. Door expliciet te werken aan continue verbetering en deze te verankeren in de organisatiestructuur, zorgt een organisatie ervoor dat data residency compliance evolueert met nieuwe eisen en ontwikkelingen en dat compliance-maatregelen effectief blijven.

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
<# ================================================================================ AZURE POWERSHELL SCRIPT - Nederlandse Baseline voor Veilige Cloud ================================================================================ .SYNOPSIS Controle op data residency compliance voor Azure-resources .DESCRIPTION Voert een controle uit op: - Of Azure Policies voor data residency compliance zijn geconfigureerd - In welke Azure-regio's resources zijn uitgerold - Of resources voldoen aan gedefinieerde regionale compliance-eisen - Of resource locks zijn geconfigureerd voor kritieke workloads - Of governance-processen zijn ingericht voor uitzonderingen Het script ondersteunt twee gebruiksscenario's: - Productie: verbinding met Azure om daadwerkelijke configuratie en resources op te halen - Lokale debugmodus: synthetische testdata genereren zonder cloudverbinding Dit script sluit inhoudelijk aan op het artikel 'Data Residency Compliance voor Azure Workloads in de Publieke Sector'. .NOTES Filename: data-residency-compliance.ps1 Author: Nederlandse Baseline voor Veilige Cloud Version: 1.0 Related JSON: content/azure/sovereignty/data-residency-compliance.json #> #Requires -Version 5.1 #Requires -Modules Az.Accounts, Az.Resources, Az.PolicyInsights, Az.ResourceGraph [CmdletBinding()] param( [Parameter(HelpMessage = "Monitor current compliance status")] [switch]$Monitoring, [Parameter(HelpMessage = "Apply recommended compliance configuration")] [switch]$Remediation, [Parameter(HelpMessage = "Show what would happen without making changes")] [switch]$WhatIf, [Parameter(HelpMessage = "Enable debug mode with synthetic test data")] [switch]$DebugMode ) $ErrorActionPreference = 'Stop' $PolicyName = "Data Residency Compliance - Azure" function Get-AllowedRegions { <# .SYNOPSIS Geeft de lijst met geaccepteerde regio's voor data residency compliance terug #> [CmdletBinding()] param() return @( "westeurope", "northeurope", "germanywestcentral", "germanynorth", "norwayeast", "norwaywest", "swedencentral", "swedensouth", "uksouth", "ukwest", "francecentral", "francesouth", "switzerlandnorth", "switzerlandwest", "italynorth", "spaincentral", "polandcentral" ) } function Connect-RequiredServices { [CmdletBinding()] param( [switch]$DebugMode ) if ($DebugMode) { Write-Verbose "DebugMode is ingeschakeld: er wordt geen verbinding met Azure gemaakt." return } if (-not (Get-AzContext -ErrorAction SilentlyContinue)) { Connect-AzAccount -ErrorAction Stop | Out-Null } } function Test-DataResidencyCompliance { <# .SYNOPSIS Controleert data residency compliance en rapporteert compliance-status .OUTPUTS PSCustomObject met policy status, resource compliance en locks status #> [CmdletBinding()] param( [switch]$DebugMode ) $allowedRegions = Get-AllowedRegions if ($DebugMode) { # Synthetische testdata voor lokale validatie zonder cloudverbinding return [PSCustomObject]@{ Mode = "Debug" PoliciesConfigured = $true TotalSubscriptions = 3 TotalResources = 250 ResourcesInAllowedRegions = 240 ResourcesOutsideAllowedRegions = 10 CompliancePercentage = [math]::Round((240 / 250) * 100, 1) ResourceLocksConfigured = $true LocksCount = 35 GovernanceProcessesConfigured = $true IsCompliant = $false DetectedRegions = @("westeurope", "northeurope", "eastus", "westus") } } # Controleer Azure Policies voor data residency compliance $policiesConfigured = $false try { $locationPolicies = Get-AzPolicyDefinition -ErrorAction SilentlyContinue | Where-Object { $_.Properties.DisplayName -like "*allowed locations*" -or $_.Properties.DisplayName -like "*allowed regions*" -or $_.Properties.DisplayName -like "*data residency*" } if ($locationPolicies) { $policiesConfigured = $true } } catch { Write-Verbose "Kon policies niet ophalen: $_" } # Haal subscriptions en resources op $subscriptions = Get-AzSubscription -ErrorAction Stop | Where-Object { $_.State -eq 'Enabled' } $totalResources = 0 $resourcesInAllowedRegions = 0 $resourcesOutsideAllowedRegions = 0 $regions = [System.Collections.Generic.HashSet[string]]::new([System.StringComparer]::OrdinalIgnoreCase) $locksCount = 0 foreach ($sub in $subscriptions) { Set-AzContext -SubscriptionId $sub.Id -ErrorAction Stop | Out-Null try { # Controleer resource locks $locks = Get-AzResourceLock -ErrorAction SilentlyContinue $locksCount += $locks.Count # Haal resources op via Resource Graph voor betere prestaties try { $resources = Search-AzGraph -Query "Resources | where type != 'microsoft.azureactivedirectory/b2ctenants' | project name, type, location, resourceGroup" -Subscription $sub.Id -ErrorAction SilentlyContinue if ($resources) { foreach ($r in $resources) { if (-not $r.location) { continue } $totalResources++ $null = $regions.Add($r.location.ToLowerInvariant()) if ($allowedRegions -contains $r.location.ToLowerInvariant()) { $resourcesInAllowedRegions++ } else { $resourcesOutsideAllowedRegions++ } } } } catch { # Fallback naar Get-AzResource als Resource Graph niet beschikbaar is Write-Verbose "Resource Graph niet beschikbaar, gebruik Get-AzResource: $_" $resources = Get-AzResource -ErrorAction SilentlyContinue if ($resources) { foreach ($r in $resources) { if (-not $r.Location) { continue } $totalResources++ $null = $regions.Add($r.Location.ToLowerInvariant()) if ($allowedRegions -contains $r.Location.ToLowerInvariant()) { $resourcesInAllowedRegions++ } else { $resourcesOutsideAllowedRegions++ } } } } } catch { Write-Verbose "Kon resources voor subscription '$($sub.Name)' niet ophalen: $_" } } $compliancePercentage = $null if ($totalResources -gt 0) { $compliancePercentage = [math]::Round(($resourcesInAllowedRegions / $totalResources) * 100, 1) } # Controleer governance-processen (dit is een indicatie, geen absolute controle) $governanceProcessesConfigured = $false try { # Controleer of er documentatie is van policies en locks if ($policiesConfigured -and $locksCount -gt 0) { $governanceProcessesConfigured = $true } } catch { Write-Verbose "Kon governance-processen niet controleren: $_" } $isCompliant = ($policiesConfigured -and $resourcesOutsideAllowedRegions -eq 0 -and $governanceProcessesConfigured) [PSCustomObject]@{ Mode = "Live" PoliciesConfigured = $policiesConfigured TotalSubscriptions = $subscriptions.Count TotalResources = $totalResources ResourcesInAllowedRegions = $resourcesInAllowedRegions ResourcesOutsideAllowedRegions = $resourcesOutsideAllowedRegions CompliancePercentage = $compliancePercentage ResourceLocksConfigured = ($locksCount -gt 0) LocksCount = $locksCount GovernanceProcessesConfigured = $governanceProcessesConfigured IsCompliant = $isCompliant DetectedRegions = @($regions) | Sort-Object } } function Test-Compliance { <# .SYNOPSIS Wrapper function die compliance-status test .OUTPUTS Returns monitoring result object with isCompliant property #> [CmdletBinding()] param( [switch]$DebugMode ) $result = Test-DataResidencyCompliance -DebugMode:$DebugMode return [PSCustomObject]@{ isCompliant = $result.IsCompliant details = $result } } function Invoke-Monitoring { <# .SYNOPSIS Monitors and reports current data residency compliance status .DESCRIPTION Checks current configuration against data residency compliance requirements. Reports compliance status and identifies non-compliant settings. .OUTPUTS Returns hashtable with: - isCompliant: Boolean indicating overall compliance - details: Detailed findings #> [CmdletBinding()] param( [switch]$DebugMode ) try { Write-Host "`nMonitoring:" -ForegroundColor Yellow Connect-RequiredServices -DebugMode:$DebugMode Write-Host "Checking data residency compliance..." -ForegroundColor Gray $result = Test-DataResidencyCompliance -DebugMode:$DebugMode Write-Host "" -ForegroundColor White Write-Host "========================================" -ForegroundColor Cyan Write-Host $PolicyName -ForegroundColor Cyan Write-Host "========================================" -ForegroundColor Cyan Write-Host ("Modus : {0}" -f $result.Mode) -ForegroundColor White Write-Host ("Policies geconfigureerd : {0}" -f $(if ($result.PoliciesConfigured) { "Ja" } else { "Nee" })) -ForegroundColor $(if ($result.PoliciesConfigured) { 'Green' } else { 'Yellow' }) Write-Host ("Subscripties : {0}" -f $result.TotalSubscriptions) -ForegroundColor White Write-Host ("Totaal aantal resources : {0}" -f $result.TotalResources) -ForegroundColor White Write-Host ("Resources in toegestane regio's : {0}" -f $result.ResourcesInAllowedRegions) -ForegroundColor White Write-Host ("Resources buiten toegestane regio's : {0}" -f $result.ResourcesOutsideAllowedRegions) -ForegroundColor $(if ($result.ResourcesOutsideAllowedRegions -eq 0) { 'Green' } else { 'Yellow' }) if ($null -ne $result.CompliancePercentage) { Write-Host ("Compliance percentage : {0}%" -f $result.CompliancePercentage) -ForegroundColor $(if ($result.CompliancePercentage -ge 100) { 'Green' } else { 'Yellow' }) } else { Write-Host "Compliance percentage : n.v.t. (geen resources gevonden)" -ForegroundColor Yellow } Write-Host ("Resource locks geconfigureerd : {0}" -f $(if ($result.ResourceLocksConfigured) { "Ja ($($result.LocksCount) locks)" } else { "Nee" })) -ForegroundColor $(if ($result.ResourceLocksConfigured) { 'Green' } else { 'Yellow' }) Write-Host ("Governance-processen : {0}" -f $(if ($result.GovernanceProcessesConfigured) { "Ja" } else { "Nee" })) -ForegroundColor $(if ($result.GovernanceProcessesConfigured) { 'Green' } else { 'Yellow' }) if ($result.DetectedRegions -and $result.DetectedRegions.Count -gt 0) { Write-Host ("Gedetecteerde regio's : {0}" -f ($result.DetectedRegions -join ", ")) -ForegroundColor White } Write-Host "" -ForegroundColor White Write-Host "========================================" -ForegroundColor Cyan Write-Host "SUMMARY:" -ForegroundColor Cyan if ($result.IsCompliant) { Write-Host "`n[OK] COMPLIANT" -ForegroundColor Green Write-Host "Alle data residency compliance-eisen zijn correct geconfigureerd." -ForegroundColor Green } else { Write-Host "`n[FAIL] NON-COMPLIANT" -ForegroundColor Red if (-not $result.PoliciesConfigured) { Write-Host " - Azure Policies voor data residency compliance zijn niet geconfigureerd" -ForegroundColor Yellow } if ($result.ResourcesOutsideAllowedRegions -gt 0) { Write-Host " - Er zijn $($result.ResourcesOutsideAllowedRegions) resources buiten toegestane regio's" -ForegroundColor Yellow } if (-not $result.ResourceLocksConfigured) { Write-Host " - Resource locks zijn niet geconfigureerd voor kritieke workloads" -ForegroundColor Yellow } if (-not $result.GovernanceProcessesConfigured) { Write-Host " - Governance-processen voor uitzonderingen zijn niet ingericht" -ForegroundColor Yellow } } return @{ isCompliant = $result.IsCompliant details = $result timestamp = Get-Date } } catch { Write-Host "`n[FAIL] ERROR during monitoring: $_" -ForegroundColor Red throw } } function Invoke-Remediation { <# .SYNOPSIS Applies recommended data residency compliance configuration .DESCRIPTION Implements recommended configuration to meet data residency compliance requirements. Uses native PowerShell cmdlets where possible. .PARAMETER WhatIf Shows what would be changed without making actual changes #> [CmdletBinding(SupportsShouldProcess)] param( [switch]$WhatIf, [switch]$DebugMode ) try { Write-Host "`nRemediation:" -ForegroundColor Yellow if ($DebugMode) { Write-Host "[INFO] DebugMode: geen daadwerkelijke wijzigingen worden uitgevoerd" -ForegroundColor Yellow return } Connect-RequiredServices Write-Host "Applying data residency compliance configuration..." -ForegroundColor Gray # Controleer eerst de huidige status $currentStatus = Test-DataResidencyCompliance if ($currentStatus.IsCompliant) { Write-Host " [OK] Data residency compliance is al correct geconfigureerd" -ForegroundColor Green return } # Configureer Azure Policy voor toegestane locaties indien nodig if (-not $currentStatus.PoliciesConfigured) { Write-Host "`n[INFO] Azure Policy voor toegestane locaties configureren:" -ForegroundColor Yellow Write-Host " Gebruik de volgende stappen om een policy te configureren:" -ForegroundColor White Write-Host " 1. Navigeer naar Azure Portal > Policy > Definitions" -ForegroundColor White Write-Host " 2. Zoek naar 'Allowed locations' policy" -ForegroundColor White Write-Host " 3. Wijs de policy toe aan management group of subscription" -ForegroundColor White Write-Host " 4. Configureer de lijst van toegestane EU-regio's" -ForegroundColor White if ($PSCmdlet.ShouldProcess("Azure Policy", "Configure allowed locations policy")) { Write-Host " [NOTE] Policy-configuratie vereist handmatige stappen in Azure Portal" -ForegroundColor Yellow } } # Geef aanbevelingen voor resources buiten toegestane regio's if ($currentStatus.ResourcesOutsideAllowedRegions -gt 0) { Write-Host "`n[INFO] Resources buiten toegestane regio's gevonden:" -ForegroundColor Yellow Write-Host " Aantal resources: $($currentStatus.ResourcesOutsideAllowedRegions)" -ForegroundColor White Write-Host " Overweeg de volgende acties:" -ForegroundColor White Write-Host " 1. Identificeer welke resources buiten toegestane regio's draaien" -ForegroundColor White Write-Host " 2. Evalueer of migratie naar toegestane regio's mogelijk is" -ForegroundColor White Write-Host " 3. Documenteer uitzonderingen indien migratie niet mogelijk is" -ForegroundColor White Write-Host " 4. Plan migraties binnen reguliere changeprocessen" -ForegroundColor White Write-Host " 5. Voer governance-proces uit voor uitzonderingen" -ForegroundColor White } # Configureer resource locks indien nodig if (-not $currentStatus.ResourceLocksConfigured) { Write-Host "`n[INFO] Resource locks configureren voor kritieke workloads:" -ForegroundColor Yellow Write-Host " Gebruik de volgende PowerShell-cmdlets:" -ForegroundColor White Write-Host " New-AzResourceLock -LockName 'DataResidencyComplianceLock' -LockLevel CanNotDelete -ResourceGroupName 'RG-Name' -ResourceName 'Resource-Name' -ResourceType 'Microsoft.Storage/storageAccounts'" -ForegroundColor Gray if ($PSCmdlet.ShouldProcess("Resource Locks", "Configure locks for critical workloads")) { Write-Host " [NOTE] Resource locks moeten per resource worden geconfigureerd" -ForegroundColor Yellow } } # Configureer governance-processen indien nodig if (-not $currentStatus.GovernanceProcessesConfigured) { Write-Host "`n[INFO] Governance-processen inrichten voor uitzonderingen:" -ForegroundColor Yellow Write-Host " Overweeg de volgende acties:" -ForegroundColor White Write-Host " 1. Definieer proces voor het aanvragen en goedkeuren van uitzonderingen" -ForegroundColor White Write-Host " 2. Documenteer uitzonderingen in centrale repository" -ForegroundColor White Write-Host " 3. Plan periodieke review van uitzonderingen" -ForegroundColor White Write-Host " 4. Koppel governance-processen aan monitoring en rapportage" -ForegroundColor White } Write-Host "`n[OK] Remediation-aanbevelingen gepresenteerd" -ForegroundColor Green Write-Host " Voer de bovenstaande stappen uit om data residency compliance volledig te implementeren" -ForegroundColor White } catch { Write-Host "`n[FAIL] ERROR during remediation: $_" -ForegroundColor Red throw } } function Invoke-Implementation { <# .SYNOPSIS Implementeert configuratie (delegeert naar remediatie) #> [CmdletBinding()] param( [switch]$WhatIf, [switch]$DebugMode ) Invoke-Remediation -WhatIf:$WhatIf -DebugMode:$DebugMode } # ============================================================================ # MAIN EXECUTION # ============================================================================ try { # Determine which action to perform if ($Remediation) { if ($WhatIf) { Write-Host "WhatIf: Would apply remediation" -ForegroundColor Yellow Invoke-Remediation -WhatIf -DebugMode:$DebugMode } else { Invoke-Remediation -DebugMode:$DebugMode } } elseif ($Monitoring) { $result = Invoke-Monitoring -DebugMode:$DebugMode # Exit with appropriate code for automation if ($result.isCompliant) { exit 0 # Success - Compliant } else { exit 1 # Warning - Non-compliant } } else { # No parameters - show usage Write-Host "Available parameters:" -ForegroundColor Yellow Write-Host " -Monitoring : Check current compliance status" -ForegroundColor Gray Write-Host " -Remediation : Apply recommended compliance configuration" -ForegroundColor Gray Write-Host " -WhatIf : Preview changes without applying" -ForegroundColor Gray Write-Host " -DebugMode : Use synthetic test data (no Azure connection)" -ForegroundColor Gray Write-Host "`nExample: .\data-residency-compliance.ps1 -Monitoring" -ForegroundColor Cyan Write-Host "Example: .\data-residency-compliance.ps1 -Monitoring -DebugMode" -ForegroundColor Cyan } } catch { Write-Error "Script execution failed: $_" exit 2 # Error } finally { Write-Host "`n========================================`n" -ForegroundColor Cyan } # ============================================================================ # EXIT CODES # ============================================================================ # 0 = Success / Compliant # 1 = Warning / Non-compliant # 2 = Error / Execution failed

Risico zonder implementatie

Risico zonder implementatie
High: Kritiek - Zonder data residency compliance kunnen organisaties niet aantoonbaar garanderen dat gegevens worden opgeslagen en verwerkt in overeenstemming met wet- en regelgeving en contractuele afspraken. Dit kan leiden tot juridische risico's, mogelijke schending van AVG-doorgiftebepalingen, kritieke bevindingen bij audits, bestuurlijke verantwoordelijkheid, reputatieschade en mogelijke sancties van toezichthouders.

Management Samenvatting

Implementeer data residency compliance-processen en technische maatregelen in Azure om aantoonbaar te kunnen garanderen dat gegevens worden opgeslagen en verwerkt in overeenstemming met wet- en regelgeving. Essentieel voor Nederlandse overheidsorganisaties die werken onder de BIO, AVG en NIS2. Implementatie: 250 uur.