Playbook Library Voor Microsoft 365 Incident Response

💼 Management Samenvatting

Een centrale playbook library voor Microsoft 365 incident response voorkomt dat analisten en beheerders tijdens een crisis ad‑hoc moeten bedenken welke stappen zij moeten nemen. Door uniforme, goed gedocumenteerde playbooks op te bouwen, te beheren en te koppelen aan concrete signalen uit Microsoft 365 ontstaat een reproduceerbare en aantoonbare aanpak voor beveiligingsincidenten.

Aanbeveling
IMPLEMENT
Risico zonder
High
Risk Score
8/10
Implementatie
60u (tech: 20u)
Van toepassing op:
M365
Overheidsorganisaties
Kritieke processen

Veel Nederlandse overheidsorganisaties beschikken inmiddels over losse runbooks, notities en ervaring binnen teams, maar deze kennis is vaak versnipperd over persoonlijke mappen, e‑mailarchieven of wiki's. Tijdens een echt incident leidt dit tot tijdverlies, inconsistentie in beslissingen en discussies over 'hoe we het de vorige keer ook alweer deden'. Tegelijkertijd vragen de BIO, NIS2 en de AVG om aantoonbare, herhaalbare processen waarmee organisaties kunnen laten zien dat zij passende maatregelen hebben genomen om de impact van incidenten in Microsoft 365 te beperken. Een goed ingerichte playbook library brengt structuur in dit landschap: alle kritieke scenario's worden beschreven in eenduidige formats, voorzien van beslislogica, verwijzingen naar relevante logbronnen en heldere koppelingen met meldplichten, communicatie en business continuity. Hierdoor kunnen analisten sneller handelen, bestuurders krijgen beter inzicht in de aanpak en auditors zien dat incidentrespons meer is dan individuele vakkennis.

PowerShell Modules Vereist
Primary API: Microsoft 365 Defender, Entra ID en Purview portals
Connection: Browser; optioneel PowerShell voor governance- en rapportagerapporten
Required Modules:

Implementatie

Dit artikel beschrijft hoe een playbook library voor Microsoft 365 incident response wordt ontworpen, beheerd en in de praktijk gebruikt. Het gaat in op de eisen aan inhoud en structuur van playbooks, de governance rond eigenaarschap en review, de integratie met Microsoft 365 Defender, Purview en andere monitoringoplossingen, en de manier waarop playbooks aansluiten op bredere crisis- en continuïteitsprocessen. Daarnaast laat het artikel zien hoe een eenvoudige PowerShell-tooling kan worden gebruikt om de volledigheid en actualiteit van de library te controleren en om organisaties te helpen bij het opstarten van een eerste set playbooks. Het doel is dat Nederlandse overheidsorganisaties beschikken over een professionele, goed gedocumenteerde bibliotheek met playbooks die direct inzetbaar is tijdens incidenten én aantoonbaar voldoet aan de eisen van toezichthouders.

Functionele en organisatorische eisen aan een playbook library

Een playbook library voor Microsoft 365 heeft alleen waarde wanneer de inhoud betrouwbaar, volledig en actueel is. Dat begint met een heldere definitie van wat een playbook is en hoe het wordt opgebouwd. In de context van de Nederlandse Baseline voor Veilige Cloud is een playbook een gestandaardiseerde set stappen, beslismomenten en communicatielijnen voor een specifiek type incident in Microsoft 365, bijvoorbeeld een gecompromitteerd account, verdachte mailboxregels, ongeautoriseerde externe deling of misbruik van beheerrollen. Elk playbook beschrijft het doel van de procedure, de triggers die tot uitvoering leiden, de benodigde logbronnen en tooling, de rollen en verantwoordelijkheden, de concrete acties voor detectie, containment, herstel en nazorg, en de criteria om het incident formeel te sluiten. Daarnaast hoort bij elk playbook een paragraaf over meldplichten (AVG, NIS2) en de relatie met business continuity plannen. Door deze elementen te standaardiseren, ontstaat een library die ook door nieuwe analisten en beheerders begrijpelijk en toepasbaar is.

Organisatorische inbedding is minstens zo belangrijk als inhoudelijke kwaliteit. Een volwassen playbook library heeft een formele eigenaar, bij voorkeur de CISO of een aangewezen lead binnen de security operations- of governanceorganisatie, met mandaat om wijzigingen te autoriseren en afdelingen aan te spreken op het bijhouden van hun playbooks. Per playbook wordt een inhoudelijk eigenaar aangewezen (bijvoorbeeld het Microsoft 365-beheerteam of het SOC), die verantwoordelijk is voor inhoud, periodieke review en validatie tijdens oefeningen. Deze eigenaarschapstructuur wordt vastgelegd in beleid en procedures, zodat duidelijk is wie beslissingsbevoegd is bij conflicterende inzichten of wanneer nieuwe verplichtingen uit wet- en regelgeving moeten worden verwerkt. Daarnaast wordt in het governancekader vastgelegd hoe vaak playbooks minimaal worden herzien (bijvoorbeeld jaarlijks of na ieder relevant incident) en hoe wijzigingen worden gecommuniceerd naar alle betrokken teams, inclusief documentatie in centrale kennisplatformen.

Tot slot moeten de technische randvoorwaarden goed geregeld zijn. De playbook library moet toegankelijk zijn voor alle relevante rollen, maar tegelijkertijd beschermd worden tegen ongeautoriseerde wijzigingen of inzage in gevoelige informatie. In de praktijk betekent dit vaak dat de library wordt beheerd in een gecontroleerde repository, zoals een SharePoint-site met fijnmazig toegangsbeheer of een versiebeheersysteem gekoppeld aan de securitydocumentatie. Versiebeheer is essentieel: wijzigingen in playbooks moeten traceerbaar zijn, inclusief wie de wijziging heeft aangebracht, waarom deze is doorgevoerd en welke impact dit heeft op bestaande procedures. Voor auditors en toezichthouders is het belangrijk dat de organisatie kan aantonen hoe de inhoud van playbooks door de tijd heen is ontwikkeld in reactie op nieuwe dreigingen, incidenten en regelgeving. Een aanvullende technische eis is dat playbooks eenvoudig koppelbaar zijn aan tooling, bijvoorbeeld via consistente ID's of bestandsnamen die zowel in Microsoft 365 Defender, SIEM-regels als in PowerShell-scripts worden gebruikt om de juiste instructies te vinden.

Ontwerp, structuur en classificatie van playbooks

Bij het ontwerpen van de playbook library is het verstandig om te starten vanuit de belangrijkste dreigingen en scenario's voor de organisatie. Voor Nederlandse overheidsorganisaties gaat het bijvoorbeeld om spearphishingcampagnes gericht op bestuurders, accountcompromittering van medewerkers met gevoelige dossiers, datalekken via OneDrive- of Teams-deling, misbruik van gedeelde mailboxen in burgercontactcentra en misbruik van beheerdersrechten in Entra ID of Exchange Online. Elk scenario krijgt een eigen playbook met een unieke en betekenisvolle naam, een korte samenvatting en een classificatie naar impactcategorie (bijvoorbeeld vertrouwelijkheid, integriteit, beschikbaarheid of reputatie). Daarnaast kunnen playbooks worden ingedeeld naar type workflow, zoals 'detectiegedreven' (startend vanuit een alert of logevent) of 'meldinggedreven' (startend vanuit een gebruiker, leverancier of ketenpartner). Deze taxonomie maakt het voor analisten eenvoudiger om snel het juiste playbook te vinden en helpt bij rapportage over welke typen scenario's goed of juist nog onvoldoende zijn afgedekt.

Een krachtig playbook combineert technische detailstappen met duidelijke beslismomenten en communicatielijnen. In plaats van uitsluitend commandoreeksen of portalkliks te beschrijven, bevat elk playbook bijvoorbeeld een beginsectie met context en uitgangspunten, een flow waarin wordt aangegeven welke keuzes wanneer moeten worden gemaakt (bijvoorbeeld of een account direct wordt geblokkeerd of eerst nader wordt onderzocht), en een overzicht van betrokken rollen met specifieke acties. Voor Microsoft 365-incidenten betekent dit dat de koppeling met logbronnen en portalen expliciet wordt gemaakt: welke queries in Microsoft 365 Defender, welke auditlogging in Purview, welke aanmeldingslogs in Entra ID en welke activiteiten in SharePoint, OneDrive, Teams of Exchange Online zijn noodzakelijk om het scenario goed te analyseren. Tegelijkertijd moet het playbook leesbaar blijven voor niet-technische stakeholders zoals privacy officers of communicatieadviseurs, zodat zij snel begrijpen wat de impact is en welke informatie zij nodig hebben voor hun eigen processen.

Classificatie en metadata spelen een sleutelrol in het beheer van de library. Elk playbook krijgt metadata zoals versie, status (concept, in gebruik, in review, uitgefaseerd), gekoppelde wettelijke kaders (BIO, AVG, NIS2, sectorale richtlijnen), betrokken proces- of applicatie-eigenaren en verwijzingen naar gerelateerde documenten zoals crisisplannen of opleidingsmateriaal. Door deze metadata consequent vast te leggen, kan de organisatie eenvoudig selecties maken, bijvoorbeeld alle playbooks die betrekking hebben op persoonsgegevens met hoge gevoeligheid of alle scenario's die relevant zijn voor een specifieke afdeling. Bovendien ondersteunt een goede classificatie de koppeling met monitoring- en SIEM-oplossingen: bij het definiëren van gebruiksklare detectieregels kan direct worden verwezen naar het bijbehorende playbook, zodat analisten vanuit een alert of incidentticket in één klik terechtkomen bij de juiste instructies. Een goed ontworpen structuur maakt de library daarmee niet alleen een naslagwerk, maar een actief onderdeel van de dagelijkse security operations.

Implementatie, gebruik in de praktijk en onderhoud

De implementatie van een playbook library begint bij een realistische inventarisatie van bestaande kennis en documentatie. Veel organisaties beschikken al over losse documenten, presentaties of stapelnotities die tijdens incidenten zijn ontstaan. Deze worden verzameld, ontdubbeld en beoordeeld op actualiteit en kwaliteit. Vervolgens wordt een eerste set kernplaybooks geselecteerd voor de meest kritieke Microsoft 365-scenario's, bijvoorbeeld gecompromitteerde accounts, datalekken via Teams of OneDrive en verdachte activiteiten in Exchange Online. Deze playbooks worden in het standaardformat gebracht en door inhoudelijke experts én de CISO-organisatie gereviewd. Het is verstandig om in deze fase te kiezen voor kwaliteit boven kwantiteit: een beperkte set goed doordachte playbooks die daadwerkelijk worden gebruikt is waardevoller dan een grote hoeveelheid half uitgewerkte documenten. Pas wanneer de basis op orde is, wordt de library stap voor stap uitgebreid met aanvullende scenario's en ondersteunende playbooks, zoals procedures voor communicatie, forensische verdieping of herstelplannen.

Voor duurzaam gebruik moet de playbook library expliciet worden geïntegreerd in werkprocessen en tooling. Dit betekent onder andere dat SOC- en beheerteams de library als standaardreferentie gebruiken bij triage en afhandeling van incidenten in Microsoft 365. In ticket- en registratiesystemen worden velden opgenomen voor het koppelen van incidenten aan gebruikte playbooks, zodat later kan worden geanalyseerd in hoeverre de library daadwerkelijk wordt toegepast. Waar mogelijk worden links naar relevante playbooks opgenomen in alerts of dashboards in Microsoft 365 Defender, SIEM-oplossingen of monitoringportalen, zodat analisten niet hoeven te zoeken. Ook binnen tabletop-oefeningen en technische drills wordt de library actief gebruikt: deelnemers worden gevraagd expliciet aan te geven welk playbook zij volgen en welke verbeterpunten zij tegenkomen. Op die manier wordt de library niet gezien als statische documentatie, maar als levend instrument dat voortdurend wordt gevoed door ervaringen uit de praktijk.

Onderhoud van de playbook library vraagt om een gestructureerde aanpak voor wijzigingsbeheer. Nieuwe dreigingsinformatie, wijzigingen in Microsoft 365-functionaliteit, lessons learned uit incidenten en bevindingen uit audits vormen triggers om bestaande playbooks te herzien of nieuwe playbooks toe te voegen. De organisatie definieert een formeel wijzigingsproces, inclusief impactanalyse, goedkeuring, test (bijvoorbeeld via oefeningen) en communicatie naar gebruikers. Belangrijk is dat wijzigingen niet alleen op documentniveau worden verwerkt, maar ook consequent worden doorgevoerd in gekoppelde tooling, zoals verwijzingen in SIEM-regels, dashboards, opleidingsmateriaal en interne richtlijnen. Door gebruik te maken van een centrale configuratie of metadataregistratie – die ook door het PowerShell-script kan worden gelezen – kunnen beheerders overzicht houden over de staat van de library: welke playbooks zijn recent bijgewerkt, welke staan gepland voor review en waar bestaan nog hiaten in dekking. Zo wordt onderhoud een beheersbaar, cyclisch proces in plaats van een reeks ad‑hoc acties.

Monitoring, governance en aantoonbaarheid van de library

Gebruik PowerShell-script playbook-library.ps1 (functie Invoke-Monitoring) – Voert een basale controle uit op de volledigheid en actualiteit van de playbook library en genereert een samenvattend overzicht..

Monitoring van de playbook library richt zich op de vraag of alle relevante scenario's zijn afgedekt en of de inhoud recent is gevalideerd. In plaats van incidenteel 'door de map te bladeren', definiëren volwassen organisaties meetbare criteria, zoals het minimumaantal kernplaybooks voor prioritaire dreigingen, maximale tijd sinds laatste review en het percentage incidenten waarbij een geregistreerd playbook is gebruikt. Door deze criteria vast te leggen in beleid en in een centrale configuratiefile op te nemen, kan met eenvoudige tooling – zoals het bijbehorende PowerShell-script – periodiek worden gerapporteerd over de status. Het script kan bijvoorbeeld tellen hoeveel playbooks een reviewdatum hebben ouder dan twaalf maanden, hoeveel scenario's nog de status 'concept' hebben en welke playbooks geen eigenaar of gekoppeld framework hebben. De resultaten worden vertaald naar concrete verbeteracties, bijvoorbeeld het plannen van reviewsessies of het prioriteren van nieuwe playbooks in de security roadmap.

Governance gaat verder dan registreren alleen. De CISO-organisatie of het security governance team gebruikt de uitkomsten van de monitoring om in reguliere overlegstructuren – zoals security committees, risicoboard of managementteams – de volwassenheid van de incident response-capaciteit in Microsoft 365 te bespreken. Hierbij worden indicatoren uit de playbook library gecombineerd met gegevens over daadwerkelijke incidenten, oefeningen en audits. Wanneer bijvoorbeeld blijkt dat meerdere ernstige incidenten hebben plaatsgevonden zonder dat daarvoor een passend playbook bestond, is dat een signaal om de library uit te breiden en de prioriteit van bepaalde scenario's te herzien. Omgekeerd kan een hoge dekkingsgraad en recente review van playbooks dienen als positief bewijs richting toezichthouders dat de organisatie structureel werkt aan weerbaarheid en aantoonbaarheid. Documentatie van deze governance-activiteiten – denk aan notulen, beslisnotities en geaccordeerde verbeterplannen – vormt belangrijk auditbewijs.

Remediatie, opstart van de library en verdere professionalisering

Gebruik PowerShell-script playbook-library.ps1 (functie Invoke-Remediation) – Maakt een basisconfiguratiebestand voor de playbook library aan en helpt bij het structureren van de eerste set playbooks..

Organisaties die nog geen gestructureerde playbook library hebben, kunnen starten met een pragmatische remediatieslag. Een nulmeting brengt in kaart welke scenario's al min of meer beschreven zijn, welke uitsluitend als impliciete kennis bestaan binnen teams en waar nog helemaal geen aanpak voor is. Op basis van deze nulmeting worden prioriteiten bepaald, bijvoorbeeld eerst alle scenario's rondom hoog-risico-accounts, grootschalige datalekken of ransomwaredreigingen in Microsoft 365. Het bijbehorende PowerShell-script kan een basisconfiguratiebestand genereren waarin deze prioritaire scenario's als 'lege' playbooks worden geregistreerd met eigenaars, gewenste opleverdata en koppelingen naar relevante wettelijke kaders. Dit dwingt de organisatie om bewuste keuzes te maken: welke playbooks moeten op korte termijn worden uitgewerkt, welke kunnen later volgen en welke bestaande documenten kunnen worden geherstructureerd om aan de standaarden van de library te voldoen.

Naarmate de library groeit, verschuift de focus van opbouw naar professionalisering. Dit omvat onder andere het integreren van playbooks in opleidings- en inwerkprogramma's voor nieuwe medewerkers, het koppelen van playbookgebruik aan prestatie-indicatoren voor SOC- en beheerteams, en het expliciet benutten van lessons learned uit incidenten en oefeningen om de library continu te verbeteren. Professionalisering betekent ook dat playbooks niet op zichzelf staan, maar worden verbonden met bredere architectuur- en risicodocumentatie. Dreigingsmodellen, risicobeoordelingen en architectuurprincipes voor Microsoft 365 vormen dan de rationale achter bepaalde keuzes in de playbooks, terwijl BCM-plannen en crisisdraaiboeken beschrijven hoe wordt opgeschaald als de impact van een incident buiten de directe Microsoft 365-scope reikt. Door deze lagen met elkaar te verbinden ontstaat een consistent geheel waarin de playbook library fungeert als operationele vertaling van strategische en tactische kaders. Dit verhoogt niet alleen de kwaliteit van incidentafhandeling, maar maakt de organisatie aantoonbaar volwassen richting toezichthouders en samenwerkingspartners.

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 Playbook library voor Microsoft 365 incident response .DESCRIPTION Helpt organisaties bij het monitoren en structureel vastleggen van de playbook library voor incident response rondom Microsoft 365. Het script werkt met een lokale configuratiefile zodat het zonder extra modules kan worden gebruikt als governance- en rapportagetool. .NOTES Filename: playbook-library.ps1 Author: Nederlandse Baseline voor Veilige Cloud Category: incident-response .EXAMPLE .\playbook-library.ps1 -Monitoring Toon een samenvatting van de status van de playbook library op basis van de configuratiefile. .EXAMPLE .\playbook-library.ps1 -Remediation Maak een basisconfiguratiefile voor de playbook library aan. #> #Requires -Version 5.1 [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 "Playbook Library Incident Response (M365)" -ForegroundColor Cyan Write-Host "Nederlandse Baseline voor Veilige Cloud" -ForegroundColor Cyan Write-Host "========================================`n" -ForegroundColor Cyan function Get-ConfigPath { <# .SYNOPSIS Bepaalt het pad naar de lokale configuratiefile. #> $scriptDir = Split-Path -Parent $PSCommandPath $configPath = Join-Path -Path $scriptDir -ChildPath "playbook-library.config.json" return $configPath } function Initialize-DefaultConfig { <# .SYNOPSIS Maakt een basisconfiguratie voor de playbook library aan. #> $config = [ordered]@{ version = "1.0" lastUpdated = (Get-Date).ToString("yyyy-MM-dd") owner = "CISO / Security Officer" objectives = @( "Alle kritieke Microsoft 365-incidenttypes beschikken over een actueel playbook.", "Playbooks worden minimaal jaarlijks of na een groot incident herzien.", "Incidenten en oefeningen verwijzen aantoonbaar naar gebruikte playbooks." ) qualityCriteria = [ordered]@{ maxReviewAgeDays = 365 minCorePlaybooks = 10 minCoverageHighRisk = 100 targetUsagePercentage = 80 } playbooks = @( [ordered]@{ id = "M365-PB-001" title = "Gecompromitteerd Microsoft 365-gebruikersaccount" scope = "Entra ID, Exchange Online, Teams, SharePoint/OneDrive" category = "Hoog risico" status = "Planned" owner = "SOC / M365-beheer" lastReviewDate = "" nextReviewDate = "" frameworks = @( "BIO 16.1", "BIO 16.2", "AVG Art. 32-34" ) } ) } return $config } function Invoke-Monitoring { <# .SYNOPSIS Controleert de status van de playbook library en genereert een samenvattend rapport. #> try { $configPath = Get-ConfigPath if (-not (Test-Path -Path $configPath)) { Write-Host "[WARN] Geen configuratie gevonden voor de playbook library." -ForegroundColor Yellow Write-Host " Verwacht bestand: $configPath" -ForegroundColor Yellow Write-Host " Voer '.\playbook-library.ps1 -Remediation' uit om een basisconfiguratie aan te maken.`n" -ForegroundColor Yellow exit 1 } $rawContent = Get-Content -Path $configPath -Raw -ErrorAction Stop $config = $rawContent | ConvertFrom-Json -ErrorAction Stop $totalPlaybooks = ($config.playbooks | Measure-Object).Count $activePlaybooks = ($config.playbooks | Where-Object { $_.status -eq 'Active' }).Count $plannedPlaybooks = ($config.playbooks | Where-Object { $_.status -eq 'Planned' }).Count $retiredPlaybooks = ($config.playbooks | Where-Object { $_.status -eq 'Retired' }).Count $maxAgeDays = $config.qualityCriteria.maxReviewAgeDays $now = Get-Date $stalePlaybooks = @() foreach ($pb in $config.playbooks) { if ($pb.lastReviewDate) { $lastReview = Get-Date $pb.lastReviewDate $ageDays = ($now - $lastReview).TotalDays if ($ageDays -gt $maxAgeDays) { $stalePlaybooks += $pb } } } Write-Host "Configuratiebestand: $configPath" -ForegroundColor Gray Write-Host "Versie: $($config.version)" -ForegroundColor Gray Write-Host "Eigenaar: $($config.owner)" -ForegroundColor Gray Write-Host "Laatst bijgewerkt: $($config.lastUpdated)`n" -ForegroundColor Gray Write-Host "Samenvatting playbook library:" -ForegroundColor Cyan Write-Host " Totaal geregistreerde playbooks : $totalPlaybooks" -ForegroundColor White Write-Host " Actief : $activePlaybooks" -ForegroundColor White Write-Host " Gepland : $plannedPlaybooks" -ForegroundColor White Write-Host " Uitgefaseerd : $retiredPlaybooks`n" -ForegroundColor White Write-Host "Kwaliteitscontrole (reviewdata):" -ForegroundColor Cyan if ($stalePlaybooks.Count -gt 0) { Write-Host " [WARN] Playbooks met verlopen reviewdatum (>${maxAgeDays} dagen):" -ForegroundColor Yellow foreach ($pb in $stalePlaybooks) { Write-Host (" - {0} ({1}) - laatst herzien op {2}" -f $pb.id, $pb.title, $pb.lastReviewDate) -ForegroundColor Yellow } } else { Write-Host " [OK] Geen playbooks met verlopen reviewdatum gevonden." -ForegroundColor Green } $minCore = $config.qualityCriteria.minCorePlaybooks if ($totalPlaybooks -lt $minCore) { Write-Host "`n[WARN] Het aantal geregistreerde playbooks ($totalPlaybooks) is lager dan de doelstelling ($minCore)." -ForegroundColor Yellow Write-Host " Breid de library uit met aanvullende scenario's voor kritieke Microsoft 365-processen." -ForegroundColor Yellow exit 1 } else { if ($stalePlaybooks.Count -gt 0) { Write-Host "`n[WARN] Het minimumaantal playbooks is behaald, maar er zijn playbooks met verlopen reviewdatum." -ForegroundColor Yellow exit 1 } else { Write-Host "`n[OK] De basisdoelstellingen voor omvang en actualiteit van de playbook library zijn behaald." -ForegroundColor Green exit 0 } } } catch { Write-Host "`n[FAIL] Er is een fout opgetreden tijdens monitoring: $_" -ForegroundColor Red Write-Host "Details: $($_.Exception.Message)" -ForegroundColor Red exit 2 } } function Invoke-Remediation { <# .SYNOPSIS Maakt of actualiseert de basisconfiguratie voor de playbook library. #> try { $configPath = Get-ConfigPath if (Test-Path -Path $configPath) { Write-Host "[INFO] Bestaande configuratie gevonden op: $configPath" -ForegroundColor Cyan Write-Host " Er wordt een back-up gemaakt voordat de configuratie wordt bijgewerkt." -ForegroundColor Cyan $backupPath = "$configPath.bak_{0}" -f (Get-Date -Format "yyyyMMddHHmmss") if (-not $WhatIf) { Copy-Item -Path $configPath -Destination $backupPath -ErrorAction Stop } Write-Host " Back-up opgeslagen als: $backupPath`n" -ForegroundColor Gray } $config = Initialize-DefaultConfig $json = $config | ConvertTo-Json -Depth 6 if ($WhatIf) { Write-Host "[WhatIf] Configuratie zou worden geschreven naar: $configPath" -ForegroundColor Yellow Write-Host $json } else { $configDir = Split-Path -Parent $configPath if (-not (Test-Path -Path $configDir)) { New-Item -ItemType Directory -Path $configDir -Force | Out-Null } $json | Out-File -FilePath $configPath -Encoding UTF8 -Force Write-Host "[OK] Basisconfiguratie voor de playbook library is aangemaakt of bijgewerkt." -ForegroundColor Green Write-Host " Bestand: $configPath" -ForegroundColor Green } Write-Host "`nVolgende stappen (aanbevolen):" -ForegroundColor Cyan Write-Host " 1. Vul de lijst met playbooks aan met alle relevante Microsoft 365-scenario's." -ForegroundColor Gray Write-Host " 2. Leg per playbook eigenaar, status en reviewdata vast." -ForegroundColor Gray Write-Host " 3. Gebruik -Monitoring om periodiek overzicht en aantoonbaarheid te waarborgen." -ForegroundColor Gray exit 0 } catch { Write-Host "`n[FAIL] Er is een fout opgetreden tijdens remediatie: $_" -ForegroundColor Red Write-Host "Details: $($_.Exception.Message)" -ForegroundColor Red exit 2 } } function Invoke-Revert { <# .SYNOPSIS Verwijdert optioneel de configuratiefile voor de playbook library. #> try { $configPath = Get-ConfigPath if (-not (Test-Path -Path $configPath)) { Write-Host "[INFO] Er is geen configuratiefile om te verwijderen." -ForegroundColor Cyan exit 0 } if ($WhatIf) { Write-Host "[WhatIf] Configuratiefile zou worden verwijderd: $configPath" -ForegroundColor Yellow } else { Remove-Item -Path $configPath -Force -ErrorAction Stop Write-Host "[OK] Configuratiefile verwijderd: $configPath" -ForegroundColor Green } exit 0 } catch { Write-Host "`n[FAIL] Er is een fout opgetreden tijdens het verwijderen van de configuratie: $_" -ForegroundColor Red Write-Host "Details: $($_.Exception.Message)" -ForegroundColor Red exit 2 } } try { if ($Revert) { Invoke-Revert } elseif ($Monitoring) { Invoke-Monitoring } elseif ($Remediation) { Invoke-Remediation } else { Write-Host "Gebruik:" -ForegroundColor Yellow Write-Host " -Monitoring Controleer status en aantoonbaarheid van de playbook library" -ForegroundColor Gray Write-Host " -Remediation Maak of actualiseer de basisconfiguratie" -ForegroundColor Gray Write-Host " -Revert Verwijder de configuratiefile (optioneel, met -WhatIf voor dry-run)" -ForegroundColor Gray } } catch { throw } finally { Write-Host "`n========================================`n" -ForegroundColor Cyan } function Initialize-DefaultConfig { <# .SYNOPSIS Maakt een basisconfiguratie voor de playbook library aan. #> $config = [ordered]@{ version = "1.0" lastUpdated = (Get-Date).ToString("yyyy-MM-dd") owner = "CISO / Security Officer" objectives = @( "Een actuele set playbooks onderhouden voor alle kritieke Microsoft 365-scenario's.", "Minimaal jaarlijks een formele review uitvoeren van alle kernplaybooks.", "Playbooks aantoonbaar koppelen aan incidenten, oefeningen en audits." ) thresholds = [ordered]@{ maxReviewAgeDays = 365 minCorePlaybooks = 5 maxDraftPercentage = 30 } playbooks = @( [ordered]@{ id = "M365-IR-PB-001" title = "Gecompromitteerd gebruikersaccount" category = "Identity / Entra ID" status = "In gebruik" # Concept, In gebruik, In review, Uitgefaseerd owner = "SOC / M365-beheer" lastReviewDate = "" nextReviewDate = "" impactCategory = "Hoog" regulations = @("BIO", "AVG", "NIS2") notes = "Basisscenario voor accountcompromittering in Microsoft 365." } ) } return $config } function Invoke-Monitoring { <# .SYNOPSIS Controleert de status van de playbook library en genereert een samenvattend rapport. #> try { $configPath = Get-ConfigPath if (-not (Test-Path -Path $configPath)) { Write-Host "[WARN] Geen configuratie gevonden voor de playbook library." -ForegroundColor Yellow Write-Host " Verwacht bestand: $configPath" -ForegroundColor Yellow Write-Host " Voer '.\playbook-library.ps1 -Remediation' uit om een basisconfiguratie aan te maken.`n" -ForegroundColor Yellow exit 1 } $rawContent = Get-Content -Path $configPath -Raw -ErrorAction Stop $config = $rawContent | ConvertFrom-Json -ErrorAction Stop $totalPlaybooks = ($config.playbooks | Measure-Object).Count $inUse = ($config.playbooks | Where-Object { $_.status -eq 'In gebruik' }).Count $draft = ($config.playbooks | Where-Object { $_.status -eq 'Concept' }).Count $inReview = ($config.playbooks | Where-Object { $_.status -eq 'In review' }).Count $retired = ($config.playbooks | Where-Object { $_.status -eq 'Uitgefaseerd' }).Count $maxDraftPerc = $config.thresholds.maxDraftPercentage $minCorePlaybooks = $config.thresholds.minCorePlaybooks $maxReviewAge = $config.thresholds.maxReviewAgeDays $now = Get-Date $stale = ($config.playbooks | Where-Object { $_.lastReviewDate -and (New-TimeSpan -Start (Get-Date $_.lastReviewDate) -End $now).Days -gt $maxReviewAge }) $staleCount = ($stale | Measure-Object).Count $draftPercentage = if ($totalPlaybooks -gt 0) { [math]::Round(($draft / $totalPlaybooks) * 100, 1) } else { 0 } Write-Host "Configuratiebestand: $configPath" -ForegroundColor Gray Write-Host "Versie: $($config.version)" -ForegroundColor Gray Write-Host "Eigenaar: $($config.owner)" -ForegroundColor Gray Write-Host "Laatst bijgewerkt: $($config.lastUpdated)`n" -ForegroundColor Gray Write-Host "Playbookoverzicht:" -ForegroundColor Cyan Write-Host " Totaal playbooks : $totalPlaybooks" -ForegroundColor White Write-Host " In gebruik : $inUse" -ForegroundColor White Write-Host " Concept : $draft" -ForegroundColor White Write-Host " In review : $inReview" -ForegroundColor White Write-Host " Uitgefaseerd : $retired`n" -ForegroundColor White Write-Host "Kwaliteitsindicatoren:" -ForegroundColor Cyan Write-Host " Minimaal aantal kernplaybooks : $minCorePlaybooks" -ForegroundColor White Write-Host " Maximaal percentage concept : $maxDraftPerc%" -ForegroundColor White Write-Host " Max. leeftijd review (dagen) : $maxReviewAge" -ForegroundColor White Write-Host " Aantal playbooks ouder dan limiet : $staleCount`n" -ForegroundColor White $isCoreComplete = $totalPlaybooks -ge $minCorePlaybooks $isDraftAcceptable = $draftPercentage -le $maxDraftPerc $hasNoStale = $staleCount -eq 0 if ($isCoreComplete -and $isDraftAcceptable -and $hasNoStale) { Write-Host "[OK] De playbook library voldoet aan de ingestelde criteria." -ForegroundColor Green exit 0 } else { Write-Host "[WARN] De playbook library voldoet nog niet volledig aan de ingestelde criteria." -ForegroundColor Yellow if (-not $isCoreComplete) { Write-Host " - Voeg extra kernplaybooks toe voor kritieke Microsoft 365-scenario's." -ForegroundColor Yellow } if (-not $isDraftAcceptable) { Write-Host " - Beperk het aandeel concept-playbooks door prioritaire scenario's uit te werken." -ForegroundColor Yellow } if (-not $hasNoStale) { Write-Host " - Werk verouderde playbooks bij waarvan de laatste review ouder is dan $maxReviewAge dagen." -ForegroundColor Yellow } exit 1 } } catch { Write-Host "`n[FAIL] Er is een fout opgetreden tijdens monitoring van de playbook library: $_" -ForegroundColor Red Write-Host "Details: $($_.Exception.Message)" -ForegroundColor Red exit 2 } } function Invoke-Remediation { <# .SYNOPSIS Maakt of actualiseert de basisconfiguratie voor de playbook library. #> try { $configPath = Get-ConfigPath if (Test-Path -Path $configPath) { Write-Host "[INFO] Bestaande configuratie gevonden op: $configPath" -ForegroundColor Cyan Write-Host " Er wordt een back-up gemaakt voordat de configuratie wordt bijgewerkt." -ForegroundColor Cyan $backupPath = "$configPath.bak_{0}" -f (Get-Date -Format "yyyyMMddHHmmss") if (-not $WhatIf) { Copy-Item -Path $configPath -Destination $backupPath -ErrorAction Stop } Write-Host " Back-up opgeslagen als: $backupPath`n" -ForegroundColor Gray } $config = Initialize-DefaultConfig $json = $config | ConvertTo-Json -Depth 6 if ($WhatIf) { Write-Host "[WhatIf] Configuratie zou worden geschreven naar: $configPath" -ForegroundColor Yellow Write-Host $json } else { $configDir = Split-Path -Parent $configPath if (-not (Test-Path -Path $configDir)) { New-Item -ItemType Directory -Path $configDir -Force | Out-Null } $json | Out-File -FilePath $configPath -Encoding UTF8 -Force Write-Host "[OK] Basisconfiguratie voor de playbook library is aangemaakt of bijgewerkt." -ForegroundColor Green Write-Host " Bestand: $configPath" -ForegroundColor Green } Write-Host "`nVolgende stappen (aanbevolen):" -ForegroundColor Cyan Write-Host " 1. Vul per playbook eigenaar, status en reviewdatums in." -ForegroundColor Gray Write-Host " 2. Voeg aanvullende playbooks toe voor prioritaire Microsoft 365-scenario's." -ForegroundColor Gray Write-Host " 3. Gebruik -Monitoring om periodiek de volwassenheid en aantoonbaarheid van de library te controleren." -ForegroundColor Gray exit 0 } catch { Write-Host "`n[FAIL] Er is een fout opgetreden tijdens remediatie van de playbook library: $_" -ForegroundColor Red Write-Host "Details: $($_.Exception.Message)" -ForegroundColor Red exit 2 } } function Invoke-Revert { <# .SYNOPSIS Verwijdert optioneel de configuratiefile voor de playbook library. #> try { $configPath = Get-ConfigPath if (-not (Test-Path -Path $configPath)) { Write-Host "[INFO] Er is geen configuratiefile om te verwijderen." -ForegroundColor Cyan exit 0 } if ($WhatIf) { Write-Host "[WhatIf] Configuratiefile zou worden verwijderd: $configPath" -ForegroundColor Yellow } else { Remove-Item -Path $configPath -Force -ErrorAction Stop Write-Host "[OK] Configuratiefile verwijderd: $configPath" -ForegroundColor Green } exit 0 } catch { Write-Host "`n[FAIL] Er is een fout opgetreden tijdens het verwijderen van de configuratie van de playbook library: $_" -ForegroundColor Red Write-Host "Details: $($_.Exception.Message)" -ForegroundColor Red exit 2 } } try { if ($Revert) { Invoke-Revert } elseif ($Monitoring) { Invoke-Monitoring } elseif ($Remediation) { Invoke-Remediation } else { Write-Host "Gebruik:" -ForegroundColor Yellow Write-Host " -Monitoring Controleer status en aantoonbaarheid van de playbook library" -ForegroundColor Gray Write-Host " -Remediation Maak of actualiseer de basisconfiguratie" -ForegroundColor Gray Write-Host " -Revert Verwijder de configuratiefile (optioneel, met -WhatIf voor dry-run)" -ForegroundColor Gray } } catch { throw } finally { Write-Host "`n========================================`n" -ForegroundColor Cyan }

Risico zonder implementatie

Risico zonder implementatie
High: Zonder centrale playbook library ontbreekt een consistente, aantoonbare aanpak voor incidentresponse in Microsoft 365. Incidenten worden trager en minder effectief afgehandeld, leerpunten worden onvoldoende geborgd en het is lastig om richting bestuur en toezichthouders aan te tonen dat passende maatregelen zijn getroffen.

Management Samenvatting

Richt een centrale, goed beheerde playbook library in voor Microsoft 365 incident response, met gestandaardiseerde formats, duidelijke eigenaarschapstructuur en integratie in dagelijkse operations, oefeningen en audits. Gebruik eenvoudige tooling om volledigheid en actualiteit te monitoren en de library continu te verbeteren.