Azure Arc Data Services Beveiliging En Governance

💼 Management Samenvatting

Azure Arc data services stellen Nederlandse overheidsorganisaties in staat om Azure data services zoals SQL Managed Instance en PostgreSQL Hyperscale te draaien op locaties buiten Azure – in eigen datacenters, bij andere cloudproviders of in gespecialiseerde hostingomgevingen – terwijl deze services centraal worden beheerd via Azure. Door Arc-enabled data services te gebruiken, kunnen organisaties uniforme beveiligingsstandaarden, compliance-controles en operationele processen toepassen op data workloads, ongeacht waar deze fysiek draaien.

Aanbeveling
IMPLEMENTEER CENTRALE BEVEILIGING EN GOVERNANCE VOOR ALLE ARC-VERBONDEN DATA SERVICES
Risico zonder
High
Risk Score
9/10
Implementatie
200u (tech: 120u)
Van toepassing op:
Azure
Azure Arc
SQL Managed Instance
PostgreSQL
Hybride en multi-cloud omgevingen

Zonder een gecentraliseerde governance- en beveiligingslaag voor data services in hybride omgevingen ontstaan gefragmenteerde landschappen waarin elke data service zijn eigen configuratie, toegangsmodel en beveiligingsmaatregelen hanteert. Voor de Nederlandse publieke sector betekent dit een hoog risico op inconsistente encryptie-instellingen, onvoldoende toegangscontrole, gebrekkige logging en beperkte auditbaarheid over meerdere omgevingen heen. Bovendien vragen BIO, NIS2, AVG en sectorale kaders om aantoonbare controle over alle bedrijfskritieke data workloads, ook wanneer deze buiten de eigen Azure-tenant draaien. Azure Arc-enabled data services bieden een uniforme besturingslaag waarmee SQL Managed Instance en PostgreSQL-instances worden ingeschreven in dezelfde governance- en complianceprocessen als native Azure-resources. Door encryptie, toegangsbeheer, logging, backup- en disaster recovery-processen centraal te organiseren, wordt het mogelijk om hybride en multi-cloud data-landschappen op een beheerste manier te exploiteren zonder in te leveren op veiligheid, privacy of transparantie.

PowerShell Modules Vereist
Primary API: Azure Resource Manager (ARM), Azure Arc-enabled data services, Azure Policy
Connection: Connect-AzAccount
Required Modules: Az.Accounts, Az.Resources, Az.ResourceGraph, Az.Sql, Az.Arc

Implementatie

Dit artikel beschrijft hoe Nederlandse overheidsorganisaties een robuust beveiligings- en governance-raamwerk opzetten voor Azure Arc-enabled data services. We behandelen de inschrijving van data services bij Azure Arc, de inrichting van versleuteling in rust en tijdens transport, het configureren van toegangscontrole via Azure Active Directory en SQL-authenticatie, het implementeren van logging en monitoring voor compliance-doeleinden, en het opzetten van backup- en disaster recovery-processen. Daarnaast gaan we in op compliance-rapportage, dataclassificatie, privacy-by-design principes en de integratie met bestaande processen voor change- en risicomanagement. Het bijbehorende PowerShell-script ondersteunt u bij het inventariseren van Arc-verbonden data services, het bepalen van de beveiligings- en compliance-status en het genereren van concrete verbeteracties voor services die nog niet aan de Nederlandse Baseline voor Veilige Cloud voldoen.

Onboarding van data services op Azure Arc

Een solide beveiligingsstrategie voor Arc-enabled data services begint bij volledige zichtbaarheid: u kunt alleen beveiligingsbeleid afdwingen op data services die zijn opgenomen in uw centrale beheerplatform. Azure Arc fungeert hierbij als koppelvlak tussen uw bestaande SQL Managed Instance- of PostgreSQL-workloads en Azure. Het onboarden van een data service houdt in dat u de Arc data controller en bijbehorende componenten installeert, waarna de service als resource in Azure verschijnt met metadata over locatie, versie, configuratie en gekoppelde beveiligingsinstellingen. Voor Nederlandse overheidsorganisaties is het zinvol om al in de ontwerp- en architectuurfase te bepalen welke data services in aanmerking komen voor Arc-onboarding: productiesystemen met persoonsgegevens, kritieke ketenvoorzieningen en databases die gevoelige informatie bevatten krijgen doorgaans prioriteit, gevolgd door test- en acceptatieomgevingen die voor regressietests worden gebruikt. Door data services systematisch in te schrijven, ontstaat een volledig register dat aansluit op het informatiebeveiligings- en verwerkingsregister van de organisatie.

Tijdens het onboarden is het essentieel om direct de juiste beveiligings- en governance-parameters mee te geven. Dit begint bij de keuze van de resource group en het abonnement waarin de Arc data service wordt geregistreerd, omdat hiermee de verantwoordelijke beheerafdeling, kostenplaats en security boundary worden bepaald. Kies een naamgevingsconventie waarin omgeving (ontwikkel, test, acceptatie, productie), organisatieonderdeel, dataclassificatie en locatie herkenbaar zijn, zodat u later eenvoudig kunt filteren op bijvoorbeeld productieniveau of specifieke ketens. Koppel vervolgens tags aan elke Arc data service, zoals dataclassificatie (Openbaar, Intern, Vertrouwelijk, Zeer Vertrouwelijk), eigenaar, contactpersoon, bedrijfsproces, AVG-relevantie en compliance-profielen (bijvoorbeeld BIO, NIS2 of sectorale normen), zodat rapportages en controles kunnen worden gefilterd op risicoprofiel. Deze metadata vormt de basis voor geautomatiseerde policy-toewijzingen, waardoor data services met een hogere gevoeligheid automatisch strenger beleid krijgen dan minder kritieke omgevingen.

Een ander belangrijk aandachtspunt bij onboarding is de integratie met bestaande identity- en toegangsmodellen. Azure Arc-enabled data services ondersteunen zowel Azure Active Directory-integratie voor beheerders- en gebruikersauthenticatie als traditionele SQL-authenticatie voor legacy-applicaties. In de praktijk betekent dit dat u eerst definieert welke rollen in Azure bevoegd zijn om Arc data services te onboarden, te wijzigen of te verwijderen, en vervolgens vastlegt welke gebruikers en service principals toegang krijgen tot databases, tabellen en functies. Door dit te koppelen aan bestaande rolmodellen, zoals een scheiding tussen databasebeheerders, applicatiebeheerders, data engineers en security officers, voorkomt u dat Arc onbedoeld een omweg vormt om bestaande toegangsbeperkingen te omzeilen. Een gestructureerde onboarding-aanpak, ondersteund door templates en automatisering (bijvoorbeeld via Azure CLI, Bicep of Terraform), zorgt ervoor dat elke nieuwe data service volgens dezelfde beveiligingsstandaard wordt opgenomen in de hybride omgeving.

Versleuteling en toegangscontrole voor Arc data services

Gebruik PowerShell-script data-services.ps1 (functie Invoke-Monitoring) – Inventariseert Arc-verbonden data services en controleert beveiligingsaspecten, zoals encryptie-instellingen, toegangscontrole, logging en backup-configuraties..

Versleuteling vormt de basis van data protection voor Arc-enabled data services. Voor SQL Managed Instance en PostgreSQL Hyperscale via Arc is het cruciaal om zowel versleuteling in rust (at rest) als tijdens transport (in transit) te implementeren. Versleuteling in rust wordt gerealiseerd door Transparent Data Encryption (TDE) voor SQL Managed Instance en door storage encryption voor PostgreSQL, waarbij de encryptiesleutels kunnen worden beheerd via Azure Key Vault of on-premises key management systems. Voor Nederlandse overheidsorganisaties is het aan te raden om customer-managed keys te gebruiken in plaats van Microsoft-managed keys, omdat dit meer controle geeft over de sleutels en aansluit op compliance-vereisten uit de BIO en AVG. Versleuteling tijdens transport wordt gegarandeerd door TLS 1.2 of hoger te verplichten voor alle verbindingen naar Arc data services, waarbij oudere protocollen zoals SSL 3.0 en TLS 1.0 expliciet worden uitgeschakeld. Het bijbehorende PowerShell-script controleert of deze encryptie-instellingen correct zijn geconfigureerd en rapporteert afwijkingen die aandacht vereisen.

Toegangscontrole voor Arc-enabled data services moet worden ingericht volgens het principe van least privilege, waarbij gebruikers en applicaties alleen de minimale rechten krijgen die nodig zijn voor hun functie. Voor SQL Managed Instance betekent dit het gebruik van Azure Active Directory-integratie voor beheerdersauthenticatie, waarbij beheerdersrollen zoals sysadmin worden beperkt tot een kleine groep vertrouwde personen. Database-level toegang wordt beheerd via database roles en schemas, waarbij gevoelige tabellen worden afgeschermd voor gebruikers die deze niet nodig hebben. Voor PostgreSQL Hyperscale via Arc wordt toegangscontrole geregeld via PostgreSQL roles en privileges, waarbij eveneens Azure Active Directory kan worden geïntegreerd voor single sign-on. Het is belangrijk om regelmatig toegangsrechten te auditen en te controleren op overbodige privileges, zombie-accounts en service accounts met te brede rechten. Het PowerShell-script in dit artikel analyseert toegangsconfiguraties en identificeert potentiële beveiligingsrisico's, zoals accounts met sysadmin-rechten, databases zonder toegangsbeperkingen of gebruikers met schrijfrechten op gevoelige tabellen.

Naast versleuteling en toegangscontrole is logging en monitoring essentieel voor compliance en security operations. Arc-enabled data services moeten worden geconfigureerd om uitgebreide audit logs te genereren die alle database-activiteiten vastleggen, inclusief inlogpogingen, data access, schema-wijzigingen, beheeracties en foutmeldingen. Deze logs moeten worden doorgestuurd naar een centrale SIEM-oplossing zoals Azure Sentinel of Log Analytics, zodat security teams afwijkend gedrag, dreigingsindicatoren en misbruik vroegtijdig kunnen detecteren. Voor Nederlandse overheidsorganisaties is het belangrijk dat audit logs minimaal 7 jaar worden bewaard, conform de bewaarplicht uit de Archiefwet, en dat logs worden beschermd tegen wijziging of verwijdering door gebruikers. Het PowerShell-script controleert of logging is ingeschakeld, of logs worden doorgestuurd naar een centrale locatie en of de logretentie voldoet aan de organisatorische vereisten.

Backup, disaster recovery en business continuity

Gebruik PowerShell-script data-services.ps1 (functie Invoke-Remediation) – Genereert een overzicht van Arc data services met beveiligings- en compliance-hiaten, inclusief aanbevelingen voor verbeteringen en prioritering..

Backup- en disaster recovery-processen zijn cruciaal voor de beschikbaarheid en veerkracht van Arc-enabled data services. Voor SQL Managed Instance en PostgreSQL Hyperscale via Arc moeten organisaties een gestructureerd backup-beleid implementeren dat aansluit op de bedrijfscontinuïteitsvereisten en recovery time objectives (RTO) en recovery point objectives (RPO) van de organisatie. Automatische backups moeten dagelijks worden uitgevoerd, waarbij full backups minimaal wekelijks worden gemaakt en transaction log backups of WAL (Write-Ahead Logging) backups voor PostgreSQL continu worden uitgevoerd om dataverlies te minimaliseren. Backups moeten worden opgeslagen op een locatie die fysiek gescheiden is van de primaire data service, bij voorkeur in een andere datacenter of cloud-regio, en moeten worden versleuteld met dezelfde standaarden als de primaire data. Voor Nederlandse overheidsorganisaties is het belangrijk dat backups worden getest door regelmatig restore-procedures uit te voeren, zodat de organisatie er zeker van kan zijn dat data daadwerkelijk kan worden hersteld in geval van een incident. Het PowerShell-script controleert of backups zijn geconfigureerd, of backup-retentie voldoet aan de vereisten en of er recente test-restores zijn uitgevoerd.

Disaster recovery voor Arc-enabled data services vereist een gestructureerde aanpak waarbij failover-scenario's worden gedefinieerd, getest en gedocumenteerd. Voor kritieke productiesystemen moet worden overwogen om een secundaire Arc data service in te richten in een andere locatie, waarbij data continu wordt gerepliceerd van de primaire naar de secundaire omgeving. Dit kan worden gerealiseerd via SQL Managed Instance failover groups of PostgreSQL streaming replication, afhankelijk van de gebruikte data service. Het is belangrijk om regelmatig disaster recovery-tests uit te voeren waarbij de secundaire omgeving wordt geactiveerd en de primaire workload wordt overgenomen, zodat organisaties er zeker van kunnen zijn dat het recovery-proces daadwerkelijk werkt wanneer dit nodig is. Tijdens deze tests moeten ook de betrokken teams worden getraind, zodat iedereen weet wat zijn rol is tijdens een daadwerkelijke disaster recovery-situatie. Het PowerShell-script analyseert disaster recovery-configuraties en identificeert data services zonder adequate failover-capaciteit of zonder recente disaster recovery-tests.

Business continuity voor Arc-enabled data services gaat verder dan alleen technische backup- en disaster recovery-maatregelen. Organisaties moeten ook operationele processen inrichten die ervoor zorgen dat data services beschikbaar blijven tijdens geplande onderhoudsactiviteiten, capaciteitsuitbreidingen en migraties. Dit omvat het gebruik van high availability-configuraties waarbij meerdere replica's van data services worden ingezet, load balancing voor het verdelen van query-workloads, en automatische failover-mechanismen die ervoor zorgen dat bij een storing van een primaire instance automatisch wordt overgeschakeld naar een secundaire instance. Daarnaast moeten organisaties capaciteitsplanning uitvoeren om te voorkomen dat data services overbelast raken, wat kan leiden tot performance-problemen en beschikbaarheidsincidenten. Het PowerShell-script ondersteunt deze processen door overzichten te genereren van data service-capaciteit, performance-metrics en beschikbaarheidsstatistieken, zodat organisaties proactief kunnen handelen voordat problemen ontstaan.

Compliance, audit en dataclassificatie

Compliance-borging voor Arc-enabled data services draait om aantoonbaarheid: auditors en toezichthouders willen niet alleen weten welk beveiligingsbeleid is gedefinieerd, maar vooral in hoeverre dit in de praktijk wordt nageleefd. Azure Arc en Azure Policy leveren hiervoor uitgebreide compliance-rapportages waarin per data service en per policy zichtbaar is welke regels compliant zijn en waar afwijkingen bestaan. Door deze rapportages te combineren met tagging-informatie (zoals dataclassificatie en kritikaliteit) kunnen risicogerichte overzichten worden opgesteld waarin duidelijk wordt welke afwijkingen prioriteit verdienen. Het PowerShell-script in dit artikel benut dezelfde informatiebronnen om een samenvattend compliancebeeld te genereren dat direct aansluit op de governance- en risicorapportages binnen de Nederlandse Baseline voor Veilige Cloud. Op basis hiervan kunnen CISO's, security officers en lijnmanagers onderbouwde beslissingen nemen over welke data services aanvullende maatregelen nodig hebben, welke uitzonderingen tijdelijk worden geaccepteerd en welke verbeteracties in de roadmap moeten worden opgenomen.

Dataclassificatie is een fundamenteel onderdeel van compliance voor Arc-enabled data services. Nederlandse overheidsorganisaties moeten alle data die wordt opgeslagen in Arc data services classificeren volgens een gestandaardiseerd classificatieschema, zoals Openbaar, Intern, Vertrouwelijk of Zeer Vertrouwelijk. Deze classificatie bepaalt welke beveiligingsmaatregelen moeten worden toegepast, wie toegang mag hebben tot de data, hoe lang data moet worden bewaard en welke logging- en monitoring-vereisten gelden. Het is belangrijk dat dataclassificatie niet alleen wordt vastgelegd in metadata en tags, maar ook wordt geïmplementeerd in de daadwerkelijke toegangscontrole en encryptie-instellingen van de data services. Zo moeten Zeer Vertrouwelijke databases bijvoorbeeld altijd customer-managed encryption keys gebruiken, uitgebreide audit logging hebben en alleen toegankelijk zijn voor een beperkte groep geautoriseerde gebruikers. Het PowerShell-script controleert of data services correct zijn getagd met dataclassificatie-informatie en of de beveiligingsinstellingen aansluiten bij de classificatie van de opgeslagen data.

Privacy-by-design principes moeten worden toegepast bij de inrichting van Arc-enabled data services, met name wanneer deze persoonsgegevens bevatten. Dit betekent dat organisaties vanaf het begin privacy-overwegingen moeten meenemen in het ontwerp en de configuratie van data services, in plaats van privacy als een afterthought te beschouwen. Concreet betekent dit het gebruik van data minimization waarbij alleen de minimale hoeveelheid persoonsgegevens wordt opgeslagen die nodig is voor het beoogde doel, het implementeren van pseudonimisering of anonimisering waar mogelijk, het beperken van toegang tot persoonsgegevens tot geautoriseerde personen, en het implementeren van data retention policies die ervoor zorgen dat persoonsgegevens worden verwijderd zodra deze niet meer nodig zijn. Voor Arc-enabled data services betekent dit ook dat organisaties moeten kunnen aantonen waar persoonsgegevens worden opgeslagen, wie er toegang toe heeft, hoe lang data wordt bewaard en hoe data wordt beschermd tegen ongeautoriseerde toegang. Het PowerShell-script ondersteunt deze processen door overzichten te genereren van data services die persoonsgegevens bevatten, welke toegangsrechten zijn toegekend en of data retention policies correct zijn geconfigureerd.

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 Controleert beveiligings- en compliance-aspecten voor Azure Arc-enabled data services. .DESCRIPTION Dit script inventariseert Arc-verbonden data services (SQL Managed Instance en PostgreSQL Hyperscale) en beoordeelt in hoeverre beveiligingsmaatregelen en compliance-vereisten zijn geïmplementeerd. Het controleert onder meer: - Versleuteling in rust en tijdens transport - Toegangscontrole en authenticatie-instellingen - Logging en monitoring-configuraties - Backup- en disaster recovery-instellingen - Dataclassificatie en tagging In monitoringmodus wordt een rapport gegenereerd met de beveiligings- en compliance-status per data service. In remediatiemodus wordt een overzicht gemaakt van data services met beveiligingshiaten, inclusief aanbevelingen voor vervolgstappen. .NOTES Filename: data-services.ps1 Author: Nederlandse Baseline voor Veilige Cloud Created: 2025-11-26 Last Modified: 2025-11-26 Version: 1.0 Related JSON: content/azure/arc/data-services.json .LINK https://github.com/[org]/m365-tenant-best-practise .EXAMPLE .\data-services.ps1 -Monitoring Voert een controle uit op alle Arc-verbonden data services en toont de beveiligingsstatus. .EXAMPLE .\data-services.ps1 -Remediation Genereert een overzicht van data services met beveiligingshiaten en aanbevelingen voor verbetering. .EXAMPLE .\data-services.ps1 -Monitoring -LocalDebug Draait een lokale debug-run met gesimuleerde data zonder Azure-verbinding of Azure-API-calls. #> #Requires -Version 5.1 [CmdletBinding()] param( [Parameter()] [switch]$WhatIf, [Parameter()] [switch]$Monitoring, [Parameter()] [switch]$Remediation, [Parameter()] [string[]]$SubscriptionId, [Parameter()] [switch]$LocalDebug ) $ErrorActionPreference = 'Stop' $VerbosePreference = 'Continue' $PolicyName = "Azure Arc data services beveiliging en governance" $PolicyDescription = "Controleert of Arc-verbonden data services zijn opgenomen in centrale beveiliging en governance, inclusief encryptie, toegangscontrole, logging en backup-configuraties." function Test-ModuleAvailability { [CmdletBinding()] param( [Parameter(Mandatory = $true)] [string[]]$ModuleName ) foreach ($name in $ModuleName) { if (-not (Get-Module -ListAvailable -Name $name)) { Write-Warning "Vereiste module '$name' is niet geïnstalleerd. Installeer deze module voor volledige functionaliteit." } } } function Connect-RequiredServices { <# .SYNOPSIS Maakt verbinding met Azure als dat nog niet is gebeurd. #> [CmdletBinding()] param() if ($LocalDebug) { Write-Verbose "LocalDebug is ingeschakeld; er wordt geen Azure-verbinding opgezet." return } Test-ModuleAvailability -ModuleName @('Az.Accounts', 'Az.Resources', 'Az.ResourceGraph', 'Az.Sql', 'Az.Arc') try { $context = Get-AzContext -ErrorAction SilentlyContinue if (-not $context) { Write-Host "Verbinding maken met Azure..." -ForegroundColor Yellow Connect-AzAccount -ErrorAction Stop | Out-Null } else { Write-Verbose "Reeds verbonden met Azure: $($context.Subscription.Name)" } } catch { Write-Error "Kon geen verbinding maken met Azure: $_" throw } } function Get-DebugDataServicesData { [CmdletBinding()] param() return @( [PSCustomObject]@{ SubscriptionId = "00000000-0000-0000-0000-000000000010" SubscriptionName = "DBG-Overheid-NonProd" ResourceGroupName = "rg-arc-data-nonprod" DataServiceName = "arc-sql-nonprod-01" DataServiceType = "SQL Managed Instance" Location = "westeurope" HasRequiredTags = $true ClassificationTag = "Confidential" OwnerTag = "Team Digitale Diensten" BusinessProcessTag = "Burgerportaal" EncryptionAtRestEnabled = $true EncryptionInTransitEnabled = $true CustomerManagedKeys = $true AzureADAuthEnabled = $true AuditLoggingEnabled = $true BackupEnabled = $true BackupRetentionDays = 30 DisasterRecoveryConfigured = $true HasSecurityIssues = $false SecurityIssues = @() }, [PSCustomObject]@{ SubscriptionId = "00000000-0000-0000-0000-000000000020" SubscriptionName = "DBG-Overheid-Prod" ResourceGroupName = "rg-arc-data-prod" DataServiceName = "arc-postgres-prod-01" DataServiceType = "PostgreSQL Hyperscale" Location = "northeurope" HasRequiredTags = $false ClassificationTag = "" OwnerTag = "" BusinessProcessTag = "" EncryptionAtRestEnabled = $true EncryptionInTransitEnabled = $false CustomerManagedKeys = $false AzureADAuthEnabled = $false AuditLoggingEnabled = $false BackupEnabled = $true BackupRetentionDays = 7 DisasterRecoveryConfigured = $false HasSecurityIssues = $true SecurityIssues = @( "Ontbrekende kern-tags (Owner, BusinessProcess, DataClassification)", "Versleuteling tijdens transport niet ingeschakeld (TLS 1.2+ vereist)", "Geen customer-managed keys geconfigureerd (Microsoft-managed keys in gebruik)", "Azure Active Directory authenticatie niet ingeschakeld", "Audit logging niet geconfigureerd", "Backup retentie te kort (7 dagen, minimaal 30 dagen aanbevolen)", "Geen disaster recovery-configuratie aanwezig" ) } ) } function Get-DataServicesSecurityStatus { <# .SYNOPSIS Haalt Arc-verbonden data services op en bepaalt de beveiligingsstatus. .OUTPUTS PSCustomObject met data service- en beveiligingsinformatie. #> [CmdletBinding()] param() if ($LocalDebug) { Write-Verbose "Gebruik van gesimuleerde Arc data services-data (LocalDebug)." return Get-DebugDataServicesData } Write-Verbose "Ophalen van Arc-enabled data services via Azure Resource Graph..." $query = @' resources | where type =~ "microsoft.azurearcdata/sqlmanagedinstances" or type =~ "microsoft.azurearcdata/postgresinstances" | project id, name, location, subscriptionId, resourceGroup, type, tags, properties '@ $argParams = @{ Query = $query } if ($SubscriptionId) { $argParams['Subscription'] = $SubscriptionId } $dataServices = Search-AzGraph @argParams $results = @() foreach ($service in $dataServices) { $props = $service.properties $tags = $service.tags $classification = $tags["DataClassification"] $owner = $tags["Owner"] $businessProc = $tags["BusinessProcess"] $hasRequiredTags = -not [string]::IsNullOrWhiteSpace($classification) -and ` -not [string]::IsNullOrWhiteSpace($owner) -and ` -not [string]::IsNullOrWhiteSpace($businessProc) $serviceType = if ($service.type -like "*sqlmanagedinstances*") { "SQL Managed Instance" } elseif ($service.type -like "*postgresinstances*") { "PostgreSQL Hyperscale" } else { "Unknown" } $securityIssues = @() $hasIssues = $false if (-not $hasRequiredTags) { $hasIssues = $true $securityIssues += "Ontbrekende kern-tags (Owner, BusinessProcess of DataClassification)." } # Versleuteling checks (vereenvoudigd - in productie zou dit via API-calls worden gecontroleerd) $encryptionAtRest = $props["encryptionAtRest"] -eq $true $encryptionInTransit = $props["encryptionInTransit"] -eq $true $customerManagedKeys = $props["customerManagedKeys"] -eq $true if (-not $encryptionAtRest) { $hasIssues = $true $securityIssues += "Versleuteling in rust niet ingeschakeld." } if (-not $encryptionInTransit) { $hasIssues = $true $securityIssues += "Versleuteling tijdens transport niet ingeschakeld (TLS 1.2+ vereist)." } if (-not $customerManagedKeys) { $hasIssues = $true $securityIssues += "Geen customer-managed keys geconfigureerd (Microsoft-managed keys in gebruik)." } # Authenticatie checks $azureADAuth = $props["azureADAuthEnabled"] -eq $true if (-not $azureADAuth) { $hasIssues = $true $securityIssues += "Azure Active Directory authenticatie niet ingeschakeld." } # Logging checks $auditLogging = $props["auditLoggingEnabled"] -eq $true if (-not $auditLogging) { $hasIssues = $true $securityIssues += "Audit logging niet geconfigureerd." } # Backup checks $backupEnabled = $props["backupEnabled"] -eq $true $backupRetention = if ($props["backupRetentionDays"]) { $props["backupRetentionDays"] } else { 0 } if (-not $backupEnabled) { $hasIssues = $true $securityIssues += "Backup niet ingeschakeld." } elseif ($backupRetention -lt 30) { $hasIssues = $true $securityIssues += "Backup retentie te kort ($backupRetention dagen, minimaal 30 dagen aanbevolen)." } # Disaster recovery checks $drConfigured = $props["disasterRecoveryConfigured"] -eq $true if (-not $drConfigured) { $hasIssues = $true $securityIssues += "Geen disaster recovery-configuratie aanwezig." } $results += [PSCustomObject]@{ SubscriptionId = $service.subscriptionId SubscriptionName = (Get-AzSubscription -SubscriptionId $service.subscriptionId -ErrorAction SilentlyContinue).Name ResourceGroupName = $service.resourceGroup DataServiceName = $service.name DataServiceType = $serviceType Location = $service.location HasRequiredTags = $hasRequiredTags ClassificationTag = $classification OwnerTag = $owner BusinessProcessTag = $businessProc EncryptionAtRestEnabled = $encryptionAtRest EncryptionInTransitEnabled = $encryptionInTransit CustomerManagedKeys = $customerManagedKeys AzureADAuthEnabled = $azureADAuth AuditLoggingEnabled = $auditLogging BackupEnabled = $backupEnabled BackupRetentionDays = $backupRetention DisasterRecoveryConfigured = $drConfigured HasSecurityIssues = $hasIssues SecurityIssues = $securityIssues } } return $results } function Test-Compliance { <# .SYNOPSIS Bepaalt de compliancestatus voor Arc data services beveiliging. .OUTPUTS PSCustomObject met samenvatting van de resultaten. #> [CmdletBinding()] param() $dataServices = Get-DataServicesSecurityStatus if (-not $dataServices -or $dataServices.Count -eq 0) { Write-Verbose "Geen Arc-enabled data services gevonden in de geselecteerde scope." return [PSCustomObject]@{ ScriptName = "data-services" IsCompliant = $true Timestamp = Get-Date Details = "Er zijn geen Arc-enabled data services gevonden in de huidige scope." Recommendations = @() DataServices = @() } } $nonCompliant = $dataServices | Where-Object { $_.HasSecurityIssues } $isCompliant = ($nonCompliant.Count -eq 0) $details = if ($isCompliant) { "Alle gevonden Arc-enabled data services voldoen aan de basis beveiligingsvereisten." } else { "Een of meer Arc-enabled data services hebben beveiligingshiaten die aandacht vereisen." } $recommendations = @() if (-not $isCompliant) { $recommendations += "Zorg dat alle Arc-enabled data services kern-tags bevatten: Owner, BusinessProcess en DataClassification." $recommendations += "Schakel versleuteling in rust en tijdens transport in voor alle data services." $recommendations += "Configureer customer-managed keys via Azure Key Vault voor alle productie data services." $recommendations += "Schakel Azure Active Directory authenticatie in voor beheerders- en gebruikersauthenticatie." $recommendations += "Configureer uitgebreide audit logging en stuur logs door naar een centrale SIEM-oplossing." $recommendations += "Zorg voor minimaal 30 dagen backup retentie en test regelmatig restore-procedures." $recommendations += "Implementeer disaster recovery-configuraties voor kritieke productie data services." $recommendations += "Documenteer beveiligingsafspraken, runbooks en incidentresponsprocedures voor Arc data services." } return [PSCustomObject]@{ ScriptName = "data-services" IsCompliant = $isCompliant Timestamp = Get-Date Details = $details Recommendations = $recommendations DataServices = $dataServices } } function Invoke-Monitoring { <# .SYNOPSIS Voert een monitoring-run uit en toont de beveiligingsstatus per Arc-enabled data service. #> [CmdletBinding()] param() Write-Host "`nMonitoring: $PolicyName" -ForegroundColor Yellow Write-Host "Beschrijving: $PolicyDescription" -ForegroundColor Yellow Write-Host "==============================================================" -ForegroundColor Yellow $result = Test-Compliance $dataServices = $result.DataServices if ($dataServices.Count -gt 0) { Write-Host "`nGevonden Arc-enabled data services:" -ForegroundColor Cyan foreach ($service in $dataServices) { $statusColor = if (-not $service.HasSecurityIssues) { "Green" } else { "Red" } $statusText = if (-not $service.HasSecurityIssues) { "Beveiliging: COMPLIANT" } else { "Beveiliging: NON-COMPLIANT - $($service.SecurityIssues.Count) issue(s)" } Write-Host ("- {0}/{1} ({2})" -f $service.SubscriptionName, $service.DataServiceName, $service.Location) -ForegroundColor $statusColor Write-Host (" Type: {0}" -f $service.DataServiceType) -ForegroundColor Gray Write-Host (" Kern-tags aanwezig: {0}" -f $(if ($service.HasRequiredTags) { "Ja" } else { "Nee" })) -ForegroundColor Gray Write-Host (" Versleuteling in rust: {0}" -f $(if ($service.EncryptionAtRestEnabled) { "Ingeschakeld" } else { "Uitgeschakeld" })) -ForegroundColor Gray Write-Host (" Versleuteling tijdens transport: {0}" -f $(if ($service.EncryptionInTransitEnabled) { "Ingeschakeld" } else { "Uitgeschakeld" })) -ForegroundColor Gray Write-Host (" Customer-managed keys: {0}" -f $(if ($service.CustomerManagedKeys) { "Ja" } else { "Nee" })) -ForegroundColor Gray Write-Host (" Azure AD authenticatie: {0}" -f $(if ($service.AzureADAuthEnabled) { "Ingeschakeld" } else { "Uitgeschakeld" })) -ForegroundColor Gray Write-Host (" Audit logging: {0}" -f $(if ($service.AuditLoggingEnabled) { "Ingeschakeld" } else { "Uitgeschakeld" })) -ForegroundColor Gray Write-Host (" Backup: {0} (retentie: {1} dagen)" -f $(if ($service.BackupEnabled) { "Ingeschakeld" } else { "Uitgeschakeld" }), $service.BackupRetentionDays) -ForegroundColor Gray Write-Host (" Disaster recovery: {0}" -f $(if ($service.DisasterRecoveryConfigured) { "Geconfigureerd" } else { "Niet geconfigureerd" })) -ForegroundColor Gray Write-Host (" Status: {0}" -f $statusText) -ForegroundColor $statusColor if ($service.SecurityIssues.Count -gt 0) { foreach ($issue in $service.SecurityIssues) { Write-Host (" - {0}" -f $issue) -ForegroundColor Yellow } } Write-Host "" } } else { Write-Host "`nGeen Arc-enabled data services gevonden in de huidige scope." -ForegroundColor Cyan } if ($result.IsCompliant) { Write-Host "✅ COMPLIANT - Alle Arc-enabled data services voldoen aan de basis beveiligingsvereisten." -ForegroundColor Green } else { Write-Host "❌ NON-COMPLIANT - Eén of meer Arc-enabled data services hebben beveiligingshiaten." -ForegroundColor Red Write-Host "Aanbevolen acties:" -ForegroundColor Yellow foreach ($rec in $result.Recommendations) { Write-Host (" - {0}" -f $rec) -ForegroundColor Yellow } } return $result } function Invoke-Remediation { <# .SYNOPSIS Geeft een remediatie-overzicht voor Arc-enabled data services met beveiligingshiaten. #> [CmdletBinding()] param() Write-Host "`nRemediatie: $PolicyName" -ForegroundColor Yellow Write-Host "==============================================================" -ForegroundColor Yellow $result = Test-Compliance $dataServices = $result.DataServices | Where-Object { $_.HasSecurityIssues } if (-not $dataServices -or $dataServices.Count -eq 0) { Write-Host "Alle Arc-enabled data services voldoen aan de basis beveiligingsvereisten. Geen remediatie nodig." -ForegroundColor Green return $result } Write-Host "`nNiet-conforme Arc-enabled data services (met beveiligingshiaten):" -ForegroundColor Red foreach ($service in $dataServices) { Write-Host ("- Subscription: {0}" -f $service.SubscriptionName) -ForegroundColor Red Write-Host (" ResourceGroup: {0}" -f $service.ResourceGroupName) -ForegroundColor Red Write-Host (" Data Service: {0} ({1})" -f $service.DataServiceName, $service.DataServiceType) -ForegroundColor Red Write-Host (" Locatie: {0}" -f $service.Location) -ForegroundColor Red Write-Host " Geidentificeerde issues:" -ForegroundColor Yellow foreach ($issue in $service.SecurityIssues) { Write-Host (" - {0}" -f $issue) -ForegroundColor Yellow } Write-Host "" } Write-Host "Aanbevolen vervolgstappen:" -ForegroundColor Yellow Write-Host "1. Vul ontbrekende kern-tags in (Owner, BusinessProcess, DataClassification) voor alle Arc-enabled data services." -ForegroundColor Yellow Write-Host "2. Schakel versleuteling in rust en tijdens transport in voor alle data services die dit nog niet hebben." -ForegroundColor Yellow Write-Host "3. Configureer customer-managed keys via Azure Key Vault voor alle productie data services." -ForegroundColor Yellow Write-Host "4. Schakel Azure Active Directory authenticatie in en beperk SQL-authenticatie tot legacy-applicaties waar nodig." -ForegroundColor Yellow Write-Host "5. Configureer uitgebreide audit logging en stuur logs door naar Azure Sentinel of Log Analytics." -ForegroundColor Yellow Write-Host "6. Zorg voor minimaal 30 dagen backup retentie en voer regelmatig test-restores uit." -ForegroundColor Yellow Write-Host "7. Implementeer disaster recovery-configuraties voor kritieke productie data services." -ForegroundColor Yellow Write-Host "8. Documenteer beveiligingsafspraken, runbooks en escalatiepaden voor Arc data services." -ForegroundColor Yellow Write-Host "9. Neem Arc data services beveiliging op in periodieke risicobeoordelingen en auditplannen." -ForegroundColor Yellow if ($WhatIf) { Write-Host "`nWhatIf is ingeschakeld: er worden geen wijzigingen doorgevoerd; alleen een rapport is gegenereerd." -ForegroundColor Cyan } return $result } try { Write-Host "`n========================================" -ForegroundColor Cyan Write-Host "Script: data-services" -ForegroundColor Cyan Write-Host "Nederlandse Baseline voor Veilige Cloud" -ForegroundColor Cyan Write-Host "========================================`n" -ForegroundColor Cyan Connect-RequiredServices if ($Monitoring) { Invoke-Monitoring } elseif ($Remediation) { Invoke-Remediation } else { $result = Test-Compliance if ($result.IsCompliant) { Write-Host "`n✅ COMPLIANT" -ForegroundColor Green } else { Write-Host "`n❌ NON-COMPLIANT" -ForegroundColor Red Write-Host "Voer het script uit met -Monitoring of -Remediation voor meer details." -ForegroundColor Yellow } return $result } } catch { Write-Error "Er is een fout opgetreden in data-services.ps1: $_" throw } finally { Write-Host "`n========================================`n" -ForegroundColor Cyan }

Risico zonder implementatie

Risico zonder implementatie
High: Wanneer data services buiten Azure zonder centrale beveiliging en governance worden beheerd, ontstaat een versnipperd en moeilijk te controleren landschap waarin beveiligingslekken, ongeautoriseerde toegang en afwijkingen van beleid nauwelijks zijn te detecteren of te corrigeren. Dit vergroot de kans op ernstige datalekken, niet-naleving van wet- en regelgeving en verlies van vertrouwen bij burgers en toezichthouders.

Management Samenvatting

Registreer alle relevante data services via Azure Arc, implementeer versleuteling in rust en tijdens transport, configureer toegangscontrole volgens least privilege, stel logging en monitoring in voor compliance, en zorg voor adequate backup- en disaster recovery-processen. Het bijbehorende PowerShell-script helpt bij inventarisatie, monitoring en remediatie, zodat Arc data services beveiliging een aantoonbaar onderdeel wordt van de Nederlandse Baseline voor Veilige Cloud.