Azure Network Watcher Configuratie: Architectuur, Implementatie En Governance

💼 Management Samenvatting

Azure Network Watcher vormt het centrale fundament voor netwerkmonitoring, diagnostiek en beveiligingsanalyse binnen Azure-omgevingen. Deze service biedt essentiële functionaliteiten zoals NSG Flow Logs voor gedetailleerde verkeersanalyse, Connection Monitor voor continue connectiviteitscontrole, Packet Capture voor diepgaande netwerkanalyse tijdens incidenten, en Traffic Analytics voor AI-gestuurde detectie van beveiligingsdreigingen. Zonder een goed geconfigureerde Network Watcher-omgeving beschikken organisaties niet over de benodigde netwerkzichtbaarheid om beveiligingsincidenten te detecteren, connectiviteitsproblemen te diagnosticeren, compliance-vereisten na te leven en forensisch onderzoek uit te voeren.

Aanbeveling
IMPLEMENT
Risico zonder
High
Risk Score
9/10
Implementatie
36u (tech: 24u)
Van toepassing op:
Azure
Hybride omgevingen

In de praktijk zien we vaak dat organisaties Azure Network Watcher niet hebben ingeschakeld in alle gebruikte regio's, dat NSG Flow Logs niet zijn geconfigureerd waardoor kritieke verkeersdata ontbreekt, dat Traffic Analytics niet is ingeschakeld waardoor AI-gestuurde threat detection niet beschikbaar is, en dat Connection Monitor niet is geconfigureerd waardoor connectiviteitsproblemen pas worden gedetecteerd wanneer gebruikers klagen. Deze configuratiefouten leiden tot blinde vlekken in netwerkmonitoring, verminderde detectiecapaciteit voor beveiligingsdreigingen, onvermogen om netwerkproblemen proactief op te lossen, en het niet kunnen voldoen aan compliance-vereisten zoals BIO, ISO 27001 en NIS2 die uitgebreide netwerklogging vereisen. Bovendien ontbreekt vaak een centraal overzicht van welke Network Watcher-instances actief zijn, welke NSG's flow logs genereren, en hoe netwerkmonitoring wordt gebruikt voor incidentdetectie en forensisch onderzoek.

PowerShell Modules Vereist
Primary API: Azure Resource Manager
Connection: Connect-AzAccount
Required Modules: Az.Accounts, Az.Network, Az.Monitor, Az.Resources

Implementatie

Dit artikel beschrijft een gestructureerde aanpak voor het ontwerpen, implementeren en beheren van Azure Network Watcher-configuraties binnen de Nederlandse Baseline voor Veilige Cloud. We behandelen architectuurkeuzes zoals de inrichting van Network Watcher in alle gebruikte Azure-regio's, configuratie van NSG Flow Logs voor gedetailleerde verkeersanalyse, implementatie van Traffic Analytics voor AI-gestuurde threat detection, configuratie van Connection Monitor voor proactieve connectiviteitscontrole, en afstemming van retentie-instellingen op compliance-frameworks zoals de Archiefwet, BIO en ISO 27001. Daarnaast gaan we in op het beheer van Network Watcher via Infrastructure as Code, configuratie van Packet Capture voor incidentresponse, implementatie van kostenbeheersing door middel van slimme retentie-instellingen, en het opzetten van alertregels die aansluiten op bestaande incidentresponse-processen. Het artikel sluit af met governance-richtlijnen voor naamgeving, tagging, kostenbewaking en periodieke configuratiereviews, en toont hoe het bijbehorende PowerShell-script network-watcher-configured.ps1 kan worden gebruikt om de configuratie te monitoren, te valideren en waar nodig te herstellen.

Architectuur en Ontwerpprincipes voor Azure Network Watcher

Een effectieve Azure Network Watcher-architectuur begint bij strategische keuzes die bepalen hoe netwerkverkeer wordt gemonitord, geanalyseerd en opgeslagen. Azure Network Watcher is een regionale service die automatisch wordt ingeschakeld wanneer u de eerste virtuele netwerkresource in een regio aanmaakt. Voor Nederlandse overheidsorganisaties adviseren we om Network Watcher expliciet in te schakelen in alle Azure-regio's waar virtuele netwerken actief zijn, zelfs als er nog geen resources zijn geïmplementeerd. Dit voorkomt dat Network Watcher automatisch wordt aangemaakt met suboptimale configuraties en zorgt ervoor dat alle netwerkmonitoring-capaciteiten direct beschikbaar zijn wanneer nieuwe workloads worden geïmplementeerd. De kernfunctionaliteit van Azure Network Watcher bestaat uit NSG Flow Logs, die gedetailleerde informatie verzamelen over al het verkeer dat door Network Security Groups (NSG's) stroomt. Flow logs bevatten essentiële informatie zoals bron- en doel-IP-adressen, poorten, protocollen, verkeersrichting (inbound/outbound), en of verkeer is toegestaan of geweigerd door NSG-regels. Deze data is onmisbaar voor security monitoring, omdat het beveiligingsteams in staat stelt om verdachte verkeerspatronen te detecteren, zoals brute force-aanvallen, port scanning, en ongeautoriseerde toegangspogingen. Zonder NSG Flow Logs opereren organisaties in feite blind, zonder inzicht in wat er gebeurt in hun netwerkinfrastructuur, wat leidt tot vertraagde detectie van beveiligingsincidenten en het onvermogen om forensisch onderzoek uit te voeren na een aanval. Traffic Analytics is een geavanceerde functionaliteit die bovenop NSG Flow Logs draait en gebruik maakt van machine learning om netwerkverkeer te analyseren en beveiligingsdreigingen te detecteren. Traffic Analytics biedt visuele dashboards die inzicht geven in verkeerspatronen, top talkers, geografische verkeersdistributie, en anomaliedetectie. Deze functionaliteit is essentieel voor proactieve threat detection, omdat het beveiligingsteams in staat stelt om afwijkende verkeerspatronen te identificeren voordat deze escaleren tot volledige beveiligingsincidenten. Traffic Analytics vereist dat NSG Flow Logs zijn geconfigureerd en dat data wordt opgeslagen in een Log Analytics workspace, waardoor integratie met bestaande monitoring-infrastructuur mogelijk is. Connection Monitor is een andere kritieke functionaliteit van Azure Network Watcher die continue connectiviteitscontrole mogelijk maakt tussen Azure-resources, on-premises systemen en externe endpoints. Connection Monitor test periodiek de connectiviteit tussen gedefinieerde bron- en doelpunten en rapporteert latency, beschikbaarheid en netwerkpad-informatie. Deze functionaliteit is essentieel voor proactieve probleemdetectie, omdat het organisaties in staat stelt om connectiviteitsproblemen te identificeren voordat gebruikers deze ervaren. Voor Nederlandse overheidsorganisaties adviseren we om Connection Monitor te configureren voor alle kritieke verbindingen, zoals verbindingen tussen productieomgevingen, verbindingen naar on-premises datacenters, en verbindingen naar externe API's en services.

Implementatie en Configuratie van Azure Network Watcher

De implementatie van Azure Network Watcher begint bij het inschakelen van de service in alle Azure-regio's waar virtuele netwerken actief zijn. Network Watcher wordt automatisch aangemaakt wanneer u de eerste virtuele netwerkresource in een regio implementeert, maar het is verstandig om dit expliciet te doen via Azure Portal, PowerShell of Infrastructure as Code om consistente configuraties te waarborgen. Voor elke regio wordt een Network Watcher-resource aangemaakt in een speciale resource group genaamd NetworkWatcherRG, die automatisch wordt beheerd door Azure. Het is belangrijk om te realiseren dat Network Watcher zelf geen kosten met zich meebrengt; alleen de opslag van NSG Flow Logs en Traffic Analytics-data genereert kosten, die typisch tussen de twee en vijf euro per maand per NSG bedragen. Na het inschakelen van Network Watcher is de volgende stap het configureren van NSG Flow Logs voor alle Network Security Groups die kritieke workloads beschermen. NSG Flow Logs kunnen worden geconfigureerd via Azure Portal onder Network Watcher → NSG Flow Logs, of via PowerShell met behulp van de Az.Network-module. Bij het configureren van NSG Flow Logs moet u verschillende belangrijke instellingen overwegen: de retentieperiode voor flow log-data (standaard 30 dagen, maar voor compliance-doeleinden adviseren we minimaal 365 dagen), de opslaglocatie (Azure Storage Account of Log Analytics workspace), en de versie van het flow log-formaat (versie 2 wordt aanbevolen omdat deze meer gedetailleerde informatie bevat). Voor Nederlandse overheidsorganisaties adviseren we om NSG Flow Logs op te slaan in een Log Analytics workspace, omdat dit integratie mogelijk maakt met Traffic Analytics en bestaande SIEM-systemen. Traffic Analytics vereist aanvullende configuratie na het inschakelen van NSG Flow Logs. Traffic Analytics kan worden geconfigureerd via Azure Portal onder Network Watcher → Traffic Analytics, waarbij u selecteert welke NSG Flow Logs moeten worden geanalyseerd en in welke Log Analytics workspace de resultaten moeten worden opgeslagen. Traffic Analytics biedt verschillende configuratie-opties, zoals de retentieperiode voor geaggregeerde data (standaard 60 dagen), de frequentie van data-verwerking (elke 10 minuten of elk uur), en de geografische scope voor verkeersanalyse. Voor Nederlandse overheidsorganisaties adviseren we om Traffic Analytics in te schakelen voor alle productie-NSG's, omdat dit essentiële threat detection-capaciteiten biedt die niet kunnen worden gerealiseerd met alleen flow logs.

Gebruik PowerShell-script network-watcher-configured.ps1 (functie Invoke-Monitoring) – Voert een tenant-brede inventarisatie en compliancecheck uit op Azure Network Watcher-configuraties, inclusief NSG Flow Logs, Traffic Analytics en Connection Monitor-instellingen..

NSG Flow Logs en Traffic Analytics Configuratie

NSG Flow Logs vormen de basis voor alle netwerkmonitoring en beveiligingsanalyse binnen Azure. Flow logs verzamelen gedetailleerde informatie over al het verkeer dat door Network Security Groups stroomt, inclusief toegestaan en geweigerd verkeer. Deze informatie is essentieel voor security monitoring, omdat het beveiligingsteams in staat stelt om verdachte verkeerspatronen te detecteren, zoals brute force-aanvallen, port scanning, en ongeautoriseerde toegangspogingen. Zonder NSG Flow Logs opereren organisaties in feite blind, zonder inzicht in wat er gebeurt in hun netwerkinfrastructuur. Bij het configureren van NSG Flow Logs moet u verschillende belangrijke instellingen overwegen. De retentieperiode bepaalt hoe lang flow log-data wordt bewaard; voor compliance-doeleinden adviseren we minimaal 365 dagen, maar voor langetermijnbewaring kan data worden geëxporteerd naar Azure Blob Storage of een SIEM-systeem. De opslaglocatie bepaalt waar flow log-data wordt opgeslagen; voor integratie met Traffic Analytics en bestaande monitoring-systemen adviseren we om data op te slaan in een Log Analytics workspace. De versie van het flow log-formaat bepaalt welke informatie wordt verzameld; versie 2 wordt aanbevolen omdat deze meer gedetailleerde informatie bevat, zoals bytes en pakketten per flow. Traffic Analytics is een geavanceerde functionaliteit die bovenop NSG Flow Logs draait en gebruik maakt van machine learning om netwerkverkeer te analyseren en beveiligingsdreigingen te detecteren. Traffic Analytics biedt visuele dashboards die inzicht geven in verkeerspatronen, top talkers, geografische verkeersdistributie, en anomaliedetectie. Deze functionaliteit is essentieel voor proactieve threat detection, omdat het beveiligingsteams in staat stelt om afwijkende verkeerspatronen te identificeren voordat deze escaleren tot volledige beveiligingsincidenten. Traffic Analytics vereist dat NSG Flow Logs zijn geconfigureerd en dat data wordt opgeslagen in een Log Analytics workspace, waardoor integratie met bestaande monitoring-infrastructuur mogelijk is.

Connection Monitor en Packet Capture voor Incidentresponse

Connection Monitor is een kritieke functionaliteit van Azure Network Watcher die continue connectiviteitscontrole mogelijk maakt tussen Azure-resources, on-premises systemen en externe endpoints. Connection Monitor test periodiek de connectiviteit tussen gedefinieerde bron- en doelpunten en rapporteert latency, beschikbaarheid en netwerkpad-informatie. Deze functionaliteit is essentieel voor proactieve probleemdetectie, omdat het organisaties in staat stelt om connectiviteitsproblemen te identificeren voordat gebruikers deze ervaren. Bij het configureren van Connection Monitor moet u verschillende belangrijke instellingen overwegen. De testfrequentie bepaalt hoe vaak connectiviteit wordt getest; voor kritieke verbindingen adviseren we elke 30 seconden, terwijl voor minder kritieke verbindingen elke 5 minuten voldoende kan zijn. De drempelwaarden bepalen wanneer een connectiviteitsprobleem als kritiek wordt beschouwd; voor productieomgevingen adviseren we strikte drempelwaarden die vroegtijdige detectie mogelijk maken. De notificatie-instellingen bepalen wie wordt geïnformeerd wanneer een connectiviteitsprobleem wordt gedetecteerd; voor kritieke verbindingen adviseren we om automatische alerting in te stellen die aansluit op bestaande incidentresponse-processen. Packet Capture is een andere belangrijke functionaliteit van Azure Network Watcher die diepgaande netwerkanalyse mogelijk maakt tijdens beveiligingsincidenten. Packet Capture verzamelt alle netwerkpakketten die door een virtuele machine worden verzonden of ontvangen, waardoor beveiligingsteams precies kunnen begrijpen wat er gebeurt in het netwerk wanneer er een probleem of aanval plaatsvindt. Packet Capture kan worden geconfigureerd om automatisch te starten wanneer bepaalde voorwaarden worden gedetecteerd, zoals verdachte verkeerspatronen of beveiligingswaarschuwingen. Voor Nederlandse overheidsorganisaties adviseren we om Packet Capture te configureren voor alle kritieke virtuele machines, omdat dit essentiële forensische capaciteiten biedt die nodig zijn voor incidentresponse en compliance-audits.

Governance, Compliance en Continue Verbetering

Een Azure Network Watcher-configuratie is geen statisch ontwerp dat na implementatie kan worden vergeten. Nieuwe workloads, wijzigingen in architectuur, wijzigende compliance-vereisten en lessen uit incidenten vereisen dat Network Watcher-configuraties doorlopend worden geëvalueerd en aangepast. Zonder actieve governance ontstaan na verloop van tijd blinde vlekken: nieuwe NSG's krijgen geen flow logs, verouderde Connection Monitor-configuraties blijven actief zonder eigenaar, retentie-instellingen worden niet herzien waardoor compliance-risico's ontstaan, en kosten lopen op door overmatige data-opslag. Daarom moet de inrichting van Azure Network Watcher ingebed worden in het bredere governance- en risicomanagementproces van de organisatie. Een praktisch vertrekpunt is het inrichten van een periodieke reviewcyclus, bijvoorbeeld per kwartaal, waarin de effectiviteit van netwerkmonitoring wordt beoordeeld. Tijdens deze sessies bekijkt u samen met het SOC, operations en compliance-teams onder andere: welke NSG Flow Logs worden daadwerkelijk gebruikt voor incidentdetectie, welke Connection Monitor-configuraties zijn overbodig geworden door architectuurwijzigingen, of retentie-instellingen nog steeds voldoen aan compliance-vereisten, en welke kostenbesparingen mogelijk zijn zonder verlies van zichtbaarheid. Het PowerShell-script kan hier direct input voor leveren door te rapporteren welke NSG's flow logs missen, welke Network Watcher-instances niet correct zijn geconfigureerd, en of Traffic Analytics is ingeschakeld voor alle kritieke workloads. Op basis van deze informatie kunt u gericht bijsturen: onnodige configuraties uitfaseren, ontbrekende instrumentatie toevoegen en retentie-instellingen afstemmen op actuele compliance-vereisten. Governance betekent ook dat eigenaarschap over Network Watcher-configuraties expliciet wordt toegewezen. Voor elke Network Watcher-instance en kritieke workload moet duidelijk zijn wie verantwoordelijk is voor het beheer van de bijbehorende configuraties, hoe wijzigingen worden aangevraagd en goedgekeurd, en hoe kennis wordt geborgd bij personeelswisselingen. In de context van Nederlandse overheidsorganisaties is het verstandig om dit eigenaarschap te koppelen aan bestaande rollen binnen de informatiebeveiligings- en continuïteitsorganisatie, zoals lijnmanagers, applicatie-eigenaren en de CISO. Leg vast dat grote wijzigingen in Network Watcher-configuraties altijd via het changeproces lopen en dat bij ingrijpende wijzigingen – bijvoorbeeld het wijzigen van retentie-instellingen voor NSG Flow Logs – expliciet akkoord van compliance of security nodig is.

Gebruik PowerShell-script network-watcher-configured.ps1 (functie Invoke-Remediation) – Ondersteunt verbetering van de Azure Network Watcher-configuratie door niet-conforme resources te identificeren en – indien gewenst – standaard-configuraties voor kritieke workloads aan te maken..

Compliance, Audit en Bewijsvoering rondom Azure Network Watcher

Azure Network Watcher-configuraties spelen een belangrijke rol in het aantonen van compliance met uiteenlopende kaders zoals de BIO, ISO 27001 en NIS2. Toezichthouders en auditors vragen steeds vaker niet alleen óf netwerkmonitoring is ingericht, maar ook hoe de organisatie waarborgt dat relevante netwerkgebeurtenissen tijdig worden gesignaleerd, opgeslagen en geanalyseerd. Tijdens audits worden bijvoorbeeld vragen gesteld als: hoe weet u dat alle kritieke NSG's flow logs genereren? Hoe borgt u dat netwerkverkeer lang genoeg wordt bewaard voor compliance-vereisten? En hoe voorkomt u dat wijzigingen in architectuur leiden tot verlies van monitoring-capaciteiten? Een goed gedocumenteerde Azure Network Watcher-architectuur, gecombineerd met aantoonbare reviewcycli en scriptgestuurde controles, vormt het antwoord op deze vragen. Voor de BIO sluiten Azure Network Watcher-configuraties vooral aan bij de normen rond logging, monitoring en incidentrespons. Door in het informatiebeveiligingsbeleid expliciet op te nemen dat kritieke netwerkprocessen ondersteund worden door Network Watcher met gedefinieerde NSG Flow Log-configuraties en Traffic Analytics-instellingen, en door de concrete invulling te documenteren per workload, kan de organisatie richting ENSIA-auditors onderbouwen dat netwerkmonitoring structureel is ingericht. Het PowerShell-script levert daarbij concreet auditbewijs in de vorm van exports die tonen welke Network Watcher-instances actief zijn, welke NSG's flow logs genereren, welke Traffic Analytics-configuraties actief zijn en hoe deze zijn gekoppeld aan incidentresponse-processen. Deze exports kunnen worden bewaard in een auditdossier, samen met besluiten uit de periodieke reviewmeetings en runbooks die beschrijven hoe het SOC of beheerteam gebruik maakt van netwerkmonitoring-data voor incidentdetectie. Voor ISO 27001 en NIS2 is vooral van belang dat er een aantoonbare PDCA-cyclus (Plan-Do-Check-Act) bestaat rondom netwerkmonitoring en observability. Het plan-niveau wordt ingevuld via architectuur- en beleidsdocumenten, de do-fase via implementatie van Network Watcher en NSG Flow Log-configuraties, de check-fase via periodieke analyses en scriptgestuurde controles, en de act-fase via verbetermaatregelen op basis van bevindingen en incidenten. Door deze samenhang expliciet te maken in documentatie en tijdens audits te illustreren met concrete voorbeelden – bijvoorbeeld een incident waarbij Network Watcher een dreiging vroegtijdig signaleerde, of een oefening waarin het gebruik van Packet Capture voor forensisch onderzoek is getest – ontstaat een overtuigend beeld van volwassen netwerkmonitoring. Het gebruik van network-watcher-configured.ps1 als standaardinstrument in deze check-fase toont bovendien aan dat de organisatie niet afhankelijk is van handmatige controles, maar geautomatiseerde waarborgen inzet om de kwaliteit van Network Watcher-configuraties op niveau te houden.

Gebruik PowerShell-script network-watcher-configured.ps1 (functie Invoke-Revert) – Biedt waar nodig een gecontroleerd mechanisme om test- of tijdelijke Network Watcher-configuraties terug te draaien naar een eerder vastgelegde, goedgekeurde staat..

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 Azure Network Watcher Configuratie: Architectuur, Best Practices en Implementatie .DESCRIPTION Controleert of Azure-abonnementen correct zijn geconfigureerd met Azure Network Watcher voor netwerkmonitoring, NSG Flow Logs, Traffic Analytics en compliance. Network Watcher vormt het fundament voor alle netwerkbeveiligingsoperaties en is essentieel voor threat hunting, incidentdetectie en compliance-rapportage. .NOTES Filename: network-watcher-configured.ps1 Author: Nederlandse Baseline voor Veilige Cloud Created: 2025-01-15 Last Modified: 2025-01-15 Version: 1.0 Related JSON: content/azure/monitoring/network-watcher-configured.json Category: monitoring Workload: azure .LINK https://github.com/m365-tenant-best-practise .EXAMPLE .\network-watcher-configured.ps1 -Monitoring Check compliance status van Azure Network Watcher configuraties .EXAMPLE .\network-watcher-configured.ps1 -Remediation Genereert een overzicht van abonnementen zonder Network Watcher en aanbevelingen voor herstel .EXAMPLE .\network-watcher-configured.ps1 -Remediation -WhatIf Show what would be changed without applying #> #Requires -Version 5.1 #Requires -Modules Az.Accounts, Az.Network, Az.Monitor [CmdletBinding()] param( [Parameter(HelpMessage = "Monitor current configuration status")] [switch]$Monitoring, [Parameter(HelpMessage = "Apply recommended configuration")] [switch]$Remediation, [Parameter(HelpMessage = "Revert to previous configuration")] [switch]$Revert, [Parameter(HelpMessage = "Show what would happen without making changes")] [switch]$WhatIf ) $ErrorActionPreference = 'Stop' # ============================================================================ # HEADER # ============================================================================ Write-Host "`n========================================" -ForegroundColor Cyan Write-Host "Azure Network Watcher Configuratie" -ForegroundColor Cyan Write-Host "Nederlandse Baseline voor Veilige Cloud" -ForegroundColor Cyan Write-Host "========================================`n" -ForegroundColor Cyan # ============================================================================ # VARIABLES # ============================================================================ $PolicyName = "Azure Network Watcher Configuratie" $PolicyDescription = "Controleert of Azure-abonnementen voorzien zijn van Azure Network Watcher voor netwerkmonitoring, NSG Flow Logs, Traffic Analytics en compliance." # Minimum retentieperiode in dagen (365 dagen voor compliance) $MinimumRetentionDays = 365 # ============================================================================ # FUNCTIONS # ============================================================================ function Connect-RequiredServices { <# .SYNOPSIS Maakt verbinding met Azure als dat nog niet is gebeurd. #> [CmdletBinding()] param() try { $context = Get-AzContext -ErrorAction SilentlyContinue if (-not $context) { Write-Host "Verbinding maken met Azure..." -ForegroundColor Yellow Connect-AzAccount -ErrorAction Stop | Out-Null } else { Write-Verbose "Reeds verbonden met Azure: $($context.Subscription.Name)" } } catch { Write-Error "Kon geen verbinding maken met Azure: $_" throw } } function Get-AzureSubscriptions { <# .SYNOPSIS Haalt alle Azure-abonnementen op waarvoor de gebruiker toegang heeft. .OUTPUTS Array van Azure-abonnement objecten. #> [CmdletBinding()] param() Write-Verbose "Ophalen van Azure-abonnementen..." try { $subscriptions = Get-AzSubscription -ErrorAction Stop return $subscriptions } catch { Write-Warning "Fout bij ophalen van abonnementen: $_" return @() } } function Get-NetworkWatchers { <# .SYNOPSIS Haalt alle Network Watcher-instances op voor een specifiek abonnement. .PARAMETER SubscriptionId De ID van het Azure-abonnement. .OUTPUTS Array van Network Watcher objecten. #> [CmdletBinding()] param( [Parameter(Mandatory = $true)] [string]$SubscriptionId ) Write-Verbose "Ophalen van Network Watchers voor abonnement: $SubscriptionId" try { Set-AzContext -SubscriptionId $SubscriptionId -ErrorAction Stop | Out-Null $watchers = Get-AzNetworkWatcher -ErrorAction SilentlyContinue $watcherDetails = @() foreach ($watcher in $watchers) { try { $watcherDetails += [PSCustomObject]@{ Id = $watcher.Id Name = $watcher.Name ResourceGroupName = $watcher.ResourceGroupName Location = $watcher.Location ProvisioningState = $watcher.ProvisioningState } } catch { Write-Warning "Fout bij ophalen van details voor Network Watcher '$($watcher.Name)': $_" } } return $watcherDetails } catch { Write-Warning "Fout bij ophalen van Network Watchers voor abonnement '$SubscriptionId': $_" return @() } } function Get-NSGFlowLogs { <# .SYNOPSIS Haalt alle NSG Flow Logs op voor een specifiek abonnement. .PARAMETER SubscriptionId De ID van het Azure-abonnement. .OUTPUTS Array van NSG Flow Log objecten. #> [CmdletBinding()] param( [Parameter(Mandatory = $true)] [string]$SubscriptionId ) Write-Verbose "Ophalen van NSG Flow Logs voor abonnement: $SubscriptionId" try { Set-AzContext -SubscriptionId $SubscriptionId -ErrorAction Stop | Out-Null $nsgs = Get-AzNetworkSecurityGroup -ErrorAction SilentlyContinue $flowLogs = @() foreach ($nsg in $nsgs) { try { $flowLog = Get-AzNetworkWatcherFlowLogStatus -NetworkWatcherName "NetworkWatcher_$($nsg.Location)" -TargetResourceId $nsg.Id -ErrorAction SilentlyContinue if ($flowLog) { $flowLogs += [PSCustomObject]@{ NSGId = $nsg.Id NSGName = $nsg.Name NSGLocation = $nsg.Location FlowLogEnabled = $flowLog.Enabled TargetResourceId = $flowLog.TargetResourceId StorageId = $flowLog.StorageId RetentionDays = if ($flowLog.RetentionPolicy) { $flowLog.RetentionPolicy.Days } else { 0 } } } } catch { Write-Verbose "Geen flow log gevonden voor NSG '$($nsg.Name)': $_" } } return $flowLogs } catch { Write-Warning "Fout bij ophalen van NSG Flow Logs voor abonnement '$SubscriptionId': $_" return @() } } function Test-NetworkWatcherCompliance { <# .SYNOPSIS Controleert of Network Watcher-configuraties voldoen aan compliance-vereisten. .PARAMETER Watchers De Network Watcher-instances om te controleren. .PARAMETER FlowLogs De NSG Flow Logs om te controleren. .OUTPUTS PSCustomObject met compliance-status. #> [CmdletBinding()] param( [Parameter(Mandatory = $true)] [array]$Watchers, [Parameter(Mandatory = $true)] [array]$FlowLogs ) $isCompliant = $true $issues = @() # Controleer of Network Watcher is ingeschakeld if ($Watchers.Count -eq 0) { $isCompliant = $false $issues += "Geen Network Watcher-instances gevonden in dit abonnement" } # Controleer of NSG Flow Logs zijn geconfigureerd $enabledFlowLogs = $FlowLogs | Where-Object { $_.FlowLogEnabled -eq $true } if ($enabledFlowLogs.Count -eq 0) { $isCompliant = $false $issues += "Geen NSG Flow Logs geconfigureerd" } # Controleer retentieperiode voor flow logs $lowRetentionFlowLogs = $FlowLogs | Where-Object { $_.FlowLogEnabled -eq $true -and $_.RetentionDays -lt $MinimumRetentionDays } if ($lowRetentionFlowLogs.Count -gt 0) { $isCompliant = $false $issues += "$($lowRetentionFlowLogs.Count) NSG Flow Log(s) hebben een retentieperiode van minder dan $MinimumRetentionDays dagen" } return [PSCustomObject]@{ IsCompliant = $isCompliant Issues = $issues } } function Test-NetworkWatcherConfiguration { <# .SYNOPSIS Controleert of abonnementen Network Watcher hebben geconfigureerd. .OUTPUTS Array van PSCustomObject met Network Watcher status per abonnement. #> [CmdletBinding()] param() $subscriptions = Get-AzureSubscriptions $results = @() foreach ($subscription in $subscriptions) { $subscriptionId = $subscription.Id $subscriptionName = $subscription.Name Write-Verbose "Controleren van abonnement: $subscriptionName" try { $watchers = Get-NetworkWatchers -SubscriptionId $subscriptionId $flowLogs = Get-NSGFlowLogs -SubscriptionId $subscriptionId $hasWatcher = $watchers.Count -gt 0 $enabledFlowLogs = ($flowLogs | Where-Object { $_.FlowLogEnabled -eq $true }).Count $totalNSGs = (Get-AzNetworkSecurityGroup -ErrorAction SilentlyContinue).Count $compliance = Test-NetworkWatcherCompliance -Watchers $watchers -FlowLogs $flowLogs $isCompliant = $hasWatcher -and $compliance.IsCompliant $results += [PSCustomObject]@{ SubscriptionId = $subscriptionId SubscriptionName = $subscriptionName TotalWatchers = $watchers.Count TotalNSGs = $totalNSGs EnabledFlowLogs = $enabledFlowLogs HasWatcher = $hasWatcher IsCompliant = $isCompliant Watchers = $watchers FlowLogs = $flowLogs ComplianceIssues = $compliance.Issues } } catch { Write-Warning "Fout bij controleren van abonnement '$subscriptionName': $_" } } return $results } function Test-Compliance { <# .SYNOPSIS Tests if current configuration meets compliance requirements .DESCRIPTION Wrapper function that calls monitoring and returns compliance status .OUTPUTS Returns monitoring result object with isCompliant property #> [CmdletBinding()] param() $subscriptions = Test-NetworkWatcherConfiguration if (-not $subscriptions -or $subscriptions.Count -eq 0) { return [PSCustomObject]@{ ScriptName = "network-watcher-configured" IsCompliant = $false Timestamp = Get-Date Details = "Er zijn geen Azure-abonnementen gevonden in de huidige scope." Recommendations = @("Controleer of u toegang heeft tot Azure-abonnementen.") Subscriptions = @() } } $nonCompliant = $subscriptions | Where-Object { -not $_.IsCompliant } $isCompliant = ($nonCompliant.Count -eq 0) $details = if ($isCompliant) { "Alle gevonden Azure-abonnementen hebben Network Watcher correct geconfigureerd met NSG Flow Logs die voldoen aan de compliance-vereisten." } else { "Een of meer Azure-abonnementen missen Network Watcher of hebben NSG Flow Logs die niet voldoen aan de minimale compliance-eisen." } $recommendations = @() if (-not $isCompliant) { $recommendations += "Schakel Network Watcher in voor alle Azure-regio's waar virtuele netwerken actief zijn." $recommendations += "Configureer NSG Flow Logs voor alle kritieke Network Security Groups." $recommendations += "Configureer retentieperiode van minimaal $MinimumRetentionDays dagen voor NSG Flow Logs voor compliance." $recommendations += "Schakel Traffic Analytics in voor AI-gestuurde threat detection." $recommendations += "Configureer Connection Monitor voor proactieve connectiviteitscontrole." $recommendations += "Documenteer Network Watcher-architectuur en NSG Flow Log-configuraties in het governance-register." } return [PSCustomObject]@{ ScriptName = "network-watcher-configured" IsCompliant = $isCompliant Timestamp = Get-Date Details = $details Recommendations = $recommendations Subscriptions = $subscriptions } } function Invoke-Monitoring { <# .SYNOPSIS Monitors and reports current configuration status .DESCRIPTION Checks current configuration against security baseline requirements. Reports compliance status and identifies non-compliant settings. .OUTPUTS Returns hashtable with: - isCompliant: Boolean indicating overall compliance - details: Detailed findings - subscriptions: Array of subscription status objects #> [CmdletBinding()] param() try { Write-Host "`nMonitoring: $PolicyName" -ForegroundColor Yellow Write-Host "Beschrijving: $PolicyDescription" -ForegroundColor Yellow Write-Host "==============================================================" -ForegroundColor Yellow $result = Test-Compliance $subscriptions = $result.Subscriptions if ($subscriptions.Count -gt 0) { Write-Host "`nGevonden Azure-abonnementen:" -ForegroundColor Cyan foreach ($subscription in $subscriptions) { $statusColor = if ($subscription.IsCompliant) { "Green" } else { "Red" } $statusText = "Network Watchers: $($subscription.TotalWatchers), " + "NSG's: $($subscription.TotalNSGs), " + "Flow Logs: $($subscription.EnabledFlowLogs)" Write-Host ("- {0} - {1}" -f $subscription.SubscriptionName, $statusText) -ForegroundColor $statusColor if ($subscription.Watchers.Count -gt 0) { foreach ($watcher in $subscription.Watchers) { Write-Host (" └─ Network Watcher: {0} ({1})" -f $watcher.Name, $watcher.Location) -ForegroundColor Green } } if ($subscription.ComplianceIssues.Count -gt 0) { foreach ($issue in $subscription.ComplianceIssues) { Write-Host (" ⚠ {0}" -f $issue) -ForegroundColor Yellow } } } } else { Write-Host "`nGeen Azure-abonnementen gevonden in de huidige scope." -ForegroundColor Cyan } Write-Host "`n========================================" -ForegroundColor Cyan Write-Host "SUMMARY:" -ForegroundColor Cyan Write-Host " Totaal abonnementen: $($subscriptions.Count)" -ForegroundColor White Write-Host " Met Network Watcher: $(($subscriptions | Where-Object { $_.HasWatcher }).Count)" -ForegroundColor White Write-Host " Compliant: $(($subscriptions | Where-Object { $_.IsCompliant }).Count)" -ForegroundColor White if ($result.IsCompliant) { Write-Host "`n[OK] COMPLIANT" -ForegroundColor Green Write-Host "Alle Azure-abonnementen voldoen aan de basisvoorwaarden voor Network Watcher-configuratie." -ForegroundColor Green } else { Write-Host "`n[FAIL] NON-COMPLIANT" -ForegroundColor Red Write-Host "Eén of meer Azure-abonnementen missen Network Watcher of hebben configuraties die niet voldoen aan de vereisten." -ForegroundColor Red Write-Host "`nAanbevolen acties:" -ForegroundColor Yellow foreach ($rec in $result.Recommendations) { Write-Host (" - {0}" -f $rec) -ForegroundColor Yellow } } return $result } catch { Write-Host "`n[FAIL] ERROR during monitoring: $_" -ForegroundColor Red throw } } function Invoke-Remediation { <# .SYNOPSIS Applies recommended security configuration .DESCRIPTION Genereert een overzicht van Azure-abonnementen zonder Network Watcher en aanbevelingen voor herstel. In plaats van automatisch configuraties aan te passen, markeert het script abonnementen zonder Network Watcher en geeft gerichte aanbevelingen om netwerkmonitoring te herstellen. .PARAMETER WhatIf Shows what would be changed without making actual changes #> [CmdletBinding(SupportsShouldProcess)] param() try { Write-Host "`nRemediatie: $PolicyName" -ForegroundColor Yellow Write-Host "==============================================================" -ForegroundColor Yellow $result = Test-Compliance $subscriptions = $result.Subscriptions | Where-Object { -not $_.IsCompliant } if (-not $subscriptions -or $subscriptions.Count -eq 0) { Write-Host "Alle Azure-abonnementen beschikken over Network Watcher-configuraties die voldoen aan de vereisten. Geen remediatie nodig." -ForegroundColor Green return $result } Write-Host "`nNiet-conforme Azure-abonnementen:" -ForegroundColor Red foreach ($subscription in $subscriptions) { Write-Host ("- Abonnement: {0}" -f $subscription.SubscriptionName) -ForegroundColor Red Write-Host (" Network Watchers: {0}" -f $subscription.TotalWatchers) -ForegroundColor Red Write-Host (" NSG's: {0}" -f $subscription.TotalNSGs) -ForegroundColor Red Write-Host (" Flow Logs: {0}" -f $subscription.EnabledFlowLogs) -ForegroundColor Red if ($subscription.TotalWatchers -eq 0) { Write-Host (" ⚠ Geen Network Watcher gevonden" -ForegroundColor Yellow) } else { if ($subscription.ComplianceIssues.Count -gt 0) { foreach ($issue in $subscription.ComplianceIssues) { Write-Host (" ⚠ {0}" -f $issue) -ForegroundColor Yellow } } } Write-Host "" } Write-Host "Aanbevolen vervolgstappen:" -ForegroundColor Yellow Write-Host "1. Schakel Network Watcher in voor alle Azure-regio's waar virtuele netwerken actief zijn via Azure Portal of PowerShell." -ForegroundColor Yellow Write-Host "2. Configureer NSG Flow Logs voor alle kritieke Network Security Groups via Network Watcher → NSG Flow Logs." -ForegroundColor Yellow Write-Host "3. Configureer retentieperiode van minimaal $MinimumRetentionDays dagen voor NSG Flow Logs voor compliance-vereisten." -ForegroundColor Yellow Write-Host "4. Schakel Traffic Analytics in via Network Watcher → Traffic Analytics voor AI-gestuurde threat detection." -ForegroundColor Yellow Write-Host "5. Configureer Connection Monitor voor proactieve connectiviteitscontrole tussen kritieke resources." -ForegroundColor Yellow Write-Host "6. Verifieer dat alle geconfigureerde NSG Flow Logs daadwerkelijk data genereren via Log Analytics queries." -ForegroundColor Yellow Write-Host "7. Documenteer Network Watcher-architectuur, NSG Flow Log-configuraties en monitoring procedures in het governance-register." -ForegroundColor Yellow if ($WhatIf) { Write-Host "`nWhatIf is ingeschakeld: er worden geen wijzigingen doorgevoerd; alleen een rapport is gegenereerd." -ForegroundColor Cyan } else { Write-Host "`nNOTE: Dit script genereert alleen een rapport. Configureer Network Watcher handmatig via Azure Portal of gebruik infrastructuur-as-code (ARM/Bicep/Terraform) voor definitieve configuratie." -ForegroundColor Cyan } return $result } catch { Write-Host "`n[FAIL] ERROR during remediation: $_" -ForegroundColor Red throw } } function Invoke-Revert { <# .SYNOPSIS Reverts configuration to previous state .DESCRIPTION Reverts changes made by remediation to restore previous configuration. Voor Network Watcher is revert niet aanbevolen omdat dit beveiligingsrisico's introduceert. #> [CmdletBinding(SupportsShouldProcess)] param() try { Write-Host "`nRevert:" -ForegroundColor Yellow Write-Host "WARNING: Het verwijderen van Network Watcher-configuraties is een SECURITY RISK!" -ForegroundColor Red Write-Host "Dit zal netwerkmonitoring en incidentdetectie belemmeren.`n" -ForegroundColor Red Write-Host "Dit script ondersteunt geen automatische revert van Network Watcher-configuratie." -ForegroundColor Yellow Write-Host "Als revert noodzakelijk is, verwijder dan handmatig Network Watcher-configuraties via Azure Portal." -ForegroundColor Yellow Write-Host "Houd er rekening mee dat dit kan leiden tot niet-naleving van compliance-vereisten." -ForegroundColor Yellow } catch { Write-Host "`n[FAIL] ERROR during revert: $_" -ForegroundColor Red throw } } # ============================================================================ # MAIN EXECUTION # ============================================================================ try { Connect-RequiredServices # Determine which action to perform if ($Revert) { if ($WhatIf) { Write-Host "WhatIf: Would revert configuration" -ForegroundColor Yellow } else { Invoke-Revert } } elseif ($Remediation) { if ($WhatIf) { Write-Host "WhatIf: Would apply remediation" -ForegroundColor Yellow } else { Invoke-Remediation } } elseif ($Monitoring) { $result = Invoke-Monitoring # Exit with appropriate code for automation if ($result.IsCompliant) { exit 0 # Success - Compliant } else { exit 1 # Warning - Non-compliant } } else { # No parameters - show usage Write-Host "Available parameters:" -ForegroundColor Yellow Write-Host " -Monitoring : Check current configuration status" -ForegroundColor Gray Write-Host " -Remediation : Generate report and recommendations" -ForegroundColor Gray Write-Host " -Revert : Revert to previous configuration (NOT RECOMMENDED!)" -ForegroundColor Gray Write-Host " -WhatIf : Preview changes without applying" -ForegroundColor Gray Write-Host "`nExample: .\network-watcher-configured.ps1 -Monitoring" -ForegroundColor Cyan } } catch { Write-Error "Script execution failed: $_" exit 2 # Error } finally { Write-Host "`n========================================`n" -ForegroundColor Cyan } # ============================================================================ # EXIT CODES # ============================================================================ # 0 = Success / Compliant # 1 = Warning / Non-compliant # 2 = Error / Execution failed

Risico zonder implementatie

Risico zonder implementatie
High: Zonder goed geconfigureerde Azure Network Watcher blijven kritieke netwerkbeveiligings- en connectiviteitsincidenten onzichtbaar, worden compliance-vereisten niet nageleefd, en kan de organisatie richting toezichthouders niet aantonen dat netwerkmonitoring op orde is. Dit vergroot de kans op langdurige uitval, gegevensverlies, reputatieschade en non-compliance met BIO, ISO 27001 en NIS2.

Management Samenvatting

Richt Azure Network Watcher in met juiste NSG Flow Log-configuraties, Traffic Analytics en Connection Monitor-instellingen die afgestemd zijn op compliance-vereisten. Automatiseer de uitrol en inventarisatie van Network Watcher-configuraties met PowerShell en Infrastructure as Code, gebruik network-watcher-configured.ps1 om de inrichting periodiek te toetsen en verbeter deze op basis van incidenten en audits. Zo borgt u dat relevante netwerkgebeurtenissen tijdig worden gedetecteerd, opgeslagen en geanalyseerd, en dat netwerkmonitoring aantoonbaar wordt gemaakt richting bestuur en toezichthouders.