Azure Compliance: Overzicht Van Compliance-framework En Implementatie Voor Nederlandse Overheidsorganisaties

💼 Management Samenvatting

Compliance in Azure is een complexe, multidimensionale uitdaging voor Nederlandse overheidsorganisaties die moeten voldoen aan meerdere wettelijke kaders tegelijkertijd. Deze index pagina biedt een overzicht van alle compliance-aspecten die relevant zijn voor Azure-omgevingen en helpt organisaties om een samenhangend, aantoonbaar compliance-raamwerk op te bouwen dat voldoet aan de Baseline Informatiebeveiliging Overheid (BIO), de NIS2 richtlijn, de Algemene Verordening Gegevensbescherming (AVG), ISO 27001 en andere relevante normenkaders.

Aanbeveling
IMPLEMENT
Risico zonder
High
Risk Score
9/10
Implementatie
180u (tech: 80u)
Van toepassing op:
Azure Tenant
Azure Subscriptions

Nederlandse overheidsorganisaties die Azure gebruiken, worden geconfronteerd met een toenemende complexiteit aan compliance-vereisten. Zonder een gestructureerde aanpak ontstaat het risico dat organisaties compliance zien als een lastige verplichting die vooral tijdens audits belangrijk is, in plaats van een integraal onderdeel van de dagelijkse cloudoperaties. Dit leidt tot ad-hoc implementaties, inconsistente toepassing van maatregelen, moeilijk aantoonbare naleving en verhoogde risico's op boetes, reputatieschade en bestuurlijke aansprakelijkheid. Een doordacht compliance-framework helpt organisaties om proactief te voldoen aan wettelijke eisen, risico's te beheersen en transparantie te bieden richting burgers, toezichthouders en bestuur.

PowerShell Modules Vereist
Primary API: Azure API, Azure Policy, Microsoft Defender for Cloud
Connection: Connect-AzAccount
Required Modules: Az.Accounts, Az.Resources, Az.PolicyInsights, Az.Security

Implementatie

Dit index-artikel fungeert als centrale verzamelplaats voor alle compliance-gerelateerde artikelen binnen de Azure-domein van de 'Nederlandse Baseline voor Veilige Cloud'. We behandelen de belangrijkste compliance-kaders die relevant zijn voor Nederlandse overheidsorganisaties, beschrijven hoe deze worden vertaald naar concrete Azure-services en configuraties, en laten zien hoe organisaties een volwassen compliance-proces kunnen opzetten. Het artikel verbindt specifieke compliance-artikelen zoals geautomatiseerde compliance-controles, data residency requirements, EU data boundary configuratie, government cloud opties en multi-framework compliance, en biedt handvatten voor governance, monitoring en rapportage. Daarnaast beschrijft het artikel hoe compliance wordt gemeten, gerapporteerd en continu verbeterd binnen een Azure-omgeving.

Het compliance-landschap voor Nederlandse overheidsorganisaties in Azure

Nederlandse overheidsorganisaties die Azure gebruiken, moeten voldoen aan een complex web van nationale en Europese regelgeving. De Baseline Informatiebeveiliging Overheid (BIO) vormt het fundament voor informatiebeveiliging binnen de publieke sector en legt eisen op rond risicomanagement, beveiligingsmaatregelen, incident response en continuïteit. De NIS2 richtlijn voegt daar specifieke eisen aan toe voor essentiële en belangrijke entiteiten op het gebied van cybersecurity-maatregelen, incidentmeldingen en supply chain security. De Algemene Verordening Gegevensbescherming (AVG) verplicht organisaties om passende technische en organisatorische maatregelen te treffen ter bescherming van persoonsgegevens, inclusief data protection by design en by default. ISO 27001 biedt een internationaal erkend framework voor informatiebeveiligingsmanagementsystemen (ISMS) dat vaak wordt gebruikt als aanvulling op de BIO. Daarnaast kunnen sectorale wetten en regelingen specifieke eisen stellen, bijvoorbeeld de Archiefwet voor het beheer van overheidsinformatie, de Wet op de geneeskundige behandelingsovereenkomst (WGBO) voor zorgorganisaties, of de Wet elektronisch bestuursverkeer (Web) voor digitale dienstverlening.

Azure compliance betekent niet dat u deze kaders een-op-een hoeft te implementeren als losstaande silo's. In de praktijk overlappen veel eisen elkaar: de BIO vereist bijvoorbeeld encryptie van gevoelige gegevens, de AVG stelt eisen aan de beveiliging van persoonsgegevens, en ISO 27001 beschrijft algemene maatregelen voor data protection. Een effectieve aanpak is daarom om een geïntegreerd compliance-raamwerk op te zetten waarin gemeenschappelijke eisen worden geïdentificeerd en vertaald naar concrete Azure-configuraties. Azure Policy, Microsoft Defender for Cloud en compliance-dashboards kunnen vervolgens worden gebruikt om deze configuraties te monitoren en af te dwingen. Door compliance te benaderen als een samenhangend geheel in plaats van losse checklists, ontstaat efficiëntie in implementatie en beheer, terwijl tegelijkertijd alle relevante kaders worden afgedekt.

Een belangrijk aspect van Azure compliance voor Nederlandse overheidsorganisaties is data residency en soevereiniteit. Veel organisaties vragen zich af waar hun data fysiek wordt opgeslagen, of data de Europese grenzen verlaat, en of zij voldoende controle behouden over hun gegevens. Microsoft biedt verschillende opties om hieraan tegemoet te komen, waaronder de EU Data Boundary die garandeert dat klantgegevens binnen de Europese Unie blijven, en sovereign cloud opties zoals Azure Government die extra garanties bieden voor overheidsorganisaties. Deze keuzes hebben directe impact op compliance: bepaalde wetten vereisen expliciet dat data binnen de EU blijft, terwijl andere organisaties mogelijk extra eisen stellen vanuit risicomanagement of bestuurlijke afwegingen. Het is daarom essentieel om data residency-vereisten expliciet te maken in het compliance-raamwerk en deze te vertalen naar concrete Azure-configuraties en servicekeuzes.

Implementatieframework: van policy naar praktijk

Het implementeren van een volwassen compliance-raamwerk in Azure begint met het vertalen van wettelijke eisen en normenkaders naar concrete, meetbare configuratie-eisen. Dit proces begint bij een grondige analyse: welke artikelen en controls uit de BIO, NIS2, AVG of ISO 27001 zijn relevant voor de Azure-omgeving, en hoe kunnen deze worden vertaald naar Azure-specifieke maatregelen? Voorbeelden zijn: 'alle opslagaccounts moeten versleuteling-at-rest hebben' (vertaling van BIO-vereisten rond data protection), 'alle netwerkverbindingen moeten worden gelogd' (vertaling van NIS2-vereisten rond monitoring), of 'persoonsgegevens mogen alleen worden opgeslagen in goedgekeurde Azure-regio's binnen de EU' (vertaling van AVG-vereisten rond data residency). Deze vertalingen worden vastgelegd in een compliance-matrix die expliciet maakt welke Azure-configuraties bijdragen aan welke compliance-vereisten, zodat later tijdens audits duidelijk kan worden aangetoond dat maatregelen zijn genomen.

Vervolgens worden deze eisen vertaald naar Azure Policy-definities en initiatieven die automatisch kunnen controleren of resources voldoen aan de gestelde eisen. Azure Policy biedt honderden ingebouwde policies die direct aansluiten bij compliance-kaders zoals de Azure Security Benchmark, maar organisaties zullen ook custom policies moeten ontwikkelen voor organisatie-specifieke eisen. Deze policies worden gebundeld in initiatieven per thema (bijvoorbeeld 'BIO Compliance Baseline', 'AVG Data Protection', 'NIS2 Security Monitoring') en toegewezen aan management groups en subscriptions. Het effecttype kan variëren: audit-only policies signaleren afwijkingen zonder te blokkeren, deny policies voorkomen dat niet-conforme resources worden aangemaakt, en deployIfNotExists policies zorgen automatisch dat ontbrekende configuraties worden aangebracht. Door een gelaagde aanpak te hanteren – met generieke basismaatregelen op hoog niveau en specifieke maatregelen op lagere niveaus – ontstaat een flexibel maar krachtig compliance-raamwerk.

Microsoft Defender for Cloud vormt een belangrijke aanvulling op Azure Policy door continue security assessments uit te voeren op basis van beveiligingsstandaarden zoals de Azure Security Benchmark, NIST, CIS en ISO 27001. Defender for Cloud genereert aanbevelingen voor verbeteringen, detecteert bedreigingen in real-time, en biedt secure score als samenvattende indicator van de beveiligingspostuur. Voor compliance-doeleinden is het belangrijk om deze beveiligingsstandaarden te activeren en te koppelen aan de organisatie-specifieke compliance-vereisten. Door de secure score te monitoren en te benchmarken tegen interne doelen of sectorale gemiddelden, krijgen bestuurders en compliance officers een duidelijk beeld van de compliance-volwassenheid. Daarnaast biedt Defender for Cloud regulatory compliance-dashboards die expliciet laten zien welke controls uit verschillende frameworks (zoals ISO 27001, NIST, PCI-DSS) wel of niet worden nageleefd, wat waardevol is voor audits en rapportages richting toezichthouders.

Een volwassen compliance-implementatie gaat verder dan alleen technische configuraties. Het omvat ook organisatorische processen: wie is verantwoordelijk voor compliance, hoe worden uitzonderingen op beleid behandeld, hoe vaak worden compliance-assessments uitgevoerd, en hoe wordt gerapporteerd richting bestuur en toezichthouders? Deze processen moeten worden vastgelegd in procedures en geïntegreerd in de reguliere governance- en changeprocessen. Geautomatiseerde compliance-rapportages, dashboards en alerts zorgen ervoor dat compliance niet wordt vergeten in de dagelijkse operatie, maar continu wordt bewaakt en verbeterd. Door compliance expliciet te koppelen aan risicomanagement en security operations ontstaat een proactieve cultuur waarin afwijkingen snel worden gesignaleerd en opgelost, in plaats van reactief tijdens audits of na incidenten.

Monitoring, rapportage en continue verbetering

Gebruik PowerShell-script index.ps1 (functie Invoke-Monitoring) – Geeft een overzicht van de compliance-status van de Azure-omgeving, inclusief policy compliance, secure score en belangrijke compliance-indicatoren..

Compliance is geen eenmalige activiteit, maar vereist continue monitoring en rapportage om te verifiëren dat de Azure-omgeving blijft voldoen aan de gestelde eisen. Azure Policy en Policy Insights leveren gedetailleerde informatie over de mate waarin resources voldoen aan toegewezen beleidsregels, met specifieke rapportages per policy, resource type, subscription en resource group. Microsoft Defender for Cloud biedt secure score als samenvattende indicator en gedetailleerde aanbevelingen per resource en security control. Door deze gegevens te combineren in dashboards (bijvoorbeeld met Azure Monitor workbooks of Power BI) ontstaat een actueel beeld van de compliance-status per domein, workload en eigenaar. Voor bestuur en directie zijn vooral trendinformatie, grote afwijkingen en de relatie met risico's relevant; voor operationele teams zijn detailoverzichten van niet-conforme resources en toegewezen acties essentieel.

Effectieve compliance-rapportage gaat verder dan het simpelweg verzamelen van technische metingen. Het moet ook de context bieden die nodig is voor bestuurlijke besluitvorming en verantwoording richting toezichthouders. Dat betekent dat rapportages niet alleen laten zien hoe de huidige situatie is, maar ook welke verbeteringen in de afgelopen periode zijn doorgevoerd, welke rest-risico's bewust zijn geaccepteerd met motivatie, en welke acties nog openstaan om compliance verder te verbeteren. Voor Nederlandse overheidsorganisaties is het verstandig om een vaste rapportagecyclus af te spreken, bijvoorbeeld kwartaalrapportages over de ontwikkeling van secure score, aantallen niet-conforme resources, doorgevoerde verbeteracties en openstaande risico's. Deze rapportages worden besproken in governance-overleggen met CISO, compliance officer en bestuur, en vormen de basis voor besluitvorming over aanvullende investeringen, prioritering van verbeteracties of acceptatie van rest-risico's.

Continue verbetering van compliance vereist een gestructureerde aanpak waarbij bevindingen uit monitoring worden vertaald naar concrete verbeteracties. Niet-conforme resources moeten worden geanalyseerd: wat is de oorzaak (bijvoorbeeld ontbrekende kennis, technische beperkingen, of bewuste afwijking), wat is de impact op risico's en compliance, en wat is de beste remediatiestrategie? Sommige afwijkingen kunnen automatisch worden opgelost via remediation tasks of deployIfNotExists policies, andere vereisen handmatige interventie of procesaanpassingen. Belangrijk is dat verbeteracties worden voorzien van een eigenaar, deadline en prioriteit, en dat de voortgang wordt gemonitord totdat de afwijking is opgelost. Door dit proces expliciet te maken en te koppelen aan het bredere risicomanagement- en changeproces, ontstaat een transparante keten van bevinding → analyse → maatregel → verificatie → rest-risico. Dit sluit rechtstreeks aan bij de eisen uit BIO, ISO 27001 en NIS2 rond continue verbetering en aantoonbaarheid van beheersmaatregelen.

Governance en relatie met andere compliance-artikelen

Compliance in Azure is geen geïsoleerde discipline, maar moet worden ingebed in een breder governance-raamwerk dat enterprise architectuur, risicomanagement, security operations en change management met elkaar verbindt. Zonder duidelijke governance ontstaat het risico dat compliance wordt gezien als een lastige verplichting die vooral tijdens audits belangrijk is, in plaats van een integraal onderdeel van de cloudstrategie. Een effectief governance-model benoemt daarom expliciete rollen en verantwoordelijkheden: wie is eindverantwoordelijk voor compliance (vaak de CISO of compliance officer), wie beheert Azure Policies en compliance-configuraties (vaak een cloud architect of security architect), wie voert compliance-assessments uit (vaak interne audit of een gespecialiseerd team), en wie rapporteert richting bestuur en toezichthouders? Deze rollen worden vertaald naar concrete taken en processen die vastgelegd worden in governance-documenten, zodat zij organisatiebreed herkenbaar zijn.

Dit index-artikel moet expliciet worden gelezen in samenhang met andere compliance-artikelen binnen de 'Nederlandse Baseline voor Veilige Cloud'. Het artikel over geautomatiseerde compliance-controles beschrijft hoe Azure Policy en Microsoft Defender for Cloud kunnen worden ingezet om compliance continu te bewaken en af te dwingen. Het artikel over data residency controls gaat dieper in op de configuratie van Azure-regio's en data boundary-vereisten. Het artikel over EU data boundary beschrijft hoe Microsoft's EU Data Boundary kan worden gebruikt om te garanderen dat klantgegevens binnen de EU blijven. Het artikel over government cloud opties behandelt de keuzes die organisaties hebben tussen publieke Azure, Azure Government en sovereign cloud opties. Het artikel over multi-framework compliance beschrijft hoe meerdere normenkaders (BIO, NIS2, AVG, ISO 27001) kunnen worden geïntegreerd in één samenhangend raamwerk. Samen vormen deze artikelen een compleet beeld: dit index-artikel schetst de overkoepelende lijnen en het governance-kader, terwijl de deelartikelen verdieping bieden op specifieke compliance-aspecten en technische implementaties.

Voor auditors en toezichthouders is vooral van belang dat de samenhang tussen beleid, technische configuraties, monitoring en remediatie aantoonbaar is. Dat betekent dat u niet alleen compliance-documenten en procesbeschrijvingen beschikbaar heeft, maar ook concreet kunt laten zien welke Azure Policies zijn toegepast, hoe resources zijn geconfigureerd, 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 compliance-aspecten – helpen om deze informatie snel en reproduceerbaar te verzamelen. Door hun output te koppelen aan dashboards en rapportages wordt compliance niet beperkt tot papieren documenten, maar ondersteund door actuele operationele data die aantoonbaar maakt dat het compliance-raamwerk daadwerkelijk wordt nageleefd, gemonitord en verbeterd. Dit vormt de basis voor vertrouwen bij toezichthouders en het bestuur, en helpt om compliance te positioneren als een proactieve, waarde-toevoegende activiteit in plaats van een reactieve, lastige verplichting.

Remediatie en volwassenwording van Azure compliance

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

Remediatie binnen het Azure compliance-domein betekent in de praktijk dat u gaten dicht tussen de gewenste compliance-status en de werkelijkheid. In veel organisaties bestaan al wel beleidsdocumenten over informatiebeveiliging en compliance, maar ontbreekt concrete vastlegging van hoe deze worden vertaald naar Azure-configuraties, welke policies daadwerkelijk zijn toegepast, en hoe compliance wordt gemonitord en verbeterd. Het index-script ondersteunt remediatie door automatisch te inventariseren waar compliance-vereisten niet worden nageleefd, waar belangrijke policies ontbreken, waar secure score onder de gestelde drempelwaarden ligt, en waar documentatie verouderd of incompleet is. Op basis van deze inventarisatie kunnen gerichte verbeteracties worden gepland en uitgevoerd, waarbij prioriteit wordt gegeven aan de meest kritieke hiaten die de grootste impact hebben op risico's en wettelijke naleving.

Een volwassen Azure compliance-raamwerk groeit stap voor stap door continue verbetering. Na elke monitoringsronde worden de belangrijkste verbeterpunten vastgelegd, van een eigenaar voorzien en ingepland in het reguliere change- of verbeterportfolio. Denk aan het implementeren van ontbrekende Azure Policies, het activeren van aanvullende Defender for Cloud-securitystandaarden, het verbeteren van compliance-rapportages en dashboards, het actualiseren van compliance-documentatie, of het invoeren van geautomatiseerde remediation workflows. Door de resultaten van het index-script te combineren met de uitkomsten van gespecialiseerde scripts voor specifieke compliance-aspecten ontstaat een integraal beeld van de voortgang. Uiteindelijk wordt Azure compliance zo niet alleen een set van technische configuraties en processen, maar een aantoonbaar beheerst en verantwoord ingericht raamwerk dat continu wordt geëvalueerd en verbeterd om te blijven voldoen aan veranderende eisen, dreigingen en regelgeving.

Compliance & Frameworks

Automation

Gebruik het onderstaande PowerShell script om deze security control te monitoren en te implementeren. Het script bevat functies voor zowel monitoring (-Monitoring) als remediation (-Remediation).

PowerShell
<# .SYNOPSIS Overzichtsmonitoring en remediatie voor Azure Compliance-status .DESCRIPTION Geeft een samenvattend beeld van de compliance-status van de Azure-omgeving, inclusief policy compliance, secure score en belangrijke compliance-indicatoren. Ondersteunt het gericht identificeren en dichten van compliance-hiaten. .NOTES Filename: index.ps1 Author: Nederlandse Baseline voor Veilige Cloud Created: 2025-01-27 Last Modified: 2025-01-27 Version: 1.0 Related JSON: content/azure/compliance/index.json .LINK https://github.com/[org]/m365-tenant-best-practise .EXAMPLE .\index.ps1 -Monitoring Toont een samenvattend overzicht van Azure compliance-status en belangrijke indicatoren. .EXAMPLE .\index.ps1 -Remediation Genereert een overzicht van compliance-hiaten en biedt handvatten voor verbeteracties. #> #Requires -Version 5.1 #Requires -Modules Az.Accounts, Az.Resources, Az.PolicyInsights, Az.Security [CmdletBinding()] param( [Parameter(HelpMessage = "Voer een samenvattende monitoring uit van de Azure compliance-status.")] [switch]$Monitoring, [Parameter(HelpMessage = "Genereer remediatie-overzichten en handvatten voor compliance-verbeteringen.")] [switch]$Remediation, [Parameter(HelpMessage = "Toon welke acties zouden worden uitgevoerd zonder daadwerkelijk te wijzigen.")] [switch]$WhatIf ) $ErrorActionPreference = 'Stop' $VerbosePreference = 'Continue' function Get-RepositoryRoot { <# .SYNOPSIS Bepaalt de rootmap van de repository op basis van de locatie van dit script. .OUTPUTS String met pad naar repository-root. #> [CmdletBinding()] param() $root = Resolve-Path (Join-Path $PSScriptRoot "..\..\..") -ErrorAction SilentlyContinue if (-not $root) { throw "Kon de repository-root niet bepalen op basis van PSScriptRoot: $PSScriptRoot" } return $root.Path } function Get-ComplianceInventory { <# .SYNOPSIS Stelt een overzicht op van Azure compliance-gerelateerde JSON- en PS1-bestanden. .OUTPUTS PSCustomObject met aantallen en details. #> [CmdletBinding()] param() $repoRoot = Get-RepositoryRoot $contentRoot = Join-Path $repoRoot "content\azure\compliance" $codeRoot = Join-Path $repoRoot "code\azure\compliance" $jsonFiles = @() if (Test-Path -Path $contentRoot) { $jsonFiles = Get-ChildItem -Path $contentRoot -Filter "*.json" -File -ErrorAction SilentlyContinue } $ps1Files = @() if (Test-Path -Path $codeRoot) { $ps1Files = Get-ChildItem -Path $codeRoot -Filter "*.ps1" -File -ErrorAction SilentlyContinue } $byName = @{} foreach ($json in $jsonFiles) { $base = [System.IO.Path]::GetFileNameWithoutExtension($json.Name) if (-not $byName.ContainsKey($base)) { $byName[$base] = [pscustomobject]@{ Name = $base JsonPath = $null JsonUpdated = $null ScriptPath = $null ScriptUpdated= $null } } $entry = $byName[$base] $entry.JsonPath = $json.FullName $entry.JsonUpdated = $json.LastWriteTime $byName[$base] = $entry } foreach ($ps1 in $ps1Files) { $base = [System.IO.Path]::GetFileNameWithoutExtension($ps1.Name) if (-not $byName.ContainsKey($base)) { $byName[$base] = [pscustomobject]@{ Name = $base JsonPath = $null JsonUpdated = $null ScriptPath = $null ScriptUpdated= $null } } $entry = $byName[$base] $entry.ScriptPath = $ps1.FullName $entry.ScriptUpdated = $ps1.LastWriteTime $byName[$base] = $entry } $items = $byName.Values | Sort-Object Name $missingJson = $items | Where-Object { -not $_.JsonPath } $missingScript = $items | Where-Object { -not $_.ScriptPath } return [pscustomobject]@{ RepositoryRoot = $repoRoot Items = $items MissingJson = $missingJson MissingScripts = $missingScript TotalControls = $items.Count WithJsonAndPs1 = ($items | Where-Object { $_.JsonPath -and $_.ScriptPath }).Count } } function Test-AzureConnection { <# .SYNOPSIS Controleert of er een actieve Azure-verbinding bestaat. .OUTPUTS Boolean: $true als verbonden, anders $false #> [CmdletBinding()] param() try { $context = Get-AzContext -ErrorAction Stop if ($context) { Write-Verbose "Azure-verbinding actief: $($context.Account.Id) in tenant $($context.Tenant.Id)" return $true } return $false } catch { Write-Verbose "Geen actieve Azure-verbinding: $_" return $false } } function Get-AzureComplianceStatus { <# .SYNOPSIS Inventariseert de compliance-status van de Azure-omgeving. .OUTPUTS PSCustomObject met compliance-status. #> [CmdletBinding()] param() $isConnected = Test-AzureConnection if (-not $isConnected) { Write-Warning "Geen actieve Azure-verbinding. Alleen repository-inventarisatie wordt uitgevoerd." return [pscustomobject]@{ AzureConnected = $false Subscriptions = 0 PolicyAssignments = 0 NonCompliantResources = 0 SecureScore = $null } } try { Write-Verbose "Inventariseren van Azure compliance-status..." $subscriptions = @() try { $subscriptions = Get-AzSubscription -ErrorAction SilentlyContinue | Where-Object { $_.State -eq 'Enabled' } } catch { Write-Verbose "Kon subscriptions niet ophalen: $_" } $totalPolicyAssignments = 0 $totalNonCompliant = 0 $secureScoreAverage = $null $secureScores = @() foreach ($sub in $subscriptions) { Set-AzContext -SubscriptionId $sub.Id -ErrorAction SilentlyContinue | Out-Null try { # Haal policy assignments op $assignments = Get-AzPolicyAssignment -ErrorAction SilentlyContinue $totalPolicyAssignments += $assignments.Count # Haal policy compliance summary op $summary = Get-AzPolicyStateSummary -ErrorAction SilentlyContinue if ($summary -and $summary.Results) { foreach ($r in $summary.Results) { if ($r.NonCompliantResources) { $totalNonCompliant += [int]$r.NonCompliantResources } } } } catch { Write-Verbose "Kon policy-compliance voor subscription '$($sub.Name)' niet ophalen: $_" } try { # Probeer secure score op te halen (vereist Defender for Cloud) $scores = Get-AzSecuritySecureScore -ErrorAction SilentlyContinue if ($scores) { foreach ($s in $scores) { if ($s.Properties.Percentage) { $secureScores += [double]$s.Properties.Percentage } } } } catch { Write-Verbose "Kon secure score voor subscription '$($sub.Name)' niet ophalen (mogelijk Defender for Cloud niet actief): $_" } } if ($secureScores.Count -gt 0) { $secureScoreAverage = [math]::Round(($secureScores | Measure-Object -Average).Average * 100, 1) } return [pscustomobject]@{ AzureConnected = $true Subscriptions = $subscriptions.Count PolicyAssignments = $totalPolicyAssignments NonCompliantResources = $totalNonCompliant SecureScore = $secureScoreAverage } } catch { Write-Warning "Fout bij inventariseren van Azure compliance-status: $_" return [pscustomobject]@{ AzureConnected = $false Subscriptions = 0 PolicyAssignments = 0 NonCompliantResources = 0 SecureScore = $null } } } function Invoke-Monitoring { <# .SYNOPSIS Voert een samenvattende monitoring uit van Azure compliance-status. .OUTPUTS PSCustomObject met overzichtsresultaten. #> [CmdletBinding()] param() Write-Host "`nMonitoring: Azure Compliance overzicht" -ForegroundColor Yellow Write-Host "=========================================" -ForegroundColor Yellow $inventory = Get-ComplianceInventory $azureStatus = Get-AzureComplianceStatus Write-Host "`nRepository-root: $($inventory.RepositoryRoot)" -ForegroundColor Cyan Write-Host "Totaal Azure compliance controls (JSON/PS1-combinaties): $($inventory.TotalControls)" -ForegroundColor Cyan Write-Host "Volledig gekoppeld (JSON + PS1): $($inventory.WithJsonAndPs1)" -ForegroundColor Cyan if ($azureStatus.AzureConnected) { Write-Host "`nAzure compliance-status:" -ForegroundColor Cyan Write-Host " Actieve subscriptions: $($azureStatus.Subscriptions)" -ForegroundColor Gray Write-Host " Policy assignments: $($azureStatus.PolicyAssignments)" -ForegroundColor Gray Write-Host " Niet-conforme resources: $($azureStatus.NonCompliantResources)" -ForegroundColor $(if ($azureStatus.NonCompliantResources -gt 0) { "Yellow" } else { "Gray" }) if ($null -ne $azureStatus.SecureScore) { Write-Host " Gemiddelde secure score: $($azureStatus.SecureScore)%" -ForegroundColor $(if ($azureStatus.SecureScore -lt 60) { "Yellow" } elseif ($azureStatus.SecureScore -lt 80) { "Cyan" } else { "Green" }) } else { Write-Host " Gemiddelde secure score: n.v.t. (Defender for Cloud mogelijk niet actief)" -ForegroundColor Yellow } } else { Write-Host "`n⚠️ Geen actieve Azure-verbinding. Verbind met Connect-AzAccount voor volledige compliance-monitoring." -ForegroundColor Yellow } if ($inventory.MissingJson.Count -gt 0) { Write-Host "`n❌ Ontbrekende JSON voor de volgende scripts:" -ForegroundColor Red foreach ($item in $inventory.MissingJson) { Write-Host " - $($item.Name) (script: $($item.ScriptPath))" -ForegroundColor Red } } if ($inventory.MissingScripts.Count -gt 0) { Write-Host "`n❌ Ontbrekende PS1-scripts voor de volgende JSON-bestanden:" -ForegroundColor Red foreach ($item in $inventory.MissingScripts) { Write-Host " - $($item.Name) (json: $($item.JsonPath))" -ForegroundColor Red } } if (($inventory.MissingJson.Count -eq 0) -and ($inventory.MissingScripts.Count -eq 0)) { Write-Host "`n✅ Alle Azure compliance-artikelen hebben zowel JSON als PS1." -ForegroundColor Green } else { Write-Host "`n⚠️ Er zijn nog hiaten in de JSON/PS1-koppeling voor Azure compliance." -ForegroundColor Yellow Write-Host " Gebruik -Remediation om gericht met deze hiaten aan de slag te gaan." -ForegroundColor Yellow } # Compliance evaluatie $isCompliant = $true if ($azureStatus.AzureConnected) { if ($azureStatus.NonCompliantResources -gt 0) { $isCompliant = $false Write-Host "`n⚠️ Er zijn niet-conforme resources gedetecteerd. Onderzoek deze via Azure Policy of Defender for Cloud." -ForegroundColor Yellow } if ($null -ne $azureStatus.SecureScore -and $azureStatus.SecureScore -lt 60) { $isCompliant = $false Write-Host "⚠️ Secure score ligt onder 60%. Prioriteer verbeteracties op basis van Defender for Cloud-aanbevelingen." -ForegroundColor Yellow } if ($azureStatus.PolicyAssignments -eq 0) { Write-Host "⚠️ Geen policy assignments gevonden. Overweeg het implementeren van Azure Policies voor compliance-controle." -ForegroundColor Yellow } } return [pscustomobject]@{ Inventory = $inventory AzureStatus = $azureStatus IsCompliant = $isCompliant } } function Invoke-Remediation { <# .SYNOPSIS Ondersteunt remediatie door compliance-hiaten inzichtelijk te maken en handvatten te bieden voor verbeteracties. .OUTPUTS PSCustomObject met remediatieadvies. #> [CmdletBinding()] param() Write-Host "`nRemediatie: Azure Compliance verbetering" -ForegroundColor Yellow Write-Host "==========================================" -ForegroundColor Yellow $inventory = Get-ComplianceInventory $azureStatus = Get-AzureComplianceStatus $repoRoot = $inventory.RepositoryRoot $actions = @() Write-Host "`nCompliance-hiaten analyse:" -ForegroundColor Cyan if ($azureStatus.AzureConnected) { if ($azureStatus.NonCompliantResources -gt 0) { $action = [pscustomobject]@{ Priority = "High" Issue = "Niet-conforme resources gedetecteerd" Count = $azureStatus.NonCompliantResources Recommendation = "Gebruik Azure Policy compliance-dashboards om specifieke niet-conforme resources te identificeren en remediatie uit te voeren." } $actions += $action Write-Host " ❌ $($action.Issue): $($action.Count) resources" -ForegroundColor Red Write-Host " → $($action.Recommendation)" -ForegroundColor Gray } if ($null -ne $azureStatus.SecureScore -and $azureStatus.SecureScore -lt 60) { $action = [pscustomobject]@{ Priority = "High" Issue = "Secure score onder drempelwaarde" Count = $azureStatus.SecureScore Recommendation = "Activeer Microsoft Defender for Cloud beveiligingsstandaarden en prioriteer aanbevelingen met hoge impact." } $actions += $action Write-Host " ⚠️ $($action.Issue): $($action.Count)%" -ForegroundColor Yellow Write-Host " → $($action.Recommendation)" -ForegroundColor Gray } elseif ($null -eq $azureStatus.SecureScore) { $action = [pscustomobject]@{ Priority = "Medium" Issue = "Secure score niet beschikbaar" Count = 0 Recommendation = "Controleer of Microsoft Defender for Cloud is geactiveerd en beveiligingsstandaarden zijn ingeschakeld." } $actions += $action Write-Host " ⚠️ $($action.Issue)" -ForegroundColor Yellow Write-Host " → $($action.Recommendation)" -ForegroundColor Gray } if ($azureStatus.PolicyAssignments -eq 0) { $action = [pscustomobject]@{ Priority = "Medium" Issue = "Geen policy assignments gevonden" Count = 0 Recommendation = "Implementeer Azure Policy initiatieven voor compliance-controles (bijv. Azure Security Benchmark, BIO baseline)." } $actions += $action Write-Host " ⚠️ $($action.Issue)" -ForegroundColor Yellow Write-Host " → $($action.Recommendation)" -ForegroundColor Gray } } else { Write-Host " ⚠️ Verbind met Azure voor gedetailleerde compliance-analyse" -ForegroundColor Yellow } if ($inventory.MissingJson.Count -gt 0 -or $inventory.MissingScripts.Count -gt 0) { Write-Host "`nRepository-hiaten:" -ForegroundColor Cyan Write-Host (" Items zonder JSON: {0}" -f $inventory.MissingJson.Count) -ForegroundColor Cyan Write-Host (" Items zonder script: {0}" -f $inventory.MissingScripts.Count) -ForegroundColor Cyan Write-Host " → Werk deze hiaten bij om het compliance-raamwerk compleet te maken." -ForegroundColor Gray } Write-Host "`nVolgende stappen:" -ForegroundColor Cyan Write-Host "1. Analyseer niet-conforme resources via Azure Policy compliance-dashboards" -ForegroundColor White Write-Host "2. Implementeer ontbrekende Azure Policies en initiatieven" -ForegroundColor White Write-Host "3. Activeer en configureer Microsoft Defender for Cloud" -ForegroundColor White Write-Host "4. Stel compliance-dashboards en rapportages op" -ForegroundColor White Write-Host "5. Voer regelmatige compliance-assessments uit" -ForegroundColor White return [pscustomobject]@{ Actions = $actions Inventory = $inventory AzureStatus = $azureStatus } } try { Write-Host "`n========================================" -ForegroundColor Cyan Write-Host "Azure Compliance Overzichtsmonitor" -ForegroundColor Cyan Write-Host "Nederlandse Baseline voor Veilige Cloud" -ForegroundColor Cyan Write-Host "========================================`n" -ForegroundColor Cyan if ($Monitoring) { $result = Invoke-Monitoring if ($result.IsCompliant) { exit 0 } else { exit 1 } } elseif ($Remediation) { Invoke-Remediation | Out-Null } else { # Standaard: compacte compliance check via monitoring $result = Invoke-Monitoring if ($result.IsCompliant -and ($result.Inventory.MissingJson.Count -eq 0) -and ($result.Inventory.MissingScripts.Count -eq 0)) { Write-Host "`n✅ COMPLIANT" -ForegroundColor Green exit 0 } else { Write-Host "`n❌ NON-COMPLIANT" -ForegroundColor Red Write-Host "Run met -Monitoring voor gedetailleerde rapportage" -ForegroundColor Yellow Write-Host "Run met -Remediation voor gericht verbeteradvies" -ForegroundColor Yellow exit 1 } } } catch { Write-Error "Er is een fout opgetreden in index.ps1: $_" exit 2 } finally { Write-Host "`n========================================`n" -ForegroundColor Cyan }

Risico zonder implementatie

Risico zonder implementatie
High: Zonder een volwassen compliance-raamwerk in Azure ontstaat het risico dat organisaties niet kunnen aantonen dat zij voldoen aan BIO, NIS2, AVG en andere relevante wet- en regelgeving. Dit kan leiden tot boetes, verplichte herstelmaatregelen, reputatieschade, verlies van vertrouwen bij burgers en bestuurlijke aansprakelijkheid bij incidenten of datalekken.

Management Samenvatting

Azure compliance vereist een samenhangend raamwerk dat meerdere wettelijke kaders (BIO, NIS2, AVG, ISO 27001) integreert en vertaalt naar concrete Azure-configuraties. Dit index-artikel fungeert als centrale verzamelplaats voor compliance-artikelen en beschrijft governance, implementatie, monitoring en continue verbetering van compliance in Azure-omgevingen.