Kubernetes Governance Met Azure Arc

💼 Management Samenvatting

Kubernetes governance met Azure Arc stelt Nederlandse overheidsorganisaties in staat om containerplatformen die buiten Azure draaien – in eigen datacenters, bij andere cloudproviders of in gespecialiseerde hostingomgevingen – centraal te beheren en te beveiligen. Door Arc-enabled Kubernetes te gebruiken, kunnen security- en beheerteams uniform beleid afdwingen, configuraties controleren en compliance toetsen, ongeacht waar clusters fysiek zijn ondergebracht.

Aanbeveling
IMPLEMENTEER CENTRALE GOVERNANCE VOOR ALLE ARC-VERBONDEN KUBERNETES-CLUSTERS
Risico zonder
High
Risk Score
9/10
Implementatie
140u (tech: 80u)
Van toepassing op:
Azure
Azure Arc
Kubernetes
Hybride en multi-cloud omgevingen

Zonder een centrale governance-laag voor Kubernetes ontstaan gefragmenteerde omgevingen waarin ieder cluster zijn eigen configuratie, toegangsmodel en beveiligingsmaatregelen hanteert. Voor de Nederlandse publieke sector betekent dit een hoog risico op inconsistent beleid, niet-gepatchte kwetsbaarheden, onvoldoende logging en beperkte auditbaarheid over meerdere omgevingen heen. Bovendien vragen BIO, NIS2 en sectorale kaders om aantoonbare controle over alle bedrijfskritische IT-diensten, ook wanneer deze buiten de eigen Azure-tenant draaien. Azure Arc-enabled Kubernetes biedt een uniforme besturingslaag waarmee clusters worden ingeschreven in dezelfde governance- en complianceprocessen als native Azure-resources. Door beleid, configuratiedrift, toegangsbeheer en compliance-rapportages centraal te organiseren, wordt het mogelijk om hybride en multi-cloud Kubernetes-landschappen op een beheerste manier te exploiteren zonder in te leveren op veiligheid of transparantie.

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

Implementatie

Dit artikel beschrijft hoe Nederlandse overheidsorganisaties een robuust Kubernetes governance-raamwerk opzetten op basis van Azure Arc. We behandelen de inschrijving van bestaande clusters bij Azure Arc, de inrichting van role-based access control via Azure en Kubernetes, het toepassen van Azure Policy voor Kubernetes voor configuratie- en beveiligingsregels, en het gebruik van GitOps-configuraties voor gecontroleerde uitrol van platformcomponenten. Daarnaast gaan we in op compliance-rapportage, incidentrespons en de integratie met bestaande processen voor change- en risicomanagement. Het bijbehorende PowerShell-script ondersteunt u bij het inventariseren van Arc-verbonden clusters, het bepalen van de governance- en compliance-status en het genereren van concrete verbeteracties voor clusters die nog niet aan de Nederlandse Baseline voor Veilige Cloud voldoen.

Onboarding van Kubernetes-clusters op Azure Arc

Een solide governance-strategie begint bij volledige zichtbaarheid: u kunt alleen beleid afdwingen op Kubernetes-clusters die zijn opgenomen in uw centrale beheerplatform. Azure Arc fungeert hierbij als koppelvlak tussen uw bestaande Kubernetes-omgevingen en Azure. Het onboarden van een cluster houdt in dat u de Arc-agent en bijbehorende componenten installeert, waarna het cluster als resource in Azure verschijnt met metadata over locatie, type distributie en gekoppelde configuraties. Voor Nederlandse overheidsorganisaties is het zinvol om al in de ontwerp- en architectuurfase te bepalen welke clusters in aanmerking komen voor Arc-onboarding: productiesystemen met persoonsgegevens, kritieke ketenvoorzieningen en integratieplatformen krijgen doorgaans prioriteit, gevolgd door test- en acceptatieomgevingen die voor regressietests worden gebruikt. Door clusters 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 governance- en security-parameters mee te geven. Dit begint bij de keuze van de resource group en het abonnement waarin het Arc-cluster wordt geregistreerd, omdat hiermee de verantwoordelijke beheerafdeling, kostenplaats en security boundary worden bepaald. Kies een naamgevingsconventie waarin omgeving (ontwikkel, test, acceptatie, productie), organisatieonderdeel en locatie herkenbaar zijn, zodat u later eenvoudig kunt filteren op bijvoorbeeld productieniveau of specifieke ketens. Koppel vervolgens tags aan elk Arc-cluster, zoals dataclassificatie, eigenaar, contactpersoon, bedrijfsproces 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 clusters 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 ondersteunt zowel Azure RBAC voor het beheren van rechten op resource-niveau als integratie met Kubernetes RBAC binnen het cluster. In de praktijk betekent dit dat u eerst definieert welke rollen in Azure bevoegd zijn om Arc-clusters te onboarden, te wijzigen of te verwijderen, en vervolgens vastlegt welke rollen binnen Kubernetes toegang krijgen tot namespaces, workloads en configuratie-objecten. Door dit te koppelen aan bestaande rolmodellen, zoals een scheiding tussen platformbeheerders, applicatiebeheerders 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 elk nieuw cluster volgens dezelfde governance-standaard wordt opgenomen in de hybride omgeving.

Beleid, configuratie en compliance-borging

Gebruik PowerShell-script kubernetes-governance.ps1 (functie Invoke-Monitoring) – Inventariseert Arc-verbonden Kubernetes-clusters en controleert governance- en compliance-aspecten, zoals Azure Policy-toewijzingen, GitOps-configuraties en tagging..

Zodra clusters via Azure Arc zijn geregistreerd, kan governance worden ingevuld door beleid en configuratieregels centraal te definiëren en af te dwingen. Azure Policy voor Kubernetes maakt het mogelijk om regels toe te passen op cluster- en namespace-niveau, bijvoorbeeld om te eisen dat pods geen privileged modus gebruiken, dat alleen images uit goedgekeurde containerregistries zijn toegestaan of dat bepaalde labels verplicht zijn op namespaces en workloads. Voor Nederlandse overheidsorganisaties is dit een krachtige manier om beveiligings- en compliance-eisen uit de BIO of NIS2 direct te vertalen naar technische controles. Door beleid op management group-niveau of abonnementsniveau toe te wijzen aan Arc-clusters, ontstaat een uniforme baseline die automatisch wordt gevalideerd zodra nieuwe clusters worden onboarded of wanneer configuraties wijzigen. Het bijbehorende PowerShell-script leest via Azure Resource Graph en Policy Insights uit welke clusters onder welk beleid vallen, welke policy-evaluaties mislukken en waar drift optreedt tussen gewenste en werkelijke configuratie.

GitOps vormt een tweede fundament onder Kubernetes governance met Azure Arc. In plaats van handmatig configuraties uit te rollen, beheren organisaties hun platformcomponenten en applicatieconfiguratie in Git-repositories, die vervolgens door de Arc GitOps-agent worden toegepast op de clusters. Dit sluit naadloos aan op bestaande change- en releaseprocessen binnen de overheid, waarin vier-ogen-principes, goedkeuringsworkflows en audittrails al zijn ingericht rondom versiebeheersystemen. Door GitOps-templates te ontwikkelen voor onder meer netwerkpolicies, logging- en monitoring-agents, security sidecars en toegangscontroles, ontstaat een herhaalbaar en controleerbaar uitrolproces. Wanneer een wijziging wordt gemerged in de hoofdbranch, wordt deze automatisch doorgevoerd naar de gekoppelde clusters, terwijl afwijkingen ten opzichte van de gewenste configuratie door de GitOps-agent worden gedetecteerd en gecorrigeerd. Governance-teams kunnen via rapportages en dashboards inzicht krijgen in de status van deze configuraties, inclusief welke clusters achterlopen of lokale wijzigingen bevatten die nog niet in Git zijn vastgelegd.

Compliance-borging draait uiteindelijk om aantoonbaarheid: auditors en toezichthouders willen niet alleen weten welk beleid is gedefinieerd, maar vooral in hoeverre dit in de praktijk wordt nageleefd. Azure Policy en Arc leveren hiervoor uitgebreide compliance-rapportages waarin per policy en per cluster 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 clusters aanvullende maatregelen nodig hebben, welke uitzonderingen tijdelijk worden geaccepteerd en welke verbeteracties in de roadmap moeten worden opgenomen.

Operationeel beheer en incidentrespons voor Arc-enabled Kubernetes

Gebruik PowerShell-script kubernetes-governance.ps1 (functie Invoke-Remediation) – Genereert een overzicht van niet-conforme Arc-Kubernetes-clusters met aanbevelingen voor governance-verbeteringen en prioritering..

Wanneer governance-structuren eenmaal zijn ingericht, verschuift de focus naar duurzaam operationeel beheer. In hybride Kubernetes-omgevingen is het cruciaal om operationele processen zoals patchmanagement, capaciteitsplanning, incidentrespons en wijzigingsbeheer te harmoniseren over alle clusters heen. Azure Arc levert hiervoor een centrale inventaris en biedt integraties met monitoringoplossingen zoals Azure Monitor, Log Analytics en Microsoft Sentinel. Door logstreams van Arc-enabled clusters te koppelen aan een centrale SIEM-oplossing, kunnen securityteams afwijkend gedrag, dreigingsindicatoren en misconfiguraties vroegtijdig detecteren, ook wanneer deze zich voordoen in on-premises datacenters of andere clouds. Voor Nederlandse overheidsorganisaties betekent dit dat de bestaande SOC-processen voor Azure en M365 kunnen worden uitgebreid naar Kubernetes-omgevingen buiten Azure, zonder dat daarvoor volledig nieuwe tooling of procedures nodig zijn.

Incidentrespons in een Arc-enabled Kubernetes-landschap vereist heldere afspraken over rollen, verantwoordelijkheden en escalatiepaden. Wanneer een incident wordt gedetecteerd – bijvoorbeeld een policy-violatie, een verdachte workload of een mislukte GitOps-deploy – moet snel duidelijk zijn welk team verantwoordelijk is voor onderzoek en herstel: het platformteam dat Arc en de clusters beheert, het applicatieteam dat workloads ontwikkelt of het securityteam dat dreigingen analyseert. Deze afspraken moeten worden vastgelegd in runbooks en playbooks die expliciet rekening houden met hybride scenario’s, zoals clusters die door externe hostingpartners worden beheerd of die in sectorale samenwerkingsverbanden worden gebruikt. Het PowerShell-script in dit artikel ondersteunt deze processen door gestructureerde overzichten te leveren van clusters met governance- en compliance-issues, inclusief aanbevelingen voor vervolgstappen. Dit verlaagt de drempel om incidenten snel te classificeren, prioriteren en af te handelen binnen de kaders van de Nederlandse Baseline voor Veilige Cloud.

Tot slot is continue verbetering een kernprincipe van volwassen governance. Arc-enabled Kubernetes biedt hiervoor de nodige feedbackloops: policy-compliance, GitOps-status en incidentrapportages geven inzicht in waar governancekaders in de praktijk worden uitgedaagd of omzeild. Door periodiek retrospectives te houden met vertegenwoordigers van platform-, ontwikkel- en securityteams, kan worden geëvalueerd welke policies effectief zijn, waar uitzonderingen structureel terugkomen en welke organisatorische of technische maatregelen nodig zijn om de naleving te verhogen. De uitkomsten hiervan moeten worden teruggekoppeld naar architectuurprincipes, richtlijnen en opleidingen, zodat Kubernetes governance niet beperkt blijft tot technische configuraties, maar wordt ingebed in de bredere digitale strategie van de organisatie. Op die manier groeit een Arc-enabled Kubernetes-landschap uit tot een beheersbare, transparante en veerkrachtige pijler onder de digitale overheid.

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 governance- en compliance-aspecten voor Azure Arc-enabled Kubernetes-clusters. .DESCRIPTION Dit script inventariseert Arc-verbonden Kubernetes-clusters en beoordeelt in hoeverre governance-afspraken en beveiligingsmaatregelen zijn geïmplementeerd. Het controleert onder meer: - Aanwezigheid van Azure Policy-toewijzingen voor Kubernetes - Gebruik van consistente tagging voor eigenaarschap, classificatie en bedrijfsproces - Aanwezige GitOps-configuraties via Azure Arc (Flux v2) In monitoringmodus wordt een rapport gegenereerd met de governance- en compliance-status per cluster. In remediatiemodus wordt een overzicht gemaakt van clusters met governance-hiaten, inclusief aanbevelingen voor vervolgstappen. .NOTES Filename: kubernetes-governance.ps1 Author: Nederlandse Baseline voor Veilige Cloud Created: 2025-11-26 Last Modified: 2025-11-26 Version: 1.0 Related JSON: content/azure/arc/kubernetes-governance.json .LINK https://github.com/[org]/m365-tenant-best-practise .EXAMPLE .\kubernetes-governance.ps1 -Monitoring Voert een controle uit op alle Arc-verbonden Kubernetes-clusters en toont de governance-status. .EXAMPLE .\kubernetes-governance.ps1 -Remediation Genereert een overzicht van clusters met governance-hiaten en aanbevelingen voor verbetering. .EXAMPLE .\kubernetes-governance.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 = "Kubernetes governance met Azure Arc" $PolicyDescription = "Controleert of Arc-verbonden Kubernetes-clusters zijn opgenomen in centrale governance, inclusief tagging, Azure Policy en GitOps-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.PolicyInsights') 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-DebugGovernanceData { [CmdletBinding()] param() return @( [PSCustomObject]@{ SubscriptionId = "00000000-0000-0000-0000-000000000010" SubscriptionName = "DBG-Overheid-NonProd" ResourceGroupName = "rg-arc-k8s-nonprod" ClusterName = "arc-k8s-nonprod-01" Location = "westeurope" Distribution = "AKS on Azure Stack HCI" HasRequiredTags = $true ClassificationTag = "Confidential" OwnerTag = "Team Digitale Diensten" BusinessProcessTag = "Burgerportaal" HasKubernetesPolicies = $true NonCompliantPolicyCount = 0 HasGitOpsConfig = $true GitOpsDriftDetected = $false HasGovernanceIssues = $false GovernanceIssues = @() }, [PSCustomObject]@{ SubscriptionId = "00000000-0000-0000-0000-000000000020" SubscriptionName = "DBG-Overheid-Prod" ResourceGroupName = "rg-arc-k8s-prod" ClusterName = "arc-k8s-prod-01" Location = "northeurope" Distribution = "On-premises Kubernetes" HasRequiredTags = $false ClassificationTag = "" OwnerTag = "" BusinessProcessTag = "" HasKubernetesPolicies = $true NonCompliantPolicyCount = 5 HasGitOpsConfig = $false GitOpsDriftDetected = $false HasGovernanceIssues = $true GovernanceIssues = @( "Ontbrekende kern-tags (Owner, BusinessProcess, DataClassification)", "Azure Policy rapporteert 5 niet-conforme Kubernetes-beleidsregels", "Geen GitOps-configuratie voor platformcomponenten geconfigureerd" ) } ) } function Get-KubernetesGovernanceStatus { <# .SYNOPSIS Haalt Arc-verbonden Kubernetes-clusters op en bepaalt de governance-status. .OUTPUTS PSCustomObject met cluster- en governance-informatie. #> [CmdletBinding()] param() if ($LocalDebug) { Write-Verbose "Gebruik van gesimuleerde Kubernetes-governancedata (LocalDebug)." return Get-DebugGovernanceData } Write-Verbose "Ophalen van Arc-enabled Kubernetes-clusters via Azure Resource Graph..." $query = @' resources | where type =~ "microsoft.kubernetes/connectedclusters" | project id, name, location, subscriptionId, resourceGroup, tags, properties '@ $argParams = @{ Query = $query } if ($SubscriptionId) { $argParams['Subscription'] = $SubscriptionId } $clusters = Search-AzGraph @argParams $results = @() foreach ($cluster in $clusters) { $props = $cluster.properties $tags = $cluster.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) $distribution = $props["distribution"] $governanceIssues = @() $hasIssues = $false if (-not $hasRequiredTags) { $hasIssues = $true $governanceIssues += "Ontbrekende kern-tags (Owner, BusinessProcess of DataClassification)." } # Vereenvoudigde policy-check: tel aantal niet-conforme policyresultaten voor dit cluster $nonCompliantCount = 0 $hasK8sPolicies = $false try { $policyResults = Get-AzPolicyState -Filter "resourceId eq '$($cluster.id)'" -ErrorAction SilentlyContinue if ($policyResults) { $hasK8sPolicies = $true $nonCompliantCount = ($policyResults | Where-Object { $_.ComplianceState -eq 'NonCompliant' }).Count if ($nonCompliantCount -gt 0) { $hasIssues = $true $governanceIssues += "Azure Policy rapporteert $nonCompliantCount niet-conforme beleidsregels." } } } catch { Write-Verbose "Kon policy-status niet bepalen voor cluster $($cluster.name): $_" } # GitOps-configuraties (Flux v2) via gerelateerde resources (vereenvoudigde check) $hasGitOps = $false $gitOpsDrift = $false try { $kustomizations = Get-AzResource -ResourceType "Microsoft.KubernetesConfiguration/fluxConfigurations" -ErrorAction SilentlyContinue | Where-Object { $_.Properties.clusterResourceId -eq $cluster.id } if ($kustomizations) { $hasGitOps = $true # In een echte implementatie zou hier op drift-status worden gecontroleerd } else { $hasGitOps = $false $hasIssues = $true $governanceIssues += "Geen GitOps-configuratie (Flux) gevonden voor dit Arc-enabled Kubernetes-cluster." } } catch { Write-Verbose "Kon GitOps-configuraties niet ophalen voor cluster $($cluster.name): $_" } $results += [PSCustomObject]@{ SubscriptionId = $cluster.subscriptionId SubscriptionName = (Get-AzSubscription -SubscriptionId $cluster.subscriptionId -ErrorAction SilentlyContinue).Name ResourceGroupName = $cluster.resourceGroup ClusterName = $cluster.name Location = $cluster.location Distribution = $distribution HasRequiredTags = $hasRequiredTags ClassificationTag = $classification OwnerTag = $owner BusinessProcessTag = $businessProc HasKubernetesPolicies = $hasK8sPolicies NonCompliantPolicyCount = $nonCompliantCount HasGitOpsConfig = $hasGitOps GitOpsDriftDetected = $gitOpsDrift HasGovernanceIssues = $hasIssues GovernanceIssues = $governanceIssues } } return $results } function Test-Compliance { <# .SYNOPSIS Bepaalt de compliancestatus voor Kubernetes governance op Arc-enabled clusters. .OUTPUTS PSCustomObject met samenvatting van de resultaten. #> [CmdletBinding()] param() $clusters = Get-KubernetesGovernanceStatus if (-not $clusters -or $clusters.Count -eq 0) { Write-Verbose "Geen Arc-enabled Kubernetes-clusters gevonden in de geselecteerde scope." return [PSCustomObject]@{ ScriptName = "kubernetes-governance" IsCompliant = $true Timestamp = Get-Date Details = "Er zijn geen Arc-enabled Kubernetes-clusters gevonden in de huidige scope." Recommendations = @() Clusters = @() } } $nonCompliant = $clusters | Where-Object { $_.HasGovernanceIssues } $isCompliant = ($nonCompliant.Count -eq 0) $details = if ($isCompliant) { "Alle gevonden Arc-enabled Kubernetes-clusters voldoen aan de basis governance-vereisten." } else { "Een of meer Arc-enabled Kubernetes-clusters hebben governance-hiaten die aandacht vereisen." } $recommendations = @() if (-not $isCompliant) { $recommendations += "Zorg dat alle Arc-enabled Kubernetes-clusters kern-tags bevatten: Owner, BusinessProcess en DataClassification." $recommendations += "Los niet-conforme Azure Policy-regels op voor Kubernetes-resources of pas het beleid aan waar nodig." $recommendations += "Implementeer GitOps-configuraties (Flux) voor platformcomponenten en kritieke workloads." $recommendations += "Documenteer governance-afspraken, runbooks en escalatiepaden voor Arc-enabled Kubernetes." $recommendations += "Neem Kubernetes governance op in periodieke risicobeoordelingen en auditplannen." } return [PSCustomObject]@{ ScriptName = "kubernetes-governance" IsCompliant = $isCompliant Timestamp = Get-Date Details = $details Recommendations = $recommendations Clusters = $clusters } } function Invoke-Monitoring { <# .SYNOPSIS Voert een monitoring-run uit en toont de governance-status per Arc-enabled Kubernetes-cluster. #> [CmdletBinding()] param() Write-Host "`nMonitoring: $PolicyName" -ForegroundColor Yellow Write-Host "Beschrijving: $PolicyDescription" -ForegroundColor Yellow Write-Host "==============================================================" -ForegroundColor Yellow $result = Test-Compliance $clusters = $result.Clusters if ($clusters.Count -gt 0) { Write-Host "`nGevonden Arc-enabled Kubernetes-clusters:" -ForegroundColor Cyan foreach ($cluster in $clusters) { $statusColor = if (-not $cluster.HasGovernanceIssues) { "Green" } else { "Red" } $statusText = if (-not $cluster.HasGovernanceIssues) { "Governance: COMPLIANT" } else { "Governance: NON-COMPLIANT - $($cluster.GovernanceIssues.Count) issue(s)" } Write-Host ("- {0}/{1} ({2})" -f $cluster.SubscriptionName, $cluster.ClusterName, $cluster.Location) -ForegroundColor $statusColor Write-Host (" Distributie: {0}" -f $cluster.Distribution) -ForegroundColor Gray Write-Host (" Kern-tags aanwezig: {0}" -f $(if ($cluster.HasRequiredTags) { "Ja" } else { "Nee" })) -ForegroundColor Gray Write-Host (" Azure Policy: {0} niet-conforme regels" -f $cluster.NonCompliantPolicyCount) -ForegroundColor Gray Write-Host (" GitOps-configuratie: {0}" -f $(if ($cluster.HasGitOpsConfig) { "Aanwezig" } else { "Afwezig" })) -ForegroundColor Gray Write-Host (" Status: {0}" -f $statusText) -ForegroundColor $statusColor if ($cluster.GovernanceIssues.Count -gt 0) { foreach ($issue in $cluster.GovernanceIssues) { Write-Host (" - {0}" -f $issue) -ForegroundColor Yellow } } Write-Host "" } } else { Write-Host "`nGeen Arc-enabled Kubernetes-clusters gevonden in de huidige scope." -ForegroundColor Cyan } if ($result.IsCompliant) { Write-Host "✅ COMPLIANT - Alle Arc-enabled Kubernetes-clusters voldoen aan de basis governance-vereisten." -ForegroundColor Green } else { Write-Host "❌ NON-COMPLIANT - Eén of meer Arc-enabled Kubernetes-clusters hebben governance-hiaten." -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 Kubernetes-clusters met governance-hiaten. #> [CmdletBinding()] param() Write-Host "`nRemediatie: $PolicyName" -ForegroundColor Yellow Write-Host "==============================================================" -ForegroundColor Yellow $result = Test-Compliance $clusters = $result.Clusters | Where-Object { $_.HasGovernanceIssues } if (-not $clusters -or $clusters.Count -eq 0) { Write-Host "Alle Arc-enabled Kubernetes-clusters voldoen aan de basis governance-vereisten. Geen remediatie nodig." -ForegroundColor Green return $result } Write-Host "`nNiet-conforme Arc-enabled Kubernetes-clusters (met governance-hiaten):" -ForegroundColor Red foreach ($cluster in $clusters) { Write-Host ("- Subscription: {0}" -f $cluster.SubscriptionName) -ForegroundColor Red Write-Host (" ResourceGroup: {0}" -f $cluster.ResourceGroupName) -ForegroundColor Red Write-Host (" Cluster: {0}" -f $cluster.ClusterName) -ForegroundColor Red Write-Host (" Locatie: {0}" -f $cluster.Location) -ForegroundColor Red Write-Host (" Distributie: {0}" -f $cluster.Distribution) -ForegroundColor Red Write-Host " Geïdentificeerde issues:" -ForegroundColor Yellow foreach ($issue in $cluster.GovernanceIssues) { 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 Kubernetes-clusters." -ForegroundColor Yellow Write-Host "2. Analyseer niet-conforme Azure Policy-resultaten en herstel configuratie-afwijkingen per cluster." -ForegroundColor Yellow Write-Host "3. Implementeer GitOps (Flux) voor platformcomponenten en kritieke workloads, zodat configuraties centraal worden beheerd." -ForegroundColor Yellow Write-Host "4. Documenteer governance-afspraken en runbooks en neem Arc-enabled Kubernetes op in incidentresponsprocedures." -ForegroundColor Yellow Write-Host "5. Plan periodieke evaluaties van Kubernetes governance en veranker verbeteracties in de security- en cloudroadmap." -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: kubernetes-governance" -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 kubernetes-governance.ps1: $_" throw } finally { Write-Host "`n========================================`n" -ForegroundColor Cyan }

Risico zonder implementatie

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

Management Samenvatting

Registreer alle relevante Kubernetes-clusters via Azure Arc, dwing beveiligings- en configuratiebeleid af met Azure Policy en GitOps, en gebruik centrale rapportages om compliance en risico’s structureel te beheren. Het bijbehorende PowerShell-script helpt bij inventarisatie, monitoring en remediatie, zodat Kubernetes governance een aantoonbaar onderdeel wordt van de Nederlandse Baseline voor Veilige Cloud.