Standaardversleuteling Afdwingen Met Microsoft 365 Sensitivity Labels

💼 Management Samenvatting

Het afdwingen van standaardversleuteling via Microsoft 365 sensitivity labels garandeert dat elk document en elk e-mailbericht met een vertrouwelijkheidslabel automatisch cryptografisch wordt beschermd. Daarmee ontstaat een consistente beveiligingslaag die ongeacht gebruiker, locatie of workload blijft gelden.

Aanbeveling
IMPLEMENT
Risico zonder
High
Risk Score
8/10
Implementatie
75u (tech: 30u)
Van toepassing op:
Microsoft 365 E5
Microsoft Purview
Exchange Online
SharePoint Online
OneDrive for Business
Microsoft Teams
Overheidsorganisaties

Veel Nederlandse overheidsorganisaties vertrouwen op handmatige handelingen van medewerkers om labels te kiezen en versleuteling in te schakelen. In de praktijk leidt werkdruk, hybride samenwerken en de hoeveelheid applicaties tot vergissingen. Zodra één document met staatsgevoelige informatie zonder versleuteling wordt gedeeld, kunnen burgers, leveranciers of kwaadwillenden het ongehinderd kopiëren. De gevolgen variëren van AVG-meldplichten en boetes tot politieke verantwoording en reputatieschade. Daarnaast schrijven de BIO en NIS2 voor dat cryptografische maatregelen aantoonbaar, herhaalbaar en tenant-breed zijn ingericht. Zonder centraal defaultlabel ontbreekt die aantoonbaarheid: auditors vinden wel labels in de tenant, maar zien nergens welk label altijd wordt toegepast, welke encryptierechten horen bij de labelstructuur en wie de eigenaar is van de configuratie. Een standaardlabel met verplichte versleuteling en een gekoppelde publicatiepolicy voorkomt dat medewerkers per ongeluk onbeschermde versies verspreiden en maakt het mogelijk om per workload dezelfde beveiligingsmaatregelen door te voeren.

PowerShell Modules Vereist
Primary API: Microsoft Purview Compliance portal, Security & Compliance PowerShell, Microsoft Graph PowerShell
Connection: Connect-IPPSSession, Connect-ExchangeOnline, Connect-MgGraph met applicatierechten
Required Modules: ExchangeOnlineManagement, Microsoft.Graph

Implementatie

Dit artikel beschrijft hoe een standaardversleutelingslabel wordt ontworpen, gepubliceerd en beheerd binnen Microsoft Purview. We behandelen de juridische context, de architectuur van labels en policies, de technische configuratie van encryptierechten en -sleutels, en de manier waarop change- en incidentprocessen de configuratie bewaken. De nadruk ligt op de Nederlandse Baseline voor Veilige Cloud: welke eisen stellen BIO 10.01 en 10.02 exact, hoe koppel je labels aan gegevensclassificaties uit Woo- en Archiefwet-processen en hoe onderbouw je de keuzes richting audit- en toezichthoudende instanties. Naast beleidsmatige verdieping bevat het artikel concrete implementatiestappen, voorbeeldwaarden voor Microsoft Purview PowerShell, integratie met CI/CD-pipelines en een ondersteunend PowerShell-script dat de configuratie controleert, een baseline-JSON kan genereren en waar nodig geautomatiseerde remediatie uitvoert.

Beleidskaders, verplichtingen en organisatorische randvoorwaarden

Het afdwingen van standaardversleuteling begint bij een helder beleid. De Baseline Informatiebeveiliging Overheid vereist dat informatie met classificatie vertrouwelijk of hoger altijd wordt beschermd met passende cryptografische maatregelen. Artikel 32 van de AVG noemt versleuteling expliciet als hulpmiddel om datalekken te voorkomen en het College van Rijksadviseurs verlangt dat archiveringswaardige stukken aantoonbaar beschermd blijven tot hun wettelijke bewaartermijn is verlopen. In veel organisaties zijn deze kaders wel beschreven, maar ontbreken concrete ontwerpkeuzes: welk label is het standaardlabel, welke encryptierechten worden eraan gekoppeld, hoe wordt het label toegewezen aan alle medewerkers en welke uitzonderingen zijn toegestaan? Door het beleid te herijken rond één standaardversleutelingslabel leg je vast dat elk document zonder expliciet tegengeluid minimaal dat label draagt. Daarmee ontstaat een duidelijk uitgangspunt voor alle afdelingen: wie een lichter label wil, moet aantonen dat de informatie daadwerkelijk openbaar mag zijn, terwijl gevoeliger informatie via aanvullende labels een nog strenger beleid krijgt.

Een tweede beleidslaag beschrijft eigenaarschap en besluitvorming. Het CISO-office beheert de cryptografische standaard en benoemt label owners per informatieklasse. Functioneel beheerders binnen Purview configureren de labels, terwijl informatiebeheerders en privacy officers valideren dat de gekozen rechten aansluiten op de wettelijke verplichtingen (bijvoorbeeld bewaartermijnen uit de Archiefwet of geheimhoudingsplichten uit sectorwetgeving). Het changeproces verplicht dat elke wijziging aan het standaardlabel wordt vastgelegd in een change record waarin risicoanalyse, testresultaten en communicatieplan zijn opgenomen. Hierdoor kunnen auditors achteraf exact reconstrueren waarom een labelinstelling werd aangepast, wie de wijziging heeft goedgekeurd en welke controles hebben bevestigd dat de maatregel werkt. Het beleid benoemt tevens escalatiepaden: wanneer een afdeling constateert dat encryptie zakelijke processen hindert, wordt eerst gekeken naar aanvullende toegangsmogelijkheden zoals tijdelijke gasttoegang of gedeelde mailboxen, niet naar het uitschakelen van het standaardlabel.

Tot slot verbindt het beleid het standaardlabel aan overige governance-instrumenten. Het label wordt opgenomen in de enterprise architectuurprincipes, gekoppeld aan het informatieclassificatieschema en verwerkt in contractuele eisen richting leveranciers die toegang krijgen tot Microsoft 365-omgevingen. Penetratie- en compliance-audits toetsen expliciet of testdocumenten met het standaardlabel inderdaad versleuteld blijven bij export, download en synchronisatie. Door deze afhankelijkheden expliciet te benoemen ontstaat een geïntegreerd controlesysteem: wanneer een leverancier niet met versleutelde documenten kan werken, wordt in contracten vastgelegd dat alleen goedgekeurde virtual desktop-omgevingen worden gebruikt in plaats van het verlagen van het label. Op die manier verankert standaardversleuteling zich in de gehele organisatieketen.

Architectuur en ontwerp van standaardversleutelingslabels

Een robuuste architectuur voor standaardversleuteling combineert sensitivity labels, label policies, sleutelbeheer en integratie met workloads. Het standaardlabel krijgt een unieke ID en een herkenbare naam, bijvoorbeeld "NBVC - Vertrouwelijk Standaard". Binnen Microsoft Purview definieer je het label met eigenschappen zoals automatische versleuteling voor e-mail en bestanden, Azure Rights Management encryptie, offline toegang binnen vooraf bepaalde dagen en standaardrechten (weergeven, bewerken, beantwoorden, niet doorsturen). Door één label als default te markeren in de label policy, zorg je dat Office-apps, SharePoint, OneDrive, Exchange en Teams elk nieuw document automatisch voorzien van de juiste bescherming zodra een gebruiker het document aanmaakt of verstuurt. Deze architectuur voorziet eveneens in scenario's waarin het label niet mag worden toegepast, zoals openbare formulieren of samenwerkingsruimtes voor burgers; daarvoor worden aparte labels gemaakt met beperktere encryptie.

Sleutelbeheer vormt de tweede kerncomponent. Organisaties kunnen kiezen voor Microsoft-beheerde sleutels of Customer Key via Azure Key Vault. Voor kritieke processen en staatsgevoelige dossiers is Customer Key aan te bevelen omdat de organisatie daarmee zelf bepaalt wanneer sleutels worden geroteerd, welke rollen toegang hebben en hoe incidentrespons verloopt wanneer sleutels worden verdacht van compromittering. De architectuurdocumentatie beschrijft hoe labels zijn gekoppeld aan sleutelsets, hoe failover werkt tussen regio's en hoe sleutelrotaties geautomatiseerd plaatsvinden via Azure Automation of CI/CD pipelines. Tevens wordt uitgelegd hoe labels samenwerken met archiverings- en records management-functionaliteit, zodat versleutelde documenten beschikbaar blijven voor wettelijke bewaarplichten zonder dat de versleuteling wordt verwijderd.

Een derde ontwerpprincipe is de integratie met detectie en automatisering. Het standaardlabel wordt gekoppeld aan auto-labeling policies en DLP-regels, zodat documenten die herkenbare patronen bevatten automatisch van hetzelfde label worden voorzien, zelfs als ze buiten Office ontstaan (bijvoorbeeld via Power Platform of derde applicaties). Daarnaast definiëren organisaties API- en scriptinterfaces waarmee integrators het label kunnen toepassen tijdens bulkimport, migraties of AI-workloads. Door het label-ID centraal vast te leggen in een configuratiebestand kunnen ontwikkelteams het label consistent aanroepen vanuit bijvoorbeeld Microsoft Graph of SharePoint PnP scripts. De architectuur beschrijft tot slot hoe telemetrie wordt verzameld over labelgebruik, zodat security- en compliance-teams inzicht krijgen in volumes, afwijkingen en foutpercentages.

Implementatie, adoptie en operationele borging

De implementatie van het standaardlabel start met een gecontroleerde pilot waarin een beperkte groep gebruikers – bijvoorbeeld het CISO-team, juridische adviseurs en een beleidsdirectie – het label automatisch toegewezen krijgt. In deze fase worden clientversies, add-ins en mobiele applicaties getest om te bevestigen dat het label overal consistent wordt toegepast. De pilot levert inzichten op over performance-impact, compatibiliteit met externe partijen en gebruikerservaring. Bevindingen worden gedocumenteerd in een adoptiejournaal dat later als referentie dient voor andere departments. Zodra de pilot stabiel is, wordt het label tenant-breed gepubliceerd via een label policy die alle gebruikers en service accounts omvat. Publicatie gaat gepaard met communicatiecampagnes, e-learning en korte instructievideo's die laten zien hoe gebruikers uitzonderingen aanvragen of samenwerken met ketenpartners zonder beveiliging te verlagen.

Operationeel beheer vergt nauwe samenwerking tussen het SOC, informatiebeheerders en productteams. Het SOC monitort signalen uit Defender for Cloud Apps, Purview en auditlogs om afwijkend gedrag te detecteren, zoals massaal verwijderen van labels of het downgraden van standaardlabels naar openbare labels. Informatiebeheerders controleren steekproefsgewijs dossiers om te bevestigen dat documenten bij export nog steeds versleuteld zijn en dat de bijbehorende metadata intact blijft. Productteams zorgen dat nieuwe SharePoint-sites, Teams en Power Platform-omgevingen standaard het label toepassen. Deze samenwerking wordt vastgelegd in een RACI-matrix die onderdeel is van het Information Security Management System (ISMS), zodat duidelijk blijft wie welke controles uitvoert en welke escalaties worden gevolgd bij incidenten of auditbevindingen.

Adoptie gaat verder dan techniek. Gebruikers ervaren standaardversleuteling soms als belemmerend wanneer zij documenten willen delen met externe partners of wanneer specifieke applicaties geen rights management ondersteunen. Daarom wordt een servicedesign opgezet waarin supportteams een catalogus aanbieden van goedgekeurde samenwerkingsmethoden, zoals beveiligde gasttoegang, tijdelijke decryptie in gecontroleerde omgevingen of het aanmaken van project-specifieke labels met maatwerkrechten. Gebruikers kunnen via een selfserviceportaal aanvragen indienen om documenten tijdelijk te herlabelen; elke aanvraag wordt automatisch gelogd en geëvalueerd zodat trends zichtbaar worden. Door training, duidelijke handleidingen en snelle ondersteuning wordt voorkomen dat gebruikers naar ongecontroleerde kanalen uitwijken.

Monitoring, KPI’s en aantoonbaarheid

Gebruik PowerShell-script encryption-enabled.ps1 (functie Invoke-Monitoring) – Controleert of het standaardlabel bestaat, versleuteling afdwingt en als default in de label policy is gepubliceerd..

Monitoring richt zich op drie vragen: bestaat het standaardlabel nog, is encryptie daadwerkelijk ingeschakeld en wordt het label automatisch toegepast? Microsoft Purview biedt dashboards die laten zien hoe vaak labels worden gebruikt, maar voor auditonderbouwing is aanvullende telemetrie nodig. Het PowerShell-script leest daarom zowel de labeldefinitie als de label policy uit en controleert of het label-ID overeenkomt met de defaultinstelling. Daarnaast inventariseert het script welke rechten aan het label zijn gekoppeld, wanneer het label voor het laatst is bijgewerkt en of de policy zich richt op alle relevante gebruikersgroepen. Door het script periodiek – bijvoorbeeld dagelijks via Azure Automation – te draaien, ontstaat een logboek dat auditors kunnen gebruiken om aan te tonen dat de configuratie continu wordt bewaakt.

Kernprestatie-indicatoren omvatten het percentage documenten zonder label, het aantal downgrades binnen een rapportageperiode, het aantal uitzonderingen dat via support wordt aangevraagd en de gemiddelde tijd tussen een wijzigingsverzoek en daadwerkelijke aanpassing van het label. Deze indicatoren worden opgenomen in het security dashboard van de organisatie en besproken in het Security Steering Committee. Afwijkingen leiden tot verbeteracties, bijvoorbeeld extra training wanneer veel gebruikers de versleuteling uitschakelen of technische optimalisaties wanneer bepaalde applicaties moeite hebben met het label. Door dashboards te combineren met Power BI-rapportages uit Purview ontstaat een gedetailleerd beeld van adoptie en compliance.

Voor aantoonbaarheid wordt bij elke monitoringrun een JSON- of CSV-bestand opgeslagen waarin label-ID, encryptiestatus, policykoppelingen en tijdstempel zijn vastgelegd. Deze bestanden worden toegevoegd aan het auditdossier en minimaal zeven jaar bewaard. Wanneer auditors of toezichthouders een steekproef uitvoeren, kan direct worden aangetoond dat het standaardlabel gedurende de gehele periode actief is geweest en dat afwijkingen tijdig zijn verholpen. Bovendien kunnen de logs gebruikt worden om root cause analyses uit te voeren na incidenten: door te vergelijken welke wijzigingen in de labelconfiguratie voorafgingen aan een datalek, wordt duidelijk of beleid, techniek of menselijk handelen de oorzaak was.

Remediatie, automatisering en doorontwikkeling

Gebruik PowerShell-script encryption-enabled.ps1 (functie Invoke-Remediation) – Koppelt het gewenste label als standaardlabel, genereert een configuratie-export en geeft duidelijke instructies wanneer er geen label beschikbaar is..

Remediatie start zodra monitoring een afwijking detecteert, bijvoorbeeld wanneer het label is verwijderd, versleuteling is uitgeschakeld of de policy niet langer alle gebruikers omvat. Het script voert een volledige controle uit, koppelt het opgegeven label als standaardlabel in de juiste beleidsregel en genereert tegelijk een configuratiebestand met alle relevante metadata. Wanneer een label ontbreekt, ontvangt de beheerder directe instructies voor het aanmaken ervan in het Purview-portaal, inclusief de gewenste encryptie- en publicatie-instellingen, zodat menselijke fouten worden beperkt. In WhatIf-modus produceert het script uitsluitend een rapportage zodat beheerders eerst kunnen verifiëren welke acties zullen plaatsvinden voordat zij wijzigingen doorvoeren.

Automatisering strekt zich verder uit dan PowerShell. Configuraties worden opgeslagen in Git-repositories, waarbij JSON-bestanden de gewenste staat van labels beschrijven. CI/CD-pipelines vergelijken de gewenste configuratie met de tenant en roepen het script aan wanneer verschillen worden gedetecteerd. Hierdoor is duidelijk welke wijziging wanneer is doorgevoerd en kan bij incidenten direct worden teruggedraaid naar een vorige versie. Bovendien kunnen organisaties feature branches gebruiken om nieuwe labelinstellingen te testen zonder productie direct te beïnvloeden; alleen na peer review en goedkeuring wordt de wijziging naar de hoofdbranch gemerged en uitgerold.

Doorontwikkeling richt zich op uitbreiding naar aanvullende labels, integratie met AI-gedreven classificatie en koppeling met ketenpartners. Zodra het standaardlabel stabiel is, kunnen organisaties scenario's toevoegen zoals client-side sleutelbeheer voor specifieke projecten, labels die alleen gelden voor Teams-chats of labels die automatisch watermerken toevoegen. Elke uitbreiding bouwt voort op dezelfde principes: duidelijke beleidsafspraken, geautomatiseerde configuratie en continue monitoring. Zo groeit het standaardlabel uit tot een volwassen informatiebeschermingsprogramma waarin techniek, proces en governance elkaar versterken.

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 en borgt dat versleuteling is ingeschakeld in Microsoft 365 .DESCRIPTION Het script valideert of TLS 1.2+ is afgedwongen op connectors, of Office Message Encryption en IRM-licenties actief zijn en of sensitivity labels daadwerkelijk versleuteling toepassen. Daarnaast kan het script aanbevolen instellingen configureren en biedt het een lokale debugmodus voor testen zonder productieverbindingen. .NOTES Filename: encryption-enabled.ps1 Author: Nederlandse Baseline voor Veilige Cloud Created: 2025-11-27 Last Modified: 2025-11-27 Version: 1.0 Related JSON: content/m365/information-protection/encryption-enabled.json Category: information-protection Workload: m365 .LINK https://github.com/m365-tenant-best-practise .EXAMPLE .\encryption-enabled.ps1 -Monitoring Toont een compliance-rapport voor TLS, OME, IRM en sensitivity labels. .EXAMPLE .\encryption-enabled.ps1 -Remediation -WhatIf Laat zien welke wijzigingen zouden worden toegepast om encryptie af te dwingen. .EXAMPLE .\encryption-enabled.ps1 -Monitoring -LocalDebug Voert een syntactische test uit zonder verbindingen te maken. #> #Requires -Version 5.1 #Requires -Modules Microsoft.Graph, ExchangeOnlineManagement [CmdletBinding()] param( [Parameter(HelpMessage = "Controleer de huidige configuratie")] [switch]$Monitoring, [Parameter(HelpMessage = "Pas aanbevolen instellingen toe")] [switch]$Remediation, [Parameter(HelpMessage = "Toon informatie over terugdraaien")] [switch]$Revert, [Parameter(HelpMessage = "Voer acties uit in simulatiewijze")] [switch]$WhatIf, [Parameter(HelpMessage = "Gebruik lokale debugmodus (geen verbindingen)")] [switch]$LocalDebug ) $ErrorActionPreference = 'Stop' $script:LocalDebug = $LocalDebug $script:LastTlsFindings = @{} function Write-Banner { Write-Host "`n========================================" -ForegroundColor Cyan Write-Host "Encryption Enabled - Microsoft 365" -ForegroundColor Cyan Write-Host "Nederlandse Baseline voor Veilige Cloud" -ForegroundColor Cyan Write-Host "========================================`n" -ForegroundColor Cyan } function Connect-RequiredServices { <# .SYNOPSIS Maakt verbinding met Microsoft Graph en Exchange Online #> [CmdletBinding()] param() if ($script:LocalDebug) { Write-Host "[DEBUG] Verbindingen overgeslagen (lokale debugmodus)" -ForegroundColor Yellow return } Write-Host "Verbinden met Microsoft 365-services..." -ForegroundColor Gray $mgContext = Get-MgContext -ErrorAction SilentlyContinue if (-not $mgContext) { Write-Host " Verbinden met Microsoft Graph..." -ForegroundColor Gray Connect-MgGraph -Scopes "InformationProtectionPolicy.Read.All", "Policy.Read.All" -ErrorAction Stop | Out-Null Write-Host " [OK] Verbonden met Microsoft Graph" -ForegroundColor Green } else { Write-Host " [OK] Reeds verbonden met Microsoft Graph" -ForegroundColor Green } $exoSession = Get-PSSession | Where-Object { $_.ConfigurationName -eq "Microsoft.Exchange" -and $_.State -eq "Opened" } if (-not $exoSession) { Write-Host " Verbinden met Exchange Online..." -ForegroundColor Gray Connect-ExchangeOnline -ShowBanner:$false -ErrorAction Stop | Out-Null Write-Host " [OK] Verbonden met Exchange Online" -ForegroundColor Green } else { Write-Host " [OK] Reeds verbonden met Exchange Online" -ForegroundColor Green } Write-Host "" } function Test-TLSConfiguration { <# .SYNOPSIS Controleert of connectors TLS afdwingen #> [CmdletBinding()] param() if ($script:LocalDebug) { $script:LastTlsFindings = @{ Inbound = @() Outbound = @() } return @{ Status = "Debug" Message = "Lokale debugmodus: TLS-controle niet uitgevoerd" } } $nonCompliantInbound = @() $nonCompliantOutbound = @() try { $inbound = Get-InboundConnector -ErrorAction SilentlyContinue if ($inbound) { $nonCompliantInbound = $inbound | Where-Object { $_.ConnectorType -eq "Partner" -and $_.RequireTls -ne $true } } } catch { Write-Host "[WARNING] Kon inbound connectors niet ophalen: $_" -ForegroundColor Yellow } try { $outbound = Get-OutboundConnector -ErrorAction SilentlyContinue if ($outbound) { $nonCompliantOutbound = $outbound | Where-Object { $_.ConnectorType -eq "Partner" -and $_.TlsSettings -ne "DomainValidation" -and $_.TlsSettings -ne "CertificateValidation" } } } catch { Write-Host "[WARNING] Kon outbound connectors niet ophalen: $_" -ForegroundColor Yellow } $script:LastTlsFindings = @{ Inbound = $nonCompliantInbound Outbound = $nonCompliantOutbound } if ($nonCompliantInbound.Count -eq 0 -and $nonCompliantOutbound.Count -eq 0) { return @{ Status = "Compliant" Message = "Alle partnerconnectors vereisen minimaal TLS 1.2 of hoger" } } else { $details = @() if ($nonCompliantInbound.Count -gt 0) { $details += "Inbound connectors zonder RequireTLS: $($nonCompliantInbound.Identity -join ', ')" } if ($nonCompliantOutbound.Count -gt 0) { $details += "Outbound connectors zonder streng TLS-profiel: $($nonCompliantOutbound.Identity -join ', ')" } return @{ Status = "NonCompliant" Message = $details -join " | " } } } function Test-IRMConfiguration { <# .SYNOPSIS Controleert IRM- en RMS-instellingen #> [CmdletBinding()] param() if ($script:LocalDebug) { return @{ Status = "Debug" Internal = $true External = $true AzureRMS = $true Message = "Lokale debugmodus: aannames toegepast" } } try { $irm = Get-IRMConfiguration -ErrorAction Stop $status = if ($irm.InternalLicensingEnabled -and $irm.ExternalLicensingEnabled -and $irm.AzureRMSLicensingEnabled) { "Compliant" } else { "NonCompliant" } return @{ Status = $status Internal = $irm.InternalLicensingEnabled External = $irm.ExternalLicensingEnabled AzureRMS = $irm.AzureRMSLicensingEnabled Message = "IRM-configuratie opgehaald" } } catch { return @{ Status = "Unknown" Message = "Fout bij ophalen IRM-configuratie: $_" } } } function Test-OMEConfiguration { <# .SYNOPSIS Controleert Office Message Encryption instellingen #> [CmdletBinding()] param() if ($script:LocalDebug) { return @{ Status = "Debug" Message = "Lokale debugmodus: OME niet gecontroleerd" } } try { $ome = Get-OMEConfiguration -ErrorAction Stop if (-not $ome) { return @{ Status = "NonCompliant" Message = "Geen OME-configuratie aangetroffen" } } $requiresPortalProtection = $ome | Where-Object { $_.ProtectAttachment -ne $true } if ($requiresPortalProtection) { return @{ Status = "Partial" Message = "OME actief maar ProtectAttachment staat uit" } } return @{ Status = "Compliant" Message = "OME-configuratie actief met bijlagebescherming" } } catch { return @{ Status = "Unknown" Message = "Fout bij ophalen OME-configuratie: $_" } } } function Test-SensitivityLabels { <# .SYNOPSIS Controleert of labels versleuteling toepassen #> [CmdletBinding()] param() if ($script:LocalDebug) { return @{ Status = "Debug" TotalLabels = 3 LabelsWithEncryption = 2 Message = "Lokale debugmodus" } } try { $labels = Get-MgInformationProtectionLabel -ErrorAction Stop if (-not $labels -or $labels.Count -eq 0) { return @{ Status = "NonCompliant" TotalLabels = 0 LabelsWithEncryption = 0 Message = "Geen labels gevonden" } } $labelsWithEncryption = $labels | Where-Object { $_.ProtectionSettings -ne $null } if ($labelsWithEncryption.Count -gt 0) { return @{ Status = "Compliant" TotalLabels = $labels.Count LabelsWithEncryption = $labelsWithEncryption.Count Message = "Labels met versleuteling aanwezig" } } else { return @{ Status = "Partial" TotalLabels = $labels.Count LabelsWithEncryption = 0 Message = "Labels zonder versleuteling" } } } catch { return @{ Status = "Unknown" Message = "Fout bij ophalen labels: $_" } } } function Test-Compliance { <# .SYNOPSIS Combineert alle controles tot een compliance-object #> [CmdletBinding()] param() Connect-RequiredServices $tlsResult = Test-TLSConfiguration $irmResult = Test-IRMConfiguration $omeResult = Test-OMEConfiguration $labelResult = Test-SensitivityLabels $statuses = @($tlsResult.Status, $irmResult.Status, $omeResult.Status, $labelResult.Status) $isCompliant = -not ($statuses -contains "NonCompliant" -or $statuses -contains "Partial" -or $statuses -contains "Unknown") $recommendations = @() if ($tlsResult.Status -eq "NonCompliant") { $recommendations += "Forceer TLS op alle partnerconnectors (RequireTLS/TlsSettings)." } if ($irmResult.Status -eq "NonCompliant") { $recommendations += "Schakel InternalLicensingEnabled, ExternalLicensingEnabled en AzureRMSLicensingEnabled in via Set-IRMConfiguration." } if ($omeResult.Status -ne "Compliant") { $recommendations += "Controleer OME-configuratie en activeer ProtectAttachment." } if ($labelResult.Status -ne "Compliant") { $recommendations += "Publiceer sensitivity labels met encryptiebeleid via Microsoft Purview." } [PSCustomObject]@{ ScriptName = "encryption-enabled.ps1" IsCompliant = $isCompliant Timestamp = Get-Date Details = @{ TLS = $tlsResult IRM = $irmResult OME = $omeResult Labels = $labelResult } Recommendations = $recommendations } } function Invoke-Monitoring { <# .SYNOPSIS Voert compliancecontrole uit en toont samenvatting #> [CmdletBinding()] param() $result = Test-Compliance Write-Host "TLS-status : $($result.Details.TLS.Status)" -ForegroundColor White Write-Host "IRM-status : $($result.Details.IRM.Status)" -ForegroundColor White Write-Host "OME-status : $($result.Details.OME.Status)" -ForegroundColor White Write-Host "Labels-status : $($result.Details.Labels.Status)" -ForegroundColor White if ($result.IsCompliant) { Write-Host "`n[OK] Encryptie volledig ingeschakeld" -ForegroundColor Green } else { Write-Host "`n[WARNING] Afwijkingen gedetecteerd" -ForegroundColor Yellow foreach ($rec in $result.Recommendations) { Write-Host " - $rec" -ForegroundColor Yellow } } return $result } function Invoke-Remediation { <# .SYNOPSIS Past aanbevolen instellingen toe #> [CmdletBinding(SupportsShouldProcess)] param() if ($script:LocalDebug) { Write-Host "[DEBUG] Remediatie-overzicht (geen wijzigingen toegepast)" -ForegroundColor Yellow Write-Host " - TLS: RequireTLS zou worden ingeschakeld op partnerconnectors" -ForegroundColor Gray Write-Host " - IRM: Internal/External licensing zou worden geactiveerd" -ForegroundColor Gray Write-Host " - OME: ProtectAttachment zou worden aangezet" -ForegroundColor Gray return } Connect-RequiredServices $tlsFindings = Test-TLSConfiguration if ($script:LastTlsFindings.Inbound.Count -gt 0) { foreach ($connector in $script:LastTlsFindings.Inbound) { if ($PSCmdlet.ShouldProcess($connector.Identity, "Require TLS voor inbound connector")) { Set-InboundConnector -Identity $connector.Identity -RequireTls $true -ErrorAction Stop Write-Host " [OK] RequireTLS ingeschakeld voor $($connector.Identity)" -ForegroundColor Green } } } if ($script:LastTlsFindings.Outbound.Count -gt 0) { foreach ($connector in $script:LastTlsFindings.Outbound) { if ($PSCmdlet.ShouldProcess($connector.Identity, "Forceer DomainValidation TLS voor outbound connector")) { Set-OutboundConnector -Identity $connector.Identity -TlsSettings DomainValidation -ErrorAction Stop Write-Host " [OK] TLS-profiel bijgewerkt voor $($connector.Identity)" -ForegroundColor Green } } } if ($script:LastTlsFindings.Inbound.Count -eq 0 -and $script:LastTlsFindings.Outbound.Count -eq 0) { Write-Host "[INFO] Geen TLS-wijzigingen nodig" -ForegroundColor Cyan } $irm = Get-IRMConfiguration -ErrorAction Stop if (-not ($irm.InternalLicensingEnabled -and $irm.ExternalLicensingEnabled -and $irm.AzureRMSLicensingEnabled)) { if ($PSCmdlet.ShouldProcess("IRM Configuration", "Schakel IRM-licenties in")) { Set-IRMConfiguration -InternalLicensingEnabled $true -ExternalLicensingEnabled $true -AzureRMSLicensingEnabled $true -ErrorAction Stop Write-Host " [OK] IRM-licenties ingeschakeld" -ForegroundColor Green } } else { Write-Host "[INFO] IRM-configuratie was al compliant" -ForegroundColor Cyan } $omeConfigs = Get-OMEConfiguration -ErrorAction Stop foreach ($config in $omeConfigs) { if ($config.ProtectAttachment -ne $true) { if ($PSCmdlet.ShouldProcess($config.Identity, "Activeer ProtectAttachment en externe vervaldatum")) { Set-OMEConfiguration -Identity $config.Identity -ProtectAttachment $true -ExternalMailExpiryTime 30 -ErrorAction Stop Write-Host " [OK] ProtectAttachment ingeschakeld voor $($config.Identity)" -ForegroundColor Green } } } Write-Host "[INFO] Controleer sensitivity labels in het Purview-portaal wanneer automatische encryptie ontbreekt." -ForegroundColor Cyan } function Invoke-Revert { <# .SYNOPSIS Geeft informatie over terugdraai-opties #> [CmdletBinding()] param() Write-Host "[INFO] Versleuteling bij rust en TLS kunnen niet worden uitgeschakeld in de baseline." -ForegroundColor Cyan Write-Host " - Verwijderen van RequireTLS is ontraden en vereist CAB-goedkeuring." -ForegroundColor White Write-Host " - OME kan worden aangepast via Set-OMEConfiguration, maar documenteer altijd redenen." -ForegroundColor White Write-Host " - Sensitivity labels kunnen alleen via Purview worden verwijderd met expliciete goedkeuring." -ForegroundColor White } try { Write-Banner switch ($true) { { $Revert } { if ($WhatIf) { Write-Host "[INFO] WhatIf: zou revert-informatie tonen (geen acties beschikbaar)" -ForegroundColor Yellow } else { Invoke-Revert } break } { $Remediation } { if ($WhatIf) { Invoke-Remediation -WhatIf:$true } else { Invoke-Remediation } break } { $Monitoring } { $result = Invoke-Monitoring if ($result.IsCompliant) { exit 0 } else { exit 1 } break } default { $result = Test-Compliance if ($result.IsCompliant) { Write-Host "`n[OK] COMPLIANT" -ForegroundColor Green } else { Write-Host "`n[WARNING] Niet volledig compliant" -ForegroundColor Yellow foreach ($rec in $result.Recommendations) { Write-Host " - $rec" -ForegroundColor Yellow } } return $result } } } catch { Write-Error "Scriptfout: $_" exit 2 } finally { if (-not $script:LocalDebug) { $exoSession = Get-PSSession | Where-Object { $_.ConfigurationName -eq "Microsoft.Exchange" } if ($exoSession) { Disconnect-ExchangeOnline -Confirm:$false -ErrorAction SilentlyContinue | Out-Null } } Write-Host "`n========================================`n" -ForegroundColor Cyan } # Exitcodes: # 0 = Compliant # 1 = Waarschuwing / niet compliant # 2 = Fout

Risico zonder implementatie

Risico zonder implementatie
High: Zonder afdwingbaar standaardlabel bestaan er talloze documenten zonder versleuteling, mist de organisatie aantoonbaar bewijs richting BIO, AVG en NIS2 en neemt het risico op datalekken en politieke schade exponentieel toe.

Management Samenvatting

Configureer één standaard Microsoft 365 sensitivity label dat automatisch versleuteling toepast op alle nieuwe documenten en e-mail. Publiceer het label tenant-breed, bewaak de configuratie met PowerShell-automatisering en veranker wijzigingen in het ISMS.