Log Analytics Workspace: Architectuur, Best Practices En Implementatie

💼 Management Samenvatting

Een Log Analytics Workspace vormt het centrale fundament voor alle logging, monitoring en security analytics binnen een Azure-omgeving. Deze workspace functioneert als de primaire opslagplaats voor logdata, metrische gegevens en telemetrie van Azure-resources, hybride servers en cloudservices, waardoor organisaties volledige zichtbaarheid krijgen op de gezondheid, prestaties en beveiliging van hun IT-infrastructuur.

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

Zonder een goed geconfigureerde Log Analytics Workspace beschikken organisaties niet over de benodigde zichtbaarheid om beveiligingsincidenten te detecteren, prestatieproblemen te identificeren, compliance-vereisten na te leven en forensisch onderzoek uit te voeren. In de praktijk zien we vaak dat organisaties meerdere workspaces ad-hoc aanmaken zonder consistente naamgeving en tagging, dat retentie-instellingen niet zijn afgestemd op wettelijke bewaarplichten zoals vastgelegd in de Archiefwet en de BIO, dat diagnostische instellingen niet correct zijn geconfigureerd waardoor belangrijke logdata ontbreekt, en dat kostenbeheersing ontbreekt waardoor maandelijkse kosten onverwacht oplopen. Deze configuratiefouten leiden tot compliance-risico's, onnodige kosten, verminderde zichtbaarheid op beveiligingsincidenten en het onvermogen om richting bestuurders en auditors aan te tonen dat logging en monitoring op orde zijn. Bovendien ontbreekt vaak een centraal overzicht van welke resources zijn geïnstrumenteerd, welke configuraties actief zijn en hoe monitoring wordt gebruikt voor incidentdetectie en service level management.

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

Implementatie

Dit artikel beschrijft een gestructureerde aanpak voor het ontwerpen, implementeren en beheren van Log Analytics Workspaces binnen de Nederlandse Baseline voor Veilige Cloud. We behandelen architectuurkeuzes zoals de inrichting van workspaces met juiste retentie-instellingen en data-exportmogelijkheden, configuratie van diagnostische instellingen voor platformlogs en metrische data, implementatie van Log Analytics agents voor hybride omgevingen, 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 beheer 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 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 log-analytics-workspace.ps1 kan worden gebruikt om de configuratie te monitoren, te valideren en waar nodig te herstellen.

Architectuur en Ontwerpprincipes voor Log Analytics Workspaces

Een effectieve Log Analytics Workspace-architectuur begint bij strategische keuzes die bepalen hoe telemetrie wordt verzameld, opgeslagen en geanalyseerd. De kern van Azure Monitor bestaat uit Log Analytics workspaces, die functioneren als centrale opslagplaatsen voor logdata, metrische gegevens en custom telemetrie. Voor Nederlandse overheidsorganisaties adviseren we een hiërarchische workspace-architectuur waarbij productie-, acceptatie- en ontwikkelomgevingen elk hun eigen workspace hebben, maar waarbij kritieke beveiligings- en auditlogs centraal worden verzameld in een dedicated security workspace. Deze scheiding maakt het mogelijk om retentie-instellingen per omgeving af te stemmen op compliance-vereisten: productielogs kunnen bijvoorbeeld zeven jaar worden bewaard voor auditdoeleinden, terwijl ontwikkellogs na negentig dagen kunnen worden verwijderd om kosten te besparen. Bovendien biedt deze architectuur betere mogelijkheden voor toegangscontrole omdat ontwikkelaars geen toegang hoeven te hebben tot productielogs met gevoelige gegevens. 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-workspace.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. Voor hybride omgevingen met on-premises servers en werkstations is de Log Analytics agent essentieel. Deze agent verzamelt logdata van Windows Event Logs, Syslog, performance counters en custom logs, en stuurt deze door naar de Log Analytics workspace. De agent kan worden geïnstalleerd via Azure Arc, via Azure Automation, of handmatig via installatiepakketten. Voor grote omgevingen met honderden of duizenden servers is het cruciaal om de agent-deployment te automatiseren via Group Policy, Configuration Manager of Infrastructure as Code. Het script controleert of agents correct zijn geïnstalleerd en geconfigureerd, en rapporteert welke servers nog niet zijn geïnstrumenteerd. Zonder adequate agent-deployment blijven on-premises gebeurtenissen onzichtbaar in de cloud, wat leidt tot blinde vlekken in security monitoring en compliance-rapportage.

Implementatie en Configuratie van Log Analytics Workspaces

De implementatie van een Log Analytics Workspace begint bij het bepalen van de juiste locatie, resource group en naamgeving. Voor Nederlandse overheidsorganisaties is het belangrijk om workspaces te plaatsen in dezelfde Azure-regio als de primaire workloads om latencies te minimaliseren en data-residency-vereisten na te leven. De naamgeving moet consistent zijn en informatie bevatten 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. Bij het aanmaken van een workspace moet u expliciet aandacht besteden aan de retentie-instellingen. Standaard biedt Azure Monitor een retentieperiode van dertig dagen, maar voor compliance-doeleinden is dit vaak onvoldoende. De Archiefwet vereist bijvoorbeeld dat bepaalde categorieën administratieve gegevens langdurig worden bewaard, terwijl de BIO en ISO 27001 eisen stellen aan de bewaartermijn van auditlogs. Voor productieworkspaces adviseren we een minimale retentieperiode van 365 dagen voor algemene logs, en voor security-specifieke workspaces zelfs zeven jaar conform de Archiefwet. Het is belangrijk om te realiseren dat langere retentieperioden hogere kosten met zich meebrengen, maar dat deze kosten noodzakelijk zijn voor compliance en forensisch onderzoek. Voor ontwikkelomgevingen kan een kortere retentieperiode van 30 tot 90 dagen volstaan om kosten te besparen. Naast retentie-instellingen is het cruciaal om de juiste pricing tier te selecteren. Azure Monitor biedt verschillende pricing tiers: Pay-as-you-go, Capacity Reservation en Commitment Tier. Voor voorspelbare workloads met consistente data-inname kan Capacity Reservation of Commitment Tier kostenbesparend zijn, terwijl voor variabele workloads Pay-as-you-go flexibeler is. Het is belangrijk om historische data-inname te analyseren voordat u een commitment aangaat, omdat downgrades niet altijd mogelijk zijn. Daarnaast biedt Azure Monitor data-cap instellingen die automatisch data-inname stoppen wanneer een maandelijks limiet wordt bereikt, wat helpt om onverwachte kosten te voorkomen. 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. Voor het beheren van toegang tot Log Analytics workspaces is role-based access control (RBAC) essentieel. Azure biedt verschillende ingebouwde rollen zoals Log Analytics Reader, Log Analytics Contributor en Log Analytics Custom Logs Contributor. Voor Nederlandse overheidsorganisaties adviseren we om custom roles te definiëren die specifiek zijn afgestemd op de organisatorische behoeften, bijvoorbeeld een rol die alleen toegang geeft tot specifieke tabellen of queries, of een rol die alleen read-only toegang geeft tot security logs. Het is belangrijk om het principe van least privilege toe te passen: gebruikers krijgen alleen de minimale rechten die nodig zijn voor hun functie. Daarnaast moet toegang regelmatig worden gereviewd via Azure AD Access Reviews om te verifiëren dat alleen geautoriseerde personen toegang hebben tot gevoelige logdata.

Gebruik PowerShell-script log-analytics-workspace.ps1 (functie Invoke-Monitoring) – Voert een tenant-brede inventarisatie en compliancecheck uit op Log Analytics Workspaces, inclusief retentie-instellingen, diagnostische instellingen en agent-configuraties..

Dataverzameling en Integratie met Azure Services

Een Log Analytics Workspace is alleen waardevol wanneer deze daadwerkelijk logdata ontvangt van Azure-resources, hybride servers en cloudservices. De primaire mechanismen voor dataverzameling zijn diagnostische instellingen voor Azure-platformservices, Log Analytics agents voor hybride omgevingen, en directe integraties met Azure-services zoals Azure AD, Microsoft Defender en Azure Sentinel. Voor Azure-platformservices zoals Virtual Machines, Storage Accounts, Key Vaults, App Services en Azure Functions zijn diagnostische instellingen de primaire methode om logs en metrische data te verzamelen. Diagnostische instellingen kunnen worden geconfigureerd via de Azure Portal, via PowerShell, of via Infrastructure as Code zoals ARM-templates, Bicep of Terraform. Voor elke resource type zijn verschillende logcategorieën beschikbaar: voor Virtual Machines zijn dit bijvoorbeeld Windows Event Logs, Syslog, Performance Counters en Custom Logs, terwijl voor Key Vaults dit vooral Audit Logs en AllMetrics zijn. Het is belangrijk om alleen relevante logcategorieën te verzamelen om kosten te beheersen, maar wel alle categorieën die essentieel zijn voor security monitoring en compliance. Voor kritieke resources adviseren we om alle beschikbare logcategorieën te verzamelen, terwijl voor minder kritieke resources een selectieve aanpak mogelijk is. Voor hybride omgevingen met on-premises servers en werkstations is de Log Analytics agent (ook wel bekend als OMS agent of MMA agent) essentieel. Deze agent verzamelt logdata van Windows Event Logs, Linux Syslog, performance counters en custom logs, en stuurt deze door naar de Log Analytics workspace via een beveiligde HTTPS-verbinding. De agent kan worden geïnstalleerd via Azure Arc, via Azure Automation, via Group Policy voor Windows-omgevingen, of handmatig via installatiepakketten. Voor grote omgevingen met honderden of duizenden servers is het cruciaal om de agent-deployment te automatiseren om consistentie te waarborgen en handmatige fouten te voorkomen. Het script log-analytics-workspace.ps1 controleert of agents correct zijn geïnstalleerd en geconfigureerd, en rapporteert welke servers nog niet zijn geïnstrumenteerd. Azure AD-integratie is essentieel voor het verzamelen van sign-in logs, audit logs en provisioning logs. Deze logs bevatten kritieke informatie over authenticatiepogingen, wijzigingen in directory-objecten, en beheeractiviteiten. Azure AD-diagnostische instellingen kunnen worden geconfigureerd via Azure Portal onder Azure AD → Diagnostische instellingen, of via PowerShell met behulp van de Azure AD-module. Het is belangrijk om alle relevante logcategorieën te verzamelen: SignInLogs voor authenticatiegebeurtenissen, AuditLogs voor directory-wijzigingen, en ProvisioningLogs voor automatische gebruikersinrichting. Deze logs zijn essentieel voor security monitoring, compliance-rapportage en forensisch onderzoek naar beveiligingsincidenten. Microsoft Defender-integratie biedt uitgebreide security telemetrie vanuit verschillende Defender-services zoals Defender for Cloud, Defender for Endpoint, Defender for Identity en Defender for Office 365. Deze integratie kan worden geconfigureerd via Microsoft Defender voor Cloud → Environment settings → Continuous export, waarbij u selecteert welke security alerts en recommendations moeten worden geëxporteerd naar de Log Analytics workspace. Deze data is essentieel voor threat hunting, incidentdetectie en compliance-rapportage, en maakt het mogelijk om security events te correleren met andere logdata in de workspace.

Kostenbeheersing en Retentie-instellingen voor Compliance

Azure Monitor kan aanzienlijke kosten genereren wanneer logdata onbeperkt wordt verzameld zonder strategie voor kostenbeheersing. Voor Nederlandse overheidsorganisaties is het daarom essentieel om expliciete retentie-instellingen te configureren die balanceren tussen compliance-vereisten en kostenoptimalisatie. 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. Daarnaast kunt u kosten besparen door slimme sampling te configureren voor application telemetrie, waarbij alleen een representatieve steekproef van events wordt verzameld in plaats van alle gebeurtenissen. Het PowerShell-script 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. Voor langetermijnbewaring van auditlogs en compliance-data biedt Azure Monitor data-export functionaliteit waarmee u logdata kunt exporteren naar Azure Blob Storage, Event Hubs of externe SIEM-systemen. Deze export maakt het mogelijk om data voor langere perioden te bewaren dan de standaard retentieperiode in Log Analytics, wat essentieel kan zijn voor organisaties die moeten voldoen aan compliance-frameworks zoals de Archiefwet, BIO en ISO 27001 die langere retentieperiodes vereisen. Data-export kan worden geconfigureerd via Azure Portal onder Log Analytics workspace → Data Export, of via PowerShell met behulp van de Az.OperationalInsights-module. Het is belangrijk om te realiseren dat data-export aanvullende kosten met zich meebrengt voor storage en egress, maar dat deze kosten vaak lager zijn dan het verlengen van retentie in Log Analytics zelf.

Governance, Compliance en Continue Verbetering

Een Log Analytics Workspace-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 workspace-configuraties doorlopend worden geëvalueerd en aangepast. Zonder actieve governance ontstaan na verloop van tijd blinde vlekken: nieuwe abonnementen krijgen geen workspaces, verouderde workspaces blijven actief zonder eigenaar, retentie-instellingen worden niet herzien waardoor compliance-risico's ontstaan, en kosten lopen op door overmatige data-inname. Daarom moet de inrichting van Log Analytics workspaces 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 monitoring wordt beoordeeld. Tijdens deze sessies bekijkt u samen met het SOC, operations en compliance-teams onder andere: welke logs worden daadwerkelijk gebruikt voor incidentdetectie, welke diagnostische instellingen 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 workspaces weinig data genereren, welke resources diagnostische instellingen missen, en of retentie-instellingen consistent zijn geconfigureerd. 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 workspace-configuraties expliciet wordt toegewezen. Voor elke Log Analytics workspace 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 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-workspace.ps1 (functie Invoke-Remediation) – Ondersteunt verbetering van de Log Analytics Workspace-configuratie door niet-conforme resources te identificeren en – indien gewenst – standaard-configuraties voor kritieke workloads aan te maken..

Compliance, Audit en Bewijsvoering rondom Log Analytics Workspaces

Log Analytics 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. 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 Log Analytics Workspace-architectuur, gecombineerd met aantoonbare reviewcycli en scriptgestuurde controles, vormt het antwoord op deze vragen. Voor de BIO sluiten Log Analytics 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 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-workspace.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-workspace.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 Log Analytics Workspace: Architectuur, Best Practices en Implementatie .DESCRIPTION Controleert of Azure-abonnementen correct zijn geconfigureerd met Log Analytics Workspaces voor gecentraliseerde logging, security monitoring en compliance. Deze workspace vormt het fundament voor alle Azure-beveiligingsoperaties en is essentieel voor threat hunting, incidentdetectie en compliance-rapportage. .NOTES Filename: log-analytics-workspace.ps1 Author: Nederlandse Baseline voor Veilige Cloud Created: 2025-01-15 Last Modified: 2025-01-15 Version: 1.0 Related JSON: content/azure/monitoring/log-analytics-workspace.json Category: monitoring Workload: azure .LINK https://github.com/m365-tenant-best-practise .EXAMPLE .\log-analytics-workspace.ps1 -Monitoring Check compliance status van Log Analytics Workspaces .EXAMPLE .\log-analytics-workspace.ps1 -Remediation Genereert een overzicht van abonnementen zonder Log Analytics Workspaces en aanbevelingen voor herstel .EXAMPLE .\log-analytics-workspace.ps1 -Remediation -WhatIf Show what would be changed without applying #> #Requires -Version 5.1 #Requires -Modules Az.Accounts, Az.OperationalInsights, 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 "Log Analytics Workspace" -ForegroundColor Cyan Write-Host "Nederlandse Baseline voor Veilige Cloud" -ForegroundColor Cyan Write-Host "========================================`n" -ForegroundColor Cyan # ============================================================================ # VARIABLES # ============================================================================ $PolicyName = "Log Analytics Workspace" $PolicyDescription = "Controleert of Azure-abonnementen voorzien zijn van Log Analytics Workspaces voor gecentraliseerde logging, security monitoring 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-LogAnalyticsWorkspaces { <# .SYNOPSIS Haalt alle Log Analytics Workspaces op voor een specifiek abonnement. .PARAMETER SubscriptionId De ID van het Azure-abonnement. .OUTPUTS Array van Log Analytics Workspace objecten. #> [CmdletBinding()] param( [Parameter(Mandatory = $true)] [string]$SubscriptionId ) Write-Verbose "Ophalen van Log Analytics Workspaces voor abonnement: $SubscriptionId" try { Set-AzContext -SubscriptionId $SubscriptionId -ErrorAction Stop | Out-Null $workspaces = Get-AzOperationalInsightsWorkspace -ErrorAction SilentlyContinue $workspaceDetails = @() foreach ($workspace in $workspaces) { try { # Haal retentie-instellingen op $retentionDays = $workspace.RetentionInDays if (-not $retentionDays) { $retentionDays = 30 # Standaardwaarde als niet geconfigureerd } $workspaceDetails += [PSCustomObject]@{ Id = $workspace.Id Name = $workspace.Name ResourceGroupName = $workspace.ResourceGroupName Location = $workspace.Location RetentionInDays = $retentionDays Sku = $workspace.Sku.Name CustomerId = $workspace.CustomerId ProvisioningState = $workspace.ProvisioningState } } catch { Write-Warning "Fout bij ophalen van details voor workspace '$($workspace.Name)': $_" } } return $workspaceDetails } catch { Write-Warning "Fout bij ophalen van Log Analytics Workspaces voor abonnement '$SubscriptionId': $_" return @() } } function Test-WorkspaceCompliance { <# .SYNOPSIS Controleert of Log Analytics Workspaces voldoen aan compliance-vereisten. .PARAMETER Workspace De Log Analytics Workspace om te controleren. .OUTPUTS PSCustomObject met compliance-status. #> [CmdletBinding()] param( [Parameter(Mandatory = $true)] [PSCustomObject]$Workspace ) $isCompliant = $true $issues = @() # Controleer retentieperiode if ($Workspace.RetentionInDays -lt $MinimumRetentionDays) { $isCompliant = $false $issues += "Retentieperiode ($($Workspace.RetentionInDays) dagen) is minder dan de vereiste $MinimumRetentionDays dagen" } # Controleer provisioning state if ($Workspace.ProvisioningState -ne "Succeeded") { $isCompliant = $false $issues += "Workspace provisioning state is niet 'Succeeded': $($Workspace.ProvisioningState)" } return [PSCustomObject]@{ IsCompliant = $isCompliant Issues = $issues } } function Test-WorkspaceConfiguration { <# .SYNOPSIS Controleert of abonnementen Log Analytics Workspaces hebben geconfigureerd. .OUTPUTS Array van PSCustomObject met workspace 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 { $workspaces = Get-LogAnalyticsWorkspaces -SubscriptionId $subscriptionId $hasWorkspace = $workspaces.Count -gt 0 $compliantWorkspaces = 0 $nonCompliantWorkspaces = 0 $allWorkspacesCompliant = $true foreach ($workspace in $workspaces) { $compliance = Test-WorkspaceCompliance -Workspace $workspace if ($compliance.IsCompliant) { $compliantWorkspaces++ } else { $nonCompliantWorkspaces++ $allWorkspacesCompliant = $false } } $isCompliant = $hasWorkspace -and $allWorkspacesCompliant $results += [PSCustomObject]@{ SubscriptionId = $subscriptionId SubscriptionName = $subscriptionName TotalWorkspaces = $workspaces.Count CompliantWorkspaces = $compliantWorkspaces NonCompliantWorkspaces = $nonCompliantWorkspaces HasWorkspace = $hasWorkspace IsCompliant = $isCompliant Workspaces = $workspaces } } 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-WorkspaceConfiguration if (-not $subscriptions -or $subscriptions.Count -eq 0) { return [PSCustomObject]@{ ScriptName = "log-analytics-workspace" 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 Log Analytics Workspaces geconfigureerd die voldoen aan de compliance-vereisten." } else { "Een of meer Azure-abonnementen missen Log Analytics Workspaces of hebben workspaces die niet voldoen aan de minimale compliance-eisen." } $recommendations = @() if (-not $isCompliant) { $recommendations += "Maak Log Analytics Workspaces aan voor abonnementen zonder workspaces." $recommendations += "Configureer retentieperiode van minimaal $MinimumRetentionDays dagen voor compliance." $recommendations += "Verifieer dat alle kritieke resources diagnostische instellingen hebben geconfigureerd die logs doorsturen naar de workspace." $recommendations += "Configureer Azure AD-integratie voor sign-in logs en audit logs." $recommendations += "Documenteer workspace-architectuur en data sources in het governance-register." } return [PSCustomObject]@{ ScriptName = "log-analytics-workspace" 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 = "Workspaces: $($subscription.TotalWorkspaces), " + "Compliant: $($subscription.CompliantWorkspaces), " + "Non-Compliant: $($subscription.NonCompliantWorkspaces)" Write-Host ("- {0} - {1}" -f $subscription.SubscriptionName, $statusText) -ForegroundColor $statusColor if ($subscription.Workspaces.Count -gt 0) { foreach ($workspace in $subscription.Workspaces) { $compliance = Test-WorkspaceCompliance -Workspace $workspace $workspaceColor = if ($compliance.IsCompliant) { "Green" } else { "Yellow" } Write-Host (" └─ {0} (Retentie: {1} dagen)" -f $workspace.Name, $workspace.RetentionInDays) -ForegroundColor $workspaceColor if (-not $compliance.IsCompliant -and $compliance.Issues.Count -gt 0) { foreach ($issue in $compliance.Issues) { 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 workspaces: $(($subscriptions | Where-Object { $_.HasWorkspace }).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 Log Analytics Workspace." -ForegroundColor Green } else { Write-Host "`n[FAIL] NON-COMPLIANT" -ForegroundColor Red Write-Host "Eén of meer Azure-abonnementen missen Log Analytics Workspaces of hebben workspaces 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 Log Analytics Workspaces en aanbevelingen voor herstel. In plaats van automatisch configuraties aan te passen, markeert het script abonnementen zonder workspaces en geeft gerichte aanbevelingen om logging 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 Log Analytics Workspaces 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 (" Workspaces: {0}" -f $subscription.TotalWorkspaces) -ForegroundColor Red if ($subscription.TotalWorkspaces -eq 0) { Write-Host (" ⚠ Geen Log Analytics Workspace gevonden" -ForegroundColor Yellow) } else { foreach ($workspace in $subscription.Workspaces) { $compliance = Test-WorkspaceCompliance -Workspace $workspace if (-not $compliance.IsCompliant) { Write-Host (" ⚠ Workspace '{0}' is niet compliant:" -f $workspace.Name) -ForegroundColor Yellow foreach ($issue in $compliance.Issues) { Write-Host (" - {0}" -f $issue) -ForegroundColor Yellow } } } } Write-Host "" } Write-Host "Aanbevolen vervolgstappen:" -ForegroundColor Yellow Write-Host "1. Maak een Log Analytics Workspace aan voor abonnementen zonder workspaces via Azure Portal of PowerShell." -ForegroundColor Yellow Write-Host "2. Configureer retentieperiode van minimaal $MinimumRetentionDays dagen voor compliance-vereisten." -ForegroundColor Yellow Write-Host "3. Configureer diagnostische instellingen voor alle kritieke resources om logs door te sturen naar de workspace." -ForegroundColor Yellow Write-Host "4. Configureer Azure AD-integratie voor sign-in logs en audit logs via Azure AD → Diagnostische instellingen." -ForegroundColor Yellow Write-Host "5. Configureer Microsoft Defender-integratie via Defender voor Cloud → Environment settings → Continuous export." -ForegroundColor Yellow Write-Host "6. Verifieer dat alle geconfigureerde data sources daadwerkelijk logs leveren via KQL-queries." -ForegroundColor Yellow Write-Host "7. Documenteer workspace-architectuur, data sources 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 Log Analytics Workspaces 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 Log Analytics Workspace is revert niet aanbevolen omdat dit beveiligingsrisico's introduceert. #> [CmdletBinding(SupportsShouldProcess)] param() try { Write-Host "`nRevert:" -ForegroundColor Yellow Write-Host "WARNING: Het verwijderen van Log Analytics Workspaces is een SECURITY RISK!" -ForegroundColor Red Write-Host "Dit zal beveiligingsmonitoring en incidentdetectie belemmeren.`n" -ForegroundColor Red Write-Host "Dit script ondersteunt geen automatische revert van Log Analytics Workspace configuratie." -ForegroundColor Yellow Write-Host "Als revert noodzakelijk is, verwijder dan handmatig workspaces 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: .\log-analytics-workspace.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 Log Analytics Workspaces blijven kritieke beveiligings- en beschikbaarheidsincidenten onzichtbaar, worden compliance-vereisten niet nageleefd, lopen kosten onbeheersbaar op en kan de organisatie richting toezichthouders niet aantonen dat logging en monitoring op orde zijn. Dit vergroot de kans op langdurige uitval, gegevensverlies, reputatieschade en non-compliance met BIO, ISO 27001 en NIS2.

Management Samenvatting

Richt Log Analytics Workspaces in met juiste retentie-instellingen, diagnostische instellingen en agent-configuraties die afgestemd zijn op compliance-vereisten. Automatiseer de uitrol en inventarisatie van workspace-configuraties met PowerShell en Infrastructure as Code, gebruik log-analytics-workspace.ps1 om de inrichting periodiek te toetsen en verbeter deze op basis van incidenten en audits. Zo borgt u dat relevante gebeurtenissen tijdig worden gedetecteerd, opgeslagen en geanalyseerd, en dat monitoring aantoonbaar wordt gemaakt richting bestuur en toezichthouders.