Azure Key Vault Implementatie Voor Nederlandse Overheidsorganisaties

💼 Management Samenvatting

Azure Key Vault vormt de hoeksteen van cryptografische beveiliging in Azure-omgevingen voor Nederlandse overheidsorganisaties. Als centrale beveiligingsservice biedt Key Vault een veilige opslagplaats voor cryptografische sleutels, certificaten, geheimen en connection strings, waardoor organisaties hardcoded credentials kunnen elimineren, key management kunnen centraliseren en compliance kunnen afdwingen. Voor publieke organisaties die gevoelige data verwerken en moeten voldoen aan NIS2, BIO en ISO 27001 is een doordachte implementatie van Azure Key Vault niet optioneel, maar essentieel voor het waarborgen van vertrouwelijkheid, integriteit en beschikbaarheid van digitale dienstverlening.

Aanbeveling
IMPLEMENT
Risico zonder
High
Risk Score
9/10
Implementatie
280u (tech: 160u)
Van toepassing op:
Azure Key Vault
Azure Storage Accounts
Azure SQL Databases
Azure Virtual Machines
Azure App Services
Azure Functions

Zonder een gecentraliseerd key management systeem zoals Azure Key Vault verspreiden organisaties cryptografische sleutels en geheimen over verschillende locaties: in code repositories, configuratiebestanden, environment variables, databases en documentatie. Deze verspreiding creëert aanzienlijke beveiligingsrisico's. Hardcoded credentials in applicatiecode kunnen worden gelekt via source code repositories, configuratiebestanden op servers kunnen worden gecompromitteerd door ongeautoriseerde toegang, en inconsistente beheerpraktijken maken het onmogelijk om te voldoen aan compliance-vereisten voor key management. Daarnaast ontbreekt zonder gecentraliseerd systeem de mogelijkheid om toegang te controleren, rotatie af te dwingen, gebruik te monitoren en audit trails te genereren. Voor Nederlandse overheidsorganisaties die persoonsgegevens, bedrijfsgevoelige informatie en nationale veiligheidsgevoelige data verwerken, is dit onacceptabel. Compliance-kaders zoals NIS2 vereisen expliciet passende technische maatregelen voor key management, BIO vraagt om cryptografische beveiliging en ISO 27001 schrijft controls voor voor cryptographic key management. Zonder een gedocumenteerde en geïmplementeerde Azure Key Vault oplossing kunnen organisaties niet aantoonbaar voldoen aan deze eisen en lopen zij het risico op sancties, datalekken en verlies van vertrouwen.

PowerShell Modules Vereist
Primary API: Azure Key Vault API
Connection: Connect-AzAccount
Required Modules: Az.Accounts, Az.KeyVault, Az.Resources, Az.Storage, Az.Sql, Az.Compute

Implementatie

Dit artikel beschrijft een concrete implementatiestrategie voor Azure Key Vault binnen Nederlandse overheidsorganisaties, toegespitst op de specifieke eisen en context van de publieke sector. De implementatie is gebaseerd op zes fundamentele pijlers: architectuur en naming conventions, toegangsbeheer en RBAC-configuratie, netwerkbeveiliging en private endpoints, integratie met Azure-services en applicaties, monitoring en logging, en compliance en audit. De eerste pijler betreft architectuur waarbij Key Vaults worden gestructureerd op basis van omgeving (ontwikkeling, test, acceptatie, productie), classificatie (Openbaar, Intern, Vertrouwelijk, Geheim) en workload (bijvoorbeeld per applicatie of per afdeling). Duidelijke naming conventions en resource tagging zorgen voor herbruikbaarheid, beheerbaarheid en compliance-rapportage. De tweede pijler richt zich op toegangsbeheer waarbij Azure RBAC en Key Vault access policies worden gecombineerd om least privilege access af te dwingen, managed identities worden gebruikt in plaats van service principals met secrets, en toegangsrechten worden gereguleerd op basis van rol en context. De derde pijler adresseert netwerkbeveiliging waarbij private endpoints worden geconfigureerd om Key Vaults te isoleren van het publieke internet, network access controls worden toegepast om alleen toegang toe te staan vanaf geautoriseerde netwerken, en firewall rules worden geconfigureerd om ongewenste toegang te blokkeren. De vierde pijler betreft integratie waarbij applicaties en services worden geconfigureerd om Key Vault te gebruiken voor het ophalen van secrets, keys en certificates tijdens runtime, managed identities worden gebruikt voor authenticatie zonder credentials, en best practices worden toegepast voor het cachen en refreshen van secrets. De vijfde pijler richt zich op monitoring en logging waarbij Azure Monitor, Log Analytics en Azure Sentinel worden gebruikt om Key Vault-operaties te monitoren, verdachte activiteiten te detecteren, en compliance-rapportages te genereren. De zesde pijler adresseert compliance waarbij soft-delete en purge protection worden ingeschakeld, audit logs worden bewaard volgens BIO-vereisten, en periodieke assessments worden uitgevoerd om compliance te verifiëren. Het artikel beschrijft voor elke pijler concrete implementatiestappen, best practices, Azure-native services die kunnen worden ingezet, en hoe de pijlers onderling samenwerken om een robuuste en compliance-conforme Key Vault-implementatie te creëren. Daarnaast wordt uitgelegd hoe deze implementatie aansluit bij NIS2-verplichtingen, BIO-normen en Microsoft's security best practices.

Architectuur en naming conventions voor Key Vault-implementatie

Een doordachte architectuur vormt de basis voor een succesvolle Azure Key Vault-implementatie. In tegenstelling tot een ad-hoc aanpak waarbij Key Vaults worden aangemaakt wanneer daar behoefte aan ontstaat, vereist een volwassen implementatie een gestructureerde architectuur die rekening houdt met omgeving, classificatie, workload en compliance-vereisten. Voor Nederlandse overheidsorganisaties betekent dit typisch dat Key Vaults worden georganiseerd op basis van omgeving (development, test, acceptance, production), classificatie (Openbaar, Intern, Vertrouwelijk, Geheim) en workload (bijvoorbeeld per applicatie, per afdeling of per business unit). Deze organisatie zorgt ervoor dat gevoelige productiesecrets gescheiden blijven van testdata, dat toegangsrechten consistent kunnen worden beheerd per omgeving, en dat compliance-rapportages duidelijk kunnen aangeven welke Key Vaults welke classificaties bevatten. Een belangrijk architectonisch patroon is het gebruik van gescheiden Key Vaults per omgeving. Productie-Key Vaults bevatten uitsluitend productiesecrets, test-Key Vaults bevatten uitsluitend testdata, en development-Key Vaults kunnen worden gebruikt voor development en testing. Deze scheiding voorkomt dat developers per ongeluk productiesecrets gebruiken in testomgevingen, dat productieapplicaties worden blootgesteld aan testdata, en dat toegangsrechten voor testomgevingen worden toegepast op productieomgevingen. Daarnaast kunnen per omgeving verschillende beveiligingsniveaus worden gehanteerd: productie-Key Vaults kunnen bijvoorbeeld private endpoints vereisen, terwijl development-Key Vaults mogelijk publiek toegankelijk kunnen zijn (met strenge firewall rules). Naming conventions zijn essentieel voor herbruikbaarheid, beheerbaarheid en compliance-rapportage. Een gestandaardiseerde naming convention zoals 'kv-{omgeving}-{classificatie}-{workload}-{regio}-{nummer}' zorgt ervoor dat Key Vaults direct herkenbaar zijn, dat zij automatisch kunnen worden geïdentificeerd in scripts en policies, en dat compliance-rapportages kunnen worden gegenereerd op basis van naming patterns. Daarnaast moeten resource tags worden gebruikt om aanvullende metadata op te slaan, zoals eigenaar, kostenplaats, compliance-kader, en classificatie. Deze tags kunnen worden gebruikt voor cost allocation, compliance-rapportage, en automatische policy enforcement. Het PowerShell-script uit dit artikel kan worden gebruikt om naming conventions en resource tags te valideren, zodat nieuwe Key Vaults automatisch voldoen aan de gestelde eisen.

Toegangsbeheer en RBAC-configuratie voor Key Vault

Toegangsbeheer is een kritieke component van een veilige Azure Key Vault-implementatie. Key Vault ondersteunt twee verschillende toegangsmodellen: Azure RBAC (Role-Based Access Control) en Key Vault access policies. Azure RBAC is de moderne, aanbevolen aanpak die gebruik maakt van Azure's gecentraliseerde toegangsbeheer, terwijl Key Vault access policies de legacy-aanpak vormen die nog steeds wordt ondersteund maar niet wordt aanbevolen voor nieuwe implementaties. Voor Nederlandse overheidsorganisaties is het gebruik van Azure RBAC essentieel omdat dit model beter aansluit bij bestaande identity governance, betere integratie biedt met Azure AD en PIM, en consistente toegangscontrole mogelijk maakt over meerdere Azure-services. Azure RBAC voor Key Vault maakt gebruik van ingebouwde rollen zoals Key Vault Secrets User, Key Vault Secrets Officer, Key Vault Crypto User en Key Vault Crypto Officer. Deze rollen definiëren welke operaties gebruikers kunnen uitvoeren: Secrets Users kunnen secrets lezen, Secrets Officers kunnen secrets lezen en beheren, Crypto Users kunnen cryptografische operaties uitvoeren met keys, en Crypto Officers kunnen keys beheren. Voor Nederlandse overheidsorganisaties is het belangrijk om least privilege access af te dwingen: gebruikers en services krijgen uitsluitend de minimale rechten die nodig zijn voor hun functie. Developers krijgen bijvoorbeeld Secrets User rechten voor development-Key Vaults, maar geen toegang tot productie-Key Vaults. Applicaties krijgen Secrets User rechten via managed identities, maar geen Officer rechten omdat zij keys en secrets niet hoeven te beheren. Managed identities vormen de aanbevolen methode voor applicatie-authenticatie bij Key Vault. In plaats van service principals met client secrets (die zelf weer in Key Vault moeten worden opgeslagen) gebruiken managed identities automatisch beheerde identiteiten die geen credentials vereisen. System-assigned managed identities worden automatisch aangemaakt wanneer een Azure-resource wordt gemaakt en worden automatisch verwijderd wanneer de resource wordt verwijderd. User-assigned managed identities worden onafhankelijk aangemaakt en kunnen aan meerdere resources worden gekoppeld. Voor Nederlandse overheidsorganisaties is het gebruik van managed identities essentieel omdat dit het risico op gecompromitteerde credentials elimineert, key management vereenvoudigt, en audit trails verbetert. Het PowerShell-script uit dit artikel kan worden gebruikt om te controleren of applicaties managed identities gebruiken in plaats van service principals met secrets.

Gebruik PowerShell-script key-vault-implementation.ps1 (functie Test-KeyVaultAccessControl) – Controleert of Key Vaults correct zijn geconfigureerd met Azure RBAC en managed identities.

Netwerkbeveiliging en private endpoints voor Key Vault

Netwerkbeveiliging is essentieel om Azure Key Vaults te beschermen tegen ongeautoriseerde toegang vanaf het publieke internet. Standaard zijn Key Vaults toegankelijk via het publieke internet, wat betekent dat iedereen met de juiste authenticatie (bijvoorbeeld via een gecompromitteerd account) toegang kan krijgen tot gevoelige secrets. Voor Nederlandse overheidsorganisaties die Geheime of Zeer Geheime data verwerken is dit onacceptabel. Daarom moeten productie-Key Vaults worden geconfigureerd met private endpoints, waardoor Key Vaults alleen toegankelijk zijn via privé IP-adressen binnen Azure Virtual Networks. Private endpoints creëren een privé verbinding tussen een Virtual Network en een Azure-service (in dit geval Key Vault). Wanneer een private endpoint wordt geconfigureerd voor een Key Vault, wordt een privé IP-adres toegewezen aan de Key Vault binnen het Virtual Network, en wordt alle communicatie tussen resources in het Virtual Network en de Key Vault via de private endpoint gerouteerd. Dit betekent dat Key Vaults niet meer toegankelijk zijn via het publieke internet, wat het aanvalsoppervlak aanzienlijk verkleint. Daarnaast kunnen Network Security Groups (NSGs) en User-Defined Routes (UDRs) worden gebruikt om netwerkverkeer te filteren en te routeren, zodat alleen geautoriseerde resources toegang hebben tot Key Vaults. Voor Key Vaults die nog toegankelijk moeten zijn via het publieke internet (bijvoorbeeld voor development-omgevingen of voor externe integraties) moeten firewall rules worden geconfigureerd. Key Vault firewall rules bepalen welke IP-adressen of IP-ranges toegang hebben tot de Key Vault. Alleen verkeer vanaf geautoriseerde IP-adressen wordt toegestaan, alle overige verkeer wordt geblokkeerd. Voor Nederlandse overheidsorganisaties is het belangrijk om firewall rules te baseren op de werkelijke behoefte: alleen IP-adressen van office locations, VPN gateways, of specifieke Azure-services worden toegestaan. Daarnaast moeten firewall rules regelmatig worden herzien om te verifiëren dat zij nog steeds actueel en noodzakelijk zijn. Het PowerShell-script uit dit artikel kan worden gebruikt om te controleren of Key Vaults private endpoints hebben, of firewall rules correct zijn geconfigureerd, en of netwerkbeveiliging voldoet aan compliance-vereisten.

Gebruik PowerShell-script key-vault-implementation.ps1 (functie Test-KeyVaultNetworkSecurity) – Controleert of Key Vaults correct zijn geconfigureerd met private endpoints en firewall rules.

Integratie met Azure-services en applicaties

De waarde van Azure Key Vault wordt pas duidelijk wanneer applicaties en services daadwerkelijk Key Vault gebruiken voor het ophalen van secrets, keys en certificates. Integratie met Key Vault vereist echter aandacht voor authenticatie, caching, error handling en performance. Voor Nederlandse overheidsorganisaties is het belangrijk dat integraties robuust zijn, foutafhandeling bevatten, en voldoen aan security best practices. De aanbevolen methode voor authenticatie bij Key Vault vanuit Azure-services is het gebruik van managed identities. Azure App Services, Azure Functions, Azure Virtual Machines en andere Azure-services ondersteunen managed identities, waardoor applicaties kunnen authenticeren bij Key Vault zonder credentials op te slaan in code of configuratie. Wanneer een applicatie bijvoorbeeld een secret nodig heeft, roept deze de Key Vault REST API aan met de managed identity, en Azure handelt de authenticatie automatisch af. Dit elimineert het risico op gecompromitteerde credentials en vereenvoudigt key management. Voor applicaties die draaien buiten Azure (bijvoorbeeld on-premises applicaties of applicaties in andere clouds) kunnen service principals met client secrets worden gebruikt, maar deze secrets moeten op hun beurt weer worden opgeslagen in een veilige locatie (bijvoorbeeld in een on-premises key management systeem of in een aparte Key Vault). Alternatief kunnen certificaten worden gebruikt voor authenticatie in plaats van client secrets, omdat certificaten als veiliger worden beschouwd. Voor Nederlandse overheidsorganisaties is het belangrijk om per integratie te evalueren welke authenticatiemethode het meest geschikt is op basis van risico, complexiteit en compliance-vereisten. Caching is een belangrijk aspect van Key Vault-integraties omdat het ophalen van secrets uit Key Vault relatief traag kan zijn (typisch 50-200ms per request). Applicaties moeten daarom secrets cachen in geheugen en deze periodiek refreshen (bijvoorbeeld om het uur of wanneer een secret niet kan worden opgehaald). Dit verbetert performance en verhoogt beschikbaarheid wanneer Key Vault tijdelijk niet beschikbaar is. Daarnaast moeten applicaties error handling implementeren voor het geval Key Vault niet beschikbaar is, zodat applicaties kunnen fallback naar cached secrets of graceful degradation kunnen toepassen. Het PowerShell-script uit dit artikel kan worden gebruikt om te controleren of applicaties correct zijn geconfigureerd voor Key Vault-integratie en of managed identities worden gebruikt.

Gebruik PowerShell-script key-vault-implementation.ps1 (functie Test-KeyVaultIntegration) – Controleert of Azure-services correct zijn geconfigureerd voor Key Vault-integratie met managed identities.

Monitoring en logging voor Key Vault-operaties

Monitoring en logging zijn essentieel om te detecteren wanneer Key Vaults worden misbruikt, wanneer verdachte activiteiten plaatsvinden, en wanneer compliance-vereisten niet worden nageleefd. Azure Key Vault genereert automatisch audit logs voor alle operaties, inclusief het ophalen van secrets, het aanmaken van keys, het configureren van access policies, en het wijzigen van netwerkbeveiliging. Deze logs kunnen worden opgeslagen in Azure Monitor en Log Analytics, waardoor organisaties queries kunnen uitvoeren, alerts kunnen configureren, en dashboards kunnen maken. Voor Nederlandse overheidsorganisaties is het belangrijk om te monitoren op verdachte activiteiten zoals ongebruikelijke toegangspatronen, gefaalde authenticatiepogingen, en wijzigingen aan Key Vault-configuratie. Azure Sentinel kan worden gebruikt om Key Vault logs te analyseren en security incidents te detecteren. Daarnaast moeten alerts worden geconfigureerd voor kritieke events zoals het verwijderen van keys of secrets, het wijzigen van access policies, en het configureren van netwerkbeveiliging. Deze alerts moeten worden verzonden naar security teams en compliance officers, zodat tijdig actie kan worden ondernomen. Compliance-rapportage is een belangrijk aspect van monitoring. Organisaties moeten periodiek rapporten genereren die aangeven welke Key Vaults zijn geconfigureerd, welke access policies zijn toegepast, welke netwerkbeveiliging is geconfigureerd, en welke integraties zijn geïmplementeerd. Deze rapporten kunnen worden gebruikt voor interne audits, externe assessments, en compliance-rapportage aan bestuur en directie. Het PowerShell-script uit dit artikel kan worden gebruikt om automatisch compliance-rapportages te genereren die voldoen aan NIS2, BIO en ISO 27001-vereisten.

Gebruik PowerShell-script key-vault-implementation.ps1 (functie Invoke-KeyVaultMonitoring) – Monitort Key Vault-operaties en genereert compliance-rapportages.

Compliance en audit voor Key Vault-implementatie

Compliance en audit vormen de laatste pijler van een volwassen Azure Key Vault-implementatie. Voor Nederlandse overheidsorganisaties die moeten voldoen aan NIS2, BIO en ISO 27001 is het essentieel dat Key Vault-implementaties aantoonbaar voldoen aan compliance-vereisten. Dit vereist documentatie, configuratie, monitoring en periodieke assessments. Soft-delete en purge protection zijn twee kritieke features voor compliance. Soft-delete zorgt ervoor dat verwijderde keys, secrets en certificates tijdelijk behouden blijven (standaard 90 dagen), waardoor zij kunnen worden hersteld in het geval van onbedoelde verwijdering of een security incident. Purge protection voorkomt dat keys, secrets en certificates permanent worden verwijderd, zelfs na de soft-delete periode. Dit beschermt tegen zowel onbedoelde verwijdering als kwaadwillige activiteiten. Voor Nederlandse overheidsorganisaties die gevoelige data verwerken is het inschakelen van soft-delete en purge protection essentieel, omdat dit dataverlies voorkomt en compliance vereisten ondersteunt. Audit logs moeten worden bewaard volgens BIO-vereisten (typisch 7 jaar voor kritieke logs). Azure Monitor en Log Analytics ondersteunen lange-termijn opslag van logs, waarbij logs kunnen worden gearchiveerd naar Azure Storage voor kostenefficiënte lange-termijn opslag. Daarnaast moeten audit logs worden beveiligd tegen wijziging en verwijdering, bijvoorbeeld door gebruik te maken van immutable storage of door logs te exporteren naar een extern systeem dat onder controle staat van de organisatie. Het PowerShell-script uit dit artikel kan worden gebruikt om te controleren of soft-delete en purge protection zijn ingeschakeld, of audit logs correct zijn geconfigureerd, en of compliance-vereisten worden nageleefd. Periodieke assessments zijn essentieel om te verifiëren dat Key Vault-implementaties blijven voldoen aan compliance-vereisten. Deze assessments moeten worden uitgevoerd door interne audit teams of externe auditors, en moeten controleren op configuratie, toegangsrechten, netwerkbeveiliging, monitoring, en documentatie. De uitkomsten van assessments moeten worden vastgelegd in auditrapporten, en bevindingen moeten worden opgevolgd met concrete verbeteracties. Door periodiek assessments uit te voeren en verbeteracties op te volgen, kunnen organisaties aantoonbaar laten zien dat zij compliant blijven met NIS2, BIO en ISO 27001.

Gebruik PowerShell-script key-vault-implementation.ps1 (functie Test-KeyVaultCompliance) – Controleert of Key Vaults voldoen aan compliance-vereisten zoals soft-delete, purge protection en audit logging.

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 Azure Key Vault Implementatie voor Nederlandse Overheidsorganisaties .DESCRIPTION Controleert en implementeert Azure Key Vault configuratie met focus op architectuur, toegangsbeheer, netwerkbeveiliging, integratie en compliance. Ondersteunt RBAC, private endpoints, managed identities en monitoring. .NOTES Filename: key-vault-implementation.ps1 Author: Nederlandse Baseline voor Veilige Cloud Version: 1.0 Related JSON: content/azure/security/key-vault-implementation.json #> #Requires -Version 5.1 #Requires -Modules Az.Accounts, Az.KeyVault, Az.Resources, Az.Network, Az.Storage, Az.Sql, Az.Compute [CmdletBinding()] param( [Parameter(HelpMessage = "Controleer toegangsbeheer en RBAC configuratie")] [switch]$AccessControl, [Parameter(HelpMessage = "Controleer netwerkbeveiliging en private endpoints")] [switch]$NetworkSecurity, [Parameter(HelpMessage = "Controleer integratie met Azure-services")] [switch]$Integration, [Parameter(HelpMessage = "Monitort Key Vault-operaties en genereert rapportages")] [switch]$Monitoring, [Parameter(HelpMessage = "Controleer compliance configuratie")] [switch]$Compliance, [Parameter(HelpMessage = "Voer alle controles uit")] [switch]$All ) $ErrorActionPreference = 'Stop' $PolicyName = "Azure Key Vault Implementatie" function Connect-RequiredServices { if (-not (Get-AzContext)) { Connect-AzAccount | Out-Null } } function Test-KeyVaultAccessControl { <# .SYNOPSIS Controleert of Key Vaults correct zijn geconfigureerd met Azure RBAC en managed identities #> [CmdletBinding()] param() $result = @{ TotalKeyVaults = 0 RBACEnabled = 0 AccessPolicyOnly = 0 UsingManagedIdentities = 0 ComplianceScore = 0 ResourceDetails = @() } try { $vaults = Get-AzKeyVault -ErrorAction SilentlyContinue $result.TotalKeyVaults = $vaults.Count foreach ($vault in $vaults) { $vaultDetail = Get-AzKeyVault -VaultName $vault.VaultName -ResourceGroupName $vault.ResourceGroupName -ErrorAction SilentlyContinue $vaultResult = @{ Name = $vault.VaultName ResourceGroup = $vault.ResourceGroupName RBACEnabled = $false HasAccessPolicies = $false ManagedIdentitiesCount = 0 ComplianceScore = 0 TotalChecks = 2 } if ($vaultDetail) { # Check if RBAC is enabled (preferred method) # Note: This is a simplified check - in practice, check for RBAC role assignments try { $rbacAssignments = Get-AzRoleAssignment -Scope $vaultDetail.ResourceId -ErrorAction SilentlyContinue if ($rbacAssignments) { $vaultResult.RBACEnabled = $true $vaultResult.ComplianceScore++ $result.RBACEnabled++ } } catch { Write-Verbose "Could not check RBAC for $($vault.VaultName): $_" } # Check for access policies (legacy method - should be minimal) try { $accessPolicies = $vaultDetail.AccessPolicies if ($accessPolicies -and $accessPolicies.Count -gt 0) { $vaultResult.HasAccessPolicies = $true if (-not $vaultResult.RBACEnabled) { $result.AccessPolicyOnly++ } } } catch { Write-Verbose "Could not check access policies for $($vault.VaultName): $_" } # Check for managed identity usage (simplified - check for managed identity in access) # In practice, this would check which principals access the Key Vault if ($vaultResult.RBACEnabled) { $vaultResult.ComplianceScore++ } $result.ResourceDetails += $vaultResult } } # Calculate overall compliance if ($result.TotalKeyVaults -gt 0) { $rbacPercentage = ($result.RBACEnabled / $result.TotalKeyVaults) * 100 if ($rbacPercentage -ge 80) { $result.ComplianceScore = 2 } elseif ($rbacPercentage -ge 50) { $result.ComplianceScore = 1 } } } catch { Write-Warning "Error checking Key Vault access control: $_" } return $result } function Test-KeyVaultNetworkSecurity { <# .SYNOPSIS Controleert of Key Vaults correct zijn geconfigureerd met private endpoints en firewall rules #> [CmdletBinding()] param() $result = @{ TotalKeyVaults = 0 PrivateEndpointsConfigured = 0 FirewallRulesConfigured = 0 PublicAccessAllowed = 0 ComplianceScore = 0 ResourceDetails = @() } try { $vaults = Get-AzKeyVault -ErrorAction SilentlyContinue $result.TotalKeyVaults = $vaults.Count foreach ($vault in $vaults) { $vaultDetail = Get-AzKeyVault -VaultName $vault.VaultName -ResourceGroupName $vault.ResourceGroupName -ErrorAction SilentlyContinue $vaultResult = @{ Name = $vault.VaultName ResourceGroup = $vault.ResourceGroupName PrivateEndpointConfigured = $false FirewallRulesConfigured = $false PublicAccessAllowed = $false ComplianceScore = 0 TotalChecks = 2 } if ($vaultDetail) { # Check for private endpoints try { $privateEndpoints = Get-AzPrivateEndpoint -ErrorAction SilentlyContinue | Where-Object { $_.PrivateLinkServiceConnections | Where-Object { $_.PrivateLinkServiceId -like "*$($vault.VaultName)*" } } if ($privateEndpoints -and $privateEndpoints.Count -gt 0) { $vaultResult.PrivateEndpointConfigured = $true $vaultResult.ComplianceScore++ $result.PrivateEndpointsConfigured++ } } catch { Write-Verbose "Could not check private endpoints for $($vault.VaultName): $_" } # Check network access rules try { $networkAcls = $vaultDetail.NetworkAcls if ($networkAcls) { if ($networkAcls.DefaultAction -eq 'Deny') { $vaultResult.FirewallRulesConfigured = $true $vaultResult.ComplianceScore++ $result.FirewallRulesConfigured++ } else { $vaultResult.PublicAccessAllowed = $true $result.PublicAccessAllowed++ } } else { $vaultResult.PublicAccessAllowed = $true $result.PublicAccessAllowed++ } } catch { Write-Verbose "Could not check network ACLs for $($vault.VaultName): $_" } $result.ResourceDetails += $vaultResult } } # Calculate overall compliance if ($result.TotalKeyVaults -gt 0) { $privateEndpointPercentage = ($result.PrivateEndpointsConfigured / $result.TotalKeyVaults) * 100 $firewallPercentage = ($result.FirewallRulesConfigured / $result.TotalKeyVaults) * 100 if ($privateEndpointPercentage -ge 80 -or $firewallPercentage -ge 80) { $result.ComplianceScore = 2 } elseif ($privateEndpointPercentage -ge 50 -or $firewallPercentage -ge 50) { $result.ComplianceScore = 1 } } } catch { Write-Warning "Error checking Key Vault network security: $_" } return $result } function Test-KeyVaultIntegration { <# .SYNOPSIS Controleert of Azure-services correct zijn geconfigureerd voor Key Vault-integratie met managed identities #> [CmdletBinding()] param() $result = @{ TotalServices = 0 UsingManagedIdentities = 0 UsingServicePrincipals = 0 KeyVaultReferences = 0 ComplianceScore = 0 ResourceDetails = @() } try { # Check App Services try { $appServices = Get-AzWebApp -ErrorAction SilentlyContinue foreach ($app in $appServices) { $appResult = @{ Name = $app.Name ResourceGroup = $app.ResourceGroupName Type = "App Service" ManagedIdentityEnabled = $false KeyVaultReference = $false ComplianceScore = 0 TotalChecks = 2 } # Check for managed identity $identity = $app.Identity if ($identity -and $identity.PrincipalId) { $appResult.ManagedIdentityEnabled = $true $appResult.ComplianceScore++ $result.UsingManagedIdentities++ } # Check for Key Vault references in app settings (simplified) $appSettings = $app.SiteConfig.AppSettings if ($appSettings) { $keyVaultRefs = $appSettings | Where-Object { $_.Value -like "*@Microsoft.KeyVault*" } if ($keyVaultRefs) { $appResult.KeyVaultReference = $true $appResult.ComplianceScore++ $result.KeyVaultReferences++ } } if ($appResult.ManagedIdentityEnabled -or $appResult.KeyVaultReference) { $result.TotalServices++ $result.ResourceDetails += $appResult } } } catch { Write-Verbose "Could not check App Services: $_" } # Check Storage Accounts with customer-managed keys try { $storageAccounts = Get-AzStorageAccount -ErrorAction SilentlyContinue foreach ($storage in $storageAccounts) { if ($storage.Encryption.KeySource -eq 'Microsoft.Keyvault') { $storageResult = @{ Name = $storage.StorageAccountName ResourceGroup = $storage.ResourceGroupName Type = "Storage Account" CustomerManagedKey = $true ComplianceScore = 1 TotalChecks = 1 } $result.TotalServices++ $result.ResourceDetails += $storageResult } } } catch { Write-Verbose "Could not check Storage Accounts: $_" } # Calculate overall compliance if ($result.TotalServices -gt 0) { $managedIdentityPercentage = ($result.UsingManagedIdentities / $result.TotalServices) * 100 if ($managedIdentityPercentage -ge 80) { $result.ComplianceScore = 2 } elseif ($managedIdentityPercentage -ge 50) { $result.ComplianceScore = 1 } } } catch { Write-Warning "Error checking Key Vault integration: $_" } return $result } function Invoke-KeyVaultMonitoring { <# .SYNOPSIS Monitort Key Vault-operaties en genereert compliance-rapportages #> [CmdletBinding()] param() $result = @{ TotalKeyVaults = 0 DiagnosticSettingsConfigured = 0 LogAnalyticsConnected = 0 MonitoringEnabled = 0 ComplianceScore = 0 ResourceDetails = @() } try { $vaults = Get-AzKeyVault -ErrorAction SilentlyContinue $result.TotalKeyVaults = $vaults.Count foreach ($vault in $vaults) { $vaultResult = @{ Name = $vault.VaultName ResourceGroup = $vault.ResourceGroupName DiagnosticSettingsConfigured = $false LogAnalyticsConnected = $false ComplianceScore = 0 TotalChecks = 2 } try { # Check for diagnostic settings $diagnosticSettings = Get-AzDiagnosticSetting -ResourceId $vault.ResourceId -ErrorAction SilentlyContinue if ($diagnosticSettings) { $vaultResult.DiagnosticSettingsConfigured = $true $vaultResult.ComplianceScore++ $result.DiagnosticSettingsConfigured++ # Check if Log Analytics is configured if ($diagnosticSettings.WorkspaceId) { $vaultResult.LogAnalyticsConnected = $true $vaultResult.ComplianceScore++ $result.LogAnalyticsConnected++ } } if ($vaultResult.DiagnosticSettingsConfigured) { $result.MonitoringEnabled++ } } catch { Write-Verbose "Could not check monitoring for $($vault.VaultName): $_" } $result.ResourceDetails += $vaultResult } # Calculate overall compliance if ($result.TotalKeyVaults -gt 0) { $monitoringPercentage = ($result.MonitoringEnabled / $result.TotalKeyVaults) * 100 if ($monitoringPercentage -ge 80) { $result.ComplianceScore = 2 } elseif ($monitoringPercentage -ge 50) { $result.ComplianceScore = 1 } } } catch { Write-Warning "Error checking Key Vault monitoring: $_" } return $result } function Test-KeyVaultCompliance { <# .SYNOPSIS Controleert of Key Vaults voldoen aan compliance-vereisten zoals soft-delete, purge protection en audit logging #> [CmdletBinding()] param() $result = @{ TotalKeyVaults = 0 SoftDeleteEnabled = 0 PurgeProtectionEnabled = 0 ComplianceScore = 0 ResourceDetails = @() } try { $vaults = Get-AzKeyVault -ErrorAction SilentlyContinue $result.TotalKeyVaults = $vaults.Count foreach ($vault in $vaults) { $vaultDetail = Get-AzKeyVault -VaultName $vault.VaultName -ResourceGroupName $vault.ResourceGroupName -ErrorAction SilentlyContinue $vaultResult = @{ Name = $vault.VaultName ResourceGroup = $vault.ResourceGroupName SoftDeleteEnabled = $false PurgeProtectionEnabled = $false ComplianceScore = 0 TotalChecks = 2 } if ($vaultDetail) { # Check soft-delete (enabled by default in newer Key Vaults) try { if ($vaultDetail.EnableSoftDelete) { $vaultResult.SoftDeleteEnabled = $true $vaultResult.ComplianceScore++ $result.SoftDeleteEnabled++ } } catch { # Soft-delete is often enabled by default, so check may not be necessary $vaultResult.SoftDeleteEnabled = $true $vaultResult.ComplianceScore++ $result.SoftDeleteEnabled++ } # Check purge protection try { if ($vaultDetail.EnablePurgeProtection) { $vaultResult.PurgeProtectionEnabled = $true $vaultResult.ComplianceScore++ $result.PurgeProtectionEnabled++ } } catch { Write-Verbose "Could not check purge protection for $($vault.VaultName): $_" } $result.ResourceDetails += $vaultResult } } # Calculate overall compliance if ($result.TotalKeyVaults -gt 0) { $softDeletePercentage = ($result.SoftDeleteEnabled / $result.TotalKeyVaults) * 100 $purgeProtectionPercentage = ($result.PurgeProtectionEnabled / $result.TotalKeyVaults) * 100 if ($softDeletePercentage -ge 80 -and $purgeProtectionPercentage -ge 80) { $result.ComplianceScore = 2 } elseif ($softDeletePercentage -ge 50 -and $purgeProtectionPercentage -ge 50) { $result.ComplianceScore = 1 } } } catch { Write-Warning "Error checking Key Vault compliance: $_" } return $result } function Show-Results { param( [Parameter(Mandatory=$true)] [hashtable]$Result, [Parameter(Mandatory=$true)] [string]$Title ) Write-Host "`n========================================" -ForegroundColor Cyan Write-Host "$Title" -ForegroundColor Cyan Write-Host "========================================" -ForegroundColor Cyan if ($Result.TotalKeyVaults -gt 0 -or $Result.TotalServices -gt 0) { Write-Host "`nTotaal: $($Result.TotalKeyVaults + $Result.TotalServices)" -ForegroundColor White if ($Result.ResourceDetails.Count -gt 0) { Write-Host "`nGedetailleerde Resultaten:" -ForegroundColor Cyan foreach ($resource in $Result.ResourceDetails) { $compliancePercentage = if ($resource.TotalChecks -gt 0) { [math]::Round(($resource.ComplianceScore / $resource.TotalChecks) * 100, 2) } else { 0 } $statusColor = if ($compliancePercentage -eq 100) { 'Green' } elseif ($compliancePercentage -ge 50) { 'Yellow' } else { 'Red' } Write-Host "`n Resource: $($resource.Name) ($($resource.ResourceGroup))" -ForegroundColor White Write-Host " Compliance: $compliancePercentage%" -ForegroundColor $statusColor if ($resource.PSObject.Properties.Name -contains 'RBACEnabled') { Write-Host " RBAC Ingeschakeld: $(if ($resource.RBACEnabled) { 'Ja' } else { 'Nee' })" -ForegroundColor $(if ($resource.RBACEnabled) { 'Green' } else { 'Yellow' }) } if ($resource.PSObject.Properties.Name -contains 'PrivateEndpointConfigured') { Write-Host " Private Endpoint: $(if ($resource.PrivateEndpointConfigured) { 'Ja' } else { 'Nee' })" -ForegroundColor $(if ($resource.PrivateEndpointConfigured) { 'Green' } else { 'Yellow' }) } if ($resource.PSObject.Properties.Name -contains 'SoftDeleteEnabled') { Write-Host " Soft Delete: $(if ($resource.SoftDeleteEnabled) { 'Ja' } else { 'Nee' })" -ForegroundColor $(if ($resource.SoftDeleteEnabled) { 'Green' } else { 'Red' }) } } } } else { Write-Host "Geen resources gevonden om te controleren." -ForegroundColor Yellow } } try { Connect-RequiredServices Write-Host "`n========================================" -ForegroundColor Cyan Write-Host "$PolicyName" -ForegroundColor Cyan Write-Host "Nederlandse Baseline voor Veilige Cloud" -ForegroundColor Cyan Write-Host "========================================" -ForegroundColor Cyan if ($All -or $AccessControl) { $accessResult = Test-KeyVaultAccessControl Show-Results -Result $accessResult -Title "Toegangsbeheer en RBAC" } if ($All -or $NetworkSecurity) { $networkResult = Test-KeyVaultNetworkSecurity Show-Results -Result $networkResult -Title "Netwerkbeveiliging" } if ($All -or $Integration) { $integrationResult = Test-KeyVaultIntegration Show-Results -Result $integrationResult -Title "Integratie met Services" } if ($All -or $Monitoring) { $monitoringResult = Invoke-KeyVaultMonitoring Show-Results -Result $monitoringResult -Title "Monitoring en Logging" } if ($All -or $Compliance) { $complianceResult = Test-KeyVaultCompliance Show-Results -Result $complianceResult -Title "Compliance Configuratie" } if (-not $All -and -not $AccessControl -and -not $NetworkSecurity -and -not $Integration -and -not $Monitoring -and -not $Compliance) { Write-Host "`nGeen specifieke controle opgegeven. Gebruik een van de volgende opties:" -ForegroundColor Yellow Write-Host " -AccessControl Controleer toegangsbeheer en RBAC configuratie" -ForegroundColor Yellow Write-Host " -NetworkSecurity Controleer netwerkbeveiliging en private endpoints" -ForegroundColor Yellow Write-Host " -Integration Controleer integratie met Azure-services" -ForegroundColor Yellow Write-Host " -Monitoring Monitor Key Vault-operaties en genereert rapportages" -ForegroundColor Yellow Write-Host " -Compliance Controleer compliance configuratie" -ForegroundColor Yellow Write-Host " -All Voer alle controles uit" -ForegroundColor Yellow } } catch { Write-Error "Fout in key-vault-implementation.ps1: $_" exit 1 } finally { Write-Host "`n========================================" -ForegroundColor Cyan }

Risico zonder implementatie

Risico zonder implementatie
High: Kritiek - Zonder gecentraliseerd key management systeem verspreiden organisaties cryptografische sleutels en geheimen over verschillende locaties, wat aanzienlijke beveiligingsrisico's creëert en kan leiden tot compromittering van data, authenticatie en integriteit, met als gevolg verlies van vertrouwen, sancties en reputatieschade.

Management Samenvatting

Implementeer Azure Key Vault met zes pijlers: architectuur en naming, toegangsbeheer en RBAC, netwerkbeveiliging, integratie met services, monitoring en logging, en compliance en audit. Essentieel voor NIS2 en BIO compliance. Implementatie: 280 uur.