Kritieke Infrastructuur In Azure: Overzicht, Beveiliging En Bescherming Voor Nederlandse Overheidsorganisaties

💼 Management Samenvatting

Kritieke infrastructuur in Azure vormt het fundament van essentiële digitale dienstverlening voor Nederlandse overheidsorganisaties. Dit index-artikel beschrijft hoe organisaties kritieke Azure-resources kunnen identificeren, classificeren en beschermen tegen onbedoelde wijzigingen, cyberaanvallen en operationele fouten, in lijn met de eisen van de Baseline Informatiebeveiliging Overheid (BIO), de NIS2 richtlijn en andere relevante wet- en regelgeving.

Aanbeveling
IMPLEMENT
Risico zonder
Critical
Risk Score
10/10
Implementatie
220u (tech: 120u)
Van toepassing op:
Azure Tenant
Azure Subscriptions
Mission-Critical Workloads

Nederlandse overheidsorganisaties die essentiële diensten in Azure hosten, worden geconfronteerd met toenemende cyberdreigingen, operationele risico's en compliance-vereisten die specifieke aandacht vereisen voor kritieke infrastructuurcomponenten. Zonder een gestructureerde aanpak voor het identificeren en beschermen van kritieke resources ontstaat het risico dat essentiële systemen – zoals productiedatabases, identiteitsinfrastructuur, netwerkcomponenten en logging-systemen – kwetsbaar zijn voor onbedoelde verwijdering, configuratiefouten, insider threats of externe aanvallen. Dit kan leiden tot langdurige uitval van essentiële diensten, permanent gegevensverlies, schending van wettelijke verplichtingen zoals de NIS2 richtlijn, en aanzienlijke reputatieschade. Een doordachte strategie voor kritieke infrastructuur zorgt ervoor dat organisaties hun meest waardevolle en essentiële resources kunnen beschermen met gelaagde beveiligingsmaatregelen die zijn afgestemd op de kritiekheid en impact van elk component.

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

Implementatie

Dit index-artikel fungeert als centrale verzamelplaats voor alle aspecten van kritieke infrastructuurbeveiliging binnen de Azure-domein van de 'Nederlandse Baseline voor Veilige Cloud'. We behandelen de belangrijkste principes voor het identificeren en classificeren van kritieke resources, beschrijven hoe deze worden beschermd met Resource Locks, Azure Policy, netwerksegmentatie, toegangscontrole en monitoring, en laten zien hoe organisaties een volwassen beveiligingsraamwerk kunnen opzetten. Het artikel verbindt specifieke beveiligingsartikelen zoals Resource Locks op mission-critical resources, netwerkbeveiliging, Key Vault bescherming, logging-infrastructuur en disaster recovery, en biedt handvatten voor governance, risicomanagement en compliance. Daarnaast beschrijft het artikel hoe kritieke infrastructuur wordt gemonitord, geaudit en continu verbeterd binnen een Azure-omgeving.

Het landschap van kritieke infrastructuur in Azure

Kritieke infrastructuur in Azure omvat alle resources die essentieel zijn voor de continuïteit van bedrijfsprocessen en waarvan uitval directe en aanzienlijke impact heeft op de organisatie, burgers of de samenleving. Deze resources worden gekenmerkt door een Recovery Time Objective (RTO) van minder dan vier uur, een hoge bedrijfskritiek, en vaak door wettelijke verplichtingen zoals de NIS2 richtlijn die specifieke eisen stelt aan de beveiliging van essentiële en belangrijke entiteiten. Voor Nederlandse overheidsorganisaties omvat kritieke infrastructuur typisch productiedatabases die essentiële klantgegevens bevatten, identiteitsinfrastructuur zoals Azure AD Connect servers die federatie verzorgen, kernnetwerkcomponenten zoals Hub Virtual Networks die de ruggengraat vormen van de netwerkinfrastructuur, Key Vaults met productieversleutelingssleutels, Log Analytics Workspaces met essentiële beveiligingsgegevens, en Backup vaults die hersteldata bevatten. Daarnaast kunnen specifieke workloads zoals zaaksystemen, burgerportalen of zorgketenintegraties als kritiek worden geclassificeerd wanneer zij directe impact hebben op de dienstverlening aan burgers.

Het identificeren en classificeren van kritieke infrastructuur begint met een grondige Business Impact Analyse (BIA) waarin per resource of workload wordt vastgesteld wat de gevolgen zijn van uitval, wat de wettelijke verplichtingen zijn, en welk niveau van beschikbaarheid en beveiliging benodigd is. Resources worden doorgaans geclassificeerd in drie categorieën: mission-critical (RTO minder dan één uur, directe impact op bedrijfscontinuïteit), kritiek (RTO tussen één en vier uur, aanzienlijke impact), en belangrijk (RTO tussen vier en vierentwintig uur, beperkte impact). Deze classificatie vormt de basis voor het toepassen van gelaagde beveiligingsmaatregelen: mission-critical resources krijgen de hoogste bescherming met ReadOnly Resource Locks die alle wijzigingen voorkomen, kritieke resources krijgen CanNotDelete locks die verwijdering voorkomen maar wijzigingen toestaan, en belangrijke resources krijgen standaard beveiligingsmaatregelen via Azure Policy en netwerksegmentatie. Door deze gelaagde aanpak expliciet te maken en te documenteren, ontstaat transparantie over welke resources welke bescherming genieten en waarom, wat essentieel is voor audits, compliance-verificatie en bestuurlijke verantwoording.

Een belangrijk aspect van kritieke infrastructuurbeveiliging is dat beveiligingsmaatregelen niet alleen technisch correct moeten zijn, maar ook aantoonbaar moeten voldoen aan wettelijke en bestuurlijke vereisten. De NIS2 richtlijn vereist bijvoorbeeld dat essentiële en belangrijke entiteiten passende technische en organisatorische maatregelen treffen om de beveiliging van netwerk- en informatiesystemen te waarborgen, inclusief risicobeheer, incident response en supply chain security. De BIO legt eisen op rond informatiebeveiliging, risicomanagement en beveiligingsmaatregelen. ISO 27001 biedt een internationaal erkend framework voor informatiebeveiligingsmanagement. Deze compliance-vereisten moeten expliciet worden vertaald naar concrete Azure-configuraties en beveiligingsmaatregelen: welke Resource Locks zijn toegepast, hoe is toegang gecontroleerd, hoe wordt netwerksegmentatie geïmplementeerd, en hoe wordt monitoring en incident response georganiseerd. Door compliance expliciet te koppelen aan technische implementaties ontstaat een aantoonbaar beveiligingsraamwerk dat voldoet aan alle relevante kaders.

Beveiligingsraamwerk: gelaagde bescherming voor kritieke infrastructuur

Het beveiligen van kritieke infrastructuur in Azure vereist een gelaagde aanpak waarbij meerdere beveiligingsmaatregelen samenwerken om maximale bescherming te bieden tegen verschillende bedreigingsscenario's. De eerste laag bestaat uit Resource Locks die voorkomen dat kritieke resources per ongeluk of onbevoegd worden verwijderd of gewijzigd. Mission-critical resources krijgen ReadOnly locks die alle wijzigingen blokkeren, inclusief verwijdering en configuratiewijzigingen, terwijl kritieke resources CanNotDelete locks krijgen die verwijdering voorkomen maar normale wijzigingsoperaties toestaan. Deze locks vormen een cruciale beveiligingslaag omdat zij werken ongeacht de privileges van de gebruiker: zelfs accounts met Contributor-rechten kunnen geen resources verwijderen of wijzigen wanneer een lock actief is, tenzij de lock eerst expliciet wordt verwijderd met Owner-rechten. Dit voorkomt niet alleen onbedoelde fouten, maar ook aanvallen waarbij gecompromitteerde accounts worden gebruikt om kritieke resources te beschadigen of te verwijderen.

De tweede laag bestaat uit netwerksegmentatie en toegangscontrole die ervoor zorgen dat kritieke resources alleen toegankelijk zijn via gecontroleerde paden en voor geautoriseerde gebruikers. Hub-spoke netwerkarchitecturen isoleren kritieke workloads in gescheiden Virtual Networks, Network Security Groups (NSGs) en Application Security Groups (ASGs) beperken netwerkverkeer tot alleen geautoriseerde bronnen en bestemmingen, en Private Endpoints zorgen ervoor dat PaaS-services zoals Azure SQL, Storage Accounts en Key Vaults alleen toegankelijk zijn via privé IP-adressen binnen het Virtual Network. Azure Bastion biedt veilige RDP- en SSH-toegang zonder publieke IP-adressen op virtuele machines, wat het aanvalsoppervlak aanzienlijk verkleint. Role-Based Access Control (RBAC) en Privileged Identity Management (PIM) zorgen ervoor dat alleen geautoriseerde gebruikers toegang hebben tot kritieke resources, met just-in-time toegang en multi-factor authentication voor beheerderstaken. Deze netwerk- en toegangscontroles werken samen om laterale beweging te voorkomen en ervoor te zorgen dat zelfs wanneer een account wordt gecompromitteerd, de schade beperkt blijft tot niet-kritieke resources.

De derde laag bestaat uit monitoring, detectie en incident response die ervoor zorgen dat bedreigingen en afwijkingen snel worden geïdentificeerd en aangepakt. Microsoft Defender for Cloud biedt continue security assessments, threat detection en secure score monitoring voor kritieke resources. Azure Monitor en Log Analytics Workspaces verzamelen uitgebreide logginggegevens over toegang, configuratiewijzigingen en netwerkverkeer, wat essentieel is voor forensisch onderzoek en compliance-verificatie. Azure Policy en Policy Insights controleren automatisch of resources voldoen aan beveiligingsstandaarden en signaleren afwijkingen. Geautomatiseerde alerts en playbooks zorgen ervoor dat security teams snel worden gewaarschuwd wanneer verdachte activiteiten worden gedetecteerd, zoals ongebruikelijke toegangspogingen, configuratiewijzigingen aan kritieke resources, of netwerkverkeer dat afwijkt van normale patronen. Door deze monitoring- en detectielaag te combineren met snelle incident response procedures ontstaat een proactieve beveiligingspostuur die bedreigingen kan identificeren en neutraliseren voordat zij kritieke impact hebben.

De vierde laag bestaat uit backup, disaster recovery en business continuity maatregelen die ervoor zorgen dat kritieke resources snel kunnen worden hersteld na een incident. Azure Backup biedt geautomatiseerde back-ups met configurable retention policies, immutabele backup storage voorkomt dat back-ups worden gewijzigd of verwijderd door aanvallers, en geo-redundante opslag zorgt ervoor dat back-ups beschikbaar zijn in meerdere Azure-regio's. Azure Site Recovery biedt replicatie en failover-capaciteiten voor virtuele machines en workloads, waardoor organisaties snel kunnen overschakelen naar secundaire omgevingen bij regionale calamiteiten. Multi-region architecturen met Azure Traffic Manager of Front Door zorgen voor automatische failover en load balancing, wat de beschikbaarheid van kritieke diensten waarborgt. Door deze recovery- en continuïteitsmaatregelen expliciet te koppelen aan RTO- en RPO-doelstellingen ontstaat een aantoonbaar herstelraamwerk dat voldoet aan business continuity en compliance-vereisten.

Implementatieroadmap: van inventarisatie naar volwassen beveiliging

De implementatie van een volwassen beveiligingsraamwerk voor kritieke infrastructuur in Azure begint met een grondige inventarisatie en classificatie van alle resources binnen de Azure-omgeving. Dit proces begint bij het identificeren van alle resources – virtuele machines, databases, netwerkcomponenten, Key Vaults, Storage Accounts, Log Analytics Workspaces en andere Azure-services – en het beoordelen van hun bedrijfskritiek op basis van Business Impact Analyse (BIA) criteria. Voor elke resource wordt vastgesteld wat de gevolgen zijn van uitval, wat de wettelijke verplichtingen zijn, en welk niveau van beschikbaarheid en beveiliging benodigd is. Deze classificatie wordt vastgelegd in een centrale inventarisatie die wordt bijgehouden in Azure Resource Graph, Azure Policy compliance-dashboards, of externe Configuration Management Databases (CMDBs). Belangrijk is dat deze inventarisatie regelmatig wordt bijgewerkt wanneer nieuwe resources worden toegevoegd of wanneer de kritiekheid van bestaande resources verandert, bijvoorbeeld wanneer een testomgeving wordt gepromoveerd naar productie.

Vervolgens worden per resourcecategorie de passende beveiligingsmaatregelen geïmplementeerd volgens de gelaagde beveiligingsstrategie. Mission-critical resources krijgen ReadOnly Resource Locks toegepast die alle wijzigingen voorkomen, kritieke resources krijgen CanNotDelete locks die verwijdering voorkomen maar wijzigingen toestaan, en belangrijke resources krijgen standaard beveiligingsmaatregelen via Azure Policy. Netwerksegmentatie wordt geïmplementeerd met hub-spoke architecturen, NSGs en Private Endpoints, toegangscontrole wordt geconfigureerd met RBAC en PIM, en monitoring wordt ingericht met Microsoft Defender for Cloud, Azure Monitor en Log Analytics. Backup- en disaster recovery strategieën worden geïmplementeerd met Azure Backup, Azure Site Recovery en multi-region architecturen. Belangrijk is dat deze implementatie niet ad-hoc gebeurt, maar volgens een gestructureerd plan met duidelijke prioriteiten, eigenaren en deadlines. Voor grote omgevingen kan dit proces worden geautomatiseerd met PowerShell-scripts, Azure Resource Manager templates of Infrastructure as Code (IaC) tools zoals Bicep of Terraform, wat de implementatie versnelt en het risico van menselijke fouten vermindert.

In de volwassenheidsfase wordt het beveiligingsraamwerk geoptimaliseerd en geautomatiseerd met geavanceerde monitoring, behavioral analytics en machine learning-gebaseerde detectie. Geautomatiseerde compliance-controles en security assessments worden regelmatig uitgevoerd om te verifiëren dat alle kritieke resources correct zijn beveiligd en dat beveiligingsstandaarden worden nageleefd. Governance wordt volwassen met geautomatiseerde rapportages, dashboards voor bestuurders en geïntegreerde change management processen die ervoor zorgen dat wijzigingen aan kritieke resources alleen worden doorgevoerd na expliciete goedkeuring en documentatie. Incident response procedures worden getest en verfijnd, en security teams worden getraind in het identificeren en neutraliseren van bedreigingen aan kritieke infrastructuur. Door deze fasering expliciet te maken in een roadmap – met duidelijke mijlpalen, beslismomenten en success criteria – ontstaat voorspelbaarheid voor bestuurders en wordt het eenvoudiger om investeringen, risico's en baten te verantwoorden.

Governance, compliance en relatie met andere artikelen

Governance rond kritieke infrastructuur in Azure raakt meerdere disciplines: enterprise architectuur, informatiebeveiliging, cloud governance, compliance, risicomanagement en business continuity. Zonder een helder governance-model ontstaat het risico dat beveiligingskeuzes versnipperd worden gemaakt, dat verschillende teams verschillende standaarden hanteren, en dat niemand zich eigenaar voelt van de integrale beveiligingsstrategie voor kritieke infrastructuur. Een effectief governance-model benoemt daarom ten minste een enterprise architect die verantwoordelijk is voor de overkoepelende architectuurvisie, een cloud architect die de technische Azure-architectuur beheert, een security architect die beveiligingsaspecten waarborgt, en expliciete rollen voor CISO, compliance officer en risk manager. Deze rollen worden vertaald naar concrete taken: wie keurt nieuwe kritieke resources goed, wie beoordeelt afwijkingen van beveiligingsstandaarden, wie beheert de resource-inventarisatie, en wie beslist over het uitfaseren van verouderde componenten.

Op compliancegebied vormt kritieke infrastructuurbeveiliging een kruispunt van verschillende wettelijke kaders. De NIS2 richtlijn vereist dat essentiële en belangrijke entiteiten passende technische en organisatorische maatregelen treffen om de beveiliging van netwerk- en informatiesystemen te waarborgen, inclusief risicobeheer, incident response en supply chain security. De BIO en ISO 27001 leggen eisen op rond informatiebeveiliging, risicomanagement en beveiligingsmaatregelen. De AVG vereist dat persoonsgegevens adequaat worden beveiligd en dat organisaties kunnen aantonen welke technische en organisatorische maatregelen zijn genomen. Deze compliance-vereisten moeten expliciet worden vertaald naar beveiligingskeuzes: welke Resource Locks zijn toegepast, hoe is toegang gecontroleerd, hoe wordt netwerksegmentatie geïmplementeerd, en hoe wordt monitoring en incident response georganiseerd. Dit index-artikel moet daarom expliciet worden gelezen in samenhang met andere artikelen binnen de 'Nederlandse Baseline voor Veilige Cloud', zoals de artikelen over Resource Locks op mission-critical resources, netwerkbeveiliging, Key Vault bescherming, logging-infrastructuur en disaster recovery. Samen vormen zij een consistent raamwerk: dit artikel schetst de overkoepelende lijnen, terwijl de deelartikelen verdieping bieden op specifieke beveiligingspatronen en technische implementaties.

Voor auditors en toezichthouders is vooral van belang dat de samenhang tussen beleid, architectuur, implementatie en operationele controles aantoonbaar is. Dat betekent dat u niet alleen architectuurdiagrammen en procesbeschrijvingen beschikbaar heeft, maar ook concreet kunt laten zien welke resources als kritiek zijn geclassificeerd, welke beveiligingsmaatregelen zijn toegepast, hoe vaak security assessments worden uitgevoerd en welke verbeteracties zijn ondernomen. De in dit domein beschreven PowerShell-scripts – waaronder het index-script bij dit artikel en de scripts voor specifieke beveiligingscomponenten – helpen om deze informatie snel en reproduceerbaar te verzamelen. Door hun output te koppelen aan dashboards en rapportages wordt governance niet beperkt tot papieren documenten, maar ondersteund door actuele operationele data die aantoonbaar maakt dat het beveiligingsraamwerk daadwerkelijk wordt nageleefd, gemonitord en verbeterd. Dit vormt de basis voor vertrouwen bij toezichthouders en het bestuur, en helpt om kritieke infrastructuurbeveiliging te positioneren als een proactieve, waarde-toevoegende activiteit in plaats van een reactieve, lastige verplichting.

Monitoring van kritieke infrastructuurbeveiliging

Gebruik PowerShell-script index.ps1 (functie Invoke-Monitoring) – Geeft een overzicht van de beveiligingsstatus van kritieke Azure-resources, inclusief Resource Locks, netwerksegmentatie, toegangscontrole en monitoring-configuraties..

Monitoring van kritieke infrastructuurbeveiliging in Azure gaat verder dan het bewaken van individuele resources. Bestuurders, enterprise architects en security teams hebben behoefte aan een samenvattend beeld: welke resources zijn als kritiek geclassificeerd, welke beveiligingsmaatregelen zijn toegepast, zijn er afwijkingen van beveiligingsstandaarden, en zijn er signalen dat de beveiligingsstrategie niet meer voldoet aan compliance-vereisten. Het index-script bij dit artikel inventariseert de belangrijkste beveiligingscomponenten voor kritieke infrastructuur en vertaalt die naar een compacte managementsamenvatting: hoeveel mission-critical resources hebben ReadOnly locks, hoeveel kritieke resources hebben CanNotDelete locks, welke resources zijn beschermd met netwerksegmentatie en Private Endpoints, en voor welke onderdelen aanvullende acties nodig zijn. Dit vormt een startpunt voor diepgaandere analyses met gespecialiseerde scripts voor specifieke beveiligingscomponenten, en helpt om het gesprek met bestuur en auditcommissies te structureren rond feitelijke cijfers en meetbare beveiligingsvolwassenheid.

Effectieve monitoring van kritieke infrastructuur omvat zowel technische als governance-aspecten. Technisch gezien moet worden gemonitord of resources correct zijn geconfigureerd volgens de beveiligingsstandaarden, of Resource Locks actief zijn en correct functioneren, of netwerksegmentatie en toegangscontrole correct zijn geïmplementeerd, en of er afwijkingen zijn die kunnen wijzen op security risico's of compliance-problemen. Governance-monitoring richt zich op de vraag of beveiligingsprincipes worden nageleefd, of resource-inventarisatie actueel is, of change management processen correct worden gevolgd, en of er regelmatige reviews plaatsvinden om de beveiligingsstrategie te evalueren en te verbeteren. Microsoft Defender for Cloud biedt continue security assessments en secure score monitoring, Azure Policy en Policy Insights controleren automatisch of resources voldoen aan beveiligingsstandaarden, en Azure Monitor en Log Analytics verzamelen uitgebreide logginggegevens over toegang, configuratiewijzigingen en netwerkverkeer. Door beide aspecten te combineren ontstaat een compleet beeld van de beveiligingsvolwassenheid en kunnen gerichte verbeteracties worden ondernomen om de strategie verder te professionaliseren.

Remediatie en volwassenwording van kritieke infrastructuurbeveiliging

Gebruik PowerShell-script index.ps1 (functie Invoke-Remediation) – Genereert overzichten van beveiligingshiaten voor kritieke infrastructuur en biedt handvatten voor gerichte verbeteracties om de beveiligingsvolwassenheid te verhogen..

Remediatie binnen het Azure kritieke infrastructuurbeveiligingsdomein betekent in de praktijk dat u gaten dicht tussen de gewenste beveiligingsstatus en de werkelijkheid. In veel organisaties bestaan al wel beleidsdocumenten over cloudgebruik, informatiebeveiliging en beveiligingsprincipes, maar ontbreekt concrete vastlegging van hoe deze worden vertaald naar Azure-configuraties, welke resources daadwerkelijk als kritiek zijn geclassificeerd, en welke beveiligingsmaatregelen zijn toegepast. Het index-script ondersteunt remediatie door automatisch te inventariseren waar beveiligingsstandaarden niet worden nageleefd, waar Resource Locks ontbreken op kritieke resources, waar netwerksegmentatie of toegangscontrole niet correct zijn geïmplementeerd, en waar documentatie verouderd of incompleet is. Op basis van deze inventarisatie kunnen gerichte verbeteracties worden gepland en uitgevoerd, waarbij prioriteit wordt gegeven aan de meest kritieke hiaten die de grootste impact hebben op beveiliging en compliance.

Een volwassen beveiligingsraamwerk voor kritieke infrastructuur in Azure groeit stap voor stap door continue verbetering. Na elke monitoringsronde worden de belangrijkste verbeterpunten vastgelegd, van een eigenaar voorzien en ingepland in het reguliere change- of verbeterportfolio. Denk aan het implementeren van ontbrekende Resource Locks op kritieke resources, het verbeteren van netwerksegmentatie en toegangscontrole, het actualiseren van resource-inventarisatie, het invoeren van geautomatiseerde compliance-controles, of het verbeteren van monitoring en incident response procedures. Door de resultaten van het index-script te combineren met de uitkomsten van gespecialiseerde scripts voor specifieke beveiligingscomponenten ontstaat een integraal beeld van de voortgang. Uiteindelijk wordt kritieke infrastructuurbeveiliging in Azure zo niet alleen een set van technische configuraties en processen, maar een aantoonbaar beheerst en verantwoord ingericht raamwerk dat continu wordt geëvalueerd en verbeterd om te blijven voldoen aan veranderende eisen, dreigingen en regelgeving.

Compliance & Frameworks

Automation

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

PowerShell
<# .SYNOPSIS Overzichtsmonitoring en remediatie voor Azure Kritieke Infrastructuur Beveiliging .DESCRIPTION Geeft een samenvattend beeld van de beveiligingsstatus van kritieke Azure-resources, inclusief Resource Locks, netwerksegmentatie, toegangscontrole en monitoring-configuraties. Ondersteunt het gericht identificeren en dichten van beveiligingshiaten voor kritieke infrastructuur. .NOTES Filename: index.ps1 Author: Nederlandse Baseline voor Veilige Cloud Created: 2025-01-27 Last Modified: 2025-01-27 Version: 1.0 Related JSON: content/azure/critical-infrastructure/index.json .LINK https://github.com/[org]/m365-tenant-best-practise .EXAMPLE .\index.ps1 -Monitoring Toont een samenvattend overzicht van Azure kritieke infrastructuur beveiligingsstatus en belangrijke indicatoren. .EXAMPLE .\index.ps1 -Remediation Genereert een overzicht van beveiligingshiaten en biedt handvatten voor verbeteracties. #> #Requires -Version 5.1 #Requires -Modules Az.Accounts, Az.Resources, Az.PolicyInsights, Az.Security, Az.Network, Az.KeyVault [CmdletBinding()] param( [Parameter(HelpMessage = "Voer een samenvattende monitoring uit van de Azure kritieke infrastructuur beveiligingsstatus.")] [switch]$Monitoring, [Parameter(HelpMessage = "Genereer remediatie-overzichten en handvatten voor beveiligingsverbeteringen.")] [switch]$Remediation, [Parameter(HelpMessage = "Toon welke acties zouden worden uitgevoerd zonder daadwerkelijk te wijzigen.")] [switch]$WhatIf ) $ErrorActionPreference = 'Stop' $VerbosePreference = 'Continue' function Get-RepositoryRoot { <# .SYNOPSIS Bepaalt de rootmap van de repository op basis van de locatie van dit script. .OUTPUTS String met pad naar repository-root. #> [CmdletBinding()] param() $root = Resolve-Path (Join-Path $PSScriptRoot "..\..\..") -ErrorAction SilentlyContinue if (-not $root) { throw "Kon de repository-root niet bepalen op basis van PSScriptRoot: $PSScriptRoot" } return $root.Path } function Get-CriticalInfrastructureInventory { <# .SYNOPSIS Stelt een overzicht op van Azure kritieke infrastructuur-gerelateerde JSON- en PS1-bestanden. .OUTPUTS PSCustomObject met aantallen en details. #> [CmdletBinding()] param() $repoRoot = Get-RepositoryRoot $contentRoot = Join-Path $repoRoot "content\azure\critical-infrastructure" $codeRoot = Join-Path $repoRoot "code\azure\critical-infrastructure" $jsonFiles = @() if (Test-Path -Path $contentRoot) { $jsonFiles = Get-ChildItem -Path $contentRoot -Filter "*.json" -File -ErrorAction SilentlyContinue } $ps1Files = @() if (Test-Path -Path $codeRoot) { $ps1Files = Get-ChildItem -Path $codeRoot -Filter "*.ps1" -File -ErrorAction SilentlyContinue } $byName = @{} foreach ($json in $jsonFiles) { $base = [System.IO.Path]::GetFileNameWithoutExtension($json.Name) if (-not $byName.ContainsKey($base)) { $byName[$base] = [pscustomobject]@{ Name = $base JsonPath = $null JsonUpdated = $null ScriptPath = $null ScriptUpdated= $null } } $entry = $byName[$base] $entry.JsonPath = $json.FullName $entry.JsonUpdated = $json.LastWriteTime $byName[$base] = $entry } foreach ($ps1 in $ps1Files) { $base = [System.IO.Path]::GetFileNameWithoutExtension($ps1.Name) if (-not $byName.ContainsKey($base)) { $byName[$base] = [pscustomobject]@{ Name = $base JsonPath = $null JsonUpdated = $null ScriptPath = $null ScriptUpdated= $null } } $entry = $byName[$base] $entry.ScriptPath = $ps1.FullName $entry.ScriptUpdated = $ps1.LastWriteTime $byName[$base] = $entry } $items = $byName.Values | Sort-Object Name $missingJson = $items | Where-Object { -not $_.JsonPath } $missingScript = $items | Where-Object { -not $_.ScriptPath } return [pscustomobject]@{ RepositoryRoot = $repoRoot Items = $items MissingJson = $missingJson MissingScripts = $missingScript TotalControls = $items.Count WithJsonAndPs1 = ($items | Where-Object { $_.JsonPath -and $_.ScriptPath }).Count } } function Test-AzureConnection { <# .SYNOPSIS Controleert of er een actieve Azure-verbinding bestaat. .OUTPUTS Boolean: $true als verbonden, anders $false #> [CmdletBinding()] param() try { $context = Get-AzContext -ErrorAction Stop if ($context) { Write-Verbose "Azure-verbinding actief: $($context.Account.Id) in tenant $($context.Tenant.Id)" return $true } return $false } catch { Write-Verbose "Geen actieve Azure-verbinding: $_" return $false } } function Get-AzureCriticalInfrastructureStatus { <# .SYNOPSIS Inventariseert de beveiligingsstatus van kritieke Azure-resources. .OUTPUTS PSCustomObject met beveiligingsstatus. #> [CmdletBinding()] param() $isConnected = Test-AzureConnection if (-not $isConnected) { Write-Warning "Geen actieve Azure-verbinding. Alleen repository-inventarisatie wordt uitgevoerd." return [pscustomobject]@{ AzureConnected = $false ResourcesWithReadOnlyLocks = 0 ResourcesWithCanNotDeleteLocks = 0 ResourcesWithoutLocks = 0 KeyVaultsProtected = 0 PrivateEndpointsConfigured = 0 SecureScore = $null } } try { Write-Verbose "Inventariseren van Azure kritieke infrastructuur beveiligingsstatus..." $subscriptions = @() try { $subscriptions = Get-AzSubscription -ErrorAction SilentlyContinue | Where-Object { $_.State -eq 'Enabled' } } catch { Write-Verbose "Kon subscriptions niet ophalen: $_" } $totalReadOnlyLocks = 0 $totalCanNotDeleteLocks = 0 $totalResourcesWithoutLocks = 0 $keyVaultsProtected = 0 $privateEndpointsConfigured = 0 $secureScoreAverage = $null $secureScores = @() foreach ($sub in $subscriptions) { Set-AzContext -SubscriptionId $sub.Id -ErrorAction SilentlyContinue | Out-Null try { # Haal Resource Locks op $locks = Get-AzResourceLock -ErrorAction SilentlyContinue foreach ($lock in $locks) { if ($lock.Properties.Level -eq 'ReadOnly') { $totalReadOnlyLocks++ } elseif ($lock.Properties.Level -eq 'CanNotDelete') { $totalCanNotDeleteLocks++ } } # Tel resources zonder locks (vereist specifieke logica per resource type) $allResources = Get-AzResource -ErrorAction SilentlyContinue $resourcesWithLocks = $locks | ForEach-Object { $_.ResourceId } $resourcesWithoutLocks = $allResources | Where-Object { $_.ResourceId -notin $resourcesWithLocks } $totalResourcesWithoutLocks += $resourcesWithoutLocks.Count # Haal Key Vaults op en controleer op bescherming try { $keyVaults = Get-AzKeyVault -ErrorAction SilentlyContinue foreach ($kv in $keyVaults) { if ($kv.EnablePurgeProtection -or $kv.EnableSoftDelete) { $keyVaultsProtected++ } } } catch { Write-Verbose "Kon Key Vaults niet ophalen: $_" } # Haal Private Endpoints op try { $privateEndpoints = Get-AzPrivateEndpoint -ErrorAction SilentlyContinue $privateEndpointsConfigured += $privateEndpoints.Count } catch { Write-Verbose "Kon Private Endpoints niet ophalen: $_" } # Probeer secure score op te halen try { $scores = Get-AzSecuritySecureScore -ErrorAction SilentlyContinue if ($scores) { foreach ($s in $scores) { if ($s.Properties.Percentage) { $secureScores += [double]$s.Properties.Percentage } } } } catch { Write-Verbose "Kon secure score niet ophalen (mogelijk Defender for Cloud niet actief): $_" } } catch { Write-Verbose "Kon beveiligingsstatus voor subscription '$($sub.Name)' niet ophalen: $_" } } if ($secureScores.Count -gt 0) { $secureScoreAverage = [math]::Round(($secureScores | Measure-Object -Average).Average * 100, 1) } return [pscustomobject]@{ AzureConnected = $true ResourcesWithReadOnlyLocks = $totalReadOnlyLocks ResourcesWithCanNotDeleteLocks = $totalCanNotDeleteLocks ResourcesWithoutLocks = $totalResourcesWithoutLocks KeyVaultsProtected = $keyVaultsProtected PrivateEndpointsConfigured = $privateEndpointsConfigured SecureScore = $secureScoreAverage } } catch { Write-Warning "Fout bij inventariseren van Azure kritieke infrastructuur beveiligingsstatus: $_" return [pscustomobject]@{ AzureConnected = $false ResourcesWithReadOnlyLocks = 0 ResourcesWithCanNotDeleteLocks = 0 ResourcesWithoutLocks = 0 KeyVaultsProtected = 0 PrivateEndpointsConfigured = 0 SecureScore = $null } } } function Invoke-Monitoring { <# .SYNOPSIS Voert een samenvattende monitoring uit van Azure kritieke infrastructuur beveiligingsstatus. .OUTPUTS PSCustomObject met overzichtsresultaten. #> [CmdletBinding()] param() Write-Host "`nMonitoring: Azure Kritieke Infrastructuur Beveiliging" -ForegroundColor Yellow Write-Host "=====================================================" -ForegroundColor Yellow $inventory = Get-CriticalInfrastructureInventory $azureStatus = Get-AzureCriticalInfrastructureStatus Write-Host "`nRepository-root: $($inventory.RepositoryRoot)" -ForegroundColor Cyan Write-Host "Totaal Azure kritieke infrastructuur controls (JSON/PS1-combinaties): $($inventory.TotalControls)" -ForegroundColor Cyan Write-Host "Volledig gekoppeld (JSON + PS1): $($inventory.WithJsonAndPs1)" -ForegroundColor Cyan if ($azureStatus.AzureConnected) { Write-Host "`nAzure kritieke infrastructuur beveiligingsstatus:" -ForegroundColor Cyan Write-Host " Resources met ReadOnly locks: $($azureStatus.ResourcesWithReadOnlyLocks)" -ForegroundColor Gray Write-Host " Resources met CanNotDelete locks: $($azureStatus.ResourcesWithCanNotDeleteLocks)" -ForegroundColor Gray Write-Host " Resources zonder locks: $($azureStatus.ResourcesWithoutLocks)" -ForegroundColor $(if ($azureStatus.ResourcesWithoutLocks -gt 0) { "Yellow" } else { "Gray" }) Write-Host " Key Vaults met bescherming: $($azureStatus.KeyVaultsProtected)" -ForegroundColor Gray Write-Host " Private Endpoints geconfigureerd: $($azureStatus.PrivateEndpointsConfigured)" -ForegroundColor Gray if ($null -ne $azureStatus.SecureScore) { Write-Host " Gemiddelde secure score: $($azureStatus.SecureScore)%" -ForegroundColor $(if ($azureStatus.SecureScore -lt 60) { "Yellow" } elseif ($azureStatus.SecureScore -lt 80) { "Cyan" } else { "Green" }) } else { Write-Host " Gemiddelde secure score: n.v.t. (Defender for Cloud mogelijk niet actief)" -ForegroundColor Yellow } } else { Write-Host "`n⚠️ Geen actieve Azure-verbinding. Verbind met Connect-AzAccount voor volledige beveiligingsmonitoring." -ForegroundColor Yellow } if ($inventory.MissingJson.Count -gt 0) { Write-Host "`n❌ Ontbrekende JSON voor de volgende scripts:" -ForegroundColor Red foreach ($item in $inventory.MissingJson) { Write-Host " - $($item.Name) (script: $($item.ScriptPath))" -ForegroundColor Red } } if ($inventory.MissingScripts.Count -gt 0) { Write-Host "`n❌ Ontbrekende PS1-scripts voor de volgende JSON-bestanden:" -ForegroundColor Red foreach ($item in $inventory.MissingScripts) { Write-Host " - $($item.Name) (json: $($item.JsonPath))" -ForegroundColor Red } } if (($inventory.MissingJson.Count -eq 0) -and ($inventory.MissingScripts.Count -eq 0)) { Write-Host "`n✅ Alle Azure kritieke infrastructuur-artikelen hebben zowel JSON als PS1." -ForegroundColor Green } else { Write-Host "`n⚠️ Er zijn nog hiaten in de JSON/PS1-koppeling voor Azure kritieke infrastructuur." -ForegroundColor Yellow Write-Host " Gebruik -Remediation om gericht met deze hiaten aan de slag te gaan." -ForegroundColor Yellow } # Beveiligingsevaluatie $isSecure = $true if ($azureStatus.AzureConnected) { if ($azureStatus.ResourcesWithoutLocks -gt 0) { $isSecure = $false Write-Host "`n⚠️ Er zijn resources zonder Resource Locks gedetecteerd. Overweeg het toepassen van locks op kritieke resources." -ForegroundColor Yellow } if ($null -ne $azureStatus.SecureScore -and $azureStatus.SecureScore -lt 60) { $isSecure = $false Write-Host "⚠️ Secure score ligt onder 60%. Prioriteer verbeteracties op basis van Defender for Cloud-aanbevelingen." -ForegroundColor Yellow } if ($azureStatus.PrivateEndpointsConfigured -eq 0) { Write-Host "⚠️ Geen Private Endpoints gevonden. Overweeg het implementeren van Private Endpoints voor PaaS-services." -ForegroundColor Yellow } } return [pscustomobject]@{ Inventory = $inventory AzureStatus = $azureStatus IsSecure = $isSecure } } function Invoke-Remediation { <# .SYNOPSIS Ondersteunt remediatie door beveiligingshiaten inzichtelijk te maken en handvatten te bieden voor verbeteracties. .OUTPUTS PSCustomObject met remediatieadvies. #> [CmdletBinding()] param() Write-Host "`nRemediatie: Azure Kritieke Infrastructuur Beveiliging Verbetering" -ForegroundColor Yellow Write-Host "===================================================================" -ForegroundColor Yellow $inventory = Get-CriticalInfrastructureInventory $azureStatus = Get-AzureCriticalInfrastructureStatus $repoRoot = $inventory.RepositoryRoot $actions = @() Write-Host "`nBeveiligingshiaten analyse:" -ForegroundColor Cyan if ($azureStatus.AzureConnected) { if ($azureStatus.ResourcesWithoutLocks -gt 0) { $action = [pscustomobject]@{ Priority = "High" Issue = "Resources zonder Resource Locks" Count = $azureStatus.ResourcesWithoutLocks Recommendation = "Identificeer kritieke resources en pas ReadOnly of CanNotDelete locks toe om verwijdering en wijzigingen te voorkomen." } $actions += $action Write-Host " ❌ $($action.Issue): $($action.Count) resources" -ForegroundColor Red Write-Host " → $($action.Recommendation)" -ForegroundColor Gray } if ($null -ne $azureStatus.SecureScore -and $azureStatus.SecureScore -lt 60) { $action = [pscustomobject]@{ Priority = "High" Issue = "Secure score onder drempelwaarde" Count = $azureStatus.SecureScore Recommendation = "Activeer Microsoft Defender for Cloud beveiligingsstandaarden en prioriteer aanbevelingen met hoge impact voor kritieke resources." } $actions += $action Write-Host " ⚠️ $($action.Issue): $($action.Count)%" -ForegroundColor Yellow Write-Host " → $($action.Recommendation)" -ForegroundColor Gray } elseif ($null -eq $azureStatus.SecureScore) { $action = [pscustomobject]@{ Priority = "Medium" Issue = "Secure score niet beschikbaar" Count = 0 Recommendation = "Controleer of Microsoft Defender for Cloud is geactiveerd en beveiligingsstandaarden zijn ingeschakeld." } $actions += $action Write-Host " ⚠️ $($action.Issue)" -ForegroundColor Yellow Write-Host " → $($action.Recommendation)" -ForegroundColor Gray } if ($azureStatus.PrivateEndpointsConfigured -eq 0) { $action = [pscustomobject]@{ Priority = "Medium" Issue = "Geen Private Endpoints geconfigureerd" Count = 0 Recommendation = "Implementeer Private Endpoints voor PaaS-services zoals Azure SQL, Storage Accounts en Key Vaults om netwerkverkeer te isoleren." } $actions += $action Write-Host " ⚠️ $($action.Issue)" -ForegroundColor Yellow Write-Host " → $($action.Recommendation)" -ForegroundColor Gray } if ($azureStatus.KeyVaultsProtected -eq 0) { $action = [pscustomobject]@{ Priority = "High" Issue = "Key Vaults zonder purge protection" Count = 0 Recommendation = "Activeer soft delete en purge protection op alle Key Vaults om permanent verlies van versleutelingssleutels te voorkomen." } $actions += $action Write-Host " ⚠️ $($action.Issue)" -ForegroundColor Yellow Write-Host " → $($action.Recommendation)" -ForegroundColor Gray } } else { Write-Host " ⚠️ Verbind met Azure voor gedetailleerde beveiligingsanalyse" -ForegroundColor Yellow } if ($inventory.MissingJson.Count -gt 0 -or $inventory.MissingScripts.Count -gt 0) { Write-Host "`nRepository-hiaten:" -ForegroundColor Cyan Write-Host (" Items zonder JSON: {0}" -f $inventory.MissingJson.Count) -ForegroundColor Cyan Write-Host (" Items zonder script: {0}" -f $inventory.MissingScripts.Count) -ForegroundColor Cyan Write-Host " → Werk deze hiaten bij om het beveiligingsraamwerk compleet te maken." -ForegroundColor Gray } Write-Host "`nVolgende stappen:" -ForegroundColor Cyan Write-Host "1. Identificeer en classificeer kritieke resources op basis van Business Impact Analyse" -ForegroundColor White Write-Host "2. Pas Resource Locks toe (ReadOnly voor mission-critical, CanNotDelete voor kritiek)" -ForegroundColor White Write-Host "3. Implementeer netwerksegmentatie met Private Endpoints en NSGs" -ForegroundColor White Write-Host "4. Activeer en configureer Microsoft Defender for Cloud" -ForegroundColor White Write-Host "5. Stel beveiligingsdashboards en rapportages op" -ForegroundColor White Write-Host "6. Voer regelmatige security assessments uit" -ForegroundColor White return [pscustomobject]@{ Actions = $actions Inventory = $inventory AzureStatus = $azureStatus } } try { Write-Host "`n========================================" -ForegroundColor Cyan Write-Host "Azure Kritieke Infrastructuur Monitor" -ForegroundColor Cyan Write-Host "Nederlandse Baseline voor Veilige Cloud" -ForegroundColor Cyan Write-Host "========================================`n" -ForegroundColor Cyan if ($Monitoring) { $result = Invoke-Monitoring if ($result.IsSecure) { exit 0 } else { exit 1 } } elseif ($Remediation) { Invoke-Remediation | Out-Null } else { # Standaard: compacte beveiligingscheck via monitoring $result = Invoke-Monitoring if ($result.IsSecure -and ($result.Inventory.MissingJson.Count -eq 0) -and ($result.Inventory.MissingScripts.Count -eq 0)) { Write-Host "`n✅ SECURE" -ForegroundColor Green exit 0 } else { Write-Host "`n❌ SECURITY ISSUES DETECTED" -ForegroundColor Red Write-Host "Run met -Monitoring voor gedetailleerde rapportage" -ForegroundColor Yellow Write-Host "Run met -Remediation voor gericht verbeteradvies" -ForegroundColor Yellow exit 1 } } } catch { Write-Error "Er is een fout opgetreden in index.ps1: $_" exit 2 } finally { Write-Host "`n========================================`n" -ForegroundColor Cyan }

Risico zonder implementatie

Risico zonder implementatie
Critical: Zonder een doordacht beveiligingsraamwerk voor kritieke infrastructuur in Azure ontstaat het risico dat essentiële resources kwetsbaar zijn voor onbedoelde verwijdering, configuratiefouten, insider threats of externe aanvallen. Dit kan leiden tot langdurige uitval van essentiële diensten, permanent gegevensverlies, schending van wettelijke verplichtingen zoals de NIS2 richtlijn, en aanzienlijke reputatieschade. Organisaties kunnen niet aantonen dat zij passende maatregelen hebben genomen om kritieke infrastructuur te beschermen, wat kan leiden tot boetes, verplichte herstelmaatregelen en bestuurlijke aansprakelijkheid.

Management Samenvatting

Kritieke infrastructuurbeveiliging in Azure vereist een gelaagd beveiligingsraamwerk dat Resource Locks, netwerksegmentatie, toegangscontrole en monitoring combineert om essentiële resources te beschermen tegen bedreigingen. Dit index-artikel fungeert als centrale verzamelplaats voor beveiligingsartikelen en beschrijft governance, implementatie, monitoring en continue verbetering van kritieke infrastructuurbeveiliging in Azure-omgevingen.