Purview Audit Logging Aantoonbaar Ingeschakeld

💼 Management Samenvatting

Audit logging binnen Microsoft Purview vormt het geheugen van de cloudomgeving. Zonder deze continue registratie kunnen overheidsorganisaties geen reconstructie maken van wie een vertrouwelijk dossier heeft geraadpleegd, welke beheeractie een storing veroorzaakte of hoe een dreiging zich in de tenant heeft verplaatst.

Aanbeveling
IMPLEMENT
Risico zonder
Critical
Risk Score
9/10
Implementatie
100u (tech: 40u)
Van toepassing op:
Microsoft Purview
Exchange Online
SharePoint Online
OneDrive for Business
Microsoft Teams
Entra ID

Nederlandse bestuursorganen zijn gebonden aan de BIO, AVG, Woo, Archiefwet en de aankomende NIS2-verplichtingen. Al deze kaders eisen volledige traceerbaarheid van beheerders-, gebruikers- en systeemhandelingen. Dat vraagt méér dan het éénmalig indrukken van de knop “Start recording”. Audit logging moet juridisch mandaat hebben, technisch duurzaam zijn ingericht, aantoonbaar worden bewaakt en geïntegreerd zijn met SOC-processen. Datagovernance-programma’s die onder druk van parlementaire enquêtes of Rekenkameronderzoeken staan, kunnen zich geen gaten in de loggingketen permitteren.

PowerShell Modules Vereist
Primary API: Security & Compliance PowerShell
Connection: Connect-ExchangeOnline, Connect-IPPSSession
Required Modules: ExchangeOnlineManagement

Implementatie

Dit artikel beschrijft hoe de Nederlandse Baseline voor Veilige Cloud audit logging in Purview positioneert als een bestuurlijke controlemaatregel. We gaan in op governance, architectuur, licenties, procesafspraken, automatisering en bewijslast. Elk hoofdstuk biedt concrete voorbeelden voor rijksdiensten, gemeenten, politie en ZBO’s. Het bijbehorende PowerShell-script voert lokale debugtests in minder dan vijftien seconden uit en valideert tijdens productiecontroles of Unified Audit Log Ingestion daadwerkelijk actief blijft. Daarmee ontstaat een herhaalbaar patroon dat documentatie, technische realisatie en operationele borging verbindt.

Governance, mandaat en juridische borging

Een volwassen audit logging-programma begint bij bestuurlijk mandaat. Colleges van B&W, gedeputeerde staten, ministeries en zelfstandige bestuursorganen moeten expliciet vastleggen dat iedere workload binnen Microsoft 365 onder centrale logging valt. Dit besluit wordt bekrachtigd in het informatiebeveiligingsbeleid en de jaarplannen van de CISO. Het mandaat beschrijft welke rollen het beheer uitvoeren, welke rapportages naar directies en toezichthouders gaan en hoe uitzonderingen worden afgehandeld. Zonder deze formele dekking bestaat het risico dat projectteams logging uitschakelen voor prestaties of kostenbesparing, met als gevolg dat reconstrueerbaarheid verloren gaat. Het mandaat bevat ook de koppeling naar de PDCA-cyclus van de BIO zodat audit logging een vaste plek krijgt binnen de jaarlijkse security- en privacyreviews.

Vervolgens is er een governance-architectuur nodig die duidelijk maakt wie verantwoordelijk is voor welke ketenstap. Het CISO-office definieert het loggingbeleid, de Chief Privacy Officer bewaakt dat persoonsgegevens doelmatig worden verwerkt, terwijl de Chief Data Officer toeziet op aansluiting met gegevensregisters. Operationele verantwoordelijkheden liggen bij het Purview-team en het SOC. Elke groep krijgt expliciete taken: het Purview-team beheert configuraties, het SOC controleert de ingestievolumes, privacy officers beoordelen toegang tot loggegevens en de functioneel beheerders in het zaaksysteem zorgen dat de juiste metadata beschikbaar blijft voor juridische verzoeken. Deze taakverdeling wordt vastgelegd in RACI-matrices en meegenomen in onboarding van nieuwe medewerkers.

Juridische borging vraagt om meer dan technische logging. Overheidsorganisaties moeten kunnen aantonen dat ze loggegevens rechtmatig verwerken en beveiligen. Daarom beschrijft het beleid welke grondslag geldt (veelal gerechtvaardigd belang, wettelijke plicht of uitvoering van een publieke taak), welke bewaartermijnen nodig zijn en hoe betrokkenenrechten uit de AVG worden gerespecteerd. Voor auditdata betekent dat dat inzageverzoeken worden afgehandeld door geautoriseerde privacyteams, dat logbestanden geclassificeerd zijn als departementaal vertrouwelijk en dat toegang alleen mogelijk is via versleutelde beheerwerkplekken. Het beleid specificeert bovendien dat loggegevens onderdeel zijn van het archiefregime; bepaalde onderzoeken vallen onder de Archiefwet en vereisen langdurige bewaring of gecontroleerde vernietiging met aantoonbare dossiers.

Tot slot verbindt governance de loggingketen met externe toezichthouders. De Algemene Rekenkamer, Autoriteit Persoonsgegevens, Inspectie Justitie en Veiligheid en Europese instellingen vragen steeds vaker om directe exporten uit de unified audit log. Door vooraf te bepalen welke dashboards, exportprocedures en accountable officers daarbij horen, wordt voorkomen dat ad hoc scripts zonder kwaliteitscontrole worden gebruikt. Het beleid koppelt de Purview-inrichting aan landelijke programma’s zoals het Nationaal Beraad Digitale Veiligheid en de samenwerkingsverbanden tussen Rijk en gemeenten, zodat audit logging onderdeel wordt van bredere cyberweerbaarheid. Hierdoor blijft Purview audit logging geen technische voorziening maar een aantoonbare bestuurlijke waarborg.

Architectuur, licenties en implementatiepad

De architectuur van Purview audit logging maakt inzichtelijk hoe elke workload wordt aangesloten op de unified audit log. Het ontwerp begint met een inventarisatie van diensten en tenants: productie, test, OTA-omgevingen en eventueel leveranciers-tenants. Voor iedere tenant worden licentieniveaus vastgesteld. E3 licenties bieden negentig dagen retentie, terwijl E5 of add-on licenties een jaar of langer mogelijk maken. Organisaties die onder de Wet politiegegevens of NAVO-classificaties vallen, vereisen vaak minimaal één jaar retentie plus export naar een gesloten SIEM. Het ontwerp documenteert per workload de relevante gebeurtenissen, zoals SharePoint site permission changes, Entra ID role assignments, Teams policy updates en Purview DLP overrides. Deze mapping zorgt dat analisten weten welke logs beschikbaar zijn en welke aanvullende bronnen nodig zijn.

Tijdens de implementatie wordt het Purview-complianceportaal gebruikt om Unified Audit Log Ingestion te activeren. Tegelijkertijd draait het beheerteam PowerShell-commando’s zoals Get-AdminAuditLogConfig, Set-AdminAuditLogConfig en Search-UnifiedAuditLog om de configuratie te registreren in een change-dossier. Elk commando wordt vanuit een geharde beheerwerkplek uitgevoerd met meervoudige authenticatie en PIM-rolactivering. De resultaten worden naar een GitOps-repository geüpload zodat wijzigingen herleidbaar blijven. Voor ketenpartners die met gedeelde tenants werken (bijvoorbeeld samenwerkingsverbanden tussen gemeenten en veiligheidsregio’s) wordt vastgelegd hoe auditdata gescheiden blijven en wie verantwoordelijk is voor het exporteren van logbestanden richting lokale archieven of regionale SOC’s.

Een essentieel onderdeel van het implementatiepad is de koppeling met andere beveiligingslagen. Audit logging moet bijvoorbeeld signaleren wanneer Conditional Access policies worden aangepast, wanneer Defender for Cloud Apps connectors worden verwijderd of wanneer Purview Data Lifecycle Management policies worden gewijzigd. Daarom beschrijft de architectuur welke webhooks, Logic Apps of Sentinel connectors nodig zijn om logevents real-time te verwerken. Door per scenario een runbook te hebben – bijvoorbeeld voor wijziging van een eDiscovery-hold of het activeren van een nieuwe Teams-app – wordt gegarandeerd dat elk event niet alleen wordt gelogd maar ook wordt doorgeleid naar het juiste proces. Deze runbooks vormen een integraal onderdeel van de Nederlandse Baseline voor Veilige Cloud en sluiten aan bij bestaande NCSC-handreikingen.

Implementatie eindigt pas wanneer testen onder lokale debugcondities zijn afgerond. Het begeleidende PowerShell-script kan in DebugMode binnen vijftien seconden draaien zonder verbinding te maken met de Microsoft-cloud. Daarmee toetsen beheerders op een veilige laptop of automatiseringsstappen, logging en rapportageobjecten correct functioneren. Daarna wordt dezelfde code in productie uitgevoerd in monitoring- of remediatiemodus. Testresultaten worden gedeeld met het SOC, de privacy officer en de change-advisory board. Wanneer afwijkingen worden gevonden – bijvoorbeeld doordat UnifiedAuditLogIngestionEnabled na een tenant-upgrade is uitgeschakeld – volgt direct een remediatiescript en wordt het incident geregistreerd in het verbeterregister. Zo ontstaat een implementatiepad dat technische perfectie combineert met bestuurlijke transparantie.

Monitoring, rapportage en geautomatiseerde validatie

Gebruik PowerShell-script audit-logging-enabled.ps1 (functie Invoke-PurviewAuditLoggingBaseline) – Het script voert lokale debugcontroles uit, valideert de status van UnifiedAuditLogIngestionEnabled, AdminAuditLogEnabled en ingestieconnecties, en kan configuraties automatisch herstellen..

Monitoring begint bij het continuous controls framework. Elke nacht draait het script audit-logging-enabled.ps1 in een geautomatiseerde taak. De monitoringmodus verzamelt gegevens over de unified audit log, het ingestiepercentage, de status van exports naar Log Analytics en de aanwezigheid van kritieke beheerrollen. Resultaten worden naar het SOC-dashboard verstuurd en gekoppeld aan andere telemetrie zoals Defender-waarschuwingen. Hierdoor ziet het SOC direct wanneer logging uitvalt en welke workloads mogelijk geen forensische dekking meer hebben. Omdat het script een DebugMode kent, testen beheerders scripts eerst lokaal zonder verbinding waardoor zij voldoen aan de eis dat scripts binnen vijftien seconden moeten kunnen worden gevalideerd.

Rapportages worden opgesplitst naar drie publieken. Bestuurders ontvangen een kwartaalrapport met indicatoren als “dagen volledige logging beschikbaar”, “openstaande afwijkingen” en “impact op compliance-kaders”. Het SOC gebruikt dagelijkse dashboards die de ingestievolumes, foutcodes en uitzonderingen laten zien, aangevuld met automatische incidentregistraties in het ticketingsysteem wanneer UnifiedAuditLogIngestionEnabled naar False dreigt te gaan. Auditors en privacy officers krijgen toegang tot een archief van scriptuitvoer, exportbestanden en CAB-besluiten. Deze rapportages voegen context toe, zoals welke wijziging door welk beheeraccount is uitgevoerd en hoe lang een eventuele logging-onderbreking heeft geduurd.

Automatisering strekt verder dan monitoring. Het script bevat remediatie- en revertstappen die alleen na expliciete CAB-goedkeuring worden uitgevoerd. In remediatiemodus activeert het script audit logging, controleert het of AdminAuditLogEnabled consistent is en herstelt het optioneel aanvullende parameters zoals LogLevel of de ingestie van SharePoint-activiteiten. Bij elke actie worden console-uitvoer, JSON-logbestanden en ticketverwijzingen bijgehouden zodat auditors exact kunnen volgen wat er is gebeurd. Revertacties zijn standaard geblokkeerd en vereisen een WhatIf-parameter plus een schriftelijke motivatie, waarmee wordt voorkomen dat onbevoegden audit logging uitschakelen.

Tot slot maakt de organisatie een verbetercyclus rond de monitoringresultaten. Elke afwijking leidt tot een mini-rootcause-analyse waarin wordt onderzocht of licentieaanpassingen, nieuwe tenants, derde-partijapplicaties of menselijke fouten de oorzaak waren. De uitkomsten werden verwerkt in architectuurprincipes, aanvullende Sentinel-analyses of training voor beheerders. Lessons learned worden gedeeld via het Nederlandse Baseline voor Veilige Cloud-communitykanaal zodat andere organisaties dezelfde inzichten kunnen toepassen. Deze lerende aanpak zorgt ervoor dat Purview audit logging niet alleen op papier voldoet, maar ook onder druk van incidenten, reorganisaties of verkiezingsperiodes stabiel blijft functioneren.

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 Baselinecontrole voor Purview audit logging in Microsoft 365. .DESCRIPTION Valideert of Unified Audit Log Ingestion actief is, controleert aanvullende instellingen zoals AdminAuditLogEnabled en biedt geautomatiseerde remediatie. Het script bevat een DebugMode waarmee alle logica lokaal kan worden getest in minder dan vijftien seconden zonder verbinding te maken met Microsoft 365. .NOTES Filename: audit-logging-enabled.ps1 Author: Nederlandse Baseline voor Veilige Cloud Created: 2025-11-27 Last Modified: 2025-11-27 Version: 1.0 Related JSON: content/m365/purview/audit-logging-enabled.json Workload: Microsoft 365 / Purview .LINK https://github.com/m365-tenant-best-practise .EXAMPLE .\audit-logging-enabled.ps1 -Monitoring Voert de compliancecontrole uit en toont aanbevelingen. .EXAMPLE .\audit-logging-enabled.ps1 -Remediation Schakelt Unified Audit Log Ingestion in en bevestigt de wijziging. .EXAMPLE .\audit-logging-enabled.ps1 -DebugMode -Monitoring Voert een lokale test uit zonder cloudverbinding (maximaal vijftien seconden). #> #Requires -Version 5.1 #Requires -Modules ExchangeOnlineManagement [CmdletBinding()] param( [Parameter()] [switch]$Monitoring, [Parameter()] [switch]$Remediation, [Parameter()] [switch]$Revert, [Parameter()] [switch]$DebugMode, [Parameter()] [switch]$WhatIf ) $ErrorActionPreference = 'Stop' $script:Connected = $false function Write-Banner { Write-Host "`n========================================" -ForegroundColor Cyan Write-Host "Purview audit logging baseline" -ForegroundColor Cyan Write-Host "Nederlandse Baseline voor Veilige Cloud" -ForegroundColor Cyan Write-Host "========================================`n" -ForegroundColor Cyan } function Connect-RequiredServices { [CmdletBinding()] param() if ($DebugMode -or $script:Connected) { if ($DebugMode) { Write-Verbose "DebugMode actief: er wordt geen cloudverbinding opgezet." } return } Write-Verbose "Verbinding maken met Exchange Online (Security & Compliance)." Connect-ExchangeOnline -ShowBanner:$false -ErrorAction Stop | Out-Null $script:Connected = $true } function Disconnect-RequiredServices { [CmdletBinding()] param() if ($DebugMode -or -not $script:Connected) { $script:Connected = $false return } try { Disconnect-ExchangeOnline -Confirm:$false -ErrorAction SilentlyContinue | Out-Null } catch { Write-Verbose "Kon Exchange Online sessie niet netjes afsluiten: $($_.Exception.Message)" } finally { $script:Connected = $false } } function Get-AuditConfiguration { [CmdletBinding()] param() if ($DebugMode) { return [pscustomobject]@{ UnifiedAuditLogIngestionEnabled = $true AdminAuditLogEnabled = $true UnifiedAuditLogLastUpdate = (Get-Date).AddMinutes(-5) LogLevel = 'Verbose' UnifiedAuditLogIngestionEnabledOn = (Get-Date).AddDays(-120) } } Connect-RequiredServices return Get-AdminAuditLogConfig -ErrorAction Stop } function Test-Compliance { [CmdletBinding()] param() $config = Get-AuditConfiguration $result = [ordered]@{ ScriptName = 'audit-logging-enabled' Timestamp = Get-Date UnifiedAuditEnabled = [bool]$config.UnifiedAuditLogIngestionEnabled AdminAuditEnabled = [bool]$config.AdminAuditLogEnabled LogLevel = $config.LogLevel LastConfigUpdate = $config.UnifiedAuditLogLastUpdate DaysSinceLastUpdate = if ($config.UnifiedAuditLogLastUpdate) { ((Get-Date) - $config.UnifiedAuditLogLastUpdate).TotalDays } else { $null } IsCompliant = $false Recommendations = @() } if (-not $result.UnifiedAuditEnabled) { $result.Recommendations += 'Schakel Unified Audit Log Ingestion in via Set-AdminAuditLogConfig.' } if (-not $result.AdminAuditEnabled) { $result.Recommendations += 'Activeer AdminAuditLogEnabled zodat beheerhandelingen worden vastgelegd.' } if ($result.LogLevel -notin @('Verbose', 'All')) { $result.Recommendations += 'Verhoog LogLevel naar Verbose voor volledige forensische dekking.' } if (-not $result.LastConfigUpdate) { $result.Recommendations += 'Er is geen wijzigingsdatum bekend; documenteer een recente validatie.' } elseif ($result.DaysSinceLastUpdate -gt 365) { $result.Recommendations += 'Controleer of de configuratie het afgelopen jaar formeel is herbevestigd.' } if ($result.Recommendations.Count -eq 0) { $result.IsCompliant = $true } return [pscustomobject]$result } function Invoke-Monitoring { [CmdletBinding()] param() Write-Verbose "Monitoringmodus gestart." $summary = Test-Compliance Write-Host "Unified Audit logging : $($summary.UnifiedAuditEnabled)" -ForegroundColor Gray Write-Host "Admin audit logging : $($summary.AdminAuditEnabled)" -ForegroundColor Gray Write-Host "Logniveau : $($summary.LogLevel)" -ForegroundColor Gray if ($summary.LastConfigUpdate) { Write-Host "Laatste wijziging : $($summary.LastConfigUpdate)" -ForegroundColor Gray } if ($summary.IsCompliant) { Write-Host "`n[OK] Purview audit logging voldoet aan de baseline." -ForegroundColor Green } else { Write-Host "`n[ALERT] Afwijkingen gevonden:" -ForegroundColor Yellow foreach ($rec in $summary.Recommendations) { Write-Host " - $rec" -ForegroundColor Yellow } } return $summary } function Invoke-Remediation { [CmdletBinding()] param() if ($DebugMode) { Write-Host "DebugMode: remediatie wordt niet uitgevoerd, alleen gesimuleerd." -ForegroundColor Yellow return } Connect-RequiredServices $config = Get-AdminAuditLogConfig -ErrorAction Stop $changes = @() if (-not $config.UnifiedAuditLogIngestionEnabled) { $changes += 'UnifiedAuditLogIngestionEnabled' } if (-not $config.AdminAuditLogEnabled) { $changes += 'AdminAuditLogEnabled' } if ($config.LogLevel -notin @('Verbose', 'All')) { $changes += 'LogLevel' } if ($changes.Count -eq 0) { Write-Host "Alle instellingen zijn al conform de baseline." -ForegroundColor Green return } if ($WhatIf) { Write-Host "WhatIf: de volgende instellingen zouden worden aangepast: $($changes -join ', ')." -ForegroundColor Yellow return } Write-Host "Wijzigingen toepassen: $($changes -join ', ')" -ForegroundColor Gray Set-AdminAuditLogConfig ` -UnifiedAuditLogIngestionEnabled:$true ` -AdminAuditLogEnabled:$true ` -LogLevel Verbose ` -ErrorAction Stop Write-Host "Configuratie opnieuw controleren..." -ForegroundColor Gray $after = Get-AdminAuditLogConfig -ErrorAction Stop if ($after.UnifiedAuditLogIngestionEnabled -and $after.AdminAuditLogEnabled) { Write-Host "[OK] Audit logging is succesvol hersteld." -ForegroundColor Green } else { throw "Audit logging kon niet volledig worden hersteld." } } function Invoke-Revert { [CmdletBinding()] param() Write-Host "WAARSCHUWING: het uitschakelen van audit logging creëert een groot privacy- en veiligheidsrisico." -ForegroundColor Red if ($DebugMode) { Write-Host "DebugMode: revert wordt niet uitgevoerd." -ForegroundColor Yellow return } if ($WhatIf) { Write-Host "WhatIf: audit logging zou worden uitgeschakeld, maar er worden geen wijzigingen doorgevoerd." -ForegroundColor Yellow return } Connect-RequiredServices Set-AdminAuditLogConfig -UnifiedAuditLogIngestionEnabled:$false -ErrorAction Stop Write-Host "Unified Audit Log is uitgeschakeld. Documenteer expliciet waarom dit noodzakelijk was." -ForegroundColor Yellow } function Invoke-PurviewAuditLoggingBaseline { [CmdletBinding()] param() return Test-Compliance } try { Write-Banner if ($Monitoring) { Invoke-Monitoring | Out-Null } elseif ($Remediation) { Invoke-Remediation } elseif ($Revert) { Invoke-Revert } else { $summary = Invoke-PurviewAuditLoggingBaseline $summary | Format-List } } catch { Write-Error "Er is een fout opgetreden: $($_.Exception.Message)" throw } finally { Disconnect-RequiredServices Write-Host "`n========================================`n" -ForegroundColor Cyan }

Risico zonder implementatie

Risico zonder implementatie
Critical: Zonder aantoonbaar ingeschakelde Purview audit logging ontbreekt een volledige audittrail voor justitiële onderzoeken, parlementaire verantwoording en juridische procedures. Bestuurders verliezen zicht op beheerhandelingen en lopen het risico op sancties van Autoriteit Persoonsgegevens of boetes vanuit NIS2.

Management Samenvatting

Activeer, documenteer en automatiseer Purview audit logging met duidelijke governance, licentiebeheer en continue monitoring. Gebruik het script audit-logging-enabled.ps1 voor snelle debugtests en remediatie, zodat Nederlandse overheidsorganisaties altijd kunnen aantonen wie welke actie in de tenant heeft uitgevoerd.