Security Hardening Voor Azure Kubernetes Service (AKS) Clusters

💼 Management Samenvatting

Security hardening van Azure Kubernetes Service-clusters is essentieel voor Nederlandse overheidsorganisaties om het aanvalsoppervlak te minimaliseren en te voldoen aan de strikte beveiligingseisen uit de BIO, NIS2 en ISO 27001. Een goed geharde AKS-omgeving combineert clusterconfiguratie, runtime-beveiliging, netwerksegmentatie en continue monitoring tot een verdedigingslinie die zowel geautomatiseerde aanvallen als gerichte compromitteringspogingen kan weerstaan.

Aanbeveling
IMPLEMENTEER EN HANDHAAF SECURITY HARDENING IN ALLE AKS-CLUSTERS
Risico zonder
High
Risk Score
9/10
Implementatie
140u (tech: 80u)
Van toepassing op:
Azure
Azure Kubernetes Service
Containerized Workloads

Kubernetes-clusters vormen de ruggengraat van moderne cloud-native applicaties in de Nederlandse publieke sector, van burgerportalen tot integratieplatformen en dataverwerkingssystemen. Zonder adequate hardening blijft het aanvalsoppervlak groot: de Kubernetes API-server is vaak via het internet bereikbaar, containers draaien met te veel privileges, secrets worden onveilig bewaard, en runtime-afwijkingen blijven onopgemerkt. Dit creëert kansen voor aanvallen zoals privilege escalation, lateral movement tussen workloads, datalekken via misconfigureerde services, en compromittering van het gehele cluster door middel van kwetsbaarheden in onderliggende componenten. Voor Nederlandse overheidsorganisaties brengt dit niet alleen operationele risico's met zich mee, maar ook complianceproblemen: auditors verwachten aantoonbare maatregelen voor het beperken van toegang, het beschermen van gevoelige data, en het detecteren van afwijkingen. Security hardening van AKS is daarom geen optionele toevoeging, maar een fundament onder de Nederlandse Baseline voor Veilige Cloud.

PowerShell Modules Vereist
Primary API: Azure Resource Manager (ARM)
Connection: Connect-AzAccount
Required Modules: Az.Accounts, Az.Resources, Az.Aks

Implementatie

Dit artikel beschrijft een holistische aanpak voor security hardening van AKS-clusters, specifiek gericht op Nederlandse overheidsorganisaties. We behandelen het verharden van de Kubernetes API-server door autorized IP-ranges, Azure AD-integratie en RBAC-beleid, het beveiligen van node pools door middel van disk encryption, beperkte toegang en automatische updates, het implementeren van Pod Security Standards en security contexts voor containers, het beheren van secrets via Azure Key Vault en Kubernetes Secrets, het configureren van image scanning en runtime protection met Defender voor Containers, en het opzetten van uitgebreide logging en monitoring. Het bijbehorende PowerShell-script ondersteunt u bij het inventariseren van hardening-gerelateerde configuraties, het identificeren van hiaten en het structureel monitoren van de beveiligingsstatus van uw AKS-clusters.

Cluster-level hardening: API-server en controlelaag

De Kubernetes API-server vormt het centrale controle- en beheerpunt van elk AKS-cluster en vereist daarom de strengste beveiligingsmaatregelen. Standaard is de API-server in AKS via een beheerde endpoint bereikbaar, wat betekent dat deze altijd via het internet toegankelijk is, zij het alleen voor geauthenticeerde gebruikers. Voor Nederlandse overheidsorganisaties is dit vaak onacceptabel: de API-server moet uitsluitend bereikbaar zijn vanuit geautoriseerde netwerken, zoals het bedrijfsnetwerk, beveiligde jump-hosts of specifieke Azure Virtual Networks. Configureer daarom authorized IP-ranges voor de API-server, waarbij u expliciet vastlegt welke IP-adressen of netwerkbereiken toegang mogen hebben. Combineer dit met Azure AD-integratie, zodat gebruikers zich met hun organisatie-account kunnen aanmelden en alle API-aanroepen worden gelogd en geaudit. Schakel bovendien lokale accounts (service principals of managed identities) uit waar mogelijk, en zorg dat alle API-toegang via Azure RBAC en Kubernetes RBAC wordt gecontroleerd op basis van least privilege-principes.

Naast netwerkbeperkingen en authenticatie is RBAC-configuratie cruciaal voor cluster hardening. Kubernetes RBAC bepaalt welke gebruikers, service accounts en groepen welke acties mogen uitvoeren op welke resources. Standaard zijn er vaak te permissieve ClusterRoleBindings of RoleBindings aanwezig die brede toegang verlenen aan system-accounts of ontwikkelteams. Door expliciete rollen te definiëren voor verschillende functies – zoals ontwikkelaar, operator, auditor en security officer – en deze te koppelen aan specifieke naamruimten en resource-types, beperkt u de schade die kan ontstaan bij een compromittering. Gebruik Azure RBAC bovendien om te bepalen wie clusters kan maken, wijzigen of verwijderen op het Azure-platformniveau. Zorg dat alle RBAC-wijzigingen worden geregistreerd via Azure Monitor en Kubernetes audit logs, zodat auditors en security teams kunnen aantonen wie welke acties heeft uitgevoerd en wanneer. Tot slot is het belangrijk om regelmatig RBAC-configuraties te reviewen en ongebruikte rollen, bindings en service accounts op te ruimen, zodat het toegangsmodel overzichtelijk blijft en geen verouderde privileges achterblijven.

De controlelaag van AKS omvat naast de API-server ook onderdelen zoals etcd (de distributed key-value store), kube-scheduler en kube-controller-manager. Deze componenten worden door Microsoft beheerd, maar u kunt indirect invloed uitoefenen door ervoor te zorgen dat cluster-updates tijdig worden toegepast en dat u gebruik maakt van de nieuwste Kubernetes-versies met de laatste beveiligingspatches. Schakel automatische updates in voor het cluster, of plan minimaal maandelijks een upgrade naar een ondersteunde versie. Houd daarbij rekening met de backward compatibility van uw workloads en test upgrades eerst in een niet-productieomgeving. Combineer dit met Azure Policy voor AKS, waarmee u kunt afdwingen dat clusters alleen worden gecreëerd met specifieke versies, dat authorized IP-ranges verplicht zijn, en dat bepaalde beveiligingsfeatures zoals Azure AD-integratie of Pod Security Standards standaard zijn ingeschakeld. Door deze maatregelen te combineren, ontstaat een cluster-level hardening-aanpak die het fundament legt voor een veilige containeromgeving.

Node pool hardening: beveiliging van worker nodes

Worker nodes in AKS draaien de daadwerkelijke container workloads en vormen daarom een kritiek onderdeel van de beveiligingsketen. Hardening begint bij de VM-installatie: gebruik Azure Disk Encryption om alle schijven op node level te versleutelen, zodat data-at-rest wordt beschermd, ook wanneer een schijf wordt verwijderd of geëxporteerd. Configureer node pools met een minimale set van benodigde system-onderdelen en schakel ongebruikte services of kernel-modules uit om het aanvalsoppervlak te verkleinen. Gebruik daarnaast dedicated node pools voor workloads met verschillende vertrouwelijkheidsniveaus of compliance-eisen: plaats bijvoorbeeld publieke frontend-workloads in een aparte pool ten opzichte van workloads die gevoelige persoonsgegevens verwerken. Dit maakt het mogelijk om per pool specifieke beveiligingsconfiguraties toe te passen, zoals Taints en Tolerations, en om te voorkomen dat workloads met lagere beveiligingseisen worden geplaatst op nodes die zijn geconfigureerd voor hogere eisen.

Toegang tot worker nodes moet strikt worden beperkt. Standaard zijn SSH-toegang en directe VM-beheer niet nodig, omdat beheer via de Kubernetes API-server verloopt. Schakel SSH-toegang daarom uit of beperk deze tot specifieke authorized keys en beheerbare IP-ranges. Gebruik Azure Bastion of Just-In-Time toegang via Defender voor Cloud wanneer directe toegang nodig is voor troubleshooting, zodat alle verbindingen worden gelogd en tijdelijk zijn. Implementeer bovendien Network Security Groups en Application Security Groups om verkeer naar en van worker nodes te beperken tot alleen de poorten en protocollen die daadwerkelijk nodig zijn: Kubernetes API-server communicatie, container registry-toegang voor image pulls, en monitoring- en logging-verkeer. Blokkeer directe internettoegang vanaf worker nodes waar mogelijk en forceer verkeer via beveiligde proxy's of Azure Firewall, zodat malware downloads, command-and-control-communicatie en ongeautoriseerde externe verbindingen worden voorkomen.

Automatische updates en patchbeheer vormen een essentieel onderdeel van node hardening. Configureer node pools met automatische upgrades ingeschakeld, zodat security patches voor het onderliggende besturingssysteem en Kubernetes-runtime automatisch worden toegepast tijdens geplande maintenance windows. Combineer dit met een proces voor het testen van updates in een staging-omgeving voordat ze naar productie worden gepromoot. Gebruik Azure Update Manager of gelijkaardige tools om patch-compliance te monitoren en om te rapporteren over nodes die achterlopen op security-updates. Houd daarnaast rekening met image-updates: wanneer base images voor containers worden bijgewerkt met nieuwe patches, moeten deze updates ook worden uitgerold naar draaiende workloads. Automatiseer dit proces waar mogelijk via CI/CD-pijplijnen die nieuwe images automatisch scannen, testen en deployen, zodat beveiligingsupdates snel beschikbaar komen zonder handmatige interventie.

Pod en container hardening: runtime-beveiliging

Gebruik PowerShell-script security-hardening.ps1 (functie Invoke-Monitoring) – Inventariseert AKS-clusters en controleert verschillende security hardening-aspecten, waaronder API-server configuratie, node pool-beveiliging en Pod Security Standards..

Pod Security Standards (PSS) zijn een gestandaardiseerde set van security policies die bepalen welke privileges containers mogen hebben binnen een Kubernetes-cluster. AKS ondersteunt drie niveaus: Privileged (geen beperkingen), Baseline (minimale restricties) en Restricted (strikte beperkingen). Voor Nederlandse overheidsorganisaties is het aan te raden om Baseline als minimum te hanteren en Restricted waar mogelijk toe te passen, vooral voor workloads die gevoelige data verwerken. PSS blokkeert bijvoorbeeld containers die als root draaien, host namespaces delen, privileged containers gebruiken, of host paths mounten. Door PSS te configureren op namespace-niveau en deze te koppelen aan Azure Policy voor AKS, zorgt u ervoor dat nieuwe workloads automatisch worden gecontroleerd en dat niet-conforme pods worden geweigerd voordat ze worden gestart. Combineer dit met security contexts op pod- en container-niveau, waarbij u expliciet definieert welke capabilities containers nodig hebben, welke user ID ze gebruiken, en of ze read-only root filesystems moeten hebben.

Container image security is een ander cruciaal aspect van pod hardening. Zorg dat alle container images worden gescand op bekende kwetsbaarheden voordat ze worden geïmplementeerd, gebruik base images van vertrouwde bronnen, en minimaliseer het aantal packages en dependencies in images om het aanvalsoppervlak te verkleinen. Azure Container Registry (ACR) integreert met Defender voor Containers om automatisch images te scannen op CVEs en om images te blokkeren die kritieke kwetsbaarheden bevatten. Implementeer image signing en verification via Notary of andere signing-mechanismen, zodat alleen geverifieerde en goedgekeurde images kunnen worden gebruikt in productieclusters. Gebruik daarnaast image pull secrets en private registries om te voorkomen dat workloads willekeurige images van publieke repositories kunnen ophalen. Door deze maatregelen te combineren met runtime protection van Defender voor Containers, die verdachte activiteiten binnen draaiende containers detecteert en blokkeert, ontstaat een verdedigingslaag die zowel bekende kwetsbaarheden als onbekende aanvallen kan opvangen.

Secrets management vormt een bijzondere uitdaging in containeromgevingen. Hardcodeerde wachtwoorden, API-keys en certificaten in container images of environment variables zijn onacceptabel vanuit security-oogpunt. Gebruik daarom Azure Key Vault in combinatie met de Key Vault Provider voor Secrets Store CSI Driver, zodat secrets veilig worden opgehaald vanuit Key Vault en als volumes worden gemount in pods, zonder dat ze ooit in plain text in de cluster-configuratie of container logs verschijnen. Configureer Key Vault toegangsbeleid op basis van Azure RBAC en managed identities, zodat alleen specifieke workloads toegang hebben tot specifieke secrets. Gebruik daarnaast Kubernetes Secrets alleen voor niet-kritieke configuraties en zorg dat alle Secrets-versleuteling is ingeschakeld via etcd encryption at rest. Implementeer secret rotation policies in Key Vault en zorg dat workloads automatisch nieuwe secrets ophalen wanneer deze worden bijgewerkt, zodat verouderde credentials niet langer bruikbaar zijn na een compromittering of employee offboarding.

Monitoring, logging en compliance-borging

Gebruik PowerShell-script security-hardening.ps1 (functie Invoke-Remediation) – Genereert een overzicht van AKS-clusters met hardening-hiaten en geeft concrete aanbevelingen voor remediatie en verbetering van de beveiligingsstatus..

Uitgebreide logging en monitoring zijn essentieel om security hardening effectief te maken: zonder zichtbaarheid in wat er gebeurt in uw clusters, kunnen aanvallen en misconfiguraties onopgemerkt blijven. Schakel Azure Monitor Container Insights in voor alle AKS-clusters, zodat metrics, logs en events worden verzameld en geanalyseerd. Configureer Kubernetes audit logging om alle API-aanroepen vast te leggen, inclusief wie welke acties heeft uitgevoerd, wanneer dit is gebeurd, en wat het resultaat was. Stel log retention policies in die aansluiten bij compliance-eisen: voor Nederlandse overheidsorganisaties betekent dit vaak minimaal een jaar retentie voor security-relevante logs, met mogelijkheden voor langere retentie voor forensische doeleinden. Integreer logs met een Security Information and Event Management (SIEM) oplossing zoals Azure Sentinel, zodat security teams alle relevante informatie op één plek kunnen analyseren en kunnen reageren op verdachte activiteiten.

Defender voor Containers biedt naast image scanning ook runtime threat detection voor AKS-clusters. De oplossing analyseert pod-gedrag, netwerkverkeer, en system calls om anomalieën te detecteren, zoals privilege escalation, cryptomining, netwerkscanning, of verbindingen naar verdachte externe endpoints. Configureer alerting en automatische response-acties voor kritieke bedreigingen, zodat incidenten direct worden gemitigeerd zonder handmatige interventie. Combineer dit met Azure Policy voor AKS, waarmee u kunt afdwingen dat clusters voldoen aan specifieke hardening-vereisten, zoals het gebruik van authorized IP-ranges, het inschakelen van Pod Security Standards, of het blokkeren van bepaalde container capabilities. Policy-evaluaties worden automatisch uitgevoerd en resultaten worden gerapporteerd naar Azure Policy compliance dashboards, zodat u continu inzicht heeft in welke clusters voldoen aan uw beveiligingsstandaarden en welke nog aandacht vereisen.

Voor compliance-bewijs en auditdoeleinden is het belangrijk om periodiek de hardening-status van alle AKS-clusters te documenteren. Het bijbehorende PowerShell-script ondersteunt u hierbij door een gestructureerd overzicht te genereren van belangrijk hardening-aspecten per cluster, zoals API-server configuratie, node pool-beveiliging, RBAC-instellingen, en compliance met Azure Policy-vereisten. Voer dit script regelmatig uit – bijvoorbeeld maandelijks of kwartaal – en neem de resultaten op in uw risicomanagement- en compliance-rapportages. Documenteer tevens uitzonderingen en afwijkingen, inclusief de onderliggende business- of technische redenen, de geaccepteerde risico's, en de geplande datum waarop de uitzondering wordt opgeheven. Door deze informatie te koppelen aan uw governance- en changemanagement-processen, zorgt u dat hardening-maatregelen niet alleen worden geïmplementeerd, maar ook structureel worden geborgd en gecontinueerd verbeterd als onderdeel van de Nederlandse Baseline voor Veilige Cloud.

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 security hardening-configuraties voor Azure Kubernetes Service (AKS) clusters en geeft remediatie-advies. .DESCRIPTION Dit script inventariseert alle AKS-clusters in de opgegeven of alle abonnementen en controleert verschillende security hardening-aspecten, waaronder API-server configuratie (authorized IP-ranges), Azure AD-integratie, RBAC-instellingen, node pool-beveiliging, en compliance met Azure Policy. In monitoringmodus wordt een rapport gegenereerd met de status per cluster. In remediatiemodus wordt een overzicht gemaakt van clusters met hardening-hiaten met concrete aanbevelingen voor verbetering. .NOTES Filename: security-hardening.ps1 Author: Nederlandse Baseline voor Veilige Cloud Created: 2025-01-15 Last Modified: 2025-01-15 Version: 1.0 Related JSON: content/azure/aks/security-hardening.json .LINK https://github.com/[org]/m365-tenant-best-practise .EXAMPLE .\security-hardening.ps1 -Monitoring Voert een controle uit op alle toegankelijke abonnementen en toont de hardening-status per cluster. .EXAMPLE .\security-hardening.ps1 -Remediation Genereert een overzicht van AKS-clusters met hardening-hiaten en aanbevelingen voor herstel. .EXAMPLE .\security-hardening.ps1 -Monitoring -LocalDebug Draait een lokale debug-run met gesimuleerde data zonder Azure-verbinding of Kubernetes-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 = "Security hardening voor AKS-clusters" $PolicyDescription = "Controleert of AKS-clusters voldoen aan security hardening-best practices, inclusief API-server beveiliging, Azure AD-integratie, RBAC-configuratie en node pool-beveiliging." 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.Aks') 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-DebugHardeningData { [CmdletBinding()] param() return @( [PSCustomObject]@{ SubscriptionId = "00000000-0000-0000-0000-000000000010" SubscriptionName = "DBG-Overheid-NonProd" ResourceGroupName = "rg-aks-nonprod" ClusterName = "aks-nonprod-01" Location = "westeurope" ApiServerAuthorizedIPRanges = @("10.0.0.0/16", "192.168.1.0/24") AzureADEnabled = $true KubernetesVersion = "1.28.5" NodePoolCount = 2 DefenderEnabled = $true HasHardeningIssues = $false }, [PSCustomObject]@{ SubscriptionId = "00000000-0000-0000-0000-000000000020" SubscriptionName = "DBG-Overheid-Prod" ResourceGroupName = "rg-aks-prod" ClusterName = "aks-prod-01" Location = "westeurope" ApiServerAuthorizedIPRanges = @() AzureADEnabled = $false KubernetesVersion = "1.27.3" NodePoolCount = 3 DefenderEnabled = $false HasHardeningIssues = $true } ) } function Get-AksHardeningStatus { <# .SYNOPSIS Haalt alle AKS-clusters op en bepaalt de security hardening-status. .OUTPUTS PSCustomObject met cluster- en hardening-informatie. #> [CmdletBinding()] param() if ($LocalDebug) { Write-Verbose "Gebruik van gesimuleerde AKS-hardeningdata (LocalDebug)." return Get-DebugHardeningData } Write-Verbose "Ophalen van AKS-clusters via Azure Resource Graph..." $query = @' resources | where type == "microsoft.containerservice/managedclusters" | project id, name, location, subscriptionId, resourceGroup, properties '@ $argParams = @{ Query = $query } if ($SubscriptionId) { $argParams['Subscription'] = $SubscriptionId } $clusters = Search-AzGraph @argParams $results = @() foreach ($cluster in $clusters) { $props = $cluster.properties # API Server authorized IP ranges $apiServerAccessProfile = $props.apiServerAccessProfile $authorizedIPRanges = @() if ($apiServerAccessProfile -and $apiServerAccessProfile.authorizedIPRanges) { $authorizedIPRanges = $apiServerAccessProfile.authorizedIPRanges | Where-Object { $_ -ne "*" } } # Azure AD integration $aadProfile = $props.aadProfile $azureADEnabled = ($aadProfile -and $aadProfile.managed -eq $true) # Kubernetes version $kubernetesVersion = $props.kubernetesVersion # Defender for Containers (check via resource tags or separate query if needed) $defenderEnabled = $false try { $defenderSettings = Get-AzSecurityPricing -Name "Containers" -ErrorAction SilentlyContinue if ($defenderSettings) { $defenderEnabled = ($defenderSettings.PricingTier -ne "Free") } } catch { Write-Verbose "Kon Defender-status niet bepalen voor subscription $($cluster.subscriptionId)" } # Check for hardening issues $hasIssues = $false $issues = @() if ($authorizedIPRanges.Count -eq 0) { $hasIssues = $true $issues += "API-server heeft geen authorized IP-ranges geconfigureerd" } if (-not $azureADEnabled) { $hasIssues = $true $issues += "Azure AD-integratie is niet ingeschakeld" } # Get node pools count (simplified - would need additional query for full details) $nodePoolCount = 0 $results += [PSCustomObject]@{ SubscriptionId = $cluster.subscriptionId SubscriptionName = (Get-AzSubscription -SubscriptionId $cluster.subscriptionId -ErrorAction SilentlyContinue).Name ResourceGroupName = $cluster.resourceGroup ClusterName = $cluster.name Location = $cluster.location ApiServerAuthorizedIPRanges = $authorizedIPRanges AzureADEnabled = $azureADEnabled KubernetesVersion = $kubernetesVersion NodePoolCount = $nodePoolCount DefenderEnabled = $defenderEnabled HasHardeningIssues = $hasIssues HardeningIssues = $issues } } return $results } function Test-Compliance { <# .SYNOPSIS Bepaalt de compliancestatus voor security hardening op AKS-clusters. .OUTPUTS PSCustomObject met samenvatting van de resultaten. #> [CmdletBinding()] param() $clusters = Get-AksHardeningStatus if (-not $clusters -or $clusters.Count -eq 0) { Write-Verbose "Geen AKS-clusters gevonden in de geselecteerde scope." return [PSCustomObject]@{ ScriptName = "security-hardening" IsCompliant = $true Timestamp = Get-Date Details = "Er zijn geen AKS-clusters gevonden in de huidige scope." Recommendations = @() Clusters = @() } } $nonCompliant = $clusters | Where-Object { $_.HasHardeningIssues } $isCompliant = ($nonCompliant.Count -eq 0) $details = if ($isCompliant) { "Alle gevonden AKS-clusters voldoen aan de basis hardening-vereisten." } else { "Een of meer AKS-clusters hebben hardening-hiaten die aandacht vereisen." } $recommendations = @() if (-not $isCompliant) { $recommendations += "Configureer authorized IP-ranges voor de API-server om directe internettoegang te beperken." $recommendations += "Schakel Azure AD-integratie in voor alle clusters om geavanceerde authenticatie en RBAC te bieden." $recommendations += "Implementeer Pod Security Standards (Baseline of Restricted) op namespace-niveau." $recommendations += "Activeer Defender voor Containers voor image scanning en runtime threat detection." $recommendations += "Gebruik Azure Policy voor AKS om hardening-vereisten structureel af te dwingen." $recommendations += "Voer regelmatig security assessments uit en documenteer uitzonderingen met risico-acceptatie." } return [PSCustomObject]@{ ScriptName = "security-hardening" IsCompliant = $isCompliant Timestamp = Get-Date Details = $details Recommendations = $recommendations Clusters = $clusters } } function Invoke-Monitoring { <# .SYNOPSIS Voert een monitoring-run uit en toont de hardening-status per AKS-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 AKS-clusters:" -ForegroundColor Cyan foreach ($cluster in $clusters) { $statusColor = if (-not $cluster.HasHardeningIssues) { "Green" } else { "Red" } $statusText = if (-not $cluster.HasHardeningIssues) { "Hardening: COMPLIANT" } else { "Hardening: NON-COMPLIANT - $($cluster.HardeningIssues.Count) issue(s)" } Write-Host ("- {0}/{1} ({2})" -f $cluster.SubscriptionName, $cluster.ClusterName, $cluster.Location) -ForegroundColor $statusColor Write-Host (" Kubernetes versie: {0}" -f $cluster.KubernetesVersion) -ForegroundColor Gray Write-Host (" Azure AD: {0}" -f $(if ($cluster.AzureADEnabled) { "Ingeschakeld" } else { "Uitgeschakeld" })) -ForegroundColor Gray Write-Host (" API authorized IP-ranges: {0}" -f $(if ($cluster.ApiServerAuthorizedIPRanges.Count -gt 0) { "$($cluster.ApiServerAuthorizedIPRanges.Count) range(s)" } else { "Geen" })) -ForegroundColor Gray Write-Host (" Status: {0}" -f $statusText) -ForegroundColor $statusColor if ($cluster.HardeningIssues.Count -gt 0) { foreach ($issue in $cluster.HardeningIssues) { Write-Host (" - {0}" -f $issue) -ForegroundColor Yellow } } Write-Host "" } } else { Write-Host "`nGeen AKS-clusters gevonden in de huidige scope." -ForegroundColor Cyan } if ($result.IsCompliant) { Write-Host "✅ COMPLIANT - Alle AKS-clusters voldoen aan de basis hardening-vereisten." -ForegroundColor Green } else { Write-Host "❌ NON-COMPLIANT - Eén of meer AKS-clusters hebben hardening-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 AKS-clusters met hardening-hiaten. #> [CmdletBinding()] param() Write-Host "`nRemediatie: $PolicyName" -ForegroundColor Yellow Write-Host "==============================================================" -ForegroundColor Yellow $result = Test-Compliance $clusters = $result.Clusters | Where-Object { $_.HasHardeningIssues } if (-not $clusters -or $clusters.Count -eq 0) { Write-Host "Alle AKS-clusters voldoen aan de basis hardening-vereisten. Geen remediatie nodig." -ForegroundColor Green return $result } Write-Host "`nNiet-conforme AKS-clusters (met hardening-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 (" Kubernetes: {0}" -f $cluster.KubernetesVersion) -ForegroundColor Red Write-Host (" Geïdentificeerde issues:" -ForegroundColor Yellow) foreach ($issue in $cluster.HardeningIssues) { Write-Host (" - {0}" -f $issue) -ForegroundColor Yellow } Write-Host "" } Write-Host "Aanbevolen vervolgstappen:" -ForegroundColor Yellow Write-Host "1. Classificeer clusters naar omgeving (ontwikkel, test, acceptatie, productie) en prioriteer remediatie." -ForegroundColor Yellow Write-Host "2. Configureer authorized IP-ranges voor de API-server: bepaal welke netwerken toegang nodig hebben en pas dit toe via Azure Portal of IaC." -ForegroundColor Yellow Write-Host "3. Activeer Azure AD-integratie: gebruik Azure AD-gebruikers en groepen voor Kubernetes RBAC en audit logging." -ForegroundColor Yellow Write-Host "4. Implementeer Pod Security Standards: kies Baseline of Restricted per namespace en pas toe via Azure Policy voor AKS." -ForegroundColor Yellow Write-Host "5. Activeer Defender voor Containers: schakel image scanning en runtime protection in op abonnementsniveau." -ForegroundColor Yellow Write-Host "6. Documenteer uitzonderingen met risico-acceptatie en plan vervolgstappen voor het oplossen van hardening-hiaten." -ForegroundColor Yellow Write-Host "7. Voer regelmatig security assessments uit om nieuwe hiaten vroegtijdig te identificeren en op te lossen." -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: security-hardening" -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 security-hardening.ps1: $_" throw } finally { Write-Host "`n========================================`n" -ForegroundColor Cyan }

Risico zonder implementatie

Risico zonder implementatie
High: Onvoldoende geharde AKS-clusters vormen een kritiek beveiligingsrisico voor Nederlandse overheidsorganisaties. Aanvallers kunnen gebruikmaken van misconfiguraties, onbeveiligde API-servers, containers met te veel privileges, en ongedetecteerde runtime-afwijkingen om toegang te krijgen tot gevoelige persoonsgegevens, kritieke processen te verstoren, en laterale verplaatsing uit te voeren naar andere systemen. Dit leidt tot datalekken, service-uitval, reputatieschade, en mogelijke non-compliance met BIO, ISO 27001 en NIS2-vereisten.

Management Samenvatting

Implementeer een holistische security hardening-aanpak voor AKS-clusters die API-server beveiliging, node pool hardening, Pod Security Standards, secrets management, image scanning, runtime protection, en uitgebreide logging combineert. Gebruik het bijbehorende PowerShell-script om de hardening-status te monitoren, hiaten te identificeren, en compliance te borgen. Zo maakt u security hardening tot een structureel onderdeel van de Nederlandse Baseline voor Veilige Cloud.