Azure Container Registry Beveiligingsconfiguratie

💼 Management Samenvatting

Azure Container Registry (ACR) vormt de centrale opslagplaats voor container images die worden gebruikt in Azure Kubernetes Service (AKS) en andere containeromgevingen. Een correct geconfigureerde ACR is essentieel voor het waarborgen van de beveiliging, integriteit en beschikbaarheid van container workloads binnen Nederlandse overheidsorganisaties.

Aanbeveling
IMPLEMENTEER BEVEILIGDE ACR-CONFIGURATIE VOOR ALLE CONTAINER REGISTRIES
Risico zonder
High
Risk Score
8/10
Implementatie
60u (tech: 40u)
Van toepassing op:
Azure Container Registry (ACR)
Azure Kubernetes Service (AKS)
Container Workloads

Container registries bevatten de bouwstenen van moderne applicaties: container images die worden gebruikt om workloads te deployen in productieomgevingen. Wanneer een registry onvoldoende is beveiligd, kunnen kwetsbare images ongemerkt in productie belanden, kunnen onbevoegden toegang krijgen tot gevoelige containerartefacten, en kunnen images worden gemanipuleerd of gecompromitteerd zonder dat dit wordt gedetecteerd. Een onbeveiligde registry vormt een enkel punt van falen voor de beveiliging van alle container workloads die daarvan afhankelijk zijn. Zonder adequate beveiligingsconfiguratie kunnen organisaties niet voldoen aan compliance-vereisten zoals vastgelegd in de BIO, ISO 27001 en NIS2 richtlijn, wat kan leiden tot boetes, reputatieschade en juridische aansprakelijkheid.

PowerShell Modules Vereist
Primary API: Azure API
Connection: Connect-AzAccount
Required Modules: Az.Accounts, Az.ContainerRegistry, Az.Resources, Az.Security

Implementatie

Dit artikel beschrijft hoe u Azure Container Registry configureert met uitgebreide beveiligingsmaatregelen, inclusief netwerkisolatie via private endpoints, geavanceerde authenticatie en autorisatie via Azure AD, automatische kwetsbaarheidsscanning van images, versleuteling met customer-managed keys, en uitgebreide logging en monitoring. U leert over de verschillende beveiligingslagen die nodig zijn voor een production-ready registry, hoe u toegang beheert via role-based access control, hoe u netwerktoegang beperkt tot geautoriseerde bronnen, en hoe u compliance kunt aantonen door middel van auditlogs en beveiligingsrapporten.

Architectuur en beveiligingslagen van Azure Container Registry

Azure Container Registry biedt meerdere beveiligingslagen die samenwerken om een complete beveiligingsomgeving te vormen voor container images. De eerste laag betreft netwerkbeveiliging, waarbij private endpoints de voorkeur hebben boven publieke endpoints voor productieomgevingen. Private endpoints maken het mogelijk om ACR te integreren in een virtueel netwerk, waardoor alleen resources binnen dat netwerk toegang hebben tot de registry. Dit voorkomt dat de registry blootstaat aan het publieke internet en vermindert het aanvalsoppervlak aanzienlijk. Voor organisaties die toch publieke toegang nodig hebben, bijvoorbeeld voor CI/CD-pipelines die buiten Azure draaien, kunnen firewallregels worden geconfigureerd die toegang beperken tot specifieke IP-adressen of IP-ranges. Deze netwerkbeveiliging vormt de eerste verdedigingslinie tegen ongeautoriseerde toegang en is essentieel voor het voldoen aan BIO-thema 13.02 over veilige netwerkdiensten.

De tweede beveiligingslaag betreft authenticatie en autorisatie. Azure Container Registry ondersteunt verschillende authenticatiemethoden, waarbij Azure AD-integratie de aanbevolen aanpak is voor productieomgevingen. Met Azure AD-authenticatie kunnen organisaties gebruik maken van bestaande identiteiten, multi-factor authentication, conditional access policies en privileged identity management. Dit zorgt ervoor dat alleen geautoriseerde gebruikers en services toegang hebben tot de registry en dat alle toegangspogingen worden gelogd voor auditdoeleinden. Role-based access control (RBAC) maakt het mogelijk om specifieke rechten toe te kennen aan verschillende rollen, zoals AcrPull voor services die alleen images moeten kunnen ophalen, AcrPush voor ontwikkelaars die images moeten kunnen uploaden, en AcrDelete voor beheerders die images moeten kunnen verwijderen. Deze granulatie in toegangsrechten zorgt ervoor dat het principe van least privilege wordt toegepast, wat essentieel is voor het voldoen aan BIO-thema 11.01 over toegangsbeheer.

De derde beveiligingslaag betreft kwetsbaarheidsscanning en image-beveiliging. Azure Container Registry integreert met Microsoft Defender for Containers om automatisch alle gepushte images te scannen op bekende kwetsbaarheden (CVEs). Deze scanning gebeurt zonder handmatige interventie en genereert gedetailleerde rapporten over gevonden kwetsbaarheden, inclusief de ernst, de getroffen image-lagen en aanbevelingen voor remediatie. Voor Nederlandse overheidsorganisaties is deze functionaliteit cruciaal omdat het zorgt voor continue controle van containerartefacten zonder handmatige interventie, wat essentieel is voor het voldoen aan BIO-thema 12.06 over kwetsbaarheidsbeheer. De scanresultaten worden opgeslagen in Defender for Cloud en kunnen worden gebruikt voor policy enforcement, waarbij bijvoorbeeld wordt voorkomen dat kwetsbare images worden gebruikt in productieclusters. Daarnaast kunnen organisaties retention policies configureren die automatisch oude of ongebruikte images verwijderen, wat het aanvalsoppervlak verder verkleint.

De vierde beveiligingslaag betreft versleuteling en gegevensbescherming. Azure Container Registry versleutelt standaard alle data at rest met Microsoft-beheerde sleutels, maar voor organisaties met strikte compliance-eisen kan customer-managed key encryption worden geconfigureerd via Azure Key Vault. Dit geeft organisaties volledige controle over de encryptiesleutels en maakt het mogelijk om sleutelrotatie te beheren volgens organisatiebeleid. Daarnaast ondersteunt ACR content trust, wat het mogelijk maakt om images te ondertekenen met digitale handtekeningen en te verifiëren dat images niet zijn gewijzigd sinds de ondertekening. Deze integriteitscontrole is essentieel voor het waarborgen dat alleen vertrouwde images worden gebruikt in productieomgevingen. Voor organisaties die moeten voldoen aan specifieke gegevensresidency-eisen, kan ACR worden geconfigureerd in specifieke Azure-regio's, wat ervoor zorgt dat data binnen de gewenste geografische grenzen blijft.

De vijfde beveiligingslaag betreft logging en monitoring. Azure Container Registry logt alle activiteiten, inclusief image-pushes, pulls, deletes en configuratiewijzigingen. Deze logs worden opgeslagen in Azure Monitor en kunnen worden geanalyseerd voor security monitoring, compliance-rapportage en forensisch onderzoek. Voor auditdoeleinden is het belangrijk dat deze logs worden bewaard voor de vereiste bewaartermijn en dat toegang wordt beperkt tot geautoriseerd personeel. Door deze beveiligingslagen te combineren, ontstaat een robuuste beveiligingsomgeving die voldoet aan de eisen van moderne container workloads en compliance-frameworks zoals de BIO, ISO 27001 en NIS2 richtlijn.

Stapsgewijze implementatie van beveiligde ACR-configuratie

De implementatie van een beveiligde Azure Container Registry begint met het bepalen van de juiste SKU en configuratie-opties. Azure Container Registry biedt drie SKU's: Basic, Standard en Premium. Voor productieomgevingen wordt Premium aanbevolen omdat deze SKU ondersteuning biedt voor geo-replicatie, content trust, private endpoints en uitgebreide storage-capaciteit. De Basic en Standard SKU's zijn geschikt voor ontwikkel- en testomgevingen, maar missen enkele geavanceerde beveiligingsfuncties die essentieel zijn voor productie. Na het selecteren van de SKU moet de registry worden aangemaakt in een resource group met passende tags voor governance en kostenbeheer. Het PowerShell-script dat bij dit artikel hoort, kan worden gebruikt om de status van bestaande registries te controleren en om te identificeren welke registries nog niet zijn geconfigureerd volgens best practices.

De eerste configuratiestap betreft netwerkbeveiliging. Voor productieomgevingen moet een private endpoint worden geconfigureerd in een toegewezen subnet binnen het virtuele netwerk. Dit vereist het aanmaken van een private endpoint resource die de ACR koppelt aan een privé IP-adres in het subnet. Daarnaast moet Azure Private DNS worden geconfigureerd om ervoor te zorgen dat DNS-queries voor de registry worden omgezet naar het privé IP-adres in plaats van het publieke IP-adres. Voor organisaties die toch publieke toegang nodig hebben, moeten firewallregels worden geconfigureerd die toegang beperken tot specifieke IP-adressen of service tags. Het is belangrijk om regelmatig te controleren of deze firewallregels nog actueel zijn en of er geen onnodige toegang is verleend. Het PowerShell-script biedt monitoringfunctionaliteit om deze configuraties te controleren en om te rapporteren over de netwerkbeveiligingsstatus van registries.

De tweede configuratiestap betreft authenticatie en autorisatie. Azure AD-authenticatie moet worden ingeschakeld als primaire authenticatiemethode, waarbij admin user wordt uitgeschakeld om te voorkomen dat statische gebruikersnamen en wachtwoorden worden gebruikt. Role-based access control moet worden geconfigureerd om specifieke rechten toe te kennen aan verschillende rollen en identiteiten. Voor services en CI/CD-pipelines moeten managed identities worden gebruikt in plaats van statische credentials, wat de beveiliging aanzienlijk verbetert. Het is belangrijk om regelmatig te reviewen welke rollen en identiteiten toegang hebben tot de registry en om ongebruikte toegang te verwijderen. Het PowerShell-script kan helpen bij het identificeren van registries waar admin user nog is ingeschakeld of waar onvoldoende RBAC is geconfigureerd.

De derde configuratiestap betreft kwetsbaarheidsscanning. Microsoft Defender for Containers moet worden ingeschakeld op abonnementsniveau, waarna automatische scanning kan worden geconfigureerd voor de registry. Deze configuratie kan worden gedaan via de Azure Portal in de security-instellingen van de registry, of via PowerShell door de juiste properties in te stellen. Eenmaal geconfigureerd, worden alle nieuwe images automatisch gescand op bekende kwetsbaarheden. De scanresultaten worden opgeslagen in Defender for Cloud en kunnen worden gebruikt voor policy enforcement en compliance-rapportage. Het is belangrijk om processen te implementeren voor het regelmatig reviewen van scanresultaten en voor het bijwerken of verwijderen van kwetsbare images. Het PowerShell-script biedt functionaliteit om de scanning-status te controleren en om te rapporteren over gevonden kwetsbaarheden.

De vierde configuratiestap betreft versleuteling en gegevensbescherming. Voor organisaties met strikte compliance-eisen moet customer-managed key encryption worden geconfigureerd via Azure Key Vault. Dit vereist het aanmaken van een Key Vault met een encryptiesleutel, het configureren van de juiste toegangsrechten voor de ACR managed identity, en het inschakelen van customer-managed key encryption op de registry. Daarnaast moeten retention policies worden geconfigureerd die automatisch oude of ongebruikte images verwijderen, wat het aanvalsoppervlak verkleint en storage-kosten reduceert. Content trust kan worden ingeschakeld voor organisaties die digitale handtekeningen willen gebruiken om de integriteit van images te waarborgen. Na de implementatie moet de configuratie worden gevalideerd om te verifiëren dat alle componenten correct functioneren en dat beveiligingsmaatregelen effectief zijn.

Monitoring en operationele bewaking van container registry beveiliging

Gebruik PowerShell-script container-registry-configured.ps1 (functie Invoke-Monitoring) – Controleert de beveiligingsconfiguratie van Azure Container Registry instances en rapporteert over netwerkbeveiliging, authenticatie, scanning en compliance-status..

Effectieve monitoring van Azure Container Registry beveiliging is essentieel om te waarborgen dat beveiligingsconfiguraties correct blijven functioneren en om tijdig te kunnen reageren op beveiligingsincidenten. Het monitoringproces omvat het regelmatig controleren van netwerkconfiguraties, authenticatie-instellingen, kwetsbaarheidsscanresultaten en toegangslogs. Het PowerShell-script dat bij dit artikel hoort, kan worden gebruikt om een overzicht te genereren van alle registries, hun beveiligingsstatus en eventuele configuratieproblemen. Deze informatie moet regelmatig worden gereviewed door security teams en moet worden gerapporteerd aan management en compliance-teams als onderdeel van de reguliere governance-processen.

Netwerkbeveiligingsmonitoring omvat het controleren of private endpoints correct zijn geconfigureerd, of firewallregels nog actueel zijn en of er geen onbevoegde toegang is verleend. Het PowerShell-script controleert de netwerkconfiguratie van elke registry en rapporteert over registries die nog gebruik maken van publieke endpoints zonder adequate firewallbeveiliging. Daarnaast moet worden gemonitord of DNS-resolutie correct werkt voor private endpoints en of er geen configuratiefouten zijn die kunnen leiden tot onbedoelde blootstelling aan het publieke internet. Voor organisaties met meerdere registries is het belangrijk om een gestandaardiseerd proces te hebben voor het monitoren van netwerkbeveiliging, zodat nieuwe registries automatisch worden gecontroleerd zonder dat dit handmatig moet worden gecontroleerd.

Authenticatie- en autorisatiemonitoring omvat het controleren of Azure AD-authenticatie is ingeschakeld, of admin user is uitgeschakeld, en of RBAC correct is geconfigureerd. Het PowerShell-script controleert deze instellingen en rapporteert over registries waar onvoldoende beveiligingsmaatregelen zijn geïmplementeerd. Daarnaast moeten toegangslogs regelmatig worden gereviewed om te identificeren of er ongebruikelijke toegangspogingen zijn, of er onbevoegde toegang is verleend, of er misbruik wordt gemaakt van toegangsrechten. Voor auditdoeleinden is het belangrijk dat deze logs worden bewaard voor de vereiste bewaartermijn en dat toegang wordt beperkt tot geautoriseerd personeel. Door deze monitoring op een gestructureerde manier uit te voeren, ontstaat een volwassen beveiligingsbewaking die zowel operationele stabiliteit als compliance-vereisten ondersteunt.

Kwetsbaarheidsscanmonitoring omvat het regelmatig reviewen van scanresultaten om te bepalen welke images moeten worden bijgewerkt of verwijderen. Het PowerShell-script genereert rapporten over gevonden kwetsbaarheden, inclusief de ernst en de getroffen images. Voor productieomgevingen is het aanbevolen om automatische waarschuwingen in te stellen voor kritieke kwetsbaarheden met een hoge CVSS-score, zodat teams onmiddellijk kunnen worden geïnformeerd wanneer kwetsbare images worden gebruikt. Daarnaast moeten scanresultaten worden geïntegreerd in de CI/CD-pipeline, zodat nieuwe images automatisch worden gescand voordat ze worden geïmplementeerd en zodat deployments kunnen worden geblokkeerd wanneer kritieke kwetsbaarheden worden gevonden. Dit vormt een belangrijke beveiligingsgate in het deployment-proces en voorkomt dat kwetsbare images in productie belanden.

Remediatie en verbetering van ACR beveiligingsconfiguratie

Gebruik PowerShell-script container-registry-configured.ps1 (functie Invoke-Remediation) – Ondersteunt het configureren van beveiligingsinstellingen voor Azure Container Registry instances en geeft aanbevelingen voor remediatie..

Wanneer monitoring uitwijst dat een Azure Container Registry niet is geconfigureerd volgens beveiligingsbest practices, moet snelle en gestructureerde remediatie plaatsvinden. Het remediatieproces begint met het identificeren van de specifieke beveiligingsproblemen: is de registry blootgesteld aan het publieke internet zonder adequate firewallbeveiliging, is admin user nog ingeschakeld, ontbreekt Azure AD-authenticatie, of zijn er andere configuratieproblemen? Het PowerShell-script kan helpen bij het identificeren van deze problemen, maar voor het oplossen ervan is handmatige interventie of geautomatiseerde remediatie via Infrastructure as Code noodzakelijk.

Voor registries die nog gebruik maken van publieke endpoints zonder adequate firewallbeveiliging, moet een private endpoint worden geconfigureerd of moeten firewallregels worden toegevoegd die toegang beperken tot specifieke IP-adressen. Het configureren van een private endpoint vereist het aanmaken van een private endpoint resource, het koppelen van de registry aan een subnet, en het configureren van Azure Private DNS. Voor organisaties die toch publieke toegang nodig hebben, moeten firewallregels worden geconfigureerd die toegang beperken tot bekende IP-ranges, zoals CI/CD-pipeline IP-adressen of ontwikkelaarsnetwerken. Het is belangrijk om deze configuraties te documenteren en om regelmatig te controleren of ze nog actueel zijn.

Voor registries waar admin user nog is ingeschakeld, moet deze functionaliteit worden uitgeschakeld en moet Azure AD-authenticatie worden geconfigureerd als primaire authenticatiemethode. Dit vereist het configureren van Azure AD-integratie, het toewijzen van de juiste RBAC-rollen aan gebruikers en services, en het uitschakelen van admin user. Voor services en CI/CD-pipelines moeten managed identities worden gebruikt in plaats van statische credentials. Het is belangrijk om te verifiëren dat alle afhankelijke services en pipelines zijn bijgewerkt voordat admin user wordt uitgeschakeld, om te voorkomen dat services niet meer kunnen functioneren.

Voor registries waar kwetsbaarheidsscanning niet is ingeschakeld, moet Microsoft Defender for Containers worden geconfigureerd en moet automatische scanning worden ingeschakeld. Dit vereist dat Defender for Containers is ingeschakeld op abonnementsniveau, waarna scanning kan worden geconfigureerd voor de registry. Eenmaal geconfigureerd, worden alle nieuwe images automatisch gescand. Voor bestaande images kan een handmatige scan worden geactiveerd of kunnen images opnieuw worden gepusht om een scan te triggeren. Het is belangrijk om processen te implementeren voor het regelmatig reviewen van scanresultaten en voor het bijwerken of verwijderen van kwetsbare images.

Ten slotte moeten alle remediatie-acties worden gedocumenteerd en geëvalueerd om lessen te leren en processen te verbeteren. Dit omvat het analyseren van waarom bepaalde configuraties niet waren geïmplementeerd, welke beveiligingsproblemen het meest voorkomen en hoe effectief de remediatie was. Deze informatie kan worden gebruikt om preventieve maatregelen te versterken, om training te verbeteren en om processen te optimaliseren. Door remediatie op deze manier te benaderen, kunnen organisaties niet alleen individuele problemen oplossen, maar ook hun algehele beveiligingspostuur continu verbeteren.

Compliance, governance en auditbaarheid van container registry beveiliging

Azure Container Registry beveiligingsconfiguratie speelt een cruciale rol bij het voldoen aan verschillende compliance- en beveiligingsstandaarden die relevant zijn voor Nederlandse overheidsorganisaties. De implementatie van deze beveiligingsmaatregelen helpt bij het aantonen van naleving van internationale normen zoals ISO 27001, nationale normen zoals de BIO, en Europese richtlijnen zoals NIS2. Voor elke normenkader zijn specifieke controles relevant die worden ondersteund door ACR-beveiligingsfunctionaliteiten.

De CIS Microsoft Azure Foundations Benchmark bevat meerdere controles die direct worden ondersteund door ACR-beveiligingsconfiguratie. Control 3.1 vereist dat storage accounts zijn geconfigureerd met secure transfer required, wat voor ACR betekent dat HTTPS moet worden afgedwongen voor alle communicatie. Control 3.3 vereist dat public access is uitgeschakeld voor storage accounts, wat voor ACR betekent dat publieke toegang moet worden beperkt via private endpoints of firewallregels. Control 8.1 vereist dat logging is ingeschakeld voor alle relevante services, wat voor ACR betekent dat alle activiteiten moeten worden gelogd in Azure Monitor. Door deze controles te implementeren via ACR-beveiligingsconfiguratie, kunnen organisaties aantonen dat zij voldoen aan best practices voor Azure-beveiliging zoals gedefinieerd door het Center for Internet Security.

De BIO (Baseline Informatiebeveiliging Overheid) bevat thema's die direct verband houden met container registry beveiliging. Thema 11.01 richt zich op toegangsbeheer en vereist dat organisaties passende maatregelen implementeren om toegang te controleren en te monitoren. ACR-beveiligingsconfiguratie ondersteunt dit thema door Azure AD-authenticatie, RBAC en uitgebreide toegangslogging te bieden. Thema 12.06 richt zich op kwetsbaarheidsbeheer en vereist dat organisaties systematisch kwetsbaarheden identificeren, beoordelen en verhelpen. ACR-beveiligingsconfiguratie ondersteunt dit thema door automatische scanning van container images op bekende kwetsbaarheden en het genereren van rapporten die kunnen worden gebruikt voor kwetsbaarheidsbeheerprocessen. Thema 13.02 betreft veilige netwerkdiensten en vereist dat organisaties netwerktoegang beveiligen en monitoren. ACR-beveiligingsconfiguratie ondersteunt dit thema door private endpoints, firewallregels en netwerklogging te bieden.

ISO 27001 bevat controles die relevant zijn voor container registry beveiliging. Control A.9.2.1 betreft gebruikersregistratie en deprovisioning en vereist dat organisaties processen hebben voor het beheren van gebruikersaccounts. ACR-beveiligingsconfiguratie ondersteunt deze control door Azure AD-integratie en RBAC te bieden, waardoor gebruikersaccounts centraal kunnen worden beheerd. Control A.9.4.2 betreft toegangscontrole en vereist dat organisaties passende maatregelen implementeren om toegang te controleren. ACR-beveiligingsconfiguratie ondersteunt deze control door uitgebreide toegangslogging en monitoring te bieden. Control A.12.6.1 betreft het beheer van technische kwetsbaarheden en vereist dat organisaties tijdig informatie over technische kwetsbaarheden ontvangen, deze beoordelen en passende maatregelen nemen. ACR-beveiligingsconfiguratie voorziet in deze behoefte door continue scanning en rapportage van kwetsbaarheden in container images.

De NIS2-richtlijn vereist dat organisaties passende technische en organisatorische maatregelen nemen om cybersecurity-risico's te beheren. Artikel 21 vereist specifiek dat organisaties passende maatregelen implementeren voor het detecteren en reageren op cybersecurity-incidenten. ACR-beveiligingsconfiguratie helpt bij het voldoen aan deze vereisten door geavanceerde logging en monitoring te bieden, waardoor beveiligingsincidenten kunnen worden gedetecteerd en onderzocht. Voor Nederlandse overheidsorganisaties is het belangrijk om te beseffen dat compliance een continu proces is, niet een eenmalige activiteit. Regelmatige monitoring en auditing zijn essentieel om te waarborgen dat ACR-beveiligingsconfiguraties actief blijven en dat beveiligingsproblemen worden behandeld. Auditbewijs zoals netwerkconfiguraties, authenticatie-instellingen, kwetsbaarheidsscanresultaten en toegangslogs moeten worden bewaard voor de vereiste bewaartermijn van zeven jaar, conform Nederlandse archiefwetgeving.

Compliance & Frameworks

Automation

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

PowerShell
<# ================================================================================ AZURE POWERSHELL SCRIPT - Nederlandse Baseline voor Veilige Cloud ================================================================================ .SYNOPSIS Controleert en beheert Azure Container Registry beveiligingsconfiguratie .DESCRIPTION Dit script helpt om inzicht te krijgen in de beveiligingsconfiguratie van Azure Container Registry (ACR) instances. Het controleert of private endpoints zijn geconfigureerd, of Azure AD-authenticatie is ingeschakeld, of kwetsbaarheidsscanning actief is en geeft aanbevelingen voor remediatie waar nodig. In LocalDebug-modus wordt voorbeelddata gebruikt zodat het script ook zonder actieve Azure-verbinding getest kan worden. .NOTES Filename: container-registry-configured.ps1 Author: Nederlandse Baseline voor Veilige Cloud Version: 1.0 Related JSON: content/azure/containers/container-registry-configured.json Modules: Az.Accounts, Az.ContainerRegistry, Az.Resources, Az.Security .EXAMPLE .\container-registry-configured.ps1 -Monitoring -LocalDebug Voert een monitoringcontrole uit op basis van voorbeelddata. .EXAMPLE .\container-registry-configured.ps1 -Monitoring Toont een overzicht van ACR-registries en hun beveiligingsstatus. .EXAMPLE .\container-registry-configured.ps1 -Remediation Geeft aanbevelingen voor het verbeteren van ACR-beveiligingsconfiguratie. #> #Requires -Version 5.1 #Requires -Modules Az.Accounts, Az.ContainerRegistry, Az.Resources, Az.Security [CmdletBinding()] param( [Parameter(HelpMessage = "Voer een monitoringinventarisatie uit.")] [switch]$Monitoring, [Parameter(HelpMessage = "Ondersteun het opstellen van remediatie- en verbeteracties.")] [switch]$Remediation, [Parameter(HelpMessage = "Gebruik voorbeelddata in plaats van live Azure-calls (voor lokale debug).")] [switch]$LocalDebug, [Parameter(HelpMessage = "Toon alleen welke acties geadviseerd worden, zonder wijzigingen door te voeren.")] [switch]$WhatIf ) $ErrorActionPreference = 'Stop' $PolicyName = 'Azure Container Registry beveiligingsconfiguratie' function Connect-AzureContext { if ($script:LocalDebug) { Write-Verbose "LocalDebug is ingeschakeld; er wordt geen verbinding met Azure gemaakt." return } if (-not (Get-AzContext -ErrorAction SilentlyContinue)) { Write-Verbose "Geen actieve Az-context gevonden; probeer Connect-AzAccount uit te voeren." Connect-AzAccount -ErrorAction Stop | Out-Null Write-Host "Verbonden met Azure." -ForegroundColor Green } } function Get-ContainerRegistrySecurityStatus { <# .SYNOPSIS Haalt de beveiligingsstatus op voor alle Azure Container Registry instances. .OUTPUTS PSCustomObject met registry-informatie en samenvatting. #> [CmdletBinding()] param( [switch]$UseDebugData ) if ($UseDebugData) { $registries = @( [pscustomobject]@{ Name = 'acr-prod-registry' SubscriptionId = '00000000-0000-0000-0000-000000000000' SubscriptionName = 'Production Subscription' ResourceGroup = 'rg-acr-prod' Location = 'westeurope' Sku = 'Premium' PublicNetworkAccess = 'Disabled' PrivateEndpointEnabled = $true AdminUserEnabled = $false AzureAdAuthEnabled = $true VulnerabilityScanningEnabled = $true FirewallRulesConfigured = $false }, [pscustomobject]@{ Name = 'acr-dev-registry' SubscriptionId = '11111111-1111-1111-1111-111111111111' SubscriptionName = 'Development Subscription' ResourceGroup = 'rg-acr-dev' Location = 'westeurope' Sku = 'Basic' PublicNetworkAccess = 'Enabled' PrivateEndpointEnabled = $false AdminUserEnabled = $true AzureAdAuthEnabled = $false VulnerabilityScanningEnabled = $false FirewallRulesConfigured = $false } ) } else { $registries = @() $subscriptions = Get-AzSubscription | Where-Object { $_.State -eq 'Enabled' } foreach ($sub in $subscriptions) { Set-AzContext -SubscriptionId $sub.Id -ErrorAction SilentlyContinue | Out-Null Write-Verbose "Controleren van abonnement: $($sub.Name) ($($sub.Id))" try { $acrRegistries = Get-AzContainerRegistry -ErrorAction SilentlyContinue foreach ($registry in $acrRegistries) { # Controleren of private endpoint is geconfigureerd $privateEndpoints = Get-AzPrivateEndpoint -ErrorAction SilentlyContinue | Where-Object { $_.PrivateLinkServiceConnections.PrivateLinkServiceId -like "*$($registry.Id)*" } $privateEndpointEnabled = ($privateEndpoints.Count -gt 0) # Controleren of admin user is ingeschakeld $adminUserEnabled = $registry.AdminUserEnabled # Controleren of public network access is uitgeschakeld $publicNetworkAccess = if ($registry.PublicNetworkAccess) { 'Enabled' } else { 'Disabled' } # Controleren of firewallregels zijn geconfigureerd $networkRuleSet = $registry.NetworkRuleSet $firewallRulesConfigured = ($null -ne $networkRuleSet -and $networkRuleSet.IpRules.Count -gt 0) # Controleren of Defender for Containers is ingeschakeld (vereist voor scanning) $defenderForContainers = Get-AzSecurityPricing -Name 'Containers' -ErrorAction SilentlyContinue $vulnerabilityScanningEnabled = ($defenderForContainers.PricingTier -eq 'Standard') # Azure AD-authenticatie is standaard beschikbaar, maar admin user moet uit zijn $azureAdAuthEnabled = -not $adminUserEnabled $obj = [pscustomobject]@{ Name = $registry.Name SubscriptionId = $sub.Id SubscriptionName = $sub.Name ResourceGroup = $registry.ResourceGroupName Location = $registry.Location Sku = $registry.Sku.Name PublicNetworkAccess = $publicNetworkAccess PrivateEndpointEnabled = $privateEndpointEnabled AdminUserEnabled = $adminUserEnabled AzureAdAuthEnabled = $azureAdAuthEnabled VulnerabilityScanningEnabled = $vulnerabilityScanningEnabled FirewallRulesConfigured = $firewallRulesConfigured } $registries += $obj } } catch { Write-Verbose "Kon geen ACR-registries ophalen voor abonnement $($sub.Name): $_" } } } $secureCount = ($registries | Where-Object { $_.PrivateEndpointEnabled -or ($_.PublicNetworkAccess -eq 'Disabled') -or $_.FirewallRulesConfigured -and -not $_.AdminUserEnabled -and $_.AzureAdAuthEnabled -and $_.VulnerabilityScanningEnabled }).Count $insecureCount = $registries.Count - $secureCount $summary = [pscustomobject]@{ TotalRegistries = $registries.Count SecureRegistries = $secureCount InsecureRegistries = $insecureCount AllRegistries = $registries } return $summary } function Invoke-Monitoring { <# .SYNOPSIS Voert een gedetailleerde monitoringcontrole uit. .DESCRIPTION Toont een overzicht van ACR-registries en hun beveiligingsstatus, zodat beheerders gericht vervolgacties kunnen plannen. #> [CmdletBinding()] param() Connect-AzureContext $result = Get-ContainerRegistrySecurityStatus -UseDebugData:$LocalDebug Write-Host "" -ForegroundColor White Write-Host "========================================" -ForegroundColor Cyan Write-Host $PolicyName -ForegroundColor Cyan Write-Host "========================================" -ForegroundColor Cyan Write-Host ("Totaal ACR-registries: {0}" -f $result.TotalRegistries) -ForegroundColor White Write-Host ("Beveiligd geconfigureerd: {0}" -f $result.SecureRegistries) -ForegroundColor ($(if ($result.SecureRegistries -eq $result.TotalRegistries) { 'Green' } else { 'Yellow' })) Write-Host ("Niet beveiligd geconfigureerd: {0}" -f $result.InsecureRegistries) -ForegroundColor ($(if ($result.InsecureRegistries -eq 0) { 'Green' } else { 'Red' })) if ($result.TotalRegistries -eq 0) { Write-Host "`nGeen ACR-registries gevonden in de huidige Azure-context." -ForegroundColor Yellow return } if ($result.InsecureRegistries -gt 0) { Write-Host "`nDe volgende registries hebben beveiligingsproblemen:" -ForegroundColor Yellow $insecureRegistries = $result.AllRegistries | Where-Object { -not ($_.PrivateEndpointEnabled -or ($_.PublicNetworkAccess -eq 'Disabled') -or $_.FirewallRulesConfigured) -or $_.AdminUserEnabled -or -not $_.AzureAdAuthEnabled -or -not $_.VulnerabilityScanningEnabled } foreach ($registry in $insecureRegistries) { Write-Host "`n Registry: $($registry.Name) ($($registry.ResourceGroup))" -ForegroundColor Yellow $issues = @() if (-not ($registry.PrivateEndpointEnabled -or ($registry.PublicNetworkAccess -eq 'Disabled') -or $registry.FirewallRulesConfigured)) { $issues += "Geen netwerkbeveiliging (private endpoint of firewallregels ontbreken)" } if ($registry.AdminUserEnabled) { $issues += "Admin user is ingeschakeld (moet worden uitgeschakeld)" } if (-not $registry.AzureAdAuthEnabled) { $issues += "Azure AD-authenticatie niet correct geconfigureerd" } if (-not $registry.VulnerabilityScanningEnabled) { $issues += "Kwetsbaarheidsscanning niet ingeschakeld" } foreach ($issue in $issues) { Write-Host " - $issue" -ForegroundColor Red } } Write-Host "`nBelangrijk:" -ForegroundColor Yellow Write-Host "- Configureer private endpoints of firewallregels voor netwerkbeveiliging" -ForegroundColor Yellow Write-Host "- Schakel admin user uit en gebruik Azure AD-authenticatie" -ForegroundColor Yellow Write-Host "- Schakel Defender for Containers in voor kwetsbaarheidsscanning" -ForegroundColor Yellow Write-Host "- Gebruik -Remediation voor aanbevelingen" -ForegroundColor Yellow } else { Write-Host "`nAlle ACR-registries zijn beveiligd geconfigureerd." -ForegroundColor Green } } function Invoke-Remediation { <# .SYNOPSIS Geeft aanbevelingen voor remediatie rond ACR-beveiligingsconfiguratie. .DESCRIPTION Dit script wijzigt zelf geen resources, maar rapporteert waar beveiligingsconfiguraties ontbreken en geeft gerichte aanbevelingen zodat beheerders via Azure Portal, ARM/Bicep of Terraform de juiste wijzigingen kunnen doorvoeren. #> [CmdletBinding()] param() Connect-AzureContext $result = Get-ContainerRegistrySecurityStatus -UseDebugData:$LocalDebug Write-Host "" -ForegroundColor White Write-Host "========================================" -ForegroundColor Cyan Write-Host "$PolicyName - Remediatieadvies" -ForegroundColor Cyan Write-Host "========================================" -ForegroundColor Cyan if ($result.TotalRegistries -eq 0) { Write-Host "`nGeen ACR-registries gevonden. Geen remediatie nodig." -ForegroundColor Green return } $insecureRegistries = $result.AllRegistries | Where-Object { -not ($_.PrivateEndpointEnabled -or ($_.PublicNetworkAccess -eq 'Disabled') -or $_.FirewallRulesConfigured) -or $_.AdminUserEnabled -or -not $_.AzureAdAuthEnabled -or -not $_.VulnerabilityScanningEnabled } if ($insecureRegistries.Count -eq 0) { Write-Host "`nAlle registries zijn beveiligd geconfigureerd. Geen remediatie nodig." -ForegroundColor Green return } Write-Host "`nRegistries met beveiligingsproblemen:" -ForegroundColor Red $insecureRegistries | Select-Object Name, ResourceGroup, Location, SubscriptionName | Format-Table -AutoSize Write-Host "`nREMEDIATIESTAPPEN:" -ForegroundColor Cyan Write-Host "`n1. Netwerkbeveiliging configureren:" -ForegroundColor White Write-Host " a. Private Endpoint (aanbevolen voor productie):" -ForegroundColor Gray Write-Host " - Maak een private endpoint aan in een toegewezen subnet" -ForegroundColor Gray Write-Host " - Configureer Azure Private DNS voor naamresolutie" -ForegroundColor Gray Write-Host " - Schakel public network access uit: Update-AzContainerRegistry -ResourceGroupName <rg> -Name <registry> -PublicNetworkAccess Disabled" -ForegroundColor Gray Write-Host " b. Firewallregels (indien publieke toegang nodig):" -ForegroundColor Gray Write-Host " - Configureer IP-firewallregels: az acr update --name <registry> --default-action Deny" -ForegroundColor Gray Write-Host " - Voeg toegestane IP-ranges toe: az acr network-rule add --name <registry> --ip-address <ip-range>" -ForegroundColor Gray Write-Host "`n2. Authenticatie configureren:" -ForegroundColor White Write-Host " - Schakel admin user uit: Update-AzContainerRegistry -ResourceGroupName <rg> -Name <registry> -DisableAdminUser" -ForegroundColor Gray Write-Host " - Configureer Azure AD-authenticatie en RBAC-rollen" -ForegroundColor Gray Write-Host " - Gebruik managed identities voor services en CI/CD-pipelines" -ForegroundColor Gray Write-Host "`n3. Kwetsbaarheidsscanning inschakelen:" -ForegroundColor White Write-Host " - Verifieer dat Defender for Cloud is ingeschakeld op abonnementsniveau:" -ForegroundColor Gray Write-Host " Set-AzSecurityPricing -Name 'Containers' -PricingTier 'Standard'" -ForegroundColor Gray Write-Host " - Configureer automatische scanning in Azure Portal:" -ForegroundColor Gray Write-Host " Azure Portal -> Container Registry -> Security -> Microsoft Defender for Cloud -> Enable" -ForegroundColor Gray Write-Host "`n4. Versleuteling configureren (optioneel, voor strikte compliance):" -ForegroundColor White Write-Host " - Configureer customer-managed keys via Azure Key Vault" -ForegroundColor Gray Write-Host " - Schakel content trust in voor digitale handtekeningen" -ForegroundColor Gray Write-Host "`n5. Monitoring configureren:" -ForegroundColor White Write-Host " - Schakel diagnostische logs in voor alle activiteiten" -ForegroundColor Gray Write-Host " - Configureer Log Analytics-integratie voor centrale logging" -ForegroundColor Gray Write-Host " - Stel waarschuwingen in voor kritieke kwetsbaarheden" -ForegroundColor Gray if ($WhatIf) { Write-Host "`n[WhatIf] Er zouden geen wijzigingen worden doorgevoerd." -ForegroundColor Yellow } else { Write-Host "`nBELANGRIJK: Dit script maakt zelf geen wijzigingen. Voer bovenstaande stappen handmatig uit." -ForegroundColor Yellow } } function Invoke-Implementation { <# .SYNOPSIS Wrapper om remediatieadvies aan te roepen. .DESCRIPTION Voor integratie in generieke tooling kan deze functie worden gebruikt als standaard implementatie-entrypoint. #> [CmdletBinding()] param() Invoke-Remediation } try { if ($Monitoring) { Invoke-Monitoring } elseif ($Remediation) { Invoke-Remediation } else { # Korte samenvatting voor snelle checks Connect-AzureContext $result = Get-ContainerRegistrySecurityStatus -UseDebugData:$LocalDebug Write-Host ("ACR-beveiligingsconfiguratie: {0}/{1} registries beveiligd" -f ` $result.SecureRegistries, $result.TotalRegistries) } } catch { Write-Error $_ exit 1 }

Risico zonder implementatie

Risico zonder implementatie
High: Zonder adequate ACR-beveiligingsconfiguratie kunnen kwetsbare images ongemerkt in productie belanden, kunnen onbevoegden toegang krijgen tot containerartefacten, en kunnen images worden gemanipuleerd zonder detectie. Dit kan leiden tot datalekken, serviceonderbrekingen en compromittatie van kritieke workloads. Het risico is kritiek voor productieregistries die worden gebruikt voor productiecontainer workloads.

Management Samenvatting

Azure Container Registry beveiligingsconfiguratie omvat netwerkisolatie via private endpoints, Azure AD-authenticatie en RBAC, automatische kwetsbaarheidsscanning, customer-managed key encryption en uitgebreide logging. Implementatie: configureer private endpoints of firewallregels, schakel Azure AD-authenticatie in, activeer automatische scanning en stel monitoring in. Verplicht voor alle productieregistries. Vereist voor CIS Azure Foundations Benchmark, BIO 11.01/12.06/13.02, ISO 27001 en NIS2 Artikel 21.