Log Analytics Workspaces: Multi-Workspace Governance En Consolidatiestrategieën

💼 Management Samenvatting

In grote Azure-omgevingen met meerdere abonnementen, resourcegroepen en workloads ontstaan vaak tientallen of zelfs honderden Log Analytics workspaces zonder centrale governance. Deze gefragmenteerde aanpak leidt tot inconsistente retentie-instellingen, onbeheersbare kosten, compliance-risico's en het onvermogen om correlaties te leggen tussen gebeurtenissen in verschillende workloads. Een gestructureerde multi-workspace strategie met duidelijke governance-principes vormt de basis voor effectieve monitoring, compliance en kostenbeheersing.

Aanbeveling
IMPLEMENT
Risico zonder
High
Risk Score
9/10
Implementatie
60u (tech: 40u)
Van toepassing op:
Azure
Multi-abonnement omgevingen
Enterprise organisaties

Zonder een doordachte multi-workspace governance-strategie zien we in de praktijk dat organisaties ad-hoc workspaces aanmaken voor elk nieuw project of abonnement, waardoor na verloop van tijd tientallen of honderden workspaces ontstaan zonder centrale regie. Deze fragmentatie leidt tot aanzienlijke problemen: retentie-instellingen verschillen per workspace waardoor compliance-vereisten niet consistent worden nageleefd, kosten lopen onbeheersbaar op doordat data dubbel wordt verzameld en opgeslagen, diagnostische instellingen worden niet consistent geconfigureerd waardoor belangrijke logdata ontbreekt, en het is onmogelijk om correlaties te leggen tussen gebeurtenissen in verschillende workloads omdat data verspreid staat over tientallen workspaces. Bovendien ontbreekt vaak een centraal overzicht van welke workspaces actief zijn, wie eigenaar is van elke workspace, welke retentie-instellingen zijn geconfigureerd en hoe workspaces zijn gekoppeld aan compliance-frameworks zoals de BIO, ISO 27001 en NIS2. Deze situatie maakt het onmogelijk om richting bestuurders en auditors aan te tonen dat logging en monitoring op orde zijn, en leidt tot compliance-risico's, onnodige kosten en verminderde zichtbaarheid op beveiligingsincidenten.

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

Implementatie

Dit artikel beschrijft een gestructureerde aanpak voor het beheren van meerdere Log Analytics workspaces binnen de Nederlandse Baseline voor Veilige Cloud. We behandelen architectuurkeuzes zoals de inrichting van een hiërarchische workspace-structuur met centrale security workspaces en gedecentraliseerde operationele workspaces, consolidatiestrategieën voor het samenvoegen van overbodige workspaces, governance-principes voor naamgeving, tagging en eigenaarschap, implementatie van Azure Policy voor automatische enforcement van workspace-configuraties, afstemming van retentie-instellingen op compliance-frameworks zoals de Archiefwet, BIO en ISO 27001, en inrichting van role-based access control voor scheiding van ontwikkel- en beheertaken. Daarnaast gaan we in op het beheren van workspaces via Infrastructure as Code, configuratie van data-export naar SIEM-systemen en externe opslag voor langetermijnbewaring, implementatie van kostenbeheersing door middel van data-cap en ingestiebeperkingen, en het opzetten van periodieke reviewcycli voor workspace-governance. Het artikel sluit af met praktische richtlijnen voor consolidatie van bestaande workspaces en toont hoe het bijbehorende PowerShell-script log-analytics-workspaces.ps1 kan worden gebruikt om alle workspaces te inventariseren, compliance te monitoren en governance te verbeteren.

Multi-Workspace Architectuur en Ontwerpprincipes

Een effectieve multi-workspace strategie begint bij het maken van bewuste keuzes over wanneer een nieuwe workspace nodig is en wanneer bestaande workspaces kunnen worden hergebruikt. In tegenstelling tot de verleiding om voor elk project of abonnement een aparte workspace aan te maken, adviseren we een hiërarchische workspace-architectuur waarbij workspaces worden gegroepeerd op basis van organisatorische grenzen, compliance-vereisten en geografische locatie. Voor Nederlandse overheidsorganisaties betekent dit vaak: één centrale security workspace voor alle beveiligings- en auditlogs die langdurig worden bewaard voor compliance-doeleinden, één workspace per omgeving (productie, acceptatie, ontwikkeling) voor operationele monitoring, en eventueel één workspace per organisatorische eenheid of business unit voor specifieke workloads. Deze structuur maakt het mogelijk om retentie-instellingen per workspace af te stemmen op compliance-vereisten: security workspaces kunnen bijvoorbeeld zeven jaar worden bewaard voor auditdoeleinden, terwijl ontwikkelomgevingen na negentig dagen kunnen worden verwijderd om kosten te besparen. Een veelgemaakte fout is om voor elke resource of applicatie een aparte workspace aan te maken. Dit leidt tot gefragmenteerde monitoring, hogere kosten door duplicate data-inname en het onvermogen om correlaties te leggen tussen gebeurtenissen in verschillende workloads. Daarom is het verstandig om workspaces te groeperen op basis van organisatorische grenzen, compliance-vereisten en geografische locatie. Voor een middelgrote overheidsorganisatie kan dit bijvoorbeeld betekenen: één centrale workspace voor alle productie-Azure-resources, één workspace voor hybride servers en on-premises workloads, en één workspace voor security-specifieke logs die worden geëxporteerd naar een SIEM-systeem. Binnen elke workspace configureert u vervolgens tabellen met passende retentie-instellingen: auditlogs en security events kunnen lang worden bewaard, terwijl performance metrics en verbose application logs kortere retentieperioden krijgen. Naast workspace-architectuur is het cruciaal om diagnostische instellingen consistent te configureren voor alle kritieke Azure-resources. Diagnostische instellingen bepalen welke platformlogs en metrische data worden verzameld en waar deze naartoe worden gestuurd. Voor resources zoals Virtual Machines, Storage Accounts, Key Vaults en Azure AD moet u expliciet configureren dat auditlogs, security events en operationele logs worden doorgestuurd naar de juiste Log Analytics workspace. Zonder deze configuratie blijven belangrijke gebeurtenissen zoals mislukte authenticatiepogingen, wijzigingen in beveiligingsinstellingen en prestatieproblemen onzichtbaar, waardoor incidenten te laat worden gedetecteerd en compliance-vereisten niet worden nageleefd. Het PowerShell-script log-analytics-workspaces.ps1 sluit hierbij aan door te controleren of diagnostische instellingen aanwezig zijn op alle resources die als kritiek zijn gemarkeerd, en door te rapporteren welke resources nog niet correct zijn geïnstrumenteerd.

Workspace Governance: Naamgeving, Tagging en Eigenaarschap

Effectieve governance van meerdere Log Analytics workspaces vereist duidelijke standaarden voor naamgeving, tagging en eigenaarschap. Zonder deze standaarden ontstaan na verloop van tijd workspaces met inconsistente namen, ontbrekende tags en onduidelijk eigenaarschap, waardoor het onmogelijk wordt om te bepalen welke workspaces actief zijn, wie verantwoordelijk is voor elke workspace en hoe workspaces zijn gekoppeld aan compliance-frameworks. Voor Nederlandse overheidsorganisaties adviseren we een naamgevingsconventie die informatie bevat over de omgeving (bijvoorbeeld prod, acc, dev), het doel (security, operations, compliance) en eventueel de organisatorische eenheid. Een voorbeeld van een goede naamgeving is: law-prod-security-we, waarbij law staat voor Log Analytics Workspace, prod voor productie, security voor het doel en we voor de organisatorische eenheid. Naast naamgeving is tagging essentieel voor governance en kostenbeheersing. Elke workspace moet minimaal de volgende tags bevatten: Environment (prod, acc, dev), Owner (e-mailadres of teamnaam van de eigenaar), InformationClassification (bijvoorbeeld Public, Internal, Confidential, Secret), ComplianceFramework (bijvoorbeeld BIO, ISO27001, NIS2), en RetentionPeriod (bijvoorbeeld 90d, 1y, 7y). Deze tags maken het mogelijk om workspaces te filteren en te groeperen voor rapportage, kostenallocatie en compliance-audits. Het PowerShell-script log-analytics-workspaces.ps1 controleert of alle vereiste tags aanwezig zijn en rapporteert welke workspaces ontbrekende of inconsistente tags hebben. Eigenaarschap is cruciaal voor governance omdat elke workspace een duidelijke eigenaar moet hebben die verantwoordelijk is voor het beheer van de bijbehorende configuraties, het monitoren van kosten en het waarborgen van compliance. 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 workspace-configuraties altijd via het changeproces lopen en dat bij ingrijpende wijzigingen – bijvoorbeeld het wijzigen van retentie-instellingen voor auditlogs – expliciet akkoord van compliance of security nodig is.

Gebruik PowerShell-script log-analytics-workspaces.ps1 (functie Invoke-Monitoring) – Voert een tenant-brede inventarisatie uit van alle Log Analytics workspaces, controleert compliance met governance-standaarden en rapporteert inconsistente configuraties..

Consolidatiestrategieën en Workspace Rationalisatie

In bestaande Azure-omgevingen zien we vaak dat organisaties tientallen of zelfs honderden workspaces hebben zonder duidelijke structuur of governance. Deze fragmentatie leidt tot aanzienlijke problemen: inconsistente retentie-instellingen, onbeheersbare kosten, compliance-risico's en het onvermogen om correlaties te leggen tussen gebeurtenissen in verschillende workloads. Consolidatie van workspaces is daarom essentieel voor het verbeteren van governance, kostenbeheersing en compliance. Het consolidatieproces begint bij een grondige inventarisatie van alle bestaande workspaces, waarbij wordt geanalyseerd welke workspaces actief zijn, welke data wordt verzameld, welke retentie-instellingen zijn geconfigureerd en hoe workspaces zijn gekoppeld aan resources en diagnostische instellingen. Het PowerShell-script log-analytics-workspaces.ps1 kan hierbij helpen door een complete inventarisatie te genereren van alle workspaces in alle abonnementen, inclusief configuratiegegevens, retentie-instellingen, tags en koppelingen aan resources. Op basis van deze inventarisatie kunt u een consolidatieplan opstellen dat identificeert welke workspaces kunnen worden samengevoegd, welke workspaces overbodig zijn geworden en welke workspaces moeten worden behouden. Bij het samenvoegen van workspaces is het belangrijk om te realiseren dat data uit verschillende workspaces niet automatisch kan worden samengevoegd: u moet diagnostische instellingen en agents herconfigureren om data naar de nieuwe workspace te sturen, en bestaande data in de oude workspace blijft beschikbaar totdat de retentieperiode is verstreken. Een praktische aanpak voor consolidatie is om te beginnen met het identificeren van workspaces die weinig of geen data genereren, workspaces zonder duidelijke eigenaar, en workspaces met inconsistente of ontbrekende tags. Deze workspaces zijn vaak kandidaten voor consolidatie of verwijdering. Vervolgens kunt u workspaces groeperen op basis van omgeving, organisatorische eenheid of compliance-vereisten, en een plan opstellen voor het samenvoegen van gerelateerde workspaces. Het is belangrijk om dit proces zorgvuldig te plannen en te testen, omdat wijzigingen in workspace-configuraties impact kunnen hebben op bestaande queries, dashboards en alertregels die afhankelijk zijn van specifieke workspaces.

Azure Policy Enforcement voor Workspace Governance

Azure Policy biedt krachtige mogelijkheden voor het automatisch enforceen van governance-standaarden voor Log Analytics workspaces. In plaats van handmatig te controleren of workspaces voldoen aan naamgevingsconventies, tagging-vereisten en retentie-instellingen, kunnen organisaties Azure Policy gebruiken om automatisch te controleren of nieuwe workspaces voldoen aan deze standaarden en om bestaande workspaces te herstellen naar compliant configuraties. Voor Nederlandse overheidsorganisaties adviseren we het implementeren van policies die vereisen dat alle workspaces minimaal de volgende tags bevatten: Environment, Owner, InformationClassification, ComplianceFramework en RetentionPeriod. Daarnaast kunnen policies worden geconfigureerd om te vereisen dat productieworkspaces een minimale retentieperiode van 365 dagen hebben, en dat security workspaces een retentieperiode van zeven jaar hebben conform de Archiefwet. Het PowerShell-script log-analytics-workspaces.ps1 kan worden gebruikt om te controleren of Azure Policies correct zijn geconfigureerd en of workspaces voldoen aan policy-vereisten. Het script rapporteert welke workspaces non-compliant zijn en kan, indien gewenst, voorstellen doen voor het herstellen van non-compliant configuraties. Daarnaast kan het script worden gebruikt om periodiek te controleren of nieuwe workspaces voldoen aan governance-standaarden en om waarschuwingen te genereren wanneer non-compliant workspaces worden gedetecteerd.

Gebruik PowerShell-script log-analytics-workspaces.ps1 (functie Invoke-Remediation) – Ondersteunt verbetering van workspace-governance door non-compliant workspaces te identificeren en – indien gewenst – standaard-configuraties en tags toe te passen..

Kostenbeheersing in Multi-Workspace Omgevingen

Azure Monitor kan aanzienlijke kosten genereren wanneer logdata onbeperkt wordt verzameld zonder strategie voor kostenbeheersing, vooral in omgevingen met meerdere workspaces. Voor Nederlandse overheidsorganisaties is het daarom essentieel om expliciete retentie-instellingen te configureren die balanceren tussen compliance-vereisten en kostenoptimalisatie, en om data-inname te monitoren en te beheren over alle workspaces heen. De Archiefwet vereist bijvoorbeeld dat bepaalde categorieën administratieve gegevens langdurig worden bewaard, terwijl de AVG stelt dat persoonsgegevens niet langer mogen worden bewaard dan noodzakelijk. Azure Monitor biedt flexibele mogelijkheden om deze tegenstrijdige eisen op te lossen door per tabel of per workspace verschillende retentieperioden te configureren. Voor auditlogs en security events die relevant zijn voor compliance-audits adviseren we een retentieperiode van minimaal 365 dagen, en voor kritieke beveiligingsgebeurtenissen zelfs zeven jaar conform de Archiefwet. Voor performance metrics en verbose application logs kan een kortere retentieperiode van 30 tot 90 dagen volstaan, omdat deze data primair wordt gebruikt voor operationele troubleshooting en niet voor langetermijn-auditdoeleinden. Daarnaast biedt Azure Monitor de mogelijkheid om data te exporteren naar externe opslag zoals Azure Blob Storage of een SIEM-systeem voor langetermijnbewaring, waardoor u kosten kunt besparen door korte retentie in Log Analytics te combineren met langetermijnopslag elders. Kostenbeheersing gaat verder dan alleen retentie-instellingen. Azure Monitor biedt verschillende mechanismen om data-inname te beperken, zoals data-cap instellingen die automatisch data-inname stoppen wanneer een maandelijks limiet wordt bereikt, en ingestiebeperkingen die voorkomen dat overmatige logging leidt tot onverwachte kosten. Voor productieomgevingen is het verstandig om data-cap in te stellen op basis van historische verbruikspatronen, maar wel met een buffer voor onverwachte pieken tijdens incidenten. Het PowerShell-script log-analytics-workspaces.ps1 kan hier input voor leveren door te rapporteren welke workspaces het meeste data verbruiken, welke tabellen de grootste volumes genereren en of data-cap instellingen actief zijn.

Compliance, Audit en Bewijsvoering in Multi-Workspace Omgevingen

Multi-workspace 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 logging is ingericht, maar ook hoe de organisatie waarborgt dat relevante gebeurtenissen tijdig worden gesignaleerd, opgeslagen en geanalyseerd over alle workspaces heen. Tijdens audits worden bijvoorbeeld vragen gesteld als: hoe weet u dat alle kritieke resources correct zijn geïnstrumenteerd? Hoe borgt u dat auditlogs lang genoeg worden bewaard voor compliance-vereisten? En hoe voorkomt u dat wijzigingen in architectuur leiden tot verlies van monitoring-capaciteiten? Een goed gedocumenteerde multi-workspace architectuur, gecombineerd met aantoonbare reviewcycli en scriptgestuurde controles, vormt het antwoord op deze vragen. Voor de BIO sluiten multi-workspace configuraties vooral aan bij de normen rond logging, monitoring en incidentrespons. Door in het informatiebeveiligingsbeleid expliciet op te nemen dat kritieke processen ondersteund worden door Log Analytics workspaces met gedefinieerde retentie-instellingen en diagnostische instellingen, en door de concrete invulling te documenteren per workload, kan de organisatie richting ENSIA-auditors onderbouwen dat monitoring structureel is ingericht. Het PowerShell-script log-analytics-workspaces.ps1 levert daarbij concreet auditbewijs in de vorm van exports die tonen welke workspaces actief zijn, welke retentie-instellingen zijn geconfigureerd, welke resources diagnostische instellingen hebben 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 monitoring-data voor incidentdetectie. Voor ISO 27001 en NIS2 is vooral van belang dat er een aantoonbare PDCA-cyclus (Plan-Do-Check-Act) bestaat rondom monitoring en observability. Het plan-niveau wordt ingevuld via architectuur- en beleidsdocumenten, de do-fase via implementatie van Log Analytics workspaces en diagnostische instellingen, 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 monitoring een dreiging vroegtijdig signaleerde, of een oefening waarin het gebruik van Log Analytics voor forensisch onderzoek is getest – ontstaat een overtuigend beeld van volwassen monitoring. Het gebruik van log-analytics-workspaces.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 workspace-configuraties op niveau te houden.

Gebruik PowerShell-script log-analytics-workspaces.ps1 (functie Invoke-Revert) – Biedt waar nodig een gecontroleerd mechanisme om test- of tijdelijke workspace-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 Inventariseert en beoordeelt alle Log Analytics workspaces in een multi-abonnement omgeving voor governance en compliance. .DESCRIPTION Dit script leest per abonnement alle Log Analytics workspaces uit en beoordeelt of deze voldoen aan governance-standaarden voor naamgeving, tagging, retentie-instellingen en eigenaarschap. De nadruk ligt op: - Inventarisatie van alle workspaces in alle abonnementen - Controle van governance-standaarden (tags, naamgeving, retentie) - Identificatie van inconsistente configuraties en overbodige workspaces - Rapportage van compliance-status en voorgestelde verbeteracties Met de parameter -Monitoring wordt een samenvattend compliance-overzicht getoond. Met -Remediation worden voorstellen gedaan voor standaard-configuraties en kan, indien gewenst, governance-tags en configuraties worden toegepast op non-compliant workspaces. .NOTES Filename: log-analytics-workspaces.ps1 Author: Nederlandse Baseline voor Veilige Cloud Version: 1.0 Related JSON: content/azure/monitoring/log-analytics-workspaces.json Category: monitoring Workload: azure .LINK https://github.com/m365-tenant-best-practise .EXAMPLE .\log-analytics-workspaces.ps1 -Monitoring Controleert alle Log Analytics workspaces en rapporteert de compliance-status. .EXAMPLE .\log-analytics-workspaces.ps1 -Remediation -WhatIf Toont welke governance-configuraties zouden worden toegepast op non-compliant workspaces. .EXAMPLE .\log-analytics-workspaces.ps1 -Remediation Past governance-configuraties toe op non-compliant workspaces. #> #Requires -Version 5.1 #Requires -Modules Az.Accounts, Az.OperationalInsights, Az.Resources [CmdletBinding()] param( [Parameter(HelpMessage = "Monitor current workspace configuration status")] [switch]$Monitoring, [Parameter(HelpMessage = "Apply recommended governance configuration")] [switch]$Remediation, [Parameter(HelpMessage = "Revert to previous configuration")] [switch]$Revert, [Parameter(HelpMessage = "Show what would happen without making changes")] [switch]$WhatIf ) $ErrorActionPreference = 'Stop' # ============================================================================ # HELPER: CONNECTIEBEHEER # ============================================================================ function Get-AzContextOrWarning { <# .SYNOPSIS Zorgt voor een geldige Azure-context zonder interactieve prompts. .DESCRIPTION In omgevingen zonder vooraf ingestelde context geeft deze functie een duidelijke waarschuwing en retourneert $null. Dit voorkomt dat scripts blijven hangen op interactieve logins in geautomatiseerde pipelines. #> [CmdletBinding()] param() $ctx = Get-AzContext -ErrorAction SilentlyContinue if (-not $ctx) { Write-Warning "Geen actieve Azure-context gevonden. Meld u vooraf aan met 'Connect-AzAccount' (bij voorkeur non-interactief, bijvoorbeeld via managed identity of service principal)." return $null } return $ctx } # ============================================================================ # FUNCTIONS # ============================================================================ function Test-Compliance { <# .SYNOPSIS Tests if current configuration meets compliance requirements .DESCRIPTION Wrapper function that calls Invoke-Monitoring and returns compliance status .OUTPUTS Returns monitoring result object with isCompliant property #> [CmdletBinding()] param() return Invoke-Monitoring } function Invoke-Monitoring { <# .SYNOPSIS Monitors and reports current Log Analytics workspace governance status across all subscriptions .DESCRIPTION Controleert per abonnement alle Log Analytics workspaces op: - Aanwezigheid van vereiste tags (Environment, Owner, InformationClassification, ComplianceFramework, RetentionPeriod) - Retentie-instellingen (minimum 90 dagen voor compliance) - Naamgevingsconventies - Eigenaarschap en governance .OUTPUTS Hashtable met: - isCompliant: Boolean - timestamp: Datum/tijd - findings: Lijst met tekstuele bevindingen - summary: Overzicht met aantallen workspaces en kritieke afwijkingen - workspaces: Gedetailleerde lijst van alle workspaces met hun configuratie #> [CmdletBinding()] param() try { Write-Host "`nMonitoring Log Analytics workspaces in alle abonnementen..." -ForegroundColor Yellow $ctx = Get-AzContextOrWarning if (-not $ctx) { return @{ isCompliant = $false timestamp = Get-Date findings = @("Geen Azure-context beschikbaar; voer Connect-AzAccount uit voordat u deze controle draait.") summary = @{ SubscriptionsChecked = 0 WorkspacesFound = 0 WorkspacesCompliant = 0 WorkspacesNonCompliant = 0 WorkspacesWithoutTags = 0 WorkspacesWithoutRetention = 0 } workspaces = @() } } $result = @{ isCompliant = $true timestamp = Get-Date findings = @() summary = @{ SubscriptionsChecked = 0 WorkspacesFound = 0 WorkspacesCompliant = 0 WorkspacesNonCompliant = 0 WorkspacesWithoutTags = 0 WorkspacesWithoutRetention = 0 } workspaces = @() } $subscriptions = Get-AzSubscription -ErrorAction Stop foreach ($sub in $subscriptions) { Set-AzContext -SubscriptionId $sub.Id -ErrorAction Stop | Out-Null $result.summary.SubscriptionsChecked++ Write-Host "`nAbonnement: $($sub.Name) [$($sub.Id)]" -ForegroundColor Cyan # Haal alle Log Analytics workspaces op $workspaces = Get-AzOperationalInsightsWorkspace -ErrorAction SilentlyContinue foreach ($ws in $workspaces) { $result.summary.WorkspacesFound++ $workspaceCompliant = $true $workspaceFindings = @() Write-Host " Controleren workspace: $($ws.Name)" -ForegroundColor White # Controleer retentie-instellingen (minimum 90 dagen voor compliance) $retentionDays = $ws.RetentionInDays if (-not $retentionDays -or $retentionDays -lt 90) { $workspaceCompliant = $false $result.isCompliant = $false $result.summary.WorkspacesWithoutRetention++ $msg = "Workspace '$($ws.Name)' in abonnement '$($sub.Name)' heeft geen of onvoldoende retentie-instelling (huidig: $retentionDays dagen, minimum: 90 dagen)." $workspaceFindings += $msg $result.findings += $msg Write-Host " [FAIL] $msg" -ForegroundColor Red } else { Write-Host " [OK] Retentie: $retentionDays dagen" -ForegroundColor Green } # Controleer vereiste tags $requiredTags = @("Environment", "Owner", "InformationClassification") $recommendedTags = @("ComplianceFramework", "RetentionPeriod") $missingRequiredTags = @() $missingRecommendedTags = @() foreach ($tag in $requiredTags) { if (-not $ws.Tags -or -not $ws.Tags.ContainsKey($tag)) { $missingRequiredTags += $tag } } foreach ($tag in $recommendedTags) { if (-not $ws.Tags -or -not $ws.Tags.ContainsKey($tag)) { $missingRecommendedTags += $tag } } if ($missingRequiredTags.Count -gt 0) { $workspaceCompliant = $false $result.isCompliant = $false $result.summary.WorkspacesWithoutTags++ $msg = "Workspace '$($ws.Name)' in abonnement '$($sub.Name)' mist vereiste tags: $($missingRequiredTags -join ', ')." $workspaceFindings += $msg $result.findings += $msg Write-Host " [FAIL] $msg" -ForegroundColor Red } elseif ($missingRecommendedTags.Count -gt 0) { $msg = "Workspace '$($ws.Name)' in abonnement '$($sub.Name)' mist aanbevolen tags: $($missingRecommendedTags -join ', ')." $workspaceFindings += $msg $result.findings += $msg Write-Host " [WARN] $msg" -ForegroundColor Yellow } else { Write-Host " [OK] Alle vereiste tags aanwezig" -ForegroundColor Green } # Voeg workspace toe aan resultaat $workspaceInfo = @{ SubscriptionId = $sub.Id SubscriptionName = $sub.Name WorkspaceName = $ws.Name WorkspaceId = $ws.ResourceId ResourceGroup = $ws.ResourceGroupName Location = $ws.Location RetentionDays = $retentionDays Tags = $ws.Tags IsCompliant = $workspaceCompliant Findings = $workspaceFindings } $result.workspaces += $workspaceInfo if ($workspaceCompliant) { $result.summary.WorkspacesCompliant++ } else { $result.summary.WorkspacesNonCompliant++ } } if ($workspaces.Count -eq 0) { Write-Host " [INFO] Geen Log Analytics workspaces gevonden in dit abonnement." -ForegroundColor Gray } } Write-Host "`n========================================" -ForegroundColor Cyan Write-Host "SAMENVATTING LOG ANALYTICS WORKSPACES" -ForegroundColor Cyan Write-Host (" Abonnementen gecontroleerd : {0}" -f $result.summary.SubscriptionsChecked) -ForegroundColor White Write-Host (" Workspaces gevonden : {0}" -f $result.summary.WorkspacesFound) -ForegroundColor White Write-Host (" Workspaces compliant : {0}" -f $result.summary.WorkspacesCompliant) -ForegroundColor Green Write-Host (" Workspaces non-compliant : {0}" -f $result.summary.WorkspacesNonCompliant) -ForegroundColor $(if ($result.summary.WorkspacesNonCompliant -gt 0) { 'Red' } else { 'Green' }) Write-Host (" Workspaces zonder retentie : {0}" -f $result.summary.WorkspacesWithoutRetention) -ForegroundColor $(if ($result.summary.WorkspacesWithoutRetention -gt 0) { 'Yellow' } else { 'Green' }) Write-Host (" Workspaces zonder vereiste tags : {0}" -f $result.summary.WorkspacesWithoutTags) -ForegroundColor $(if ($result.summary.WorkspacesWithoutTags -gt 0) { 'Yellow' } else { 'Green' }) if ($result.isCompliant) { Write-Host "`n[OK] COMPLIANT: Alle Log Analytics workspaces voldoen aan governance-standaarden." -ForegroundColor Green } else { Write-Host "`n[FAIL] NON-COMPLIANT: Zie bevindingen voor ontbrekende configuraties." -ForegroundColor Red } return $result } catch { Write-Host "`n[FAIL] ERROR tijdens monitoring: $_" -ForegroundColor Red throw } } function Invoke-Remediation { <# .SYNOPSIS Biedt ondersteuning bij het toepassen van governance-configuraties op non-compliant workspaces. .DESCRIPTION Identificeert non-compliant workspaces en kan, indien bevestigd, standaard tags en configuraties toepassen. Gebruik bij voorkeur -WhatIf om de impact te beoordelen. .PARAMETER WhatIf Shows what would be changed without making actual changes #> [CmdletBinding(SupportsShouldProcess)] param() try { Write-Host "`nRemediation van Log Analytics workspace governance..." -ForegroundColor Yellow $ctx = Get-AzContextOrWarning if (-not $ctx) { Write-Warning "Remediation kan niet worden uitgevoerd zonder geldige Azure-context." return } # Eerst monitoring uitvoeren om non-compliant workspaces te identificeren $monitoringResult = Invoke-Monitoring if ($monitoringResult.summary.WorkspacesNonCompliant -eq 0) { Write-Host "`n[OK] Geen non-compliant workspaces gevonden; geen remediatie nodig." -ForegroundColor Green return } $subscriptions = Get-AzSubscription -ErrorAction Stop foreach ($sub in $subscriptions) { Set-AzContext -SubscriptionId $sub.Id -ErrorAction Stop | Out-Null Write-Host "`nAbonnement: $($sub.Name) [$($sub.Id)]" -ForegroundColor Cyan $workspaces = Get-AzOperationalInsightsWorkspace -ErrorAction SilentlyContinue foreach ($ws in $workspaces) { $needsRemediation = $false $newTags = @{} # Controleer en voeg ontbrekende tags toe $requiredTags = @{ "Environment" = "prod" "Owner" = "security-team@example.com" "InformationClassification" = "Confidential" } foreach ($tagKey in $requiredTags.Keys) { if (-not $ws.Tags -or -not $ws.Tags.ContainsKey($tagKey)) { $needsRemediation = $true $newTags[$tagKey] = $requiredTags[$tagKey] Write-Host " [PLAN] Tag '$tagKey' toevoegen aan workspace '$($ws.Name)'..." -ForegroundColor Yellow } } # Controleer retentie-instellingen $retentionDays = $ws.RetentionInDays if (-not $retentionDays -or $retentionDays -lt 90) { $needsRemediation = $true Write-Host " [PLAN] Retentie-instelling aanpassen voor workspace '$($ws.Name)' (huidig: $retentionDays dagen, minimum: 90 dagen)..." -ForegroundColor Yellow } if ($needsRemediation) { if ($PSCmdlet.ShouldProcess($ws.ResourceId, "Apply governance configuration")) { try { # Voeg tags toe (behoud bestaande tags) if ($newTags.Count -gt 0) { $mergedTags = @{} if ($ws.Tags) { foreach ($key in $ws.Tags.Keys) { $mergedTags[$key] = $ws.Tags[$key] } } foreach ($key in $newTags.Keys) { $mergedTags[$key] = $newTags[$key] } Update-AzOperationalInsightsWorkspace -ResourceGroupName $ws.ResourceGroupName -Name $ws.Name -Tag $mergedTags -ErrorAction Stop | Out-Null Write-Host " [OK] Tags bijgewerkt voor workspace '$($ws.Name)'." -ForegroundColor Green } # Retentie-instellingen kunnen niet direct worden aangepast via Update-AzOperationalInsightsWorkspace # Deze moeten handmatig worden geconfigureerd via Azure Portal of via Set-AzOperationalInsightsWorkspace met specifieke parameters if (-not $retentionDays -or $retentionDays -lt 90) { Write-Warning "Retentie-instellingen voor workspace '$($ws.Name)' moeten handmatig worden aangepast via Azure Portal of via Set-AzOperationalInsightsWorkspace. Huidige waarde: $retentionDays dagen." } } catch { Write-Warning "Kon governance-configuratie niet toepassen op workspace '$($ws.Name)': $_" } } } } } Write-Host "`n[OK] Remediation uitgevoerd (of gesimuleerd met WhatIf)." -ForegroundColor Green } catch { Write-Host "`n[FAIL] ERROR tijdens remediation: $_" -ForegroundColor Red throw } } function Invoke-Revert { <# .SYNOPSIS Reverts configuration to previous state .DESCRIPTION In deze baseline is geen volledige state-tracking voor workspace-configuraties geïmplementeerd. Deze functie verwijdert uitsluitend tags die door dit script zijn toegevoegd tijdens remediation (tags met standaardwaarden). #> [CmdletBinding(SupportsShouldProcess)] param() try { Write-Host "`nRevert van Log Analytics workspace governance-configuraties..." -ForegroundColor Yellow $ctx = Get-AzContextOrWarning if (-not $ctx) { Write-Warning "Revert kan niet worden uitgevoerd zonder geldige Azure-context." return } Write-Warning "Revert-functionaliteit is beperkt omdat workspace-configuraties complex zijn en handmatige review vereisen. Verwijder alleen tags die door dit script zijn toegevoegd als u zeker weet dat deze niet meer nodig zijn." $subscriptions = Get-AzSubscription -ErrorAction Stop foreach ($sub in $subscriptions) { Set-AzContext -SubscriptionId $sub.Id -ErrorAction Stop | Out-Null Write-Host "`nAbonnement: $($sub.Name) [$($sub.Id)]" -ForegroundColor Cyan $workspaces = Get-AzOperationalInsightsWorkspace -ErrorAction SilentlyContinue foreach ($ws in $workspaces) { # Alleen tags verwijderen die door dit script zijn toegevoegd (standaardwaarden) $tagsToRemove = @() if ($ws.Tags) { if ($ws.Tags["Owner"] -eq "security-team@example.com") { $tagsToRemove += "Owner" } } if ($tagsToRemove.Count -gt 0) { Write-Host " [PLAN] Tags verwijderen van workspace '$($ws.Name)': $($tagsToRemove -join ', ')" -ForegroundColor Yellow if ($PSCmdlet.ShouldProcess($ws.ResourceId, "Remove tags: $($tagsToRemove -join ', ')")) { try { $newTags = @{} foreach ($key in $ws.Tags.Keys) { if ($tagsToRemove -notcontains $key) { $newTags[$key] = $ws.Tags[$key] } } Update-AzOperationalInsightsWorkspace -ResourceGroupName $ws.ResourceGroupName -Name $ws.Name -Tag $newTags -ErrorAction Stop | Out-Null Write-Host " [OK] Tags verwijderd van workspace '$($ws.Name)'." -ForegroundColor Green } catch { Write-Warning "Kon tags niet verwijderen van workspace '$($ws.Name)': $_" } } } } } Write-Host "`n[OK] Revert van governance-configuraties voltooid (of gesimuleerd met WhatIf)." -ForegroundColor Green } catch { Write-Host "`n[FAIL] ERROR tijdens revert: $_" -ForegroundColor Red throw } } # ============================================================================ # HEADER # ============================================================================ Write-Host "`n========================================" -ForegroundColor Cyan Write-Host "Log Analytics Workspaces Governance" -ForegroundColor Cyan Write-Host "Nederlandse Baseline voor Veilige Cloud" -ForegroundColor Cyan Write-Host "========================================`n" -ForegroundColor Cyan # ============================================================================ # MAIN EXECUTION # ============================================================================ try { if ($Revert) { if ($WhatIf) { Write-Host "WhatIf: Zou governance-tags verwijderen die door dit script zijn toegevoegd." -ForegroundColor Yellow } else { Invoke-Revert } } elseif ($Remediation) { if ($WhatIf) { Write-Host "WhatIf: Zou governance-configuraties toepassen op non-compliant workspaces." -ForegroundColor Yellow } else { Invoke-Remediation } } elseif ($Monitoring) { $result = Invoke-Monitoring if ($result.isCompliant) { exit 0 } else { exit 1 } } else { Write-Host "Beschikbare parameters:" -ForegroundColor Yellow Write-Host " -Monitoring : Controleer huidige status van alle Log Analytics workspaces" -ForegroundColor Gray Write-Host " -Remediation : Stel governance-configuraties voor en pas deze desgewenst toe" -ForegroundColor Gray Write-Host " -Revert : Verwijder governance-tags die door dit script zijn toegevoegd" -ForegroundColor Gray Write-Host " -WhatIf : Toon welke wijzigingen zouden worden uitgevoerd" -ForegroundColor Gray Write-Host "`nVoorbeeld: .\log-analytics-workspaces.ps1 -Monitoring" -ForegroundColor Cyan } } catch { Write-Error "Script execution failed: $_" exit 2 } 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 een doordachte multi-workspace governance-strategie ontstaan tientallen of honderden workspaces zonder centrale regie, wat leidt tot inconsistente retentie-instellingen, onbeheersbare kosten, compliance-risico's en het onvermogen om correlaties te leggen tussen gebeurtenissen in verschillende workloads. Dit vergroot de kans op langdurige uitval, gegevensverlies, reputatieschade en non-compliance met BIO, ISO 27001 en NIS2.

Management Samenvatting

Richt een hiërarchische multi-workspace architectuur in met duidelijke governance-principes voor naamgeving, tagging en eigenaarschap. Implementeer Azure Policy voor automatische enforcement van workspace-configuraties, consolideer bestaande workspaces waar mogelijk, en gebruik log-analytics-workspaces.ps1 om alle workspaces periodiek te inventariseren en compliance te monitoren. Zo borgt u dat relevante gebeurtenissen tijdig worden gedetecteerd, opgeslagen en geanalyseerd, en dat monitoring aantoonbaar wordt gemaakt richting bestuur en toezichthouders.