Azure Application Insights Configuratie: Best Practices En Governance

💼 Management Samenvatting

Azure Application Insights-configuratie vormt de ruggengraat van moderne applicatiemonitoring binnen de Nederlandse Baseline voor Veilige Cloud. Een goed geconfigureerde Application Insights-omgeving biedt organisaties volledige zichtbaarheid op applicatieprestaties, gebruikerservaringen, afhankelijkheden en beveiligingsgebeurtenissen, waardoor operations-teams proactief kunnen reageren op problemen voordat deze impact hebben op eindgebruikers. Zonder een doordachte configuratiestrategie ontstaat echter een gefragmenteerd monitoringlandschap waarin telemetrie inconsistent wordt verzameld, privacyrisico's ontstaan door onvoldoende data masking, en kosten onbeheersbaar worden door overmatige data-inname.

Aanbeveling
IMPLEMENT
Risico zonder
Medium
Risk Score
6/10
Implementatie
18u (tech: 12u)
Van toepassing op:
Azure
Hybride omgevingen

Veel Nederlandse overheidsorganisaties hebben Application Insights geïmplementeerd, maar missen een gestructureerde configuratieaanpak die rekening houdt met governance, compliance en kostenbeheersing. In de praktijk zien we vaak dat Application Insights-resources ad-hoc worden aangemaakt zonder consistente naamgeving, dat sampling niet is geconfigureerd waardoor maandelijkse kosten onverwacht oplopen, dat gevoelige gegevens zoals burgerservicenummers of persoonsgegevens ongemaskerd in telemetrie verschijnen, en dat retentie-instellingen niet zijn afgestemd op wettelijke bewaarplichten zoals vastgelegd in de Archiefwet en de AVG. Deze configuratiefouten leiden tot compliance-risico's, onnodige kosten en verminderde effectiviteit van monitoring. Bovendien ontbreekt vaak een centraal overzicht van welke applicaties zijn geïnstrumenteerd, welke configuraties actief zijn en hoe telemetrie wordt gebruikt voor incidentdetectie en service level management. Dit maakt het onmogelijk om richting bestuurders en auditors aan te tonen dat monitoring op orde is en dat investeringen in observability daadwerkelijk bijdragen aan betere dienstverlening en beveiliging.

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

Implementatie

Dit artikel beschrijft een gestructureerde aanpak voor het configureren van Azure Application Insights binnen de Nederlandse Baseline voor Veilige Cloud. We behandelen architectuurkeuzes zoals workspace-gebaseerde versus klassieke Application Insights-resources, configuratie van sampling en adaptive sampling om kosten te beheersen zonder kritieke signalen te verliezen, implementatie van data masking en privacybescherming om te voldoen aan AVG-vereisten, afstemming van retentie-instellingen op compliance-frameworks zoals de Archiefwet en BIO, en inrichting van role-based access control voor scheiding van ontwikkel- en beheertaken. Daarnaast gaan we in op het beheer van instrumentation keys en connection strings via Azure Key Vault, configuratie van diagnostische instellingen voor export naar Log Analytics workspaces en SIEM-systemen, en implementatie 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 application-insights-configuration.ps1 kan worden gebruikt om de configuratie te monitoren, te valideren en waar nodig te herstellen.

Architectuur en Ontwerpprincipes voor Application Insights Configuratie

Een effectieve Application Insights-configuratie begint bij architectuurkeuzes die bepalen hoe telemetrie wordt verzameld, opgeslagen en geanalyseerd. Microsoft biedt twee modellen: klassieke Application Insights-resources die een eigen dataopslag hebben, en workspace-gebaseerde resources die telemetrie direct naar een Log Analytics-workspace sturen. Voor Nederlandse overheidsorganisaties adviseren we het workspace-gebaseerde model omdat dit betere integratie biedt met Azure Monitor, Microsoft Sentinel en bestaande SIEM-systemen, waardoor security- en operations-teams alle signalen vanuit één platform kunnen analyseren. Bovendien maakt workspace-gebaseerde configuratie het mogelijk om telemetrie langer te bewaren dan de standaard negentig dagen, wat essentieel is voor compliance met de Archiefwet en auditvereisten. Daarnaast biedt het model betere mogelijkheden voor kostenbeheersing omdat data wordt opgeslagen in Log Analytics waar retentie-instellingen per data type kunnen worden geconfigureerd, in plaats van een vaste retentie voor alle telemetrie.

Bij het ontwerpen van de Application Insights-architectuur is het belangrijk om te bepalen hoeveel resources nodig zijn. Sommige organisaties kiezen voor één centrale Application Insights-resource voor alle applicaties, terwijl anderen prefereren om per applicatie of per omgeving (ontwikkeling, test, productie) een aparte resource aan te maken. De keuze hangt af van factoren zoals scheiding van verantwoordelijkheden, kostenallocatie, compliance-eisen en de behoefte aan geïsoleerde testomgevingen. Voor de Nederlandse Baseline voor Veilige Cloud adviseren we een hybride aanpak: productie-applicaties krijgen elk een eigen Application Insights-resource met duidelijke naamgeving en tagging, terwijl niet-productieomgevingen kunnen worden geconsolideerd in gedeelde resources om kosten te besparen. Deze aanpak maakt het mogelijk om kosten per applicatie te alloceren, toegangsrechten per team te beheren en telemetrie per omgeving te isoleren, terwijl tegelijkertijd de complexiteit van het beheer wordt beperkt.

Een cruciaal ontwerpprincipe is het implementeren van consistente naamgeving en tagging. Application Insights-resources moeten een duidelijke naamgevingsconventie volgen die de applicatie, omgeving en eigenaar identificeert, bijvoorbeeld 'appinsights-prod-burgerzaken-gemeente-utrecht'. Tags moeten minimaal bevatten: ApplicationName, Environment, Owner, InformationClassification en CostCenter. Deze metadata maakt het mogelijk om resources programmatisch te beheren, kosten te alloceren aan de juiste budgetten en compliance-vereisten per applicatie te handhaven. Het PowerShell-script application-insights-configuration.ps1 valideert dat alle resources de vereiste tags bevatten en genereert rapportages die tonen welke applicaties mogelijk niet voldoen aan de naamgevings- en taggingstandaarden.

Privacy en data protection vormen een essentieel onderdeel van de configuratie. Application Insights verzamelt standaard uitgebreide telemetrie inclusief HTTP-requests, dependencies, exceptions en custom events, waarbij gevoelige informatie zoals query parameters, request bodies en stack traces kunnen worden vastgelegd. Voor Nederlandse overheidsorganisaties die werken met persoonsgegevens is het daarom cruciaal om data masking te configureren via telemetry initializers die gevoelige velden verwijderen of maskeren voordat telemetrie wordt verzonden. Daarnaast moeten samplingregels worden geconfigureerd om het volume van verzamelde data te beperken zonder kritieke signalen te verliezen. Adaptive sampling past automatisch het samplingpercentage aan op basis van het telemetrievolume, terwijl custom sampling kan worden toegepast op specifieke telemetry types of op basis van business rules. Deze configuraties moeten worden gedocumenteerd in een Data Protection Impact Assessment (DPIA) en regelmatig worden gereviewd om te verifiëren dat privacyvereisten worden nageleefd.

Tot slot moet de configuratie rekening houden met integratie met bestaande monitoring- en securitytools. Application Insights-telemetrie moet worden geëxporteerd naar Log Analytics workspaces waar KQL-queries kunnen worden uitgevoerd, dashboards kunnen worden gebouwd en alerts kunnen worden geconfigureerd. Voor securitymonitoring moet telemetrie bovendien worden doorgestuurd naar Microsoft Sentinel of andere SIEM-systemen waar security analisten correlaties kunnen leggen tussen applicatiegedrag en beveiligingsgebeurtenissen. Deze integraties vereisen configuratie van diagnostische instellingen die bepalen welke telemetry types worden geëxporteerd, naar welke bestemmingen data wordt gestuurd en welke retentie-instellingen gelden. Het ontwerp moet expliciet vastleggen welke data flows bestaan, wie toegang heeft tot welke telemetrie en hoe data wordt beveiligd tijdens transport en opslag.

Configuratie Implementatie: Sampling, Masking en Retentie

Gebruik PowerShell-script application-insights-configuration.ps1 (functie Invoke-Monitoring) – Controleert Application Insights-configuraties inclusief sampling, retentie, workspace-koppelingen en diagnostische instellingen.

De implementatie van Application Insights-configuratie begint met het aanmaken van workspace-gebaseerde resources via Azure Portal, PowerShell of Infrastructure as Code. Het PowerShell-script application-insights-configuration.ps1 kan worden gebruikt om te verifiëren dat nieuwe resources correct zijn geconfigureerd met de juiste workspace-koppeling, naamgeving en tags. Na het aanmaken van de resource moet de instrumentation key of connection string worden opgeslagen in Azure Key Vault of Azure App Configuration, zodat applicaties deze veilig kunnen ophalen zonder hardcoded waarden in configuratiebestanden. Deze aanpak maakt het mogelijk om keys te roteren zonder code-wijzigingen en om verschillende keys per omgeving te gebruiken zonder configuratiecomplexiteit in de applicatie zelf.

Een kritieke configuratiestap is het implementeren van sampling om kosten te beheersen. Zonder sampling kunnen Application Insights-resources honderden gigabytes per maand genereren, wat leidt tot onverwachte kosten. Adaptive sampling is de aanbevolen aanpak voor de meeste scenario's omdat het automatisch het samplingpercentage aanpast op basis van het telemetrievolume: tijdens normale belasting wordt een hoger percentage gesampled, terwijl tijdens pieken of incidenten meer data wordt behouden om geen kritieke signalen te missen. Voor specifieke use cases kan custom sampling worden geconfigureerd waarbij bijvoorbeeld alle exceptions en failed requests worden behouden, ongeacht het samplingpercentage, terwijl succesvolle requests worden gesampled. Het script valideert dat sampling is geconfigureerd en waarschuwt wanneer resources mogelijk overmatige kosten genereren door ontbrekende of onjuiste samplingconfiguratie.

Data masking en privacybescherming worden geïmplementeerd via telemetry initializers die worden toegevoegd aan de Application Insights SDK-configuratie in de applicatiecode. Deze initializers kunnen gevoelige velden zoals query parameters, request headers, custom properties en stack traces filteren of maskeren voordat telemetrie wordt verzonden. Voor Nederlandse overheidsorganisaties is het belangrijk om minimaal te maskeren: burgerservicenummers, e-mailadressen, telefoonnummers, creditcardnummers en andere persoonsgegevens zoals vastgelegd in de AVG. Daarnaast moeten organisaties overwegen om volledige request bodies en response bodies te maskeren wanneer deze mogelijk gevoelige informatie bevatten. Het script kan niet direct valideren of data masking correct is geïmplementeerd in de applicatiecode, maar kan wel controleren of telemetrie wordt verzonden naar de juiste workspace waar aanvullende filtering kan worden toegepast via KQL-queries.

Retentie-instellingen moeten worden afgestemd op compliance-vereisten. Standaard bewaart Application Insights telemetrie negentig dagen, maar voor workspace-gebaseerde resources kan retentie worden geconfigureerd per data type via Log Analytics workspace-instellingen. Nederlandse overheidsorganisaties moeten rekening houden met de Archiefwet die bepaalt dat bepaalde informatie voor langere perioden moet worden bewaard, terwijl de AVG vereist dat persoonsgegevens niet langer worden bewaard dan noodzakelijk. Dit betekent dat organisaties een retentiestrategie moeten ontwikkelen waarbij operationele telemetrie (zoals performance metrics en availability data) voor kortere perioden wordt bewaard, terwijl audit-relevante telemetrie (zoals security events en compliance logs) voor langere perioden wordt bewaard. Het script controleert of retentie-instellingen zijn geconfigureerd en waarschuwt wanneer resources mogelijk niet voldoen aan compliance-vereisten.

Diagnostische instellingen configureren de export van Application Insights-telemetrie naar Log Analytics workspaces en andere bestemmingen zoals storage accounts of event hubs. Voor securitymonitoring is het essentieel om alle telemetry types te exporteren naar een Log Analytics workspace die is gekoppeld aan Microsoft Sentinel, zodat security analisten applicatiegedrag kunnen correleren met beveiligingsgebeurtenissen. Het script valideert dat diagnostische instellingen zijn geconfigureerd voor alle Application Insights-resources en controleert of export correct functioneert door te verifiëren dat data daadwerkelijk in de doel-workspace verschijnt.

Governance, Kostenbeheersing en Continue Verbetering

Gebruik PowerShell-script application-insights-configuration.ps1 (functie Invoke-Remediation) – Herstelt configuratiefouten en past best practices toe voor sampling, retentie en diagnostische instellingen.

Effectieve governance van Application Insights-configuratie vereist duidelijke processen voor het beheer van resources, het monitoren van kosten en het periodiek reviewen van configuraties. Organisaties moeten een centraal register bijhouden van alle Application Insights-resources, inclusief eigenaar, doelapplicatie, omgeving, kostenallocatie en compliance-status. Dit register kan worden geautomatiseerd via het PowerShell-script dat periodiek alle resources inventariseert en rapportages genereert die tonen welke applicaties zijn geïnstrumenteerd, welke configuraties actief zijn en waar mogelijk verbeteringen nodig zijn. Het register moet worden gekoppeld aan het change management-proces zodat nieuwe resources alleen worden aangemaakt na goedkeuring en volgens de vastgestelde standaarden.

Kostenbeheersing is een kritiek aspect van Application Insights-governance omdat onbeheerde telemetrie snel kan leiden tot onverwachte kosten. Organisaties moeten budgetplafonds instellen per Application Insights-resource of per applicatie, en waarschuwingen configureren die worden gegenereerd wanneer kosten een bepaald percentage van het budget naderen. Het script kan worden uitgebreid om kosten per resource te monitoren en rapportages te genereren die tonen welke applicaties de meeste telemetrie genereren en waar optimalisaties mogelijk zijn. Daarnaast moeten teams regelmatig reviewen of alle verzamelde telemetrie daadwerkelijk waarde toevoegt: custom events die nooit worden gebruikt in queries of dashboards kunnen worden uitgeschakeld, en samplingpercentages kunnen worden verhoogd voor applicaties met hoge volumes maar lage business impact.

Role-based access control (RBAC) moet worden geconfigureerd om te waarborgen dat alleen geautoriseerde personen toegang hebben tot Application Insights-data en configuraties. Ontwikkelteams hebben doorgaans alleen leesrechten nodig om telemetrie te analyseren en problemen te diagnosticeren, terwijl platformbeheerders schrijfrechten nodig hebben om configuraties aan te passen. Security- en compliance-teams hebben toegang nodig voor auditdoeleinden, maar mogen doorgaans geen wijzigingen aanbrengen. Het script kan worden gebruikt om te valideren dat RBAC correct is geconfigureerd en waarschuwingen te genereren wanneer resources mogelijk te ruime toegangsrechten hebben.

Periodieke configuratiereviews zijn essentieel om te waarborgen dat Application Insights-configuraties actueel blijven en voldoen aan veranderende vereisten. Minimaal elk kwartaal moeten teams reviewen: of alle productie-applicaties correct zijn geïnstrumenteerd, of samplingconfiguraties nog passen bij het huidige gebruik, of retentie-instellingen nog voldoen aan compliance-vereisten, of diagnostische instellingen correct functioneren, en of kosten binnen budget blijven. Het script kan worden gebruikt om deze reviews te ondersteunen door automatisch rapportages te genereren die afwijkingen identificeren en aanbevelingen doen voor verbeteringen. Bevindingen uit reviews moeten worden vastgelegd in een verbeterregister en worden opgevolgd via het change management-proces.

Tot slot moet governance rekening houden met de levenscyclus van applicaties. Wanneer applicaties worden uitgefaseerd of vervangen, moeten bijbehorende Application Insights-resources worden gearchiveerd of verwijderd volgens de vastgestelde procedures. Het script kan worden gebruikt om resources te identificeren die mogelijk niet meer worden gebruikt, bijvoorbeeld door te controleren of er recent nog telemetrie is verzonden. Voordat resources worden verwijderd, moeten teams verifiëren dat historische telemetrie is geëxporteerd naar langetermijnopslag indien vereist voor compliance-doeleinden.

Compliance, Audit en Bewijsvoering

Application Insights-configuratie speelt een belangrijke rol in het aantonen van compliance met verschillende frameworks zoals de BIO, ISO 27001 en NIS2. Toezichthouders en auditors vragen steeds vaker niet alleen of monitoring is ingericht, maar ook hoe de organisatie waarborgt dat applicatieprestaties en beveiligingsgebeurtenissen tijdig worden gedetecteerd en opgevolgd. Een goed gedocumenteerde configuratiestrategie, gecombineerd met aantoonbare reviewcycli en scriptgestuurde controles, vormt het antwoord op deze vragen.

Voor de BIO sluit Application Insights-configuratie aan bij norm 12.01 over bewaking van applicaties en diensten. Door expliciet vast te leggen welke applicaties zijn geïnstrumenteerd, welke configuraties actief zijn en hoe telemetrie wordt gebruikt voor incidentdetectie, 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 Application Insights-resources actief zijn, welke configuraties gelden en hoe resources zijn gekoppeld aan applicaties en eigenaren. Deze exports kunnen worden bewaard in een auditdossier, samen met besluiten uit periodieke reviewmeetings en runbooks die beschrijven hoe teams reageren op telemetrie-signalen.

Voor ISO 27001 en NIS2 is vooral van belang dat er een aantoonbare PDCA-cyclus (Plan-Do-Check-Act) bestaat rondom applicatiemonitoring. Het plan-niveau wordt ingevuld via architectuur- en configuratiedocumenten, de do-fase via implementatie van Application Insights en koppeling met incidentprocessen, 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 Application Insights een prestatieprobleem vroegtijdig signaleerde, of een oefening waarin het opschalen van het responsteam is getest – ontstaat een overtuigend beeld van volwassen monitoring. Het gebruik van application-insights-configuration.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 configuraties op niveau te houden.

Privacycompliance vereist dat organisaties kunnen aantonen dat persoonsgegevens niet onnodig worden verzameld of bewaard in Application Insights-telemetrie. Dit betekent dat data masking-configuraties moeten worden gedocumenteerd, dat retentie-instellingen moeten zijn afgestemd op AVG-vereisten, en dat processen moeten bestaan voor het verwijderen van telemetrie wanneer burgers hun recht op verwijdering uitoefenen. Het script kan helpen door te controleren of retentie-instellingen zijn geconfigureerd en of diagnostische instellingen correct functioneren, maar kan niet valideren of data masking daadwerkelijk werkt in de applicatiecode. Daarom moeten organisaties aanvullende controles uitvoeren, bijvoorbeeld door periodiek telemetrie te reviewen op mogelijke persoonsgegevens en door developers te trainen in privacy-by-design principes.

Auditbewijs moet minimaal bevatten: een overzicht van alle Application Insights-resources met configuraties en eigenaren, documentatie van de architectuur en data flows, verslagen van periodieke configuratiereviews, voorbeelden van telemetrie die wordt gebruikt voor incidentdetectie, en bewijs van kostenbeheersing en optimalisatie-activiteiten. Het PowerShell-script kan deze informatie automatisch genereren en exporteren naar formats die geschikt zijn voor auditdossiers, waardoor de administratieve last wordt verminderd en de consistentie van auditbewijs wordt verbeterd.

Monitoring en Validatie van Configuraties

Gebruik PowerShell-script application-insights-configuration.ps1 (functie Invoke-Monitoring) – Voert periodieke controles uit op Application Insights-configuraties en genereert compliance-rapportages.

Monitoring van Application Insights-configuraties begint met het periodiek draaien van het PowerShell-script dat controleert of alle resources correct zijn geconfigureerd. Het script valideert: of resources workspace-gebaseerd zijn, of sampling is geconfigureerd, of retentie-instellingen voldoen aan compliance-vereisten, of diagnostische instellingen correct functioneren, of naamgeving en tagging voldoen aan standaarden, en of RBAC correct is geconfigureerd. Plan deze controles minimaal wekelijks via Azure Automation of GitHub Actions, zodat afwijkingen binnen vierentwintig uur aan het licht komen. De resultaten worden opgeslagen in een centrale Log Analytics workspace waar dashboards kunnen worden gebouwd die de compliance-status visualiseren voor zowel operations als CISO-office.

Naast technische validatie moet ook de effectiviteit van configuraties worden gemonitord. Teams moeten regelmatig reviewen of verzamelde telemetrie daadwerkelijk wordt gebruikt voor incidentdetectie, probleemdiagnose en service level management. Als telemetrie niet wordt gebruikt, kunnen configuraties worden geoptimaliseerd door samplingpercentages te verhogen of door bepaalde telemetry types uit te schakelen. Daarnaast moeten teams monitoren of alerts die zijn gebaseerd op Application Insights-telemetrie daadwerkelijk waarde toevoegen: alerts die nooit worden geactiveerd of die continu false positives genereren, moeten worden bijgesteld of verwijderd.

Kostenmonitoring is essentieel om te waarborgen dat Application Insights-kosten binnen budget blijven. Het script kan worden uitgebreid om kosten per resource te monitoren en trends te identificeren die kunnen wijzen op onverwachte toename van telemetrievolume. Wanneer kosten stijgen, moeten teams onderzoeken of dit wordt veroorzaakt door toegenomen gebruik, nieuwe functionaliteit, of configuratiefouten zoals ontbrekende sampling. Rapportages moeten worden gedeeld met applicatie-eigenaren zodat zij inzicht hebben in de kosten die hun applicaties genereren en kunnen beslissen over optimalisaties.

Tot slot moet monitoring rekening houden met de gezondheid van de Application Insights-infrastructuur zelf. Het script controleert of resources actief zijn en of telemetrie daadwerkelijk wordt verzonden, maar teams moeten ook monitoren of er vertragingen zijn in de verwerking van telemetrie, of er fouten optreden in diagnostische instellingen, en of export naar Log Analytics workspaces correct functioneert. Problemen met de infrastructuur kunnen leiden tot gaten in monitoring die pas worden ontdekt wanneer incidenten optreden, daarom is proactieve monitoring van de infrastructuur zelf essentieel.

Remediatie en Herstel van Configuratiefouten

Gebruik PowerShell-script application-insights-configuration.ps1 (functie Invoke-Remediation) – Herstelt configuratiefouten en past best practices toe voor sampling, retentie en diagnostische instellingen.

Wanneer monitoring afwijkingen identificeert, wordt het remediatiescript ingezet om configuratiefouten te herstellen. Het script kan automatisch: sampling configureren voor resources waar dit ontbreekt, retentie-instellingen aanpassen om te voldoen aan compliance-vereisten, diagnostische instellingen aanmaken of herstellen, ontbrekende tags toevoegen, en RBAC corrigeren wanneer resources te ruime toegangsrechten hebben. Voor wijzigingen die mogelijk impact hebben op operationele monitoring, zoals het aanpassen van samplingpercentages, genereert het script eerst een rapport met aanbevelingen en vraagt expliciete bevestiging voordat wijzigingen worden doorgevoerd.

Remediatie gaat verder dan het technisch herstellen van configuraties. Teams moeten een rootcauseanalyse uitvoeren om te begrijpen waarom configuratiefouten zijn ontstaan: zijn resources handmatig aangemaakt zonder de juiste standaarden te volgen, zijn configuraties gewijzigd tijdens incidenten zonder deze later te herstellen, of ontbreken er processen die voorkomen dat afwijkingen ontstaan? Bevindingen moeten worden teruggekoppeld aan het change management-proces en aan governance-processen, zodat toekomstige fouten worden voorkomen.

Voor kritieke configuratiefouten zoals ontbrekende data masking of onjuiste retentie-instellingen die kunnen leiden tot compliance-schendingen, moet remediatie onmiddellijk worden uitgevoerd. Het script kan worden geconfigureerd om automatisch kritieke afwijkingen te herstellen, maar teams moeten wel verifiëren dat herstelacties correct zijn uitgevoerd en dat er geen onbedoelde impact is op operationele monitoring. Na remediatie moeten configuraties worden gevalideerd door middel van testscenario's die verifiëren dat telemetrie correct wordt verzameld, gemaskerd en opgeslagen.

Elke remediatie-actie wordt afgesloten met documentatie, lessons learned en een update van de configuratiebaseline. Wijzigingen worden vastgelegd in Git-repositories en Infrastructure as Code, zodat de omgeving reproduceerbaar blijft. Beleidsafdelingen ontvangen een korte rapportage waarin staat welke risico's zijn geïdentificeerd, welke acties zijn genomen en hoe de configuratie opnieuw is gevalideerd. Zo blijft Application Insights-configuratie aantoonbaar effectief binnen de Nederlandse Baseline voor Veilige Cloud.

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 Application Insights Configuration: Best Practices en Governance .DESCRIPTION Controleert en beheert Azure Application Insights-configuraties inclusief sampling, retentie, workspace-koppelingen, diagnostische instellingen en compliance-vereisten. Dit script valideert dat Application Insights-resources correct zijn geconfigureerd volgens de Nederlandse Baseline voor Veilige Cloud. .NOTES Filename: application-insights-configuration.ps1 Author: Nederlandse Baseline voor Veilige Cloud Created: 2025-01-15 Last Modified: 2025-01-15 Version: 1.0 Related JSON: content/azure/monitoring/application-insights-configuration.json Category: monitoring Workload: azure .LINK https://github.com/m365-tenant-best-practise .EXAMPLE .\application-insights-configuration.ps1 -Monitoring Check compliance status van Application Insights-configuraties .EXAMPLE .\application-insights-configuration.ps1 -Remediation Genereert een overzicht van niet-conforme configuraties en aanbevelingen voor herstel .EXAMPLE .\application-insights-configuration.ps1 -Remediation -WhatIf Show what would be changed without applying #> #Requires -Version 5.1 #Requires -Modules Az.Accounts, Az.ApplicationInsights, Az.Monitor, Az.Resources [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 "Application Insights Configuration" -ForegroundColor Cyan Write-Host "Nederlandse Baseline voor Veilige Cloud" -ForegroundColor Cyan Write-Host "========================================`n" -ForegroundColor Cyan # ============================================================================ # VARIABLES # ============================================================================ $PolicyName = "Application Insights Configuration" $PolicyDescription = "Controleert of Azure Application Insights-resources correct zijn geconfigureerd met sampling, retentie, workspace-koppelingen en diagnostische instellingen." # Minimum retentieperiode in dagen (90 dagen standaard, 365 voor compliance) $MinimumRetentionDays = 90 $RecommendedRetentionDays = 365 # Vereiste tags voor Application Insights-resources $RequiredTags = @("ApplicationName", "Environment", "Owner", "InformationClassification", "CostCenter") # ============================================================================ # 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-ApplicationInsightsResources { <# .SYNOPSIS Haalt alle Application Insights-resources op voor een specifiek abonnement. .PARAMETER SubscriptionId De ID van het Azure-abonnement. .OUTPUTS Array van Application Insights-resource objecten. #> [CmdletBinding()] param( [Parameter(Mandatory = $true)] [string]$SubscriptionId ) Write-Verbose "Ophalen van Application Insights-resources voor abonnement: $SubscriptionId" try { Set-AzContext -SubscriptionId $SubscriptionId -ErrorAction Stop | Out-Null $appInsights = Get-AzApplicationInsights -ErrorAction SilentlyContinue $resourceDetails = @() foreach ($resource in $appInsights) { try { # Haal aanvullende details op via Resource Manager $resourceDetailsFull = Get-AzResource -ResourceId $resource.Id -ErrorAction SilentlyContinue # Controleer of resource workspace-gebaseerd is $isWorkspaceBased = $false $workspaceResourceId = $null if ($resourceDetailsFull.Properties.WorkspaceResourceId) { $isWorkspaceBased = $true $workspaceResourceId = $resourceDetailsFull.Properties.WorkspaceResourceId } $resourceDetails += [PSCustomObject]@{ Id = $resource.Id Name = $resource.Name ResourceGroupName = $resource.ResourceGroupName Location = $resource.Location InstrumentationKey = $resource.InstrumentationKey AppId = $resource.AppId ApplicationType = $resource.ApplicationType Kind = $resource.Kind IsWorkspaceBased = $isWorkspaceBased WorkspaceResourceId = $workspaceResourceId Tags = $resourceDetailsFull.Tags ProvisioningState = $resourceDetailsFull.Properties.ProvisioningState } } catch { Write-Warning "Fout bij ophalen van details voor Application Insights '$($resource.Name)': $_" } } return $resourceDetails } catch { Write-Warning "Fout bij ophalen van Application Insights-resources voor abonnement '$SubscriptionId': $_" return @() } } function Get-DiagnosticSettings { <# .SYNOPSIS Haalt diagnostische instellingen op voor een Application Insights-resource. .PARAMETER ResourceId De resource ID van de Application Insights-resource. .OUTPUTS Array van diagnostische instelling objecten. #> [CmdletBinding()] param( [Parameter(Mandatory = $true)] [string]$ResourceId ) Write-Verbose "Ophalen van diagnostische instellingen voor: $ResourceId" try { $diagnosticSettings = Get-AzDiagnosticSetting -ResourceId $ResourceId -ErrorAction SilentlyContinue return $diagnosticSettings } catch { Write-Verbose "Geen diagnostische instellingen gevonden voor: $ResourceId" return @() } } function Test-ResourceCompliance { <# .SYNOPSIS Controleert of een Application Insights-resource voldoen aan compliance-vereisten. .PARAMETER Resource De Application Insights-resource om te controleren. .OUTPUTS PSCustomObject met compliance-status. #> [CmdletBinding()] param( [Parameter(Mandatory = $true)] [PSCustomObject]$Resource ) $isCompliant = $true $issues = @() $warnings = @() # Controleer of resource workspace-gebaseerd is (aanbevolen) if (-not $Resource.IsWorkspaceBased) { $warnings += "Resource is niet workspace-gebaseerd (klassiek model). Workspace-gebaseerd model wordt aanbevolen voor betere integratie met Azure Monitor en Log Analytics." } # Controleer vereiste tags foreach ($requiredTag in $RequiredTags) { if (-not $Resource.Tags -or -not $Resource.Tags.ContainsKey($requiredTag)) { $isCompliant = $false $issues += "Ontbrekende vereiste tag: $requiredTag" } } # Controleer provisioning state if ($Resource.ProvisioningState -ne "Succeeded") { $isCompliant = $false $issues += "Resource provisioning state is niet 'Succeeded': $($Resource.ProvisioningState)" } # Controleer diagnostische instellingen $diagnosticSettings = Get-DiagnosticSettings -ResourceId $Resource.Id if ($diagnosticSettings.Count -eq 0) { $warnings += "Geen diagnostische instellingen geconfigureerd. Export naar Log Analytics workspace wordt aanbevolen voor langere retentie en SIEM-integratie." } return [PSCustomObject]@{ IsCompliant = $isCompliant Issues = $issues Warnings = $warnings } } function Test-Configuration { <# .SYNOPSIS Controleert of Application Insights-resources correct zijn geconfigureerd. .OUTPUTS Array van PSCustomObject met configuratiestatus per resource. #> [CmdletBinding()] param() $subscriptions = Get-AzureSubscriptions $results = @() foreach ($subscription in $subscriptions) { $subscriptionId = $subscription.Id $subscriptionName = $subscription.Name Write-Verbose "Controleren van abonnement: $subscriptionName" try { $appInsights = Get-ApplicationInsightsResources -SubscriptionId $subscriptionId foreach ($resource in $appInsights) { $compliance = Test-ResourceCompliance -Resource $resource $results += [PSCustomObject]@{ SubscriptionId = $subscriptionId SubscriptionName = $subscriptionName ResourceId = $resource.Id ResourceName = $resource.Name ResourceGroupName = $resource.ResourceGroupName IsWorkspaceBased = $resource.IsWorkspaceBased HasDiagnosticSettings = (Get-DiagnosticSettings -ResourceId $resource.Id).Count -gt 0 IsCompliant = $compliance.IsCompliant Issues = $compliance.Issues Warnings = $compliance.Warnings } } } 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() $resources = Test-Configuration if (-not $resources -or $resources.Count -eq 0) { return [PSCustomObject]@{ ScriptName = "application-insights-configuration" IsCompliant = $false Timestamp = Get-Date Details = "Er zijn geen Application Insights-resources gevonden in de huidige scope." Recommendations = @("Overweeg Application Insights te implementeren voor applicatiemonitoring.") Resources = @() } } $nonCompliant = $resources | Where-Object { -not $_.IsCompliant } $isCompliant = ($nonCompliant.Count -eq 0) $details = if ($isCompliant) { "Alle gevonden Application Insights-resources voldoen aan de basisvereisten voor configuratie." } else { "Een of meer Application Insights-resources voldoen niet aan de configuratievereisten." } $recommendations = @() if (-not $isCompliant) { $recommendations += "Configureer workspace-gebaseerde Application Insights-resources voor betere integratie met Azure Monitor." $recommendations += "Voeg vereiste tags toe aan alle Application Insights-resources (ApplicationName, Environment, Owner, InformationClassification, CostCenter)." $recommendations += "Configureer diagnostische instellingen voor export naar Log Analytics workspace voor langere retentie en SIEM-integratie." $recommendations += "Implementeer adaptive sampling om kosten te beheersen zonder kritieke signalen te verliezen." $recommendations += "Configureer data masking via telemetry initializers om te voldoen aan AVG-vereisten." $recommendations += "Documenteer configuratiekeuzes en retentiestrategie in het governance-register." } return [PSCustomObject]@{ ScriptName = "application-insights-configuration" IsCompliant = $isCompliant Timestamp = Get-Date Details = $details Recommendations = $recommendations Resources = $resources } } 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 - resources: Array of resource status objects #> [CmdletBinding()] param() try { Write-Host "`nMonitoring: $PolicyName" -ForegroundColor Yellow Write-Host "Beschrijving: $PolicyDescription" -ForegroundColor Yellow Write-Host "==============================================================" -ForegroundColor Yellow $result = Test-Compliance $resources = $result.Resources if ($resources.Count -gt 0) { Write-Host "`nGevonden Application Insights-resources:" -ForegroundColor Cyan foreach ($resource in $resources) { $statusColor = if ($resource.IsCompliant) { "Green" } else { "Red" } $workspaceStatus = if ($resource.IsWorkspaceBased) { "Workspace-based" } else { "Classic" } $diagnosticStatus = if ($resource.HasDiagnosticSettings) { "Diagnostics: Yes" } else { "Diagnostics: No" } Write-Host ("- {0} ({1}) - {2}, {3}" -f $resource.ResourceName, $resource.SubscriptionName, $workspaceStatus, $diagnosticStatus) -ForegroundColor $statusColor if ($resource.Issues.Count -gt 0) { foreach ($issue in $resource.Issues) { Write-Host (" ⚠ {0}" -f $issue) -ForegroundColor Yellow } } if ($resource.Warnings.Count -gt 0) { foreach ($warning in $resource.Warnings) { Write-Host (" ℹ {0}" -f $warning) -ForegroundColor Cyan } } } } else { Write-Host "`nGeen Application Insights-resources gevonden in de huidige scope." -ForegroundColor Cyan } Write-Host "`n========================================" -ForegroundColor Cyan Write-Host "SUMMARY:" -ForegroundColor Cyan Write-Host " Totaal resources: $($resources.Count)" -ForegroundColor White Write-Host " Compliant: $(($resources | Where-Object { $_.IsCompliant }).Count)" -ForegroundColor White Write-Host " Non-Compliant: $(($resources | Where-Object { -not $_.IsCompliant }).Count)" -ForegroundColor White if ($result.IsCompliant) { Write-Host "`n[OK] COMPLIANT" -ForegroundColor Green Write-Host "Alle Application Insights-resources voldoen aan de basisvoorwaarden voor configuratie." -ForegroundColor Green } else { Write-Host "`n[FAIL] NON-COMPLIANT" -ForegroundColor Red Write-Host "Eén of meer Application Insights-resources voldoen niet aan de configuratievereisten." -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 niet-conforme Application Insights-configuraties en aanbevelingen voor herstel. In plaats van automatisch configuraties aan te passen, markeert het script resources die niet voldoen en geeft gerichte aanbevelingen om configuraties te verbeteren. .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 $resources = $result.Resources | Where-Object { -not $_.IsCompliant } if (-not $resources -or $resources.Count -eq 0) { Write-Host "Alle Application Insights-resources voldoen aan de configuratievereisten. Geen remediatie nodig." -ForegroundColor Green return $result } Write-Host "`nNiet-conforme Application Insights-resources:" -ForegroundColor Red foreach ($resource in $resources) { Write-Host ("- Resource: {0} (Abonnement: {1})" -f $resource.ResourceName, $resource.SubscriptionName) -ForegroundColor Red if ($resource.Issues.Count -gt 0) { Write-Host (" Problemen:" -ForegroundColor Yellow) foreach ($issue in $resource.Issues) { Write-Host (" - {0}" -f $issue) -ForegroundColor Yellow } } Write-Host "" } Write-Host "Aanbevolen vervolgstappen:" -ForegroundColor Yellow Write-Host "1. Migreer klassieke Application Insights-resources naar workspace-gebaseerd model via Azure Portal of PowerShell." -ForegroundColor Yellow Write-Host "2. Voeg vereiste tags toe aan alle resources via Azure Portal of PowerShell: Set-AzResource -Tag @{ApplicationName='...'; Environment='...'; Owner='...'; InformationClassification='...'; CostCenter='...'} -ResourceId <ResourceId>" -ForegroundColor Yellow Write-Host "3. Configureer diagnostische instellingen voor export naar Log Analytics workspace via Azure Portal of New-AzDiagnosticSetting." -ForegroundColor Yellow Write-Host "4. Implementeer adaptive sampling in applicatiecode via Application Insights SDK-configuratie." -ForegroundColor Yellow Write-Host "5. Configureer data masking via telemetry initializers om te voldoen aan AVG-vereisten." -ForegroundColor Yellow Write-Host "6. Documenteer configuratiekeuzes, retentiestrategie en privacybeschermingsmaatregelen in het governance-register." -ForegroundColor Yellow Write-Host "7. Plan periodieke configuratiereviews om te waarborgen dat configuraties actueel blijven." -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 Application Insights-resources 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 Application Insights-configuratie is revert niet aanbevolen omdat dit beveiligingsrisico's introduceert. #> [CmdletBinding(SupportsShouldProcess)] param() try { Write-Host "`nRevert:" -ForegroundColor Yellow Write-Host "WARNING: Het terugdraaien van Application Insights-configuraties kan beveiligingsrisico's introduceren!" -ForegroundColor Red Write-Host "Dit kan leiden tot verminderde monitoring, compliance-schendingen en verhoogde kosten.`n" -ForegroundColor Red Write-Host "Dit script ondersteunt geen automatische revert van Application Insights-configuratie." -ForegroundColor Yellow Write-Host "Als revert noodzakelijk is, pas dan handmatig configuraties aan 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: .\application-insights-configuration.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
Medium: Zonder doordachte Application Insights-configuratie ontstaan compliance-risico's door onvoldoende data masking en retentie, onbeheersbare kosten door overmatige telemetrie, en verminderde effectiviteit van monitoring door inconsistente configuraties. Dit maakt het onmogelijk om richting bestuurders en auditors aan te tonen dat applicatiemonitoring op orde is en dat investeringen in observability daadwerkelijk bijdragen aan betere dienstverlening en beveiliging.

Management Samenvatting

Implementeer een gestructureerde configuratiestrategie voor Azure Application Insights met workspace-gebaseerde resources, adaptive sampling voor kostenbeheersing, data masking voor privacybescherming, en afgestemde retentie-instellingen voor compliance. Gebruik application-insights-configuration.ps1 om configuraties te monitoren, te valideren en waar nodig te herstellen. Zo waarborgt u dat Application Insights effectief bijdraagt aan applicatiemonitoring, incidentdetectie en compliance binnen de Nederlandse Baseline voor Veilige Cloud.