Audit Logging Ingeschakeld In Microsoft 365

💼 Management Samenvatting

Audit logging vormt de ruggengraat van forensisch onderzoek, compliance-audits en operationele beveiligingsmonitoring in Microsoft 365. Zonder betrouwbare en volledig ingeschakelde auditlogs ontbreekt elk objectief bewijs van wie welke actie heeft uitgevoerd, op welk moment en met welke impact op gegevens en configuraties.

Aanbeveling
IMPLEMENT
Risico zonder
Critical
Risk Score
9/10
Implementatie
8u (tech: 4u)
Van toepassing op:
M365

Voor Nederlandse overheidsorganisaties is het kunnen reconstrueren van gebeurtenissen geen luxe, maar een wettelijke en bestuurlijke verplichting. De BIO, AVG en NIS2 schrijven expliciet voor dat toegang tot systemen en gegevens moet worden gelogd en dat organisaties in staat moeten zijn om achteraf na te gaan welke handelingen hebben plaatsgevonden. In de praktijk blijkt echter regelmatig dat audit logging niet overal is ingeschakeld, dat logs een beperkte bewaartermijn hebben of dat cruciale workloads buiten beeld blijven. Dit leidt tot ernstige risico’s: incidenten kunnen niet volledig worden onderzocht, de organisatie kan geen sluitend verhaal presenteren aan toezichthouders of de Algemene Rekenkamer, en bestuurders missen feitelijke informatie om te bepalen welke verbetermaatregelen nodig zijn. Bij een datalek wordt het vrijwel onmogelijk om vast te stellen welke gegevens zijn geraadpleegd of geëxfiltreerd, wat direct doorwerkt in de zwaarte van de melding en de beoordeling door de Autoriteit Persoonsgegevens.

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

Implementatie

Dit artikel beschrijft hoe u ervoor zorgt dat audit logging in Microsoft 365 aantoonbaar is ingeschakeld en effectief wordt beheerd. We behandelen de functionele en technische vereisten, de concrete implementatiestappen in het Purview-complianceportaal en via PowerShell, en de manier waarop u periodiek controleert dat logging actief blijft. Daarnaast gaan we in op de inpassing in Nederlandse normenkaders zoals BIO, ISO 27001 en NIS2 en op de wijze waarop u auditlogging verbindt met operationele processen in SOC, IT-beheer en governance. Het doel is een situatie waarin u op ieder moment met één druk op de knop kunt aantonen dat alle relevante activiteiten in uw Microsoft 365-tenant worden gelogd, dat bewaartermijnen aansluiten op wettelijke eisen en dat afwijkingen snel worden opgespoord en gecorrigeerd.

Vereisten

Een robuuste inrichting van audit logging begint bij heldere bestuurlijke kaders. Het bestuur, de concerndirectie of het college van B&W moet expliciet vastleggen dat alle kritieke Microsoft 365-diensten – waaronder Exchange Online, SharePoint Online, OneDrive for Business, Microsoft Teams en Entra ID – onder het regime van centrale audit logging vallen. Deze bestuurlijke keuze wordt vastgelegd in het informatiebeveiligingsbeleid en de onderliggende procedures voor logging en monitoring. Daarbij wordt bepaald welke gebeurtenissen minimaal gelogd moeten worden (zoals aanmeldingen, privilege-escalaties, wijzigingen in toegangsrechten, configuratiewijzigingen, activiteiten rond gevoelige gegevens en gebruik van PowerShell), welke bewaartermijnen passend zijn bij de risico’s en welke rolverdeling geldt tussen CISO, proceseigenaren, beheerteams en het Security Operations Center (SOC).

Vervolgens zijn de juiste licenties en technische randvoorwaarden nodig. Unified audit logging vereist minimaal Microsoft 365 E3 voor standaard logging met een bewaartermijn van negentig dagen; voor verlengde bewaartermijnen tot één jaar of langer zijn E5-licenties, add-ons of export naar een externe logopslag nodig, bijvoorbeeld Azure Log Analytics in combinatie met Microsoft Sentinel. Beheerders die audit logging beheren of controleren, hebben specifieke rollen nodig zoals Audit Administrator, Compliance Administrator of Security Administrator. Deze rollen worden bij voorkeur via Privileged Identity Management (PIM) Just-in-Time toegekend om misbruikrisico’s te beperken en iedere escalatie vast te leggen in het toegangsbeheerregister. Daarnaast moet de organisatie beschikken over een veilige beheervoorziening (bijvoorbeeld een geharde beheerwerkplek) vanaf waar PowerShell-sessies naar Microsoft 365 kunnen worden opgezet met meervoudige authenticatie.

Aan de technische kant is het essentieel dat de benodigde PowerShell-modules beschikbaar zijn en dat netwerkconnectiviteit naar de Microsoft 365 endpoints is gegarandeerd. De ExchangeOnlineManagement-module vormt de kern voor het beheren van audit logging via cmdlets als Get-AdminAuditLogConfig en Set-AdminAuditLogConfig. Beheerders moeten kunnen aantonen dat deze module up-to-date is geïnstalleerd op de beheerwerkplekken en dat de uitvoeringspolitiek (Execution Policy) zodanig is ingericht dat goedgekeurde scripts veilig kunnen worden uitgevoerd. Daarnaast zijn koppelingen met het SIEM noodzakelijk om auditlogs die naar Log Analytics of Sentinel worden geëxporteerd, verder te kunnen analyseren en te correleren met andere telemetrie.

Tot slot zijn procesmatige en organisatorische vereisten onmisbaar. Er moet een formeel logbeleid zijn waarin is vastgelegd welke logs voor welke duur worden bewaard, wie toegang heeft tot loggegevens, hoe omgegaan wordt met verzoeken van toezichthouders en hoe de organisatie invulling geeft aan de beginselen van dataminimalisatie en doelbinding onder de AVG. Een change-proces borgt dat wijzigingen in loggingconfiguratie (bijvoorbeeld het wijzigen van bewaartermijnen of het toevoegen van nieuwe workloads) altijd via een CAB worden beoordeeld en gedocumenteerd. Daarnaast is een periodieke controlecyclus nodig – bijvoorbeeld per kwartaal – waarin de CISO of een aangewezen auditor verifieert dat audit logging nog steeds is ingeschakeld, dat exports correct functioneren en dat incidenten uit auditlogs daadwerkelijk worden opgevolgd in het SOC.

Implementatie

De implementatie van audit logging in Microsoft 365 start met een inventarisatie van de huidige status. In het Microsoft Purview complianceportaal navigeert u naar de sectie Audit en controleert u of de unified audit log is geactiveerd. Indien de knop "Start recording" nog zichtbaar is, betekent dit dat logging niet volledig actief is. In dat geval activeert u de functionaliteit via het portaal en legt u vast op welk moment de wijziging is doorgevoerd en welke impact dit heeft op de beschikbaarheid van historische logs. Parallel hieraan voert u via PowerShell een nulmeting uit met Get-AdminAuditLogConfig om de huidige configuratie inclusief UnifiedAuditLogIngestionEnabled, administratieve loginstellingen en eventuele aangepaste parameters te documenteren. Deze nulmeting vormt het referentiepunt voor audits en voor toekomstige wijzigingen.

Na de nulmeting wordt de gewenste doelsituatie ingericht. Met behulp van Set-AdminAuditLogConfig zorgt u ervoor dat UnifiedAuditLogIngestionEnabled op True staat en dat aanvullende opties – zoals het loggen van Exchange-beheeracties en mailbox-auditevents – conform beleid zijn geconfigureerd. Voor organisaties die uitgebreide forensische analyses willen uitvoeren, worden exports naar Azure Log Analytics of een ander centrale logopslag geconfigureerd. Dit gebeurt via het Purview-complianceportaal of via geautomatiseerde configuraties, waarbij de auditlogbron wordt gekoppeld aan een Log Analytics-workspace met passende toegangsbeperkingen. Het is belangrijk dat deze exportconfiguratie wordt gedocumenteerd, inclusief welke werkruimtes worden gebruikt, welke retentie-instellingen gelden en hoe de kosten worden beheerst.

Vervolgens valideert u of audit logging daadwerkelijk gebeurtenissen registreert. Dit doet u door een testscenario uit te voeren, bijvoorbeeld het aanpassen van een Exchange-configuratie, het wijzigen van een SharePoint-machtiging of het toekennen van een nieuwe rol in Entra ID, en daarna via Search-UnifiedAuditLog na te gaan of de betreffende acties binnen de verwachte tijd in de unified audit log verschijnen. Deze tests worden bij voorkeur uitgevoerd in een gescheiden testtenant of in een gecontroleerde productieomgeving met vooraf goedgekeurde testactiviteiten. De resultaten worden vastgelegd in een testrapport met tijdstempels, gebruikte accounts, verwachte events en aangetroffen events. Hiermee bouwt u bewijs op dat de inrichting niet alleen theoretisch klopt, maar in de praktijk betrouwbare logs oplevert.

Tot slot automatiseert u de controle op de configuratie. Door een PowerShell-script in te zetten dat periodiek de status van UnifiedAuditLogIngestionEnabled, eventuele afwijkende instellingen en de gezondheid van de exportkoppeling controleert, voorkomt u dat wijzigingen onopgemerkt blijven. Dit script kan worden aangeroepen vanuit een taakplanner of een CI/CD-pijplijn voor configuratievalidatie. Bij afwijkingen genereert het script een melding richting het SOC of de beheerorganisatie, inclusief een korte samenvatting van het probleem en een verwijzing naar het herstelproces. Door deze automatisering ontstaat een continu borgingsmechanisme dat veel verder gaat dan een eenmalige implementatie en dat naadloos aansluit op de eisen van de Nederlandse Baseline voor Veilige Cloud.

Monitoring

Gebruik PowerShell-script audit-logging-enabled.ps1 (functie Invoke-Monitoring) – Controleert of unified audit logging is ingeschakeld en rapporteert de status als compliant of non-compliant..

Monitoring van audit logging richt zich op het vroegtijdig signaleren van configuratiewijzigingen, storingen en onverwachte gaten in de loggingketen. Met de functie Invoke-Monitoring in het script audit-logging-enabled.ps1 maakt u via Connect-ExchangeOnline verbinding met de tenant, leest u de huidige configuratie uit en beoordeelt u of UnifiedAuditLogIngestionEnabled nog steeds op True staat. Het script rapporteert de uitkomst als een gestructureerd object en schrijft duidelijke statusmeldingen weg naar de console, zodat zowel geautomatiseerde controles als handmatige uitvoeringen bruikbaar zijn. Wanneer de status non-compliant is, levert het script een exitcode terug die direct kan worden geïnterpreteerd door monitoringtools of CI/CD-pijplijnen.

Naast de binaire vraag of logging aan of uit staat, moet monitoring zicht geven op trends in logvolume en het functioneren van exportkoppelingen. Door de uitkomsten van periodieke controles te combineren met statistieken uit Log Analytics of Sentinel (zoals aantal events per dag, verdeling over workloads en foutmeldingen in ingestie) kan het SOC afwijkingen detecteren die mogelijk wijzen op onderliggende problemen, zoals licentiewijzigingen, mislukte serviceupdates of wijzigingen in netwerkconfiguraties. Deze inzichten worden vastgelegd in dashboards en rapportages die periodiek met de CISO en proceseigenaren worden besproken.

Monitoring omvat ook het bewaken van toegangsrechten tot auditlogs zelf. Alleen een beperkt aantal functionarissen mag toegang hebben tot gedetailleerde loggegevens, omdat auditlogs gevoelige informatie bevatten over gebruikersgedrag en mogelijke incidenten. Door regelmatig te controleren welke accounts toegang hebben tot het Purview Audit-portaal en welke rollen aan hen zijn toegekend, voorkomt u privilege creep en kunt u bij audits aantonen dat ook de toegang tot logging onder controle staat. Deze controles worden idealiter geautomatiseerd via rapportages uit Entra ID en de Microsoft 365-rollenstructuur, gecombineerd met periodieke handmatige reviews.

Remediatie

Gebruik PowerShell-script audit-logging-enabled.ps1 (functie Invoke-Remediation) – Schakelt unified audit logging in wanneer deze is uitgeschakeld en valideert de configuratie..

Wanneer uit monitoring blijkt dat audit logging (gedeeltelijk) is uitgeschakeld of niet conform beleid is geconfigureerd, moet de organisatie snel en gecontroleerd kunnen herstellen. De functie Invoke-Remediation in audit-logging-enabled.ps1 automatiseert dit herstelproces. Het script maakt verbinding met Exchange Online, leest de huidige status van UnifiedAuditLogIngestionEnabled uit en schakelt logging in wanneer deze uitstaat. Na het doorvoeren van de wijziging voert het script een verificatiestap uit om te bevestigen dat de configuratie daadwerkelijk is bijgewerkt. Deze werkwijze voorkomt handmatige fouten en zorgt ervoor dat herstelacties volledig worden gelogd in de uitvoer van het script en, indien gewenst, in een centraal configuratieregister.

Remediatie beperkt zich niet tot het simpelweg weer inschakelen van logging. In geval van een incident moet worden onderzocht waarom audit logging is uitgeschakeld geraakt: was er sprake van een bewuste wijziging zonder goedkeuring, een mislukte update, een fout in een script of een beleidsbesluit dat niet via de juiste kanalen is verlopen? Deze rootcause-analyse wordt vastgelegd in het verbeterregister en leidt tot aanvullende maatregelen, zoals het aanscherpen van change-procedures, het beperken van beheerdersrechten of het toevoegen van extra controles in CI/CD-pijplijnen. Wanneer er sprake is geweest van een periode zonder logging, moet bovendien worden beoordeeld of dit impact heeft op lopende onderzoeken, compliance-verplichtingen of meldplichten richting toezichthouders.

Na iedere remediatie volgt een evaluatie met betrokken stakeholders. Het SOC, de CISO, privacy officers en relevante proceseigenaren beoordelen gezamenlijk wat de impact was van het incident, welke risico’s zijn gelopen en welke structurele verbeteringen nodig zijn. Denk aan het uitbreiden van rapportages, het verhogen van de frequentie van monitoring, het toevoegen van extra waarschuwingen wanneer UnifiedAuditLogIngestionEnabled wijzigt, of het opnemen van specifieke auditlogging-controles in interne en externe audits. Door remediatie op deze manier te verankeren in de PDCA-cyclus ontstaat een duurzaam mechanisme waarmee de organisatie aantoonbaar leert van incidenten en de betrouwbaarheid van audit logging continu verbetert.

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 Audit Logging Enabled .DESCRIPTION Controleert en zorgt ervoor dat de Microsoft 365 Unified Audit Log is ingeschakeld. Kritiek voor beveiligingsonderzoeken, compliance-audits en forensische analyses. .NOTES Filename: audit-logging-enabled.ps1 Author: Nederlandse Baseline voor Veilige Cloud Category: audit-compliance .EXAMPLE .\audit-logging-enabled.ps1 -Monitoring Controleer of unified audit logging is ingeschakeld. .EXAMPLE .\audit-logging-enabled.ps1 -Remediation Schakel unified audit logging in wanneer deze is uitgeschakeld. #> #Requires -Version 5.1 #Requires -Modules ExchangeOnlineManagement [CmdletBinding()] param( [Parameter(Mandatory = $false)] [switch]$Monitoring, [Parameter(Mandatory = $false)] [switch]$Remediation, [Parameter(Mandatory = $false)] [switch]$Revert, [Parameter(Mandatory = $false)] [switch]$WhatIf ) $ErrorActionPreference = 'Stop' Write-Host "`n========================================" -ForegroundColor Cyan Write-Host "Audit Logging Enabled" -ForegroundColor Cyan Write-Host "Nederlandse Baseline voor Veilige Cloud" -ForegroundColor Cyan Write-Host "========================================`n" -ForegroundColor Cyan function Invoke-Monitoring { <# .SYNOPSIS Controleert of unified audit logging is ingeschakeld. #> try { Write-Host "Verbinding maken met Exchange Online..." -ForegroundColor Gray Connect-ExchangeOnline -ShowBanner:$false -ErrorAction Stop Write-Host "Huidige configuratie van unified audit logging ophalen..." -ForegroundColor Gray $auditConfig = Get-AdminAuditLogConfig -ErrorAction Stop $isEnabled = $auditConfig.UnifiedAuditLogIngestionEnabled -eq $true $result = [PSCustomObject]@{ IsCompliant = $isEnabled UnifiedAuditLogEnabled = $isEnabled AdminAuditLogEnabled = $auditConfig.AdminAuditLogEnabled LastConfigUpdate = $auditConfig.LastUpdateTime } Write-Host "" if ($isEnabled) { Write-Host " [OK] Unified Audit Log: ENABLED" -ForegroundColor Green Write-Host " Activiteiten worden opgenomen in de unified audit log." -ForegroundColor Cyan Write-Host "`n[OK] COMPLIANT" -ForegroundColor Green $result | Out-String | Write-Verbose return $result } else { Write-Host " [FAIL] Unified Audit Log: DISABLED" -ForegroundColor Red Write-Host " Er wordt geen volledige audittrail opgebouwd in Microsoft 365." -ForegroundColor Red Write-Host "`n[FAIL] NON-COMPLIANT" -ForegroundColor Red $result | Out-String | Write-Verbose return $result } } catch { Write-Host "`n[FAIL] ER IS EEN FOUT OPGETREDEN TIJDENS MONITORING" -ForegroundColor Red Write-Host "Details: $($_.Exception.Message)" -ForegroundColor Red throw } finally { try { Disconnect-ExchangeOnline -Confirm:$false -ErrorAction SilentlyContinue | Out-Null } catch { # negeren, best effort disconnect } } } function Invoke-Remediation { <# .SYNOPSIS Schakelt unified audit logging in wanneer deze is uitgeschakeld. #> try { if ($WhatIf) { Write-Host "[INFO] WhatIf-modus: er worden geen wijzigingen doorgevoerd." -ForegroundColor Yellow } Write-Host "Verbinding maken met Exchange Online..." -ForegroundColor Gray Connect-ExchangeOnline -ShowBanner:$false -ErrorAction Stop Write-Host "Huidige status van unified audit logging controleren..." -ForegroundColor Gray $auditConfig = Get-AdminAuditLogConfig -ErrorAction Stop if ($auditConfig.UnifiedAuditLogIngestionEnabled -eq $true) { Write-Host " [OK] Unified Audit Log is al ingeschakeld." -ForegroundColor Green Write-Host "`n[OK] Geen remediatie nodig, configuratie is compliant." -ForegroundColor Green return } Write-Host "Unified Audit Log is uitgeschakeld. Remediatie wordt gestart..." -ForegroundColor Yellow if (-not $WhatIf) { Write-Host "Unified Audit Log inschakelen..." -ForegroundColor Gray Set-AdminAuditLogConfig -UnifiedAuditLogIngestionEnabled $true -ErrorAction Stop } else { Write-Host "[WhatIf] Set-AdminAuditLogConfig -UnifiedAuditLogIngestionEnabled \$true" -ForegroundColor Gray } Write-Host "Configuratie opnieuw valideren..." -ForegroundColor Gray $auditConfigAfter = Get-AdminAuditLogConfig -ErrorAction Stop if ($auditConfigAfter.UnifiedAuditLogIngestionEnabled -eq $true) { Write-Host "`n[OK] Unified Audit Log is succesvol ingeschakeld." -ForegroundColor Green Write-Host "Belangrijke aandachtspunten:" -ForegroundColor Cyan Write-Host " - Logs worden minimaal 90 dagen bewaard (afhankelijk van licentie)." -ForegroundColor Gray Write-Host " - Voor langere bewaartermijnen exporteert u logs naar Log Analytics of een SIEM." -ForegroundColor Gray Write-Host " - Raadpleeg het Purview-complianceportaal voor auditlog-zoekopdrachten." -ForegroundColor Gray } else { Write-Host "`n[FAIL] Unified Audit Log kon niet betrouwbaar worden ingeschakeld." -ForegroundColor Red throw "UnifiedAuditLogIngestionEnabled is na remediatie nog steeds niet actief." } } catch { Write-Host "`n[FAIL] ER IS EEN FOUT OPGETREDEN TIJDENS REMEDIATIE" -ForegroundColor Red Write-Host "Details: $($_.Exception.Message)" -ForegroundColor Red throw } finally { try { Disconnect-ExchangeOnline -Confirm:$false -ErrorAction SilentlyContinue | Out-Null } catch { # negeren, best effort disconnect } } } function Invoke-Revert { <# .SYNOPSIS Schakelt unified audit logging uit (niet aanbevolen). #> try { Write-Host "WAARSCHUWING: Het uitschakelen van audit logging is een groot beveiligingsrisico." -ForegroundColor Red Write-Host "Er wordt geen volledige audittrail meer opgebouwd voor incidentonderzoek en compliance." -ForegroundColor Red if ($WhatIf) { Write-Host "[WhatIf] Audit logging wordt niet daadwerkelijk uitgeschakeld." -ForegroundColor Yellow return } Write-Host "Verbinding maken met Exchange Online..." -ForegroundColor Gray Connect-ExchangeOnline -ShowBanner:$false -ErrorAction Stop Write-Host "Unified Audit Log uitschakelen..." -ForegroundColor Gray Set-AdminAuditLogConfig -UnifiedAuditLogIngestionEnabled $false -ErrorAction Stop Write-Host "Unified Audit Log is uitgeschakeld." -ForegroundColor Yellow } catch { Write-Host "ER IS EEN FOUT OPGETREDEN TIJDENS REVERT: $_" -ForegroundColor Red throw } finally { try { Disconnect-ExchangeOnline -Confirm:$false -ErrorAction SilentlyContinue | Out-Null } catch { # negeren } } } try { if ($Revert) { Invoke-Revert } elseif ($Monitoring) { Invoke-Monitoring | Out-Null } elseif ($Remediation) { Invoke-Remediation } else { Write-Host "Gebruik:" -ForegroundColor Yellow Write-Host " -Monitoring Controleert of unified audit logging is ingeschakeld." -ForegroundColor Gray Write-Host " -Remediation Schakelt unified audit logging in wanneer deze is uitgeschakeld." -ForegroundColor Gray Write-Host " -Revert Schakelt unified audit logging uit (niet aanbevolen)." -ForegroundColor Red Write-Host " -WhatIf Toont welke acties zouden worden uitgevoerd zonder wijzigingen te maken." -ForegroundColor Gray } } catch { throw } finally { Write-Host "`n========================================`n" -ForegroundColor Cyan }

Risico zonder implementatie

Risico zonder implementatie
Critical: Wanneer audit logging niet is ingeschakeld of slechts gedeeltelijk functioneert, ontbreekt een betrouwbare audittrail voor beveiligingsincidenten, compliance-audits en juridische onderzoeken. De organisatie kan dan niet aantonen welke acties zijn uitgevoerd, door wie en met welke impact, wat leidt tot verhoogde kans op boetes, toezichtsmaatregelen en verlies van vertrouwen bij burgers en ketenpartners.

Management Samenvatting

Schakel unified audit logging in voor alle relevante Microsoft 365-workloads, verifieer de configuratie via PowerShell en het Purview-complianceportaal, en automatiseer monitoring en remediatie met audit-logging-enabled.ps1. Hiermee voldoet u aantoonbaar aan eisen uit CIS 5.1.1, BIO 12.04, ISO 27001 en AVG artikel 32 en verkleint u het risico op onbeheersbare incidenten en incompleet forensisch bewijs.