Certificeringsprogramma's Voor Microsoft 365 Security Operations
📅 2025-11-27
•
⏱️ 46 minuten lezen
•
🔴 Must-Have
💼 Management Samenvatting
Een veerkrachtig Security Operations Center binnen de Nederlandse overheid valt of staat met aantoonbare certificeringsprogramma's. Microsoft 365-technologie verandert per kwartaal en toezichthouders eisen dat specialisten hun competenties onderhouden. Dit artikel beschrijft hoe certificering niet slechts een HR-formaliteit is, maar een controlemaatregel waarmee bestuurders kunnen bewijzen dat kritieke rollen bemand blijven en incidenten professioneel worden afgehandeld.
Aanbeveling
IMPLEMENT
Risico zonder
High
Risk Score
8/10
Implementatie
150u (tech: 60u)
Van toepassing op:
✓ Microsoft 365 ✓ Microsoft Defender XDR ✓ Microsoft Sentinel ✓ Microsoft Purview ✓ Entra ID ✓ Security Operations Center
Aanvallen op gemeenten, ministeries en uitvoeringsorganisaties richten zich steeds vaker op identity- en e-mailketens die rechtstreeks leunen op Microsoft 365. Zonder actuele certificeringen ontstaat afhankelijkheid van een beperkt aantal specialisten, raken runbooks verouderd en kan de organisatie niet aantonen dat zij passende organisatorische maatregelen treft zoals vereist door BIO, AVG en NIS2. Daarnaast vraagt de Nederlandse arbeidsmarkt om duidelijk zicht op doorgroeimogelijkheden; een gecertificeerd programma versterkt retentie en maakt samenwerking met shared services aantoonbaar.
PowerShell Modules Vereist
Primary API: Microsoft Graph Reports API (beta) voor certificerings- en trainingsrapportages, Microsoft Graph Directory API voor roldekking Connection:Connect-MgGraph -Scopes Reports.Read.All, Directory.Read.All, AuditLog.Read.All; combineer optioneel met lokale CSV-exports uit LMS-systemen Required Modules: Microsoft.Graph, Microsoft.Graph.Reports, Microsoft.Graph.DirectoryObjects
Implementatie
Het artikel werkt de volledige levenscyclus van certificeringsprogramma's uit: van bestuurlijk mandaat en risicoanalyse tot uitvoering, automatisering, rapportage en audittrail. We laten zien hoe het PowerShell-script `certification-programs.ps1` configuraties bewaakt, signalen over aflopende certificeringen genereert en binnen vijftien seconden managementinformatie levert. Alle aanbevelingen zijn afgestemd op de Nederlandse Baseline voor Veilige Cloud en bevatten concrete verwijzingen naar Microsoft 365-platformfunctionaliteit, zodat CISO's en SOC-leads direct kunnen implementeren.
Strategische basis, governance en wettelijke legitimiteit
Gebruik PowerShell-script certification-programs.ps1 (functie Invoke-CertificationRemediation) – Maakt of herstelt de basiskonfiguratie voor certificeringsdoelen, rollen en drempelwaarden, inclusief referentiegegevens voor audits..
Een certificeringsprogramma begint bij bestuurlijke opdracht. De raad van bestuur, het college van B&W of de secretaris-generaal legt in een formeel besluit vast dat kritieke Microsoft 365-rollen alleen mogen worden ingevuld door medewerkers met actuele certificeringen zoals SC-200, SC-300 of SC-100. Het besluit koppelt doelen aan de Nederlandse Baseline voor Veilige Cloud en maakt budget vrij voor examenkosten, trainingsuren en vervangingscapaciteit. Door certificering als controlemaatregel te positioneren in het risicoregister ontstaat mandaat om capaciteit tijdelijk uit productie te halen en opleidingen te prioriteren boven ad-hoc incidentrespons.
Governance richt zich op rolzuiverheid en ketenbrede dekking. Elke rol (SOC-analist, use-case engineer, incident commander, Purview specialist) krijgt een eigenaar die aantoonbaar verantwoordelijk is voor certificeringseisen, in- en uitstroom en successieplanning. Shared service-centra en leveranciers tekenen contractueel af dat zij hetzelfde certificeringsniveau handhaven; resultaten worden gedeeld tijdens security governance boards zodat opdrachtgever en opdrachtnemer dezelfde dataset gebruiken. Deze aanpak voorkomt afhankelijkheid van één leverancier en voldoet aan de NIS2-vereiste om kritieke ketens aantoonbaar te beheersen.
Privacy en arbeidsrecht worden vanaf het begin meegenomen. Het programma beschrijft welke persoonsgegevens worden verwerkt (bijvoorbeeld examendata, certificaatnummers en trainingsresultaten), waarom die verwerking noodzakelijk is en hoe lang gegevens worden bewaard. Ondernemingsraad en privacy officer toetsen of certificeringsresultaten proportioneel worden ingezet en hoe individuele prestaties worden gedeeld met leidinggevenden. Door deze afspraken op te nemen in een DPIA en in de HR-regelingen, wordt voorkomen dat certificering als disciplinair instrument wordt ervaren en ontstaat draagvlak voor structurele rapportages.
Het strategische hoofdstuk sluit af met een duidelijke koppeling naar budget- en portfoliomanagement. Certificeringsprogramma's worden onderdeel van de meerjarige investeringsagenda: elk kwartaal wordt beoordeeld welke nieuwe Microsoft 365-functies extra kennis vereisen, welke examens verlopen en hoe dat doorwerkt in SOC-capaciteit. Door certificering in dezelfde stuurlijn als technologieprojecten te plaatsen, kunnen bestuurders prioriteiten afwegen op basis van risico en kosten en sluit het programma aan op bestaande audit- en rapportagecycli.
Operationele uitvoering, datakwaliteit en automatisering
Gebruik PowerShell-script certification-programs.ps1 (functie Invoke-CertificationCoverage) – Controleert of elke rol voldoende gecertificeerde medewerkers heeft, signaleert aflopende examens en genereert een CSV-gap-analyse..
De uitvoering van certificeringsprogramma's is cyclisch: inventariseren, plannen, trainen, toetsen en bijwerken. Voor elke medewerker wordt vastgelegd welke certificeringen verplicht zijn, wanneer zij aflopen en welke trainingen of labs nodig zijn om hercertificering te halen. Deze gegevens worden niet in losse spreadsheets beheerd maar in een gecontroleerd configuratiebestand dat is gekoppeld aan Microsoft Graph-exports uit Entra ID, Defender XDR en het LMS. Door gegevensbronnen te standaardiseren kunnen security officers, HR en opleidingscoördinatoren dezelfde waarheid gebruiken zonder handmatige reconciliatie.
Het script `Invoke-CertificationCoverage` leest de configuratie en rekent binnen vijftien seconden uit of certificeringsdoelen worden gehaald. Het signaleert per rol hoeveel gecertificeerde medewerkers beschikbaar zijn, welke examens binnen 90 dagen verlopen en welke kritieke certificeringen slechts door één persoon worden gedragen. De output bevat concrete acties, zoals het plannen van een SC-200-hercertificering of het prioriteren van SC-400 voor Purview-specialisten. Omdat het script volledig lokaal draait, kan het veilig worden uitgevoerd in besloten overheidsnetwerken waar internettoegang beperkt is.
Automatisering strekt verder dan lokale scripts. Microsoft Graph Reports levert inzicht in trainingsdeelname, terwijl Attack Simulation Training en Viva Learning laten zien of medewerkers hun vaardigheden toepassen. Door deze bronnen te koppelen ontstaat een datamodel waarin certificering, hands-on labs en operationele prestaties samenvallen. Dezelfde dataset voedt Power BI-dashboards die real-time tonen welke teams een verhoogd risicoprofiel hebben omdat certificaten verlopen of vervangende capaciteit ontbreekt. Dit maakt het mogelijk om direct extra inhuur of opleidingsbudget vrij te geven voordat incidenten ontstaan.
Operationele processen bevatten ook kwaliteitscontroles. Elke wijziging in certificeringseisen doorloopt een change-procedure waarbij CISO-office, HR en privacy officer toetsen of de eis noodzakelijk is, hoe resultaten worden gemonitord en welke communicatie richting medewerkers nodig is. Templatebrieven en FAQ's worden vooraf klaargezet zodat managers het gesprek professioneel kunnen voeren. Door deze QA-sluitlus aanvallen, wordt het certificeringsprogramma net zo beheerst als technische changes in Microsoft 365.
Rapportage, ketensamenwerking en audittrail
Gebruik PowerShell-script certification-programs.ps1 (functie Publish-CertificationPortfolio) – Genereert een rapport met managementsamenvattingen, risicobeoordelingen en hashwaarden voor bewijsarchivering..
Rapportage is het bewijs dat certificering meer is dan een goede intentie. SOC-managers delen maandelijks een overzicht waarin per processtap wordt getoond welke certificeringen zijn behaald, welke trainees op examen gaan en welke risico's ontstaan als deadlines worden gemist. Deze cijfers worden gespiegeld aan incidentstatistieken: als een team met veel verlopen certificaten ook lagere detectiescores toont, is er direct aanleiding voor remediatie. Door rapportages te koppelen aan bestuurlijke KPI's worden certificeringsmaatregelen zichtbaar voor CIO's en portefeuillehouders.
Ketensamenwerking krijgt een prominente plek. Regionale SOC's, IBD, RijksSOC en leveranciers wisselen certificeringsdata uit via gestandaardiseerde sjablonen, zodat gezamenlijke incidenten kunnen worden bemenst zonder dat compliance-eisen in de weg staan. Elke partner bevestigt welke medewerkers op het hoogste classificatieniveau mogen werken en welke aanvullende screening is uitgevoerd. Dit voorkomt vertraging wanneer een crisisteam snel moet worden opgeschaald en bewijst aan toezichthouders dat ketenpartners aantoonbaar gekwalificeerd zijn.
Audittrail en bewijsvoering sluiten naadloos aan op Purview Records of een vergelijkbaar archief. Rapporten, configuratiebestanden en scriptuitvoer worden voorzien van hashwaarden en opgeslagen met een vaste retentietermijn (bijvoorbeeld zeven jaar). Hierdoor kunnen auditors later exact reconstrueren welke certificeringen actief waren ten tijde van een incident en welke verbeteracties waren gepland. Het voorkomt discussies achteraf en ondersteunt juridische verdedigbaarheid richting Autoriteit Persoonsgegevens, Algemene Rekenkamer of Tweede Kamer.
Tot slot borgt het programma de continue verbetercyclus. Bevindingen uit audits, red-teamresultaten en lessons learned uit incidenten worden vertaald naar nieuwe certificeringseisen of aanvullende trainingen. De output van `Publish-CertificationPortfolio` bevat een verbeterlogboek met verantwoordelijken, deadlines en referenties naar het portfoliobesluit. Zo blijft het programma dynamisch en sluit het aan op de innovatieagenda van Microsoft 365, zonder dat governance verslapt.
Compliance & Frameworks
BIO: 9.1, 12.1, 12.2, 16.1 - Waarborgt dat personele maatregelen, bekwaamheden en continuïteit aantoonbaar worden geborgd binnen de processen van de Nederlandse Baseline voor Veilige Cloud.
ISO 27001:2022: A.5.17, A.6.3, A.6.7, A.7.2 - Ondersteunt personele beveiliging, bewustwording en gouvernance binnen het ISMS door certificering en training meetbaar te maken.
NIS2: Artikel - Toont dat essentiële en belangrijke entiteiten beschikken over gekwalificeerd personeel, periodieke training en aantoonbare documentatie van controles.
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
Certificeringsbewaking voor Microsoft 365 security operations.
.DESCRIPTION
Dit script ondersteunt CISO- en SOC-teams bij het plannen, controleren
en rapporteren van certificeringen voor kritieke Microsoft 365-rollen.
Het werkt volledig met lokale configuraties zodat het veilig toepasbaar
is in gescheiden overheidsnetwerken.
.NOTES
Project : Nederlandse Baseline voor Veilige Cloud
Author : Nederlandse Baseline voor Veilige Cloud Team
File : certification-programs.ps1
.EXAMPLE
.\certification-programs.ps1 -Remediation
Maakt of herstelt de basisconfiguratie voor certificeringsdoelen.
.EXAMPLE
.\certification-programs.ps1 -Assess
Toont dekking per rol, aflopende certificeringen en exporteert een gap-analyse.
.EXAMPLE
.\certification-programs.ps1 -Report
Genereert een managementrapport met hashwaarde voor auditdossiers.
#>
#Requires -Version 5.1
[CmdletBinding(DefaultParameterSetName = 'Help')]
param(
[Parameter(ParameterSetName = 'Assess')]
[switch]$Assess,
[Parameter(ParameterSetName = 'Inventory')]
[switch]$Inventory,
[Parameter(ParameterSetName = 'Report')]
[switch]$Report,
[Parameter(ParameterSetName = 'Remediation')]
[switch]$Remediation,
[Parameter(ParameterSetName = 'Revert')]
[switch]$Revert,
[Parameter(Mandatory = $false)]
[switch]$WhatIf
)
Set-StrictMode -Version Latest
$ErrorActionPreference = 'Stop'
Write-Host "`n===============================================" -ForegroundColor Cyan
Write-Host "Certificeringsmonitor Microsoft 365 SOC" -ForegroundColor Cyan
Write-Host "Nederlandse Baseline voor Veilige Cloud" -ForegroundColor Cyan
Write-Host "===============================================`n" -ForegroundColor Cyan
functionGet-ConfigPath {
param()
$scriptDir = Split-Path -Parent $PSCommandPathreturn (Join-Path -Path $scriptDir -ChildPath 'certification-programs.config.json')
}
functionGet-GapPath {
param()
$scriptDir = Split-Path -Parent $PSCommandPathreturn (Join-Path -Path $scriptDir -ChildPath 'certification-programs-gaps.csv')
}
functionGet-ReportPath {
param()
$scriptDir = Split-Path -Parent $PSCommandPathreturn (Join-Path -Path $scriptDir -ChildPath 'certification-programs-report.txt')
}
function Initialize-CertificationConfig {
$today = (Get-Date).ToString('yyyy-MM-dd')
$nextQuarter = (Get-Date).AddDays(45).ToString('yyyy-MM-dd')
$nextHalfYear = (Get-Date).AddDays(160).ToString('yyyy-MM-dd')
$config = [ordered]@{
version = '1.0'
lastUpdated = $today
owner = 'SOC Certification Lead'
targets = [ordered]@{
expiryThresholdDays = 90
minimumCoveragePct = 120
criticalCerts = @(
[ordered]@{ id = 'SC-200'; minHolders = 4 },
[ordered]@{ id = 'SC-300'; minHolders = 3 },
[ordered]@{ id = 'SC-100'; minHolders = 2 }
)
}
personnel = @(
[ordered]@{
name = 'Analist Noord'
role = 'SOC Analyst'
required = @('SC-200','SC-300')
certificates = @(
[ordered]@{ id = 'SC-200'; expires = $nextHalfYear; issuer = 'Microsoft'; status = 'Active' },
[ordered]@{ id = 'SC-300'; expires = $nextQuarter; issuer = 'Microsoft'; status = 'Active' }
)
},
[ordered]@{
name = 'Analist Zuid'
role = 'SOC Analyst'
required = @('SC-200')
certificates = @(
[ordered]@{ id = 'SC-200'; expires = (Get-Date).AddDays(20).ToString('yyyy-MM-dd'); issuer = 'Microsoft'; status = 'Active' }
)
},
[ordered]@{
name = 'Use Case Engineer'
role = 'Use Case Engineer'
required = @('SC-200','SC-100')
certificates = @(
[ordered]@{ id = 'SC-200'; expires = $nextHalfYear; issuer = 'Microsoft'; status = 'Active' },
[ordered]@{ id = 'SC-100'; expires = (Get-Date).AddDays(-15).ToString('yyyy-MM-dd'); issuer = 'Microsoft'; status = 'Expired' }
)
},
[ordered]@{
name = 'Incident Commander'
role = 'Incident Commander'
required = @('SC-100')
certificates = @()
}
)
}
return$config
}
function Save-CertificationConfig {
param(
[Parameter(Mandatory = $true)]
[hashtable]$Config
)
$configPath = Get-ConfigPath$configJson = $Config | ConvertTo-Json -Depth 6if ($WhatIf) {
Write-Host "[WhatIf] Configuratie zou worden geschreven naar $configPath" -ForegroundColor Yellow
Write-Host$configJsonreturn
}
$configDir = Split-Path -Parent $configPathif (-not (Test-Path -Path $configDir)) {
New-Item -ItemType Directory -Path $configDir -Force | Out-Null
}
$configJson | Out-File -FilePath $configPath -Encoding UTF8 -Force
Write-Host "[OK] Configuratie opgeslagen op $configPath" -ForegroundColor Green
}
functionGet-CertificationData {
$configPath = Get-ConfigPathif (-not (Test-Path -Path $configPath)) {
throw "Geen configuratie gevonden. Voer '.\certification-programs.ps1 -Remediation' uit om te initialiseren."
}
$raw = Get-Content -Path $configPath -Raw
return ($raw | ConvertFrom-Json -Depth 6)
}
function Invoke-CertificationRemediation {
try {
$configPath = Get-ConfigPathif (Test-Path -Path $configPath) {
$backup = "$configPath.bak_{0}" -f (Get-Date -Format 'yyyyMMddHHmmss')
if (-not $WhatIf) {
Copy-Item -Path $configPath -Destination $backup -Force
}
Write-Host "[INFO] Back-up opgeslagen als $backup" -ForegroundColor Cyan
}
$config = Initialize-CertificationConfig
Save-CertificationConfig -Config $config
}
catch {
Write-Host "[FAIL] Remediatie mislukt: $($_.Exception.Message)" -ForegroundColor Red
exit 2
}
}
function Invoke-CertificationCoverage {
try {
$config = Get-CertificationData$now = Get-Date$threshold = [int]$config.targets.expiryThresholdDays
$personResults = @()
$portfolio = @{}
foreach ($person in $config.personnel) {
$missing = @()
$expiring = @()
foreach ($req in $person.required) {
$cert = $person.certificates | Where-Object { $_.id -eq $req }
if (-not $cert) {
$missing += $reqcontinue
}
$expires = [datetime]$cert.expires
if ($expires -lt $now) {
$missing += "$req (verlopen)"
}
elseif ($expires -lt $now.AddDays($threshold)) {
$daysLeft = [math]::Round(($expires - $now).TotalDays, 0)
$expiring += "$req ($daysLeft dagen)"
}
if (-not $portfolio.ContainsKey($cert.id)) {
$portfolio[$cert.id] = [ordered]@{
Holders = 0
Active = 0
Expiring = 0
Expired = 0
}
}
$portfolio[$cert.id].Holders++
if ($expires -lt $now) {
$portfolio[$cert.id].Expired++
}
elseif ($expires -lt $now.AddDays($threshold)) {
$portfolio[$cert.id].Expiring++
$portfolio[$cert.id].Active++
}
else {
$portfolio[$cert.id].Active++
}
}
$personResults += [pscustomobject]@{
Name = $person.name
Role = $person.role
Required = ($person.required -join ', ')
MissingCerts = if ($missing) { $missing -join '; ' } else { '' }
ExpiringSoon = if ($expiring) { $expiring -join '; ' } else { '' }
}
}
Write-Host "[INFO] Overzicht personeelscertificeringen" -ForegroundColor Cyan
$personResults | Format-Table -AutoSize
$portfolioTable = foreach ($key in ($portfolio.Keys | Sort-Object)) {
[pscustomobject]@{
Certification = $key
Holders = $portfolio[$key].Holders
Active = $portfolio[$key].Active
Expiring = $portfolio[$key].Expiring
Expired = $portfolio[$key].Expired
}
}
if ($portfolioTable) {
Write-Host "`n[INFO] Portfolio-overzicht" -ForegroundColor Cyan
$portfolioTable | Format-Table -AutoSize
}
$gapPath = Get-GapPathif ($WhatIf) {
Write-Host "[WhatIf] Gap-analyse zou worden geëxporteerd naar $gapPath" -ForegroundColor Yellow
}
else {
$personResults | Export-Csv -Path $gapPath -NoTypeInformation -Encoding UTF8
Write-Host "[OK] Gap-analyse geëxporteerd naar $gapPath" -ForegroundColor Green
}
foreach ($target in $config.targets.criticalCerts) {
$certId = $target.id
$min = [int]$target.minHolders
$current = if ($portfolio.ContainsKey($certId)) { $portfolio[$certId].Active } else { 0 }
if ($current -lt $min) {
Write-Host ("[WARN] Onvoldoende actieve houders voor {0}: {1}/{2}" -f $certId, $current, $min) -ForegroundColor Yellow
}
else {
Write-Host ("[OK] Certificeringsdoel voor {0} gehaald ({1}/{2})." -f $certId, $current, $min) -ForegroundColor Green
}
}
}
catch {
Write-Host "[FAIL] Assessment mislukt: $($_.Exception.Message)" -ForegroundColor Red
exit 2
}
}
function Export-CertificationInventory {
try {
$config = Get-CertificationData$inventoryPath = Get-GapPath$now = Get-Date$rows = foreach ($person in $config.personnel) {
foreach ($cert in $person.certificates) {
$expires = [datetime]$cert.expires
$daysLeft = [math]::Round(($expires - $now).TotalDays, 0)
[pscustomobject]@{
Name = $person.name
Role = $person.role
Certification = $cert.id
Issuer = $cert.issuer
Expires = $cert.expires
DaysLeft = $daysLeft
Status = if ($expires -lt $now) { 'Expired' } else { $cert.status }
}
}
}
if ($WhatIf) {
Write-Host "[WhatIf] Inventaris zou worden geschreven naar $inventoryPath" -ForegroundColor Yellow
$rows | Format-Table -AutoSize
return
}
$rows | Export-Csv -Path $inventoryPath -NoTypeInformation -Encoding UTF8
Write-Host "[OK] Inventaris geëxporteerd naar $inventoryPath" -ForegroundColor Green
}
catch {
Write-Host "[FAIL] Inventaris export mislukt: $($_.Exception.Message)" -ForegroundColor Red
exit 2
}
}
function Publish-CertificationPortfolio {
try {
$config = Get-CertificationData$reportPath = Get-ReportPath$now = Get-Date$lines = @()
$lines += "Rapport: Certificeringsprogramma Microsoft 365 SOC"
$lines += "Datum : $now"
$lines += "Eigenaar: $($config.owner)"
$lines += ""
$lines += "Doelstellingen:"
$lines += ("- Minimum dekking: {0}% | Expiry drempel: {1} dagen" -f $config.targets.minimumCoveragePct, $config.targets.expiryThresholdDays)
$lines += ""
foreach ($person in $config.personnel) {
$lines += ("Persoon: {0} ({1})" -f $person.name, $person.role)
$lines += (" Vereist : {0}" -f ($person.required -join ', '))
if ($person.certificates.Count -eq 0) {
$lines += " Beschikt over : geen certificeringen geregistreerd"
}
else {
foreach ($cert in $person.certificates) {
$lines += (" Certificaat: {0} | vervaldatum {1} | status {2}" -f $cert.id, $cert.expires, $cert.status)
}
}
$lines += ""
}
if (-not $WhatIf) {
$lines | Out-File -FilePath $reportPath -Encoding UTF8 -Force
$hash = Get-FileHash -Path $reportPath -Algorithm SHA256
Write-Host "[OK] Rapport opgeslagen op $reportPath" -ForegroundColor Green
Write-Host ("[INFO] SHA256: {0}" -f $hash.Hash) -ForegroundColor Cyan
}
else {
Write-Host "[WhatIf] Rapport zou worden opgeslagen op $reportPath" -ForegroundColor Yellow
$lines | ForEach-Object { Write-Host$_ }
}
}
catch {
Write-Host "[FAIL] Rapportage mislukt: $($_.Exception.Message)" -ForegroundColor Red
exit 2
}
}
function Invoke-CertificationCleanup {
try {
$paths = @(
(Get-ConfigPath),
(Get-GapPath),
(Get-ReportPath)
)
foreach ($path in $paths) {
if (-not (Test-Path -Path $path)) {
continue
}
if ($WhatIf) {
Write-Host "[WhatIf] Bestand zou worden verwijderd: $path" -ForegroundColor Yellow
}
else {
Remove-Item -Path $path -Force
Write-Host "[OK] Bestand verwijderd: $path" -ForegroundColor Green
}
}
}
catch {
Write-Host "[FAIL] Opschonen mislukt: $($_.Exception.Message)" -ForegroundColor Red
exit 2
}
}
try {
switch ($PSCmdlet.ParameterSetName) {
'Assess' { Invoke-CertificationCoverage; break }
'Inventory' { Export-CertificationInventory; break }
'Report' { Publish-CertificationPortfolio; break }
'Remediation' { Invoke-CertificationRemediation; break }
'Revert' { Invoke-CertificationCleanup; break }
default {
Write-Host "Gebruik:" -ForegroundColor Yellow
Write-Host " -Remediation Maak of herstel de basisconfiguratie" -ForegroundColor Gray
Write-Host " -Assess Controleer dekking en exporteer gap-analyse" -ForegroundColor Gray
Write-Host " -Inventory Exporteer een detailoverzicht per certificaat" -ForegroundColor Gray
Write-Host " -Report Genereer managementrapport met hashwaarde" -ForegroundColor Gray
Write-Host " -Revert Verwijder configuratie- en rapportbestanden" -ForegroundColor Gray
}
}
}
catch {
Write-Host "[FAIL] Onverwachte fout: $($_.Exception.Message)" -ForegroundColor Red
exit 2
}
finally {
Write-Host "`n===============================================`n" -ForegroundColor Cyan
}
Risico zonder implementatie
Risico zonder implementatie
High: Zonder gecentraliseerd certificeringsprogramma ontbreekt aantoonbare dekking van kritieke SOC-rollen, verlopen examens onopgemerkt en kan de organisatie geen compliancebewijzen leveren wanneer incidenten escaleren.
Management Samenvatting
Veranker certificeringsdoelen bestuurlijk, automatiseer monitoring met `certification-programs.ps1`, koppel data aan Graph-exports en archiveer rapportages met hashwaarden zodat Microsoft 365 security operations aantoonbaar bemand en compliant blijft.