Sensitive Information Types Voor Nederlandse Baselines

πŸ’Ό Management Samenvatting

Sensitive Information Types (SIT's) vormen de ruggengraat van elk Purview-programma binnen de Nederlandse Baseline voor Veilige Cloud, omdat zij bepalen welke gegevensstromen automatisch worden gedetecteerd, geclassificeerd en zo nodig geblokkeerd.

Aanbeveling
IMPLEMENT
Risico zonder
High
Risk Score
9/10
Implementatie
280u (tech: 120u)
Van toepassing op:
βœ“ Rijksoverheid
βœ“ Gemeenten
βœ“ Provincies
βœ“ ZBO's
βœ“ Vitale aanbieders

Zonder fijnmazige en aantoonbaar juiste SIT-definities kunnen AVG-artikelen en BIO-controls niet technisch worden afgedwongen en blijft het afhankelijk van menselijk gedrag of staats-, burger- en bedrijfsgevoelige gegevens wel of niet uitlekken. Overheidsorganisaties moeten bovendien inzichtelijk maken welke bronnen ten grondslag liggen aan detecties, hoe false positives worden beperkt en hoe uitzonderingen bestuurlijk zijn geborgd.

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

Implementatie

Dit artikel beschrijft hoe Nederlandse organisaties een volledige SIT-taxonomie ontwerpen, hoe maatwerk zoals RijksZaaknummers en Wob-dossiers worden toegevoegd via Exact Data Match en hoe de automatisering met het meegeleverde PowerShell-script toetsbare bewijslast levert richting auditors en toezichthouders.

Taxonomie en governance van Sensitive Information Types

Een volwassen taxonomie voor Sensitive Information Types begint met een bestuurbare indeling van alle gegevenssoorten die een Nederlandse overheidsorganisatie verwerkt. Architecten ordenen gegevens in drie lagen: wettelijke basis (AVG, Wpg, Woo, Archiefwet), organisatiedoelen (opvang van burgers, vergunningverlening, toezicht) en technische representaties (documentsoorten, databasekolommen, bestandslocaties). Door deze lagen in een register te combineren ontstaat een herleidbare lijn van beleidsuitspraak naar detectieregel. Het register beschrijft voor elke dataset welke patronen een SIT moet herkennen, of het gaat om gestructureerde codes zoals BSN of combinaties van sleutelwoorden, en welke uitzonderingen tijdelijk zijn toegestaan. Hierdoor kan het CISO-office aantonen dat elke detectie rechtstreeks terug te voeren is op een beleidsbesluit en dat SIT's niet ad hoc zijn ontstaan vanuit technische mogelijkheden.

Governance verankert de taxonomie in de organisatie. De Nederlandse Baseline voor Veilige Cloud schrijft voor dat de Functionaris Gegevensbescherming, het CISO-office, informatie-eigenaren en het SOC gezamenlijk besluiten over wijzigingen in SIT's. Elk wijzigingsvoorstel bevat een samenvatting van het risico, een beschrijving van de juridische basis, testresultaten en de verwachte impact op gebruikerservaring. Wijzigingen worden vastgelegd in een CAB-proces waarbij een dubbele goedkeuring verplicht is: een vanuit privacy-compliance en een vanuit operationele beveiliging. De governanceprocedure bevat ook tijdslijnen voor periodieke herbeoordelingen. Wanneer bijvoorbeeld nieuwe wetgeving rond digitale overheid wordt ingevoerd, moet de taxonomie binnen zestig dagen zijn bijgewerkt en moet het SOC kunnen aantonen dat synthetische tests het nieuwe gedrag bevestigen.

De taxonomie kent een hierarchische structuur. Bovenaan staan kerngegevens zoals identiteitsnummers, financiele kengetallen en classificaties van staatsgeheimen. Een tweede laag beschrijft contextuele patronen, bijvoorbeeld trefwoorden die horen bij crisisdossiers, aanbestedingen of politierapporten. Een derde laag koppelt gevoeligheidslabels en retention labels aan SIT's zodat downstream processen zoals archivering, encryptie en retentie consistent blijven. Door deze structuur te documenteren in een centrale repository kunnen security- en privacyteams veranderingen volgen, peer reviews uitvoeren en automatisch release notes genereren. Dit maakt het mogelijk om audits te laten zien wanneer een specifieke term aan een SIT is toegevoegd, wie het heeft goedgekeurd en welke tests daarbij zijn uitgevoerd.

Maatwerk vormt een essentieel onderdeel van de taxonomie. Nederlandse organisaties gebruiken identificaties zoals RijksZaaknummers, BRP-dossiers of projectcodes die buiten standaard Microsoft-templates vallen. Deze patronen vragen om Exact Data Match of keyword-classifiers. Voor EDM worden referentiebestanden gegenereerd vanuit bronapplicaties, waarbij hashing plaatsvindt voordat gegevens naar de cloud worden verzonden. Voor keywordvarianten beschrijft de taxonomie welke regex, welke proximiteit en welke ondersteunende woorden worden toegepast om false positives te minimaliseren. Elke maatwerkdefinitie wordt gekoppeld aan een verantwoordelijke proceseigenaar en krijgt een herzieningsdatum zodat het SOC weet wanneer een dataset opnieuw moet worden geladen.

Tot slot koppelt de governance sectie SIT's aan controleramingen. De Nederlandse Baseline voor Veilige Cloud adviseert om per SIT inzichtelijk te maken welke BIO-controles, AVG-artikelen of NIS2-verplichtingen ermee worden afgedekt. Dit levert managementrapportages op waarin direct zichtbaar is welke juridische dreiging ontstaat als een SIT wordt uitgeschakeld of niet wordt bijgewerkt. Door deze koppeling te automatiseren in dashboards kunnen bestuurders binnen enkele minuten beoordelen of nieuwe programma's voldoen aan de wettelijke eisen zonder eerst alle configuratiebestanden te hoeven bekijken. Zo verandert de taxonomie van een technisch datapunt naar een bestuurbaar sturingsinstrument.

Implementatiepad, EDM-lifecycle en automatisering

Het implementatiepad voor Sensitive Information Types start met een inventarisatie van bronnen en formats. Projectteams brengen per proces in kaart waar gegevens worden aangemaakt, hoe ze door systemen bewegen en welke varianten er bestaan. Voor BSN's betekent dit dat naast het standaardformaat ook notaties met spaties of koppeltekens moeten worden herkend. Voor RijksZaaknummers spelen afkortingen een rol, terwijl IBAN's vaak worden gecombineerd met naamvelden. In deze fase wordt bepaald welke detectietechniek wordt ingezet: standaardtemplates, EDM, dictionary of function. Het resultaat is een roadmap waarin staat welke SIT's direct inzetbaar zijn, welke afhankelijk zijn van bronaanpassingen en welke datasets eerst opgeschoond moeten worden voordat ze veilig kunnen worden gehasht.

Zodra de inventarisatie is afgerond volgt de bouwfase. Voor EDM houdt dit in dat beheerders CSV-bestanden genereren vanuit bronsystemen en deze lokaal via de EDM Upload Agent versleuteld uploaden naar Purview. Het proces omvat sampling, hashing en key-rotatie. Voor keywords en regex-gedreven SIT's worden classificatiepakketten opgesteld waarin patronen en contextwoorden zijn vastgelegd. Elk pakket bevat documentatie waarin staat hoe de pattern confidence is vastgesteld, welke trainingsdata zijn gebruikt en hoe de detectie is getest. Door de pakketten in dezelfde repository te bewaren als waar de taxonomie leeft, loopt versiebeheer automatisch door naar test- en productieomgevingen en kan worden aangetoond dat alle lokale debugtests binnen vijftien seconden draaiden.

Automatisering versnelt het beheer. PowerShell en Graph-API's halen dagelijks de lijst met beschikbare SIT's op en vergelijken deze met de baseline. Afwijkingen worden in een pipeline verwerkt waardoor securityteams onmiddellijk zien of een type per ongeluk is verwijderd of in conceptstaat is blijven hangen. Voor EDM controleert de automatisering of referentiebestanden binnen de geldigheidsperiode vallen en of er voldoende records aanwezig zijn om betrouwbare detectie te garanderen. Wanneer datasets verlopen of te weinig records bevatten, genereert de pipeline een taak in het service management systeem zodat proceseigenaren nieuwe exports aanleveren. Zo ontstaat een beheercyclus waarin SIT's net zo strak worden gemonitord als patches of certificaten.

De implementatieroadmap bevat ook testen en kwaliteitsbewijzen. Elke SIT krijgt synthetische testbestanden met zowel positieve als negatieve voorbeelden. SOC-analisten draaien deze voorbeelden in een aparte labtenant of met DebugMode zodat regressies direct zichtbaar zijn. De testresultaten worden opgeslagen in hetzelfde dossier als de DPIA en CAB-besluiten, inclusief screenshots van Activity Explorer en scriptuitvoer. Hierdoor beschikken auditors over een bron waarin specificatie, implementatie, test en goedkeuring samenkomen. Bovendien wordt vastgelegd hoe snel tests moeten verlopen zodat scripts nooit ongecontroleerd in productie blijven hangen.

Tijdens de operationalisatie wordt elke SIT gekoppeld aan communicatie en training. Gebruikers krijgen toelichting op de blokkerende teksten die bij een detectie verschijnen, inclusief contactinformatie voor het privacyteam. Servicedesks beschikken over een kennispagina waarin per SIT staat welk gedrag gewenst is, welke uitzonderingen mogen worden aangevraagd en welke logging wordt vastgelegd. Deze adoptie-aanpak voorkomt escalaties en zorgt ervoor dat medewerkers successen melden wanneer SIT's daadwerkelijk datalekken hebben voorkomen. Het vergroot bovendien de bereidheid van beleidsafdelingen om nieuwe datasets te laten opnemen, omdat duidelijk is hoe de technische detectie het proces ondersteunt in plaats van hindert.

Operationele borging, monitoring en rapportage

Na oplevering verschuift de focus naar continue borging. Het SOC monitort via Activity Explorer, Microsoft Sentinel en custom dashboards of SIT's blijven triggeren conform verwachting. De monitoring richt zich op vier vragen: hoeveel detecties ontstaan per type, welk aandeel wordt geblokkeerd, hoeveel overrides worden aangevraagd en hoe vaak ontbreekt een SIT in een policy. Door deze vragen per proces of organisatieonderdeel te beantwoorden ontstaat inzicht in zowel misbruikpogingen als datahygiene. Trendanalyses laten zien of nieuwe projecten meer detecties veroorzaken en of aanvullende maatregelen nodig zijn. Wanneer detecties onverwacht dalen wordt onderzocht of datasets nog up-to-date zijn of dat gebruikers gevoelige termen omzeilen via synoniemen.

Operationeel beheer vertaalt monitoring naar concrete acties. Purview-configuraties worden wekelijks geexporteerd en vergeleken met de baseline via het PowerShell-script dat onderdeel uitmaakt van dit artikel. Het script controleert of SIT's bestaan, of ze gepubliceerd zijn en of ze in de juiste DLP-regels terugkomen. Afwijkingen worden automatisch gelabeld als kritisch wanneer ze betrekking hebben op persoonsgegevens of staatsgeheime metadata. Change-managers krijgen een rapportage waarin elk verschil is gekoppeld aan een CAB-ticket zodat duidelijk is of er sprake is van een goedgekeurde wijziging of van ongeautoriseerde aanpassingen. Deze audittrail vormt een kerncomponent richting Rijksauditdiensten en externe toezichthouders.

Rapportage richting bestuurders vraagt om een andere invalshoek dan technische monitoring. Maandelijks ontvangt het directieteam een overzicht waarin voor elke SIT staat welke wet- of regelgeving ermee wordt afgedekt, hoe vaak er detecties waren en hoeveel daarvan hebben geleid tot een blokkade. De rapportage bevat heatmaps die laten zien welke organisatieonderdelen de meeste uitzonderingen aanvragen. Hierdoor kunnen bestuurders gericht investeren in aanvullende beveiliging, procesverbetering of opleiding. De Functionaris Gegevensbescherming ontvangt daarnaast een juridisch geannoteerde versie waarin per SIT staat welke grondslag en welke bewaartermijnen gelden.

Koppeling met incidentrespons is essentieel. Wanneer een datalek wordt onderzocht levert het SIT-register direct inzicht in welke documenten zijn geraakt, welke detecties eerder zijn genegeerd en welke overrides zijn toegestaan. Het SOC gebruikt deze informatie om te bepalen of aanvullende melding aan het NCSC of aan ketenpartners nodig is. Tegelijkertijd controleert het script of de betrokken SIT's nog steeds binnen policies zijn opgenomen en of EDM-bestanden niet verlopen zijn. Mocht blijken dat een SIT niet correct functioneerde, dan wordt het incidentrapport aangevuld met herstelacties en testresultaten zodat bestuurders en auditors exact weten wat er is geleerd.

Tot slot beschrijft de borgingsaanpak hoe kennis wordt onderhouden. Nieuwe beheerders doorlopen een onboarding waarbij zij het taxonomieregister, het script en de rapportages leren gebruiken. Er wordt een community of practice opgezet waarin gemeenten, ministeries en ZBO's configuraties delen en gezamenlijke EDM-templates ontwikkelen. Door deze samenwerking ontstaan herbruikbare componenten en kunnen kleinere organisaties profiteren van de lessons learned van grote departementen. Alle documentatie, inclusief scriptoutput, wordt minimaal zeven jaar bewaard zodat herleidbaarheid gegarandeerd blijft.

Automatisering en validatie

Gebruik PowerShell-script sensitive-information-types.ps1 (functie Invoke-SensitiveInformationTypeBaseline) – Het script voert lokale debugcontroles uit, vergelijkt de beschikbare Sensitive Information Types met de Nederlandse baseline, vult ontbrekende detecties in een opgegeven DLP-regel aan en exporteert de resultaten als auditbewijs..

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 Baselinecontrole voor Sensitive Information Types binnen Microsoft Purview. .DESCRIPTION Het script past binnen de Nederlandse Baseline voor Veilige Cloud en controleert of verplichte Sensitive Information Types (SIT's) bestaan, gepubliceerd zijn en of zij worden toegepast in een opgegeven DLP-regel. In monitoringmodus levert het een rapportageobject dat optioneel naar JSON kan worden geexporteerd. In remediatiemodus voegt het script ontbrekende SIT-verwijzingen toe aan de doelregel. DebugMode maakt het mogelijk om alle logica lokaal te testen binnen vijftien seconden zonder cloudverbinding. .NOTES Filename: sensitive-information-types.ps1 Author: Nederlandse Baseline voor Veilige Cloud Created: 2025-11-27 Last Modified: 2025-11-27 Version: 1.0 Related JSON: content/m365/purview/sensitive-information-types.json Workload: Microsoft 365 / Purview .LINK https://github.com/m365-tenant-best-practise .EXAMPLE .\sensitive-information-types.ps1 -Monitoring -ExportPath .\sit-report.json Voert de baselinecontrole uit en schrijft het resultaat weg naar JSON. .EXAMPLE .\sensitive-information-types.ps1 -Remediation -TargetPolicyName 'NL Sensitive Data Protection' Vul ontbrekende SIT-verwijzingen aan in de opgegeven DLP-regel. .EXAMPLE .\sensitive-information-types.ps1 -DebugMode -Monitoring Voert dezelfde controles lokaal uit zonder verbinding te maken met Microsoft 365. #> #Requires -Version 5.1 #Requires -Modules ExchangeOnlineManagement [CmdletBinding()] param( [Parameter()] [switch]$Monitoring, [Parameter()] [switch]$Remediation, [Parameter()] [switch]$Revert, [Parameter()] [switch]$DebugMode, [Parameter()] [switch]$WhatIf, [Parameter()] [string]$TargetPolicyName = 'NL Sensitive Data Protection', [Parameter()] [string]$TargetRuleName = 'NL Sensitive Data Protection - Sensitive Types', [Parameter()] [string]$ExportPath ) $ErrorActionPreference = 'Stop' Set-StrictMode -Version Latest $script:Connected = $false $script:ComplianceSession = $null function Write-Banner { Write-Host "`n========================================" -ForegroundColor Cyan Write-Host "Sensitive Information Types baseline" -ForegroundColor Cyan Write-Host "Nederlandse Baseline voor Veilige Cloud" -ForegroundColor Cyan Write-Host "========================================`n" -ForegroundColor Cyan } function Connect-RequiredServices { [CmdletBinding()] param() if ($DebugMode) { Write-Verbose "DebugMode actief: er wordt geen cloudverbinding opgebouwd." return } if ($script:Connected) { return } Write-Verbose "Verbinding maken met Exchange Online en Security & Compliance PowerShell." Connect-ExchangeOnline -ShowBanner:$false -ErrorAction Stop | Out-Null $session = Connect-IPPSSession -ShowBanner:$false -ErrorAction Stop $script:ComplianceSession = $session $script:Connected = $true } function Disconnect-RequiredServices { [CmdletBinding()] param() if (-not $DebugMode) { try { if ($script:ComplianceSession) { Remove-PSSession -Session $script:ComplianceSession -ErrorAction SilentlyContinue $script:ComplianceSession = $null } Disconnect-ExchangeOnline -Confirm:$false -ErrorAction SilentlyContinue | Out-Null } catch { Write-Verbose "Fout bij het verbreken van de sessies: $($_.Exception.Message)" } } $script:Connected = $false } function Get-BaselineSensitiveInformationTypes { [CmdletBinding()] param() return @( [pscustomobject]@{ Name = 'Netherlands Citizen Service Number (BSN)'; MinCount = 1; Mandatory = $true; RequiresCustom = $false }, [pscustomobject]@{ Name = 'Netherlands Passport Number'; MinCount = 1; Mandatory = $true; RequiresCustom = $false }, [pscustomobject]@{ Name = 'Netherlands Driver''s License Number'; MinCount = 1; Mandatory = $false; RequiresCustom = $false }, [pscustomobject]@{ Name = 'Netherlands Tax Identification Number'; MinCount = 1; Mandatory = $true; RequiresCustom = $false }, [pscustomobject]@{ Name = 'EU Debit Card Number'; MinCount = 1; Mandatory = $false; RequiresCustom = $false }, [pscustomobject]@{ Name = 'Custom - RijksZaaknummer'; MinCount = 1; Mandatory = $true; RequiresCustom = $true } ) } function Get-SensitiveInformationTypeStatus { [CmdletBinding()] param( [Parameter(Mandatory)] [string]$Name ) if ($DebugMode) { return [pscustomobject]@{ Name = $Name State = 'Published' PublisherName = 'Nederlandse Baseline voor Veilige Cloud' RulePackId = [guid]::NewGuid().Guid } } Connect-RequiredServices try { return Get-DlpSensitiveInformationType -Identity $Name -ErrorAction Stop } catch { $message = $_.Exception.Message if ($message -match 'was not found' -or $message -match 'cannot be found') { return $null } throw } } function Get-DlpBaselineRule { [CmdletBinding()] param( [Parameter(Mandatory)] [string]$PolicyName, [Parameter(Mandatory)] [string]$RuleName ) if ($DebugMode) { return [pscustomobject]@{ Identity = $RuleName Name = $RuleName Policy = $PolicyName ContentContainsSensitiveInformation = @( @{ Name = 'Netherlands Citizen Service Number (BSN)'; MinCount = '1' }, @{ Name = 'Netherlands Passport Number'; MinCount = '1' } ) } } Connect-RequiredServices $rules = Get-DlpComplianceRule -Policy $PolicyName -ErrorAction Stop return $rules | Where-Object { $_.Name -eq $RuleName } } function ConvertTo-RuleEntry { [CmdletBinding()] param( [Parameter()] $InputObject ) if ($null -eq $InputObject) { return $null } if ($InputObject -is [hashtable]) { return $InputObject } if ($InputObject -is [pscustomobject]) { $hash = @{} foreach ($prop in $InputObject.PSObject.Properties) { $hash[$prop.Name] = $prop.Value } return $hash } return $null } function Test-SensitiveCoverage { [CmdletBinding()] param() $baseline = Get-BaselineSensitiveInformationTypes $rule = Get-DlpBaselineRule -PolicyName $TargetPolicyName -RuleName $TargetRuleName if (-not $rule) { throw "De DLP-regel '$TargetRuleName' binnen policy '$TargetPolicyName' is niet gevonden." } $ruleEntries = @() if ($rule.ContentContainsSensitiveInformation) { foreach ($entry in $rule.ContentContainsSensitiveInformation) { $converted = ConvertTo-RuleEntry -InputObject $entry if ($converted) { $ruleEntries += $converted } } } $typeStatus = foreach ($type in $baseline) { $details = Get-SensitiveInformationTypeStatus -Name $type.Name $ruleMatch = $ruleEntries | Where-Object { $_.Name -eq $type.Name } $publisher = $null if ($details) { if ($details.PSObject.Properties['PublisherName']) { $publisher = $details.PublisherName } elseif ($details.PSObject.Properties['Publisher']) { $publisher = $details.Publisher } } $state = $null if ($details -and $details.PSObject.Properties['State']) { $state = $details.State } $rulePackId = $null if ($details) { if ($details.PSObject.Properties['RulePackId']) { $rulePackId = $details.RulePackId } elseif ($details.PSObject.Properties['RulePackageId']) { $rulePackId = $details.RulePackageId } } [pscustomobject]@{ Name = $type.Name Mandatory = $type.Mandatory Exists = [bool]$details IsPublished = if ($state) { $state -eq 'Published' -or $state -eq 'Active' } else { $false } Publisher = $publisher RulePackageId = $rulePackId PresentInRule = [bool]$ruleMatch MinCount = if ($ruleMatch) { $ruleMatch.minCount } else { $type.MinCount } RequiresCustom = $type.RequiresCustom } } $missingTaxonomy = $typeStatus | Where-Object { $_.Mandatory -and -not $_.Exists } $missingRule = $typeStatus | Where-Object { $_.Mandatory -and -not $_.PresentInRule } $missingTaxonomyNames = @() if ($missingTaxonomy) { $missingTaxonomyNames = @($missingTaxonomy | ForEach-Object { $_.Name }) } $missingRuleNames = @() if ($missingRule) { $missingRuleNames = @($missingRule | ForEach-Object { $_.Name }) } return [pscustomobject]@{ ScriptName = 'sensitive-information-types' Timestamp = Get-Date PolicyName = $TargetPolicyName RuleName = $TargetRuleName Types = $typeStatus MissingInTaxonomy = $missingTaxonomyNames MissingInPolicyRule = $missingRuleNames IsCompliant = ($missingTaxonomyNames.Count -eq 0 -and $missingRuleNames.Count -eq 0) } } function Export-BaselineReport { [CmdletBinding()] param( [Parameter(Mandatory)] $ReportObject ) if (-not $ExportPath) { return } $directory = Split-Path -Path $ExportPath -Parent if ($directory -and -not (Test-Path -Path $directory)) { New-Item -ItemType Directory -Path $directory -Force | Out-Null } $ReportObject | ConvertTo-Json -Depth 6 | Set-Content -Path $ExportPath -Encoding UTF8 Write-Host "Rapport opgeslagen op '$ExportPath'." -ForegroundColor Green } function Invoke-Monitoring { [CmdletBinding()] param() Write-Verbose "Monitoring-modus gestart." $report = Test-SensitiveCoverage Write-Host "Policy : $($report.PolicyName)" -ForegroundColor Gray Write-Host "Regel : $($report.RuleName)" -ForegroundColor Gray Write-Host "Status : $(if ($report.IsCompliant) { 'Compliant' } else { 'Afwijkingen' })" -ForegroundColor Gray foreach ($type in $report.Types) { $state = if ($type.Exists -and $type.IsPublished) { 'OK' } else { 'Ontbreekt' } $ruleState = if ($type.PresentInRule) { 'In regel' } else { 'Niet in regel' } Write-Host (" - {0}: {1}, {2}" -f $type.Name, $state, $ruleState) -ForegroundColor Gray } if (-not $report.IsCompliant) { Write-Host "`n[ALERT] Afwijkingen gevonden." -ForegroundColor Yellow if ($report.MissingInTaxonomy.Count -gt 0) { Write-Host "Ontbrekend in taxonomie : $($report.MissingInTaxonomy -join ', ')" -ForegroundColor Yellow } if ($report.MissingInPolicyRule.Count -gt 0) { Write-Host "Ontbrekend in DLP-regel : $($report.MissingInPolicyRule -join ', ')" -ForegroundColor Yellow } } else { Write-Host "`n[OK] De baseline is volledig toegepast." -ForegroundColor Green } Export-BaselineReport -ReportObject $report return $report } function Invoke-Remediation { [CmdletBinding()] param() $baseline = Get-BaselineSensitiveInformationTypes $rule = Get-DlpBaselineRule -PolicyName $TargetPolicyName -RuleName $TargetRuleName if (-not $rule) { throw "Kan de regel '$TargetRuleName' niet vinden. Maak de regel eerst aan voordat remediatie wordt uitgevoerd." } $existing = @() if ($rule.ContentContainsSensitiveInformation) { foreach ($entry in $rule.ContentContainsSensitiveInformation) { $converted = ConvertTo-RuleEntry -InputObject $entry if ($converted) { $existing += $converted } } } $targetList = @() foreach ($type in $baseline) { $match = $existing | Where-Object { $_.Name -eq $type.Name } if ($match) { $targetList += @{ Name = $match.Name; minCount = $match.minCount } } else { $targetList += @{ Name = $type.Name; minCount = [string]$type.MinCount } Write-Host "Toevoegen van '$($type.Name)' aan de regel." -ForegroundColor Gray } } foreach ($item in $existing) { if (-not ($baseline.Name -contains $item.Name)) { $targetList += @{ Name = $item.Name; minCount = $item.minCount } } } if ($WhatIf) { Write-Host "WhatIf: regel '$TargetRuleName' zou worden bijgewerkt met $($targetList.Count) entries." -ForegroundColor Yellow return } if ($DebugMode) { Write-Host "DebugMode: remediatie wordt niet toegepast, maar de doelconfiguratie is berekend." -ForegroundColor Yellow return } Connect-RequiredServices Set-DlpComplianceRule ` -Identity $rule.Identity ` -ContentContainsSensitiveInformation $targetList ` -ErrorAction Stop Write-Host "Regel '$TargetRuleName' is bijgewerkt." -ForegroundColor Green } function Invoke-Revert { [CmdletBinding()] param() $baseline = Get-BaselineSensitiveInformationTypes $customNames = ($baseline | Where-Object { $_.RequiresCustom }).Name if ($customNames.Count -eq 0) { Write-Host "Er zijn geen custom SIT's om te verwijderen." -ForegroundColor Yellow return } $rule = Get-DlpBaselineRule -PolicyName $TargetPolicyName -RuleName $TargetRuleName if (-not $rule) { Write-Host "De doelregel bestaat niet. Er is niets te verwijderen." -ForegroundColor Yellow return } $existing = @() if ($rule.ContentContainsSensitiveInformation) { foreach ($entry in $rule.ContentContainsSensitiveInformation) { $converted = ConvertTo-RuleEntry -InputObject $entry if ($converted) { $existing += $converted } } } $updatedList = $existing | Where-Object { $customNames -notcontains $_.Name } if ($updatedList.Count -eq $existing.Count) { Write-Host "Er zijn geen custom SIT's gevonden binnen de regel." -ForegroundColor Yellow return } if ($WhatIf) { Write-Host "WhatIf: custom SIT's zouden uit de regel worden verwijderd." -ForegroundColor Yellow return } if ($DebugMode) { Write-Host "DebugMode: revert wordt niet uitgevoerd." -ForegroundColor Yellow return } Connect-RequiredServices Set-DlpComplianceRule ` -Identity $rule.Identity ` -ContentContainsSensitiveInformation $updatedList ` -ErrorAction Stop Write-Host "Custom SIT's verwijderd uit '$TargetRuleName'." -ForegroundColor Green } function Invoke-SensitiveInformationTypeBaseline { [CmdletBinding()] param() return Test-SensitiveCoverage } try { Write-Banner if ($Monitoring) { Invoke-Monitoring | Out-Null } elseif ($Remediation) { Invoke-Remediation } elseif ($Revert) { Invoke-Revert } else { $summary = Invoke-SensitiveInformationTypeBaseline $summary | Format-List Export-BaselineReport -ReportObject $summary } } catch { Write-Error "Er is een fout opgetreden: $($_.Exception.Message)" throw } finally { Disconnect-RequiredServices Write-Host "`n========================================`n" -ForegroundColor Cyan }

Risico zonder implementatie

Risico zonder implementatie
High: Zonder beheerde Sensitive Information Types ontbreekt aantoonbare controle over persoonsgegevens en staatsgevoelige informatie, waardoor toezichthouders corrigerende maatregelen kunnen opleggen en ketenpartners vertrouwen verliezen.

Management Samenvatting

Ontwerp een Nederlandse SIT-taxonomie, automatiseer EDM- en keywordbehoud en gebruik het script om configuratie en rapportage dagelijks te controleren.