Classified Threat Handling In Microsoft 365

💼 Management Samenvatting

Classified threat handling binnen Microsoft 365 draait om het veilig verzamelen, verrijken en distribueren van dreigingsinformatie die is gemarkeerd als Departementaal Vertrouwelijk, Staatsgeheim of anderszins geclassificeerd volgens Nederlandse wet- en regelgeving. Waar traditionele SOC-processen vooral publieke of intern geclassificeerde signalen verwerken, vereist classified threat handling een streng regime waarin logging, opslag, toegang en audittrail tot in detail worden gecontroleerd. Alleen dan kunnen Nederlandse overheidsorganisaties en vitale aanbieders gevoelige analyses over buitenlandse inlichtingen, diplomatieke incidenten of nationale crisisindicatoren verwerken zonder het wettelijke kader van de Nederlandse Baseline voor Veilige Cloud te schenden.

Aanbeveling
IMPLEMENT
Risico zonder
Critical
Risk Score
10/10
Implementatie
0u
Van toepassing op:
Rijksoverheid
Ministeries
Vitale aanbieders
ZBO's
Nationale crisisorganisaties

Zonder een geformaliseerd classified threat handling-proces lopen organisaties het risico dat hoog-sensitieve indicatoren ongecontroleerd worden verspreid via Teams, e-mail of gedeelde werkruimten. Dat leidt niet alleen tot juridische gevolgen onder de Wet Bescherming Staatsgeheimen, Wbni en BIO, maar verzwakt tevens de effectiviteit van dreigingsinformatie: zodra onbekende personen kennis nemen van bronnen en methoden, kunnen tegenstanders hun tactieken aanpassen voordat mitigaties zijn uitgerold. Bovendien eisen toezichthouders dat organisaties kunnen aantonen hoe zij classificatie, bewaartermijnen, compartimentering en escalaties hebben geborgd. Zonder aantoonbaarheid is geen sprake van betrouwbare ketensamenwerking met NCTV, NCSC of Defensie.

PowerShell Modules Vereist
Primary API: Microsoft Purview, Microsoft 365 Defender, Microsoft Graph Security API, Azure Information Protection
Connection: Connect-MgGraph, Connect-IPPSSession, Connect-ExchangeOnline
Required Modules: Microsoft.Graph, ExchangeOnlineManagement, Az.Accounts

Implementatie

Dit artikel beschrijft hoe u binnen Microsoft 365 een end-to-end proces inricht voor het ontvangen, triageren, operationaliseren en archiveren van geclassificeerde dreigingsinformatie. We behandelen de beleidsmatige kaders, leggen uit hoe u Microsoft Purview, Azure Information Protection en Defender XDR inzet voor gecontroleerde distributie en presenteren een referentieoperating-model inclusief controlemomenten, logging en rapportage. Het gekoppelde PowerShell-script maakt het mogelijk om in debugmodus lokaal te testen of de vereiste instellingen aanwezig zijn en om in productie assessments en managementrapportages te genereren. Zo ontstaat een aantoonbaar veilige keten waarin classified threat intelligence effectief wordt benut zonder de vertrouwelijkheid te compromitteren.

Governance en juridisch kader voor geclassificeerde dreigingsinformatie

Een volwassen aanpak voor classified threat handling begint bij governance en juridische verankering. Nederlandse overheidsorganisaties moeten kunnen aantonen hoe zij het BROK-principe (Beleid, Risico, Organisatie, Keten) toepassen op geclassificeerde dreigingsinformatie. Dat betekent dat het bestuur formeel vastlegt welke classificaties worden gehanteerd, welke autorisatieketens gelden en welke sancties volgen bij afwijkingen. Deze afspraken moeten aansluiten op de Wet Bescherming Staatsgeheimen, Wbni, BIO hoofdstuk 12 en op sectorale richtlijnen, zoals de Defensieclassificaties of de Justitie- en Veiligheidsinstructies voor gerubriceerde informatie. Binnen Microsoft 365 vertaalt dit zich naar strikte segmentatie van workloads: dedicated Teams-channels met Private Preview, SharePoint-sites waarop Conditional Access policies hardwaregebonden MFA vereisen en Exchange-beperking tot specifieke transportregels. Organisaties leggen bovendien vast hoe zij privileged access workstations certificeren, hoe sleutelbeheer wordt gedelegeerd en hoe change management plaatsvindt wanneer een nieuw type dreigingsinformatie moet worden ontsloten. Zonder deze basis ontbreekt elke garantie dat de digitale keten de fysieke veiligheidscontext reflecteert en wordt het vrijwel onmogelijk om ketenpartners of toezichthouders overtuigend aan te tonen dat classificatiebeleid meer is dan een papieren realiteit.

Governance stopt niet bij papier. De Nederlandse Baseline voor Veilige Cloud vereist dat geclassificeerde informatie alleen wordt verwerkt wanneer de volledige lifecycle aantoonbaar onder controle staat. Concreet houdt dat in dat u in Microsoft Purview sensitivity labels configureert met dubbele autorisatie voor downgrade-acties, dat bewaartermijnen onderscheid maken tussen operationele en strategische intelligence en dat sleutelbeheer plaatsvindt via customer-managed keys met HSM-ondersteuning. Compliance officers moeten periodiek controleren of beleid en implementatie overeenkomen, bijvoorbeeld door middel van Purview label analytics, rapportages uit Microsoft 365 Defender en steekproeven op auditlogs. Daarnaast moet governance ruimte bieden voor samenwerking met externe partners zoals NCSC of NAVO, inclusief duidelijke eisen voor versleuteling, logging en herleidbaarheid voordat informatie het eigen tenantdomein verlaat. Veel organisaties richten daarom een dedicated classified governance board in die minimaal elk kwartaal bijeenkomt, afwijkingen beslecht en lessons learned vertaalt naar nieuw beleid. Door governance op deze manier te operationaliseren wordt classified threat handling een gecontroleerd proces in plaats van een serie ad-hoc-afspraken.

Een derde pijler binnen governance is accountability. Organisaties moeten aantonen wie wanneer een besluit heeft genomen om classified intelligence te delen, welke impactanalyse is uitgevoerd en welke maatregelen zijn opgelegd. Dit vraagt om een digitaal dossier dat vergelijkbaar is met de eisen uit de EU AI Act maar dan gericht op dreigingsinformatie. Elke melding krijgt een uniek kenmerk, een eigenaar, een operationeel verantwoordelijke en een vastgestelde distributielijst. Alle acties – van beoordeling in Defender XDR tot het signeren van een rapport in Word – worden automatisch voorzien van metadata die de classificatie, urgentie en bewaartermijn vastleggen. Door deze metadata te integreren met Microsoft Entra Conditional Access en Privileged Identity Management ontstaat een mechanisme waarin alleen geautoriseerde functionarissen toegang hebben én waarin elke afwijking onmiddellijk wordt gesignaleerd. Veel organisaties koppelen dit bovendien aan een integriteitsregister waarin jaarlijks wordt gecontroleerd of rollen nog passen bij de persoon en of er sprake is van functieroulatie, zodat geen enkel individu langdurig alleenheerser wordt over kritieke classified processen. Dat levert auditors een helder spoor op en voorkomt dat organisatorische afspraken zonder digitale borging blijven.

Operationeel model: van binnenkomst tot gecontroleerde distributie

Een effectief operating model voor classified threat handling begint bij de intake. Dreigingsinformatie bereikt de organisatie via verschillende kanalen: beveiligde e-mail vanuit het NCSC, handleidingen van bondgenoten, of intern verzamelde inlichtingen. Binnen Microsoft 365 worden deze bronnen geconsolideerd in een afgesloten SharePoint-bibliotheek die alleen toegankelijk is via geprivilegieerde workstations en waar geavanceerde DLP-regels elk ongeautoriseerd download- of printverzoek blokkeren. Zodra informatie is ontvangen, registreert het SOC of het Threat Intelligence Center het bericht in een Microsoft Lists-register waarin classificatie, herkomst, betrouwbaarheidsniveau en wettelijke grondslag worden vastgelegd. Dit register is gekoppeld aan Microsoft Sentinel zodat indicatoren automatisch kunnen worden verrijkt met TTP’s, MITRE-tags en contextuele telemetry. Vanaf het eerste moment wordt duidelijk welke processtappen verplicht zijn: dubbele review door analisten met Alfa- of Bravo-autorisatie, compliance-check door de security officer en final release door de designated approving authority. Door de intake te koppelen aan duidelijke responstijden, escalatieregels en fallback-mechanismen voor buiten kantooruren blijft de keten ook tijdens crises voorspelbaar functioneren.

Na intake volgt verrijking en validatie. Analisten gebruiken Microsoft Defender XDR, Sentinel en Graph Security om de aangeleverde indicatoren te toetsen aan actuele telemetry uit de tenant. Daarbij gelden strikte werkafspraken: queries worden uitgevoerd vanuit een geïsoleerde workspace, resultaten worden direct opgeslagen in een gecertificeerde Log Analytics workspace met customer lockbox en alle exportfunctionaliteit is standaard uitgeschakeld. Wanneer indicatoren leiden tot incidenten, wordt automatisch een response-playbook gestart dat zowel technische acties (isoleren van apparaten, intrekken van tokens, aanmaken van hunting queries) als bestuurlijke acties (informeren van CISO, Directie Veiligheid en eventueel de NCTV) omvat. Gedurende de hele cyclus blijven classificatiemarkeringen intact doordat Purview labels zijn gekoppeld aan eDiscovery-holds en door dataversleuteling opnieuw af te dwingen bij elke bewerking. Organisaties integreren deze werkwijze met hun dreigingsniveaus: zodra een actor in de hoogste waarschuwingsfase komt, worden automatisch aanvullende logging, verscherpte monitoring en verplichte peer reviews geactiveerd. Dit voorkomt dat geclassificeerde details per ongeluk terechtkomen in reguliere SOC-kanalen of rapportages.

De laatste stap is gecontroleerde distributie en archivering. Besluiten over wie toegang krijgt tot welke delen van een rapport worden vastgelegd in een distributiematrix die direct is gekoppeld aan Microsoft Entra-groepen. Afhankelijk van de classificatie genereert de organisatie verschillende outputvormen: een verkort alert voor operationele teams, een geanonimiseerde managementbriefing en een volledige technische bijlage die alleen beschikbaar is via een gecontroleerd SharePoint-portaal met session controls. Alle versies worden digitaal ondertekend, voorzien van watermerken en opgeslagen in een Purview Records Management-omgeving met bewaartermijnen die de NIS2-rapportageplicht, Wbni-artikelen en interne archiefwetgeving afdekken. Zodra de bewaartermijn verloopt, vindt vernietiging plaats onder vier-ogen-principe en wordt een auditrecord toegevoegd aan het classified register. Steeds meer organisaties voegen een lessons-learned stap toe waarin de effectiviteit van distributie wordt geëvalueerd tijdens crisisoefeningen, zodat verbeteringen direct terugvloeien naar het operating model. Dit operating model zorgt ervoor dat geclassificeerde dreigingsinformatie consistent, veilig en aantoonbaar wordt behandeld, ongeacht de druk van een lopend incident.

Automatisering, audittrail en het script voor classified threat handling

Gebruik PowerShell-script classified-threat-handling.ps1 (functie Invoke-ClassifiedThreatHandlingAssessment) – Voert controles uit op de aanwezigheid van verplichte componenten, waaronder Purview-labels voor geclassificeerde data, logging in een beschermde workspace en toegangsregimes voor privileged operators..

Gebruik PowerShell-script classified-threat-handling.ps1 (functie Invoke-ClassifiedThreatHandlingReport) – Genereert een managementrapport met bevindingen, uitzonderingen en aanbevelingen. Ondersteunt DebugMode voor lokale tests binnen 15 seconden, zoals vereist door de Nederlandse Baseline voor Veilige Cloud..

Automatisering is cruciaal om classified threat handling te schalen zonder menselijke fouten te introduceren. Het PowerShell-script bij dit artikel fungeert als een controlemiddel dat periodiek nagaat of essentiële beleidscomponenten aanwezig zijn. Het script verifieert bijvoorbeeld of Purview sensitivity labels met verplichte double key-encryptie bestaan, of de Log Analytics workspace die classified telemetry ontvangt daadwerkelijk is afgeschermd met customer lockbox en of Conditional Access beleid vereist dat alleen hardened admin workstations verbinding mogen maken. Dankzij de DebugMode-parameter kan het script lokaal worden getest zonder verbinding te maken met productiesystemen; zo kan elke wijziging veilig worden gevalideerd voordat deze in een productiepipeline wordt uitgevoerd. In reguliere modus maakt het script gebruik van Connect-MgGraph, Connect-IPPSSession en Connect-AzAccount om respectievelijk directorygegevens, Purview-labels en workspaceconfiguraties te lezen. De output is een uniform object dat eenvoudig kan worden gelogd, verwerkt in Sentinel of toegevoegd aan het classified register, waardoor ook externe auditors of ketenpartners snel inzicht krijgen in de actuele volwassenheid zonder dat er handmatig spreadsheets hoeven te worden bijgehouden.

Naast automatisering speelt auditability een doorslaggevende rol. Toezichthouders verwachten dat organisaties kunnen aantonen welke controles zijn uitgevoerd, door wie, met welke resultaten en welke verbeteracties zijn opgevolgd. Daarom schrijft de Nederlandse Baseline voor Veilige Cloud voor dat elk assessment automatisch een cryptografisch gesigneerd rapport oplevert dat wordt opgeslagen in een Purview Records Management-classificatie. Het rapport bevat een samenvatting van de bevindingen, een risicobeoordeling per onderdeel en duidelijke aanbevelingen met verantwoordelijken en deadlines. Door deze rapporten via Microsoft Planner of Azure DevOps te koppelen aan opvolgacties ontstaat een gesloten PDCA-cyclus. Het script ondersteunt dit door JSON- en tekstoutput te genereren die direct kunnen worden ingevoerd in deze tooling, waardoor er geen handmatige transcripties nodig zijn en de kans op fouten minimaal blijft. Organisaties kunnen bovendien kiezen om de rapportage automatisch te publiceren in een beveiligd Teams-kanaal voor de classified governance board, zodat besluitvorming en follow-up volledig transparant blijven.

Tot slot maakt automatisering het mogelijk om realtime signalen te koppelen aan governance. Wanneer een Purview-label wordt verwijderd of een privileged account een ongeautoriseerde download probeert uit te voeren, kan het script in combinatie met Sentinel een automatische escalatie starten. Denk aan het tijdelijk blokkeren van toegang, het informeren van de Classified Information Security Officer en het genereren van een rapport voor de audittrail. Door deze koppeling ontstaat een lerend systeem waarin policy, technische controles en operationele processen elkaar versterken. Het resultaat is een aantoonbaar veilig classified threat handling-proces dat bestand is tegen auditdruk, internationale samenwerkingsvereisten en de snelheid waarmee dreigingsactoren handelen. Daarmee wordt classified threat handling niet alleen een set technische maatregelen, maar een integraal sturingsmechanisme dat dagelijks bewijst dat de Nederlandse Baseline voor Veilige Cloud wordt nageleefd.

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 Controleert of kerncomponenten voor classified threat handling aanwezig zijn en rapporteert bevindingen. .DESCRIPTION Het script ondersteunt Nederlandse overheidsorganisaties bij het aantoonbaar veilig verwerken van geclassificeerde dreigingsinformatie binnen Microsoft 365. Het controleert of verplichte Purview-labels bestaan, of privileged toegang wordt afgedwongen, of logging in beschermde workspaces plaatsvindt en of rapportagecycli aanwezig zijn. De DebugMode-parameter maakt lokale tests mogelijk binnen 15 seconden zonder verbinding met productiesystemen. .NOTES Filename : classified-threat-handling.ps1 Author : Nederlandse Baseline voor Veilige Cloud Created : 2025-11-27 Version : 1.0 Gerelateerd JSON-artikel: content/m365/threat-intelligence/classified-threat-handling.json .EXAMPLE .\classified-threat-handling.ps1 -Assessment -DebugMode Voert een veilige lokale testrun uit zonder externe verbindingen en toont een gesimuleerd resultaat. .EXAMPLE .\classified-threat-handling.ps1 -Assessment Maakt verbinding met Microsoft Graph en Purview en controleert de classified threat handling-voorwaarden. .EXAMPLE .\classified-threat-handling.ps1 -Assessment -Report -OutputPath .\classified-report.txt Voert een assessment uit en schrijft een managementrapport naar het opgegeven bestand. #> #Requires -Version 5.1 [CmdletBinding()] param( [Parameter(HelpMessage = "Voer controles uit op classified threat handling-voorwaarden")] [switch]$Assessment, [Parameter(HelpMessage = "Genereer een managementrapport op basis van de assessment")] [switch]$Report, [Parameter(HelpMessage = "Pad voor rapportuitvoer (vereist bij -Report)")] [string]$OutputPath, [Parameter(HelpMessage = "Voer een lokale test uit zonder externe verbindingen")] [switch]$DebugMode ) $ErrorActionPreference = 'Stop' $VerbosePreference = 'Continue' function Initialize-ClassifiedConnections { <# .SYNOPSIS Zet benodigde verbindingen op tenzij DebugMode actief is. #> [CmdletBinding()] param() if ($DebugMode) { Write-Verbose "DebugMode actief: geen externe verbindingen nodig." return } try { $graphContext = Get-MgContext -ErrorAction SilentlyContinue if (-not $graphContext) { Write-Host "Verbinding maken met Microsoft Graph..." -ForegroundColor Yellow Connect-MgGraph -Scopes @( "Directory.Read.All", "Policy.Read.All", "AuditLog.Read.All" ) -ErrorAction Stop | Out-Null } } catch { throw "Kon Microsoft Graph-verbinding niet initialiseren: $_" } try { if (-not (Get-Module -ListAvailable -Name ExchangeOnlineManagement)) { Write-Warning "ExchangeOnlineManagement module niet gevonden. Purview-labels worden alleen indicatief gecontroleerd." return } if (-not (Get-PSSession | Where-Object { $_.ConfigurationName -eq 'Microsoft.Exchange' })) { Write-Host "Verbinding maken met Purview/Compliance PowerShell..." -ForegroundColor Yellow Connect-IPPSSession -ErrorAction Stop | Out-Null } } catch { Write-Warning "Kon geen Purview PowerShell-sessie opzetten: $_" } } function Test-ClassifiedThreatHandlingState { <# .SYNOPSIS Controleert de belangrijkste voorwaarden voor classified threat handling. .OUTPUTS PSCustomObject #> [CmdletBinding()] param() if ($DebugMode) { Write-Host "DebugMode: gesimuleerd resultaat wordt geretourneerd." -ForegroundColor Yellow return [PSCustomObject]@{ TenantId = "00000000-0000-0000-0000-000000000000" HasPurviewClassifiedLabels = $true RestrictedLoggingWorkspace = $true ConditionalAccessHardened = $false PrivilegedAccessWorkstations = $true ReportAutomationConfigured = $false Issues = @( "Conditional Access-beleid voor hardened admin workstations ontbreekt.", "Rapportageworkflow voor classified assessments is niet geautomatiseerd." ) Recommendations = @( "Implementeer een device-filter in Conditional Access zodat alleen geregistreerde PAW's toegang hebben.", "Koppel het PowerShell-rapport aan Planner of Azure DevOps voor automatische opvolging." ) Timestamp = Get-Date } } $result = [PSCustomObject]@{ TenantId = $null HasPurviewClassifiedLabels = $false RestrictedLoggingWorkspace = $null ConditionalAccessHardened = $false PrivilegedAccessWorkstations = $null ReportAutomationConfigured = $false Issues = @() Recommendations = @() Timestamp = Get-Date } try { $ctx = Get-MgContext -ErrorAction Stop $result.TenantId = $ctx.TenantId } catch { $result.Issues += "Microsoft Graph-context ontbreekt; authenticeer met Connect-MgGraph." return $result } # Purview labels (indicatief via Get-Label) try { if (Get-Command -Name Get-Label -ErrorAction SilentlyContinue) { $labels = Get-Label -ErrorAction Stop | Where-Object { $_.ContentType -contains "File" -and $_.DisplayName -match "Classified|Staatsgeheim|Departementaal" } if ($labels) { $result.HasPurviewClassifiedLabels = $true } else { $result.Issues += "Geen Purview-labels gevonden voor geclassificeerde informatie." $result.Recommendations += "Maak sensitivity labels aan voor Staatsgeheim, Departementaal Vertrouwelijk en NCTV Restricted." } } else { Write-Warning "Cmdlet Get-Label niet beschikbaar; controleer Purview-labels handmatig." } } catch { $result.Issues += "Purview-labels konden niet worden opgehaald: $_" } # Logging workspace (indicatief via Az.Accounts / configbestand) try { if (Get-Module -ListAvailable -Name Az.Accounts) { if (-not (Get-AzContext -ErrorAction SilentlyContinue)) { Connect-AzAccount -ErrorAction Stop | Out-Null } $workspace = Get-AzOperationalInsightsWorkspace -ErrorAction Stop | Where-Object { $_.Name -match "classified|secure" } | Select-Object -First 1 if ($workspace) { $result.RestrictedLoggingWorkspace = $true } else { $result.RestrictedLoggingWorkspace = $false $result.Issues += "Geen afzonderlijke Log Analytics workspace voor classified telemetry gevonden." $result.Recommendations += "Maak een dedicated workspace aan met customer lockbox en beperkte toegang." } } else { Write-Warning "Az.Accounts module niet gevonden; workspacecontrole overgeslagen." } } catch { $result.RestrictedLoggingWorkspace = $false $result.Issues += "Kon de status van de classified Log Analytics workspace niet bevestigen: $_" } # Conditional Access policies (indicatief via Graph) try { $policies = Get-MgIdentityConditionalAccessPolicy -ErrorAction Stop if ($policies | Where-Object { $_.DisplayName -match "PAW|Privileged" }) { $result.ConditionalAccessHardened = $true } else { $result.Issues += "Er is geen Conditional Access-beleid gevonden dat uitsluitend privileged workstations toelaat." $result.Recommendations += "Maak een beleid dat alleen compliant PAW's toegang geeft tot classified resources." } } catch { $result.Issues += "Kon Conditional Access-beleid niet uitlezen: $_" } # Privileged Access Workstations (indicator via Entra device tag) try { $devices = Get-MgDevice -Filter "startsWith(displayName,'PAW-')" -Top 1 -ErrorAction Stop $result.PrivilegedAccessWorkstations = ($devices.Count -gt 0) if (-not $result.PrivilegedAccessWorkstations) { $result.Issues += "Er zijn geen geregistreerde privileged access workstations met de naamconventie 'PAW-*'." $result.Recommendations += "Registreer PAW's in Entra ID en label ze voor Conditional Access-filters." } } catch { $result.PrivilegedAccessWorkstations = $null $result.Issues += "Kon PAW-registraties niet controleren: $_" } # Rapportage-automatisering controleren via repository-artefact $repoRoot = Split-Path -Parent (Split-Path -Parent $PSScriptRoot) $reportTemplate = Join-Path $repoRoot "documentatie\classified-threat-handling\rapport-template.md" if (Test-Path -Path $reportTemplate) { $result.ReportAutomationConfigured = $true } else { $result.ReportAutomationConfigured = $false $result.Recommendations += "Voeg een standaard rapporttemplate toe aan documentatie\\classified-threat-handling en koppel dit aan het script." } return $result } function Invoke-ClassifiedThreatHandlingAssessment { [CmdletBinding()] param() Initialize-ClassifiedConnections Write-Host "" Write-Host "Classified Threat Handling Assessment" -ForegroundColor Cyan Write-Host "=====================================" -ForegroundColor Cyan $assessment = Test-ClassifiedThreatHandlingState if (-not $assessment) { throw "Assessmentleverde geen resultaat op." } Write-Host ("TenantId: {0}" -f ($assessment.TenantId ?? "Onbekend")) -ForegroundColor White Write-Host ("Purview-labels aanwezig: {0}" -f $assessment.HasPurviewClassifiedLabels) -ForegroundColor White Write-Host ("Beveiligde logging workspace: {0}" -f $assessment.RestrictedLoggingWorkspace) -ForegroundColor White Write-Host ("Conditional Access voor PAW's: {0}" -f $assessment.ConditionalAccessHardened) -ForegroundColor White Write-Host ("PAW-registraties gevonden: {0}" -f $assessment.PrivilegedAccessWorkstations) -ForegroundColor White Write-Host ("Rapportage geautomatiseerd: {0}" -f $assessment.ReportAutomationConfigured) -ForegroundColor White if ($assessment.Issues.Count -gt 0) { Write-Host "`nAandachtspunten:" -ForegroundColor Yellow $assessment.Issues | ForEach-Object { Write-Host (" - {0}" -f $_) -ForegroundColor Yellow } } if ($assessment.Recommendations.Count -gt 0) { Write-Host "`nAanbevelingen:" -ForegroundColor Green $assessment.Recommendations | ForEach-Object { Write-Host (" - {0}" -f $_) -ForegroundColor Green } } return $assessment } function Invoke-ClassifiedThreatHandlingReport { <# .SYNOPSIS Schrijft een managementrapport op basis van assessmentresultaten. #> [CmdletBinding()] param( [Parameter(Mandatory = $true)] [pscustomobject]$Result, [Parameter(Mandatory = $true)] [string]$Path ) $report = @() $report += "Nederlandse Baseline voor Veilige Cloud – Classified Threat Handling" $report += "Assessment uitgevoerd op: $(Get-Date -Format 'yyyy-MM-dd HH:mm:ss')" $report += "" $report += "TenantId: $($Result.TenantId)" $report += "Purview-labels aanwezig: $($Result.HasPurviewClassifiedLabels)" $report += "Beveiligde logging workspace: $($Result.RestrictedLoggingWorkspace)" $report += "Conditional Access voor PAW's: $($Result.ConditionalAccessHardened)" $report += "PAW-registraties gevonden: $($Result.PrivilegedAccessWorkstations)" $report += "Rapportage geautomatiseerd: $($Result.ReportAutomationConfigured)" $report += "" if ($Result.Issues -and $Result.Issues.Count -gt 0) { $report += "Bevindingen:" $Result.Issues | ForEach-Object { $report += " - $_" } $report += "" } if ($Result.Recommendations -and $Result.Recommendations.Count -gt 0) { $report += "Aanbevelingen:" $Result.Recommendations | ForEach-Object { $report += " - $_" } $report += "" } $report += "Volgende stappen:" $report += "1. Valideer bevindingen binnen 5 werkdagen." $report += "2. Leg akkoord of afwijking vast in het classified handling register." $report += "3. Plan herassessment uiterlijk binnen 30 dagen indien kritieke hiaten bestaan." $directory = Split-Path -Parent $Path if ($directory -and -not (Test-Path -Path $directory)) { New-Item -ItemType Directory -Path $directory -Force | Out-Null } $report | Out-File -FilePath $Path -Encoding UTF8 Write-Host "Rapport opgeslagen naar $Path" -ForegroundColor Cyan } if (-not $Assessment -and -not $Report) { Write-Host "Geen acties opgegeven. Gebruik -Assessment en/of -Report." -ForegroundColor Yellow return } $assessmentResult = $null if ($Assessment) { $assessmentResult = Invoke-ClassifiedThreatHandlingAssessment } if ($Report) { if (-not $assessmentResult) { $assessmentResult = Invoke-ClassifiedThreatHandlingAssessment } if (-not $OutputPath) { throw "Parameter -OutputPath is verplicht wanneer -Report is opgegeven." } Invoke-ClassifiedThreatHandlingReport -Result $assessmentResult -Path $OutputPath }