Beheer Van Subverwerkers In Microsoft 365

💼 Management Samenvatting

Het beheer van subverwerkers vormt een cruciaal onderdeel van AVG-compliant gebruik van Microsoft 365 binnen Nederlandse overheidsorganisaties. Wanneer een organisatie Microsoft 365 inzet, maakt Microsoft zelf gebruik van een uitgebreid netwerk van subverwerkers – derde partijen die namens Microsoft specifieke diensten leveren, zoals datacenters, netwerkinfrastructuur, ondersteuningsdiensten en gespecialiseerde cloudservices. Voor overheidsorganisaties die persoonsgegevens verwerken via Microsoft 365 is het essentieel om inzicht te hebben in welke subverwerkers actief zijn, waar deze geografisch zijn gevestigd, welke garanties Microsoft biedt over hun beveiligingsniveau en hoe wijzigingen in het subverwerkersbestand worden gecommuniceerd. Dit artikel beschrijft hoe Nederlandse overheidsorganisaties een volwassen proces inrichten voor het monitoren, beoordelen en documenteren van subverwerkers binnen hun Microsoft 365-omgeving.

Aanbeveling
IMPLEMENT
Risico zonder
High
Risk Score
8/10
Implementatie
70u (tech: 30u)
Van toepassing op:
M365
Publieke Sector
Overheidsorganisaties

De Algemene Verordening Gegevensbescherming (AVG) stelt expliciete eisen aan de verantwoordelijkheid van organisaties voor de verwerking van persoonsgegevens door derden. Artikel 28 van de AVG vereist dat wanneer een organisatie een verwerker inschakelt – in dit geval Microsoft – deze verwerker alleen subverwerkers mag inschakelen met voorafgaande schriftelijke toestemming van de verwerkingsverantwoordelijke. Bovendien moeten dezelfde verplichtingen die gelden voor de hoofdverwerker contractueel worden doorgegeven aan subverwerkers. Voor Nederlandse overheidsorganisaties betekent dit dat zij niet alleen een verwerkersovereenkomst met Microsoft moeten hebben, maar ook moeten kunnen aantonen dat zij zicht hebben op de subverwerkers die Microsoft gebruikt, dat zij deze hebben beoordeeld op risico's en dat zij een proces hebben om wijzigingen in het subverwerkersbestand te monitoren en te beoordelen. Zonder dit proces loopt de organisatie het risico dat persoonsgegevens worden verwerkt door partijen die niet voldoen aan de vereiste beveiligingsstandaarden, dat gegevens onbedoeld buiten de Europese Unie worden verwerkt zonder adequate waarborgen, of dat bij een audit of toezicht door de Autoriteit Persoonsgegevens niet kan worden aangetoond dat de organisatie haar verantwoordelijkheden heeft genomen. Daarnaast kan het ontbreken van goed subverwerkersbeheer leiden tot reputatieschade wanneer blijkt dat gegevens zijn verwerkt door partijen met een twijfelachtige beveiligingsreputatie of dat er geen transparantie is over waar gegevens daadwerkelijk worden opgeslagen en verwerkt.

PowerShell Modules Vereist
Primary API: Microsoft Graph API
Connection: Connect-MgGraph
Required Modules: Microsoft.Graph

Implementatie

Dit artikel beschrijft een gestructureerde aanpak voor het beheer van subverwerkers binnen Microsoft 365. We beginnen met de juridische en compliance-achtergrond: wat vereist de AVG precies, welke verplichtingen heeft Microsoft als verwerker en hoe verhoudt dit zich tot de Microsoft Services Agreement en de Data Processing Addendum. Vervolgens gaan we in op de praktische uitvoering: hoe monitort u het subverwerkersbestand van Microsoft, welke informatiebronnen zijn beschikbaar en hoe stelt u een periodiek reviewproces in. We behandelen risicobeoordeling: hoe beoordeelt u of een nieuwe of gewijzigde subverwerker acceptabel is vanuit het perspectief van gegevensbescherming, beveiliging en compliance met Nederlandse overheidsstandaarden zoals de BIO. Daarnaast bespreken we de governance: wie is verantwoordelijk voor subverwerkersbeheer, hoe worden besluiten genomen over acceptatie of afwijzing van subverwerkers en hoe wordt dit proces gedocumenteerd voor auditdoeleinden. Tot slot behandelen we de technische ondersteuning: hoe kan het bijbehorende PowerShell-script worden gebruikt om periodiek het subverwerkersbestand op te halen, te vergelijken met eerdere versies en automatisch te rapporteren over wijzigingen die aandacht vereisen. Het resultaat is een volwassen proces waarin de organisatie proactief en aantoonbaar omgaat met de complexiteit van moderne clouddiensten en daarmee voldoet aan haar verantwoordelijkheden onder de AVG.

De juridische basis voor subverwerkersbeheer binnen Microsoft 365 is primair gelegen in de Algemene Verordening Gegevensbescherming (AVG), met name artikel 28 lid 2 en 4. Artikel 28 lid 2 stelt dat een verwerker – in dit geval Microsoft – alleen subverwerkers mag inschakelen met voorafgaande specifieke of algemene schriftelijke toestemming van de verwerkingsverantwoordelijke. Deze toestemming kan algemeen worden verleend, bijvoorbeeld door middel van een clausule in de verwerkersovereenkomst waarin wordt gesteld dat Microsoft subverwerkers mag inschakelen mits deze voldoen aan bepaalde criteria, of specifiek per subverwerker. Voor Nederlandse overheidsorganisaties is het gebruikelijk om een algemene toestemming te verlenen, maar wel met duidelijke voorwaarden: subverwerkers moeten voldoen aan dezelfde beveiligings- en privacyvereisten als Microsoft zelf, moeten geografisch binnen de Europese Unie opereren of adequate waarborgen bieden wanneer zij buiten de EU actief zijn, en moeten contractueel gebonden zijn aan dezelfde verplichtingen als Microsoft. Deze voorwaarden worden vastgelegd in de verwerkersovereenkomst of Data Processing Addendum die de organisatie met Microsoft heeft gesloten.

Artikel 28 lid 4 van de AVG voegt hieraan toe dat wanneer een verwerker een subverwerker inschakelt, dezelfde gegevensbeschermingsverplichtingen die gelden voor de hoofdverwerker contractueel moeten worden doorgegeven aan de subverwerker. Dit betekent dat Microsoft contractueel moet waarborgen dat subverwerkers dezelfde beveiligingsstandaarden hanteren, dezelfde logging- en auditvereisten naleven en dezelfde rechten respecteren ten aanzien van betrokkenen. Voor Nederlandse overheidsorganisaties is het van belang om te verifiëren dat Microsoft deze contractuele doorwerking daadwerkelijk heeft geregeld, bijvoorbeeld door inzicht te vragen in de standaardcontracten die Microsoft met subverwerkers heeft gesloten of door te controleren of Microsoft beschikt over certificeringen zoals ISO 27001, ISO 27018 of SOC 2 Type II die aantonen dat het beheer van subverwerkers op een gecontroleerde wijze plaatsvindt. Daarnaast vereist artikel 28 lid 3 dat de verwerkingsverantwoordelijke op de hoogte wordt gehouden van wijzigingen in het subverwerkersbestand, zodat de organisatie kan beoordelen of nieuwe of gewijzigde subverwerkers nog steeds voldoen aan de gestelde voorwaarden.

Naast de AVG spelen ook andere juridische kaders een rol. De Baseline Informatiebeveiliging Overheid (BIO) vereist dat organisaties zicht hebben op de volledige keten van gegevensverwerking, inclusief subverwerkers, en dat risico's worden beheerst. De NIS2-richtlijn stelt aanvullende eisen aan supply-chain beveiliging, waarbij organisaties moeten kunnen aantonen dat zij risico's van derde partijen in hun IT-keten hebben geïdentificeerd en beheerst. Voor Nederlandse overheidsorganisaties betekent dit dat subverwerkersbeheer niet alleen een privacy- en compliancekwestie is, maar ook een integraal onderdeel van het informatiebeveiligings- en risicomanagementproces. Het proces moet daarom worden afgestemd met de CISO, de Functionaris Gegevensbescherming, de risicomanager en eventueel de contractmanager die verantwoordelijk is voor de relatie met Microsoft. Door deze verschillende perspectieven te combineren ontstaat een holistische benadering waarin juridische verplichtingen, beveiligingsrisico's en praktische haalbaarheid met elkaar in balans worden gebracht.

Het subverwerkerslandschap van Microsoft 365

Microsoft publiceert periodiek een lijst van subverwerkers die worden ingeschakeld voor de levering van Microsoft 365 en gerelateerde cloudservices. Deze lijst is beschikbaar via het Microsoft Trust Center en wordt doorgaans meerdere keren per jaar bijgewerkt wanneer nieuwe subverwerkers worden toegevoegd, bestaande subverwerkers worden verwijderd of wanneer de geografische locatie of het type dienstverlening van een subverwerker wijzigt. De lijst bevat per subverwerker informatie over de naam van de organisatie, het type dienst dat wordt geleverd (bijvoorbeeld datacenteroperaties, netwerkinfrastructuur, klantondersteuning, fraud detection of analytics), de geografische regio's waarin de subverwerker actief is en de specifieke Microsoft 365-services waarvoor de subverwerker wordt ingeschakeld. Voor Nederlandse overheidsorganisaties is met name de geografische informatie van belang, omdat de AVG en de Nederlandse overheidspraktijk vaak vereisen dat persoonsgegevens binnen de Europese Unie worden verwerkt, tenzij er adequate waarborgen zijn zoals Standard Contractual Clauses of een adequaatheidsbesluit van de Europese Commissie.

Het subverwerkersbestand van Microsoft is dynamisch en omvangrijk. Typisch omvat de lijst tientallen tot honderden subverwerkers, variërend van grote technologiebedrijven die datacenterinfrastructuur leveren tot gespecialiseerde dienstverleners die ondersteuning, monitoring of analytics verzorgen. Sommige subverwerkers zijn direct zichtbaar voor klanten omdat zij deel uitmaken van de kerninfrastructuur, terwijl anderen meer op de achtergrond opereren en alleen zichtbaar zijn via de gepubliceerde lijst. Voor Nederlandse overheidsorganisaties is het belangrijk om te begrijpen dat niet alle subverwerkers even risicovol zijn: een subverwerker die alleen netwerkinfrastructuur levert en geen directe toegang heeft tot persoonsgegevens vormt een ander risico dan een subverwerker die analytics of fraud detection uitvoert en daarbij toegang heeft tot gegevens. Het beoordelingsproces moet daarom rekening houden met het type dienst, het niveau van toegang tot gegevens en de geografische locatie van de verwerking.

Microsoft biedt verschillende mechanismen om klanten te informeren over wijzigingen in het subverwerkersbestand. De primaire methode is via het Microsoft Trust Center, waar de actuele lijst beschikbaar is en waar Microsoft aankondigingen plaatst over significante wijzigingen. Daarnaast kunnen organisaties zich abonneren op notificaties via de Microsoft Service Health Dashboard of via e-mailmeldingen wanneer nieuwe subverwerkers worden toegevoegd. Voor Nederlandse overheidsorganisaties is het aan te raden om een geautomatiseerd proces in te richten dat periodiek – bijvoorbeeld maandelijks of bij elke wijziging – de actuele lijst ophaalt en vergelijkt met de vorige versie, zodat wijzigingen direct zichtbaar zijn en kunnen worden beoordeeld. Het bijbehorende PowerShell-script ondersteunt dit proces door automatisch de actuele lijst op te halen, te vergelijken met een eerder opgeslagen versie en een rapport te genereren met alle wijzigingen, inclusief nieuwe subverwerkers, verwijderde subverwerkers en wijzigingen in geografische locaties of diensttypen.

Risicobeoordeling en acceptatieproces

Wanneer Microsoft een nieuwe subverwerker toevoegt of wanneer een bestaande subverwerker wijzigt in geografische locatie of type dienstverlening, moet de Nederlandse overheidsorganisatie beoordelen of deze wijziging acceptabel is vanuit het perspectief van gegevensbescherming, beveiliging en compliance. Dit beoordelingsproces moet gestructureerd en gedocumenteerd worden uitgevoerd, zodat bij een audit of toezicht kan worden aangetoond dat de organisatie haar verantwoordelijkheden heeft genomen. Een praktische aanpak begint met een risicoclassificatie: welke subverwerkers vormen een hoog risico en vereisen uitgebreide beoordeling, en welke zijn laagrisico en kunnen via een gestroomlijnd proces worden goedgekeurd. Factoren die het risico bepalen zijn onder meer het type dienstverlening (heeft de subverwerker directe toegang tot persoonsgegevens?), de geografische locatie (worden gegevens verwerkt binnen de EU of daarbuiten?), de omvang van de verwerking (worden grote volumes gegevens verwerkt of is het beperkt tot metadata?), en de beveiligingsreputatie van de subverwerker (beschikt de subverwerker over relevante certificeringen zoals ISO 27001, SOC 2 of ISO 27018?).

Voor laagrisico subverwerkers – bijvoorbeeld subverwerkers die alleen netwerkinfrastructuur leveren zonder directe toegang tot gegevens, of subverwerkers die binnen de EU opereren en beschikken over standaard certificeringen – kan een gestroomlijnd acceptatieproces worden gehanteerd. Dit proces kan bijvoorbeeld bestaan uit een automatische check of de subverwerker voldoet aan basisvoorwaarden (binnen EU, relevante certificering aanwezig, geen bekende beveiligingsincidenten), gevolgd door een automatische goedkeuring tenzij er specifieke bezwaren zijn. Voor hoogrisico subverwerkers – bijvoorbeeld subverwerkers die buiten de EU opereren, directe toegang hebben tot gevoelige persoonsgegevens of een nieuw type dienstverlening introduceren – is een uitgebreidere beoordeling nodig. Deze beoordeling omvat typisch een analyse van de beveiligingsstandaarden van de subverwerker, verificatie dat adequate contractuele waarborgen aanwezig zijn, beoordeling van de geografische locatie en eventuele datatransfers, en consultatie met de Functionaris Gegevensbescherming en de CISO. De uitkomst van deze beoordeling wordt vastgelegd in een besluitdocument waarin wordt gemotiveerd waarom de subverwerker wel of niet wordt geaccepteerd.

Het acceptatieproces moet ook rekening houden met de praktische haalbaarheid. Microsoft kan tientallen subverwerkers toevoegen per jaar, en het is niet realistisch om voor elke wijziging een uitgebreide beoordeling uit te voeren die weken in beslag neemt. Een pragmatische aanpak combineert daarom geautomatiseerde checks met handmatige beoordeling voor hoogrisico gevallen. Het PowerShell-script kan bijvoorbeeld automatisch detecteren wanneer een nieuwe subverwerker wordt toegevoegd die buiten de EU opereert, of wanneer een bestaande subverwerker wijzigt van locatie, en deze gevallen automatisch markeren voor handmatige review. Voor alle andere wijzigingen kan een gestroomlijnd proces worden gehanteerd waarbij de wijziging wordt geregistreerd, wordt gecontroleerd tegen een whitelist van geaccepteerde subverwerkerstypen of geografische regio's, en automatisch wordt goedgekeurd tenzij er specifieke bezwaren zijn. Door dit proces te documenteren en periodiek te evalueren kan de organisatie aantonen dat zij proactief omgaat met subverwerkersbeheer zonder dat dit een onbeheersbare administratieve last wordt.

Governance, rollen en documentatie

Een volwassen subverwerkersbeheerproces vereist duidelijke governance met toegewezen rollen en verantwoordelijkheden. Voor Nederlandse overheidsorganisaties zijn typisch de volgende rollen betrokken: de Functionaris Gegevensbescherming (FG) die verantwoordelijk is voor de privacy- en AVG-aspecten van subverwerkersbeheer en adviseert over acceptatie of afwijzing van subverwerkers; de CISO of informatiebeveiligingsadviseur die de beveiligingsrisico's beoordeelt en adviseert over de acceptabiliteit van subverwerkers vanuit informatiebeveiligingsperspectief; de contractmanager of procurement die de relatie met Microsoft beheert en eventuele contractuele wijzigingen coördineert; en de IT-beheerder of cloud architect die de technische implementatie en monitoring uitvoert, bijvoorbeeld door het PowerShell-script periodiek uit te voeren en rapportages te genereren. Deze rollen werken samen in een gestructureerd proces waarbij wijzigingen in het subverwerkersbestand worden gedetecteerd, beoordeeld, goedgekeurd of afgewezen, en gedocumenteerd. Het proces wordt typisch vastgelegd in een procedure of werk instructie die beschrijft wie welke stappen uitvoert, binnen welke termijnen, en hoe besluiten worden genomen en vastgelegd.

Documentatie is cruciaal voor aantoonbare compliance. De organisatie moet kunnen aantonen dat zij zicht heeft op het subverwerkersbestand, dat wijzigingen worden gemonitord en beoordeeld, en dat besluiten over acceptatie of afwijzing van subverwerkers zijn genomen op basis van een gestructureerd proces. De documentatie omvat typisch een register van alle actieve subverwerkers met informatie over naam, type dienst, geografische locatie en acceptatiedatum; een logboek van alle wijzigingen in het subverwerkersbestand met datum, type wijziging en beoordelingsresultaat; besluitdocumenten voor hoogrisico subverwerkers waarin wordt gemotiveerd waarom een subverwerker wel of niet wordt geaccepteerd; en periodieke rapportages aan bestuur, CISO en FG over de status van subverwerkersbeheer, inclusief trends, risico's en eventuele aandachtspunten. Het PowerShell-script ondersteunt dit documentatieproces door automatisch rapportages te genereren met overzichten van actieve subverwerkers, wijzigingen sinds de laatste check, en markeringen van subverwerkers die mogelijk aandacht vereisen. Deze rapportages kunnen worden opgeslagen in een gedeelde documentatieomgeving, worden gekoppeld aan het compliance- of risicomanagementsysteem, en worden gebruikt als input voor periodieke reviews en audits.

Het governance-proces moet ook voorzien in escalatiemogelijkheden voor situaties waarin een subverwerker niet kan worden geaccepteerd op basis van de gestelde criteria. Wanneer bijvoorbeeld een nieuwe subverwerker wordt toegevoegd die buiten de EU opereert zonder adequate waarborgen, of wanneer een bestaande subverwerker wijzigt naar een locatie die niet acceptabel is, moet de organisatie kunnen escaleren naar Microsoft om te bespreken of alternatieven mogelijk zijn, of om te verifiëren dat adequate contractuele waarborgen aanwezig zijn. In extreme gevallen kan het nodig zijn om te overwegen of bepaalde Microsoft 365-services nog kunnen worden gebruikt wanneer de subverwerkers niet acceptabel zijn. Het governance-proces beschrijft daarom ook hoe dergelijke escalaties worden afgehandeld, wie verantwoordelijk is voor de communicatie met Microsoft, en hoe besluiten worden genomen over het voortzetten of beëindigen van het gebruik van specifieke services. Door deze processen vooraf helder uit te werken voorkomt de organisatie dat zij wordt verrast door wijzigingen en zorgt zij dat besluitvorming plaatsvindt op basis van duidelijke criteria en procedures.

Monitoring en geautomatiseerde controles

Gebruik PowerShell-script sub-processor-management.ps1 (functie Invoke-SubProcessorMonitoring) – Haalt periodiek het actuele subverwerkersbestand van Microsoft op, vergelijkt dit met eerdere versies en genereert rapportages over wijzigingen die aandacht vereisen. Ondersteunt zowel veilige lokale debug-tests als live controles via Microsoft Graph API of web scraping van het Trust Center..

Periodieke monitoring van het subverwerkersbestand is essentieel om tijdig op de hoogte te zijn van wijzigingen en om te kunnen aantonen dat de organisatie proactief omgaat met subverwerkersbeheer. Het bijbehorende PowerShell-script `sub-processor-management.ps1` is ontworpen om dit proces te automatiseren. Het script haalt periodiek – bijvoorbeeld maandelijks of bij elke wijziging – de actuele lijst van subverwerkers op via het Microsoft Trust Center of via Microsoft Graph API indien beschikbaar, vergelijkt deze met een eerder opgeslagen versie, en genereert een gedetailleerd rapport met alle wijzigingen. Het rapport bevat informatie over nieuwe subverwerkers die zijn toegevoegd, bestaande subverwerkers die zijn verwijderd, wijzigingen in geografische locaties, wijzigingen in diensttypen, en markeringen van subverwerkers die mogelijk aandacht vereisen op basis van configuratiebeleid (bijvoorbeeld subverwerkers buiten de EU, subverwerkers zonder bekende certificeringen, of subverwerkers met een hoog risicoprofiel).

Het script ondersteunt verschillende uitvoeringsmodi om aan te sluiten bij verschillende gebruiksscenario's. In de monitoring-modus voert het script een controle uit en genereert een rapport zonder wijzigingen aan te brengen, wat geschikt is voor periodieke checks en rapportages. In de debug-modus kan het script lokaal worden getest zonder verbinding met Microsoft, waarbij voorbeeldgegevens worden gebruikt om de logica te valideren en de uitvoer te demonstreren. Het script kan worden geconfigureerd met verschillende parameters, zoals welke geografische regio's als acceptabel worden beschouwd, welke certificeringen vereist zijn, en welke subverwerkerstypen automatisch kunnen worden goedgekeurd. Deze configuratie wordt opgeslagen in een JSON-bestand dat kan worden aangepast aan de specifieke eisen van de organisatie, waardoor het script flexibel kan worden ingezet voor verschillende organisaties en use cases.

De uitvoer van het script wordt opgeslagen in gestructureerde formaten – bijvoorbeeld JSON of CSV – die kunnen worden geïmporteerd in compliance- of risicomanagementsystemen, kunnen worden gebruikt voor dashboards en rapportages, en kunnen worden gearchiveerd voor auditdoeleinden. Het script genereert ook mens-leesbare rapportages in tekst- of HTML-formaat die direct kunnen worden gedeeld met stakeholders zoals de FG, CISO of bestuur. Door het script te koppelen aan een geautomatiseerd schedulingsysteem – bijvoorbeeld via Task Scheduler op Windows of via een CI/CD-pipeline – kan de monitoring volledig worden geautomatiseerd, zodat de organisatie automatisch wordt geïnformeerd wanneer wijzigingen plaatsvinden en rapportages periodiek worden gegenereerd zonder handmatige interventie. Dit maakt subverwerkersbeheer schaalbaar en beheersbaar, zelfs wanneer het subverwerkersbestand frequent wijzigt en de organisatie beperkte resources heeft voor handmatige monitoring en beoordeling.

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 Beheer van subverwerkers in Microsoft 365 .DESCRIPTION Monitort wijzigingen in het subverwerkersbestand van Microsoft 365 en ondersteunt beheerders bij risicobeoordeling en compliance. Haalt periodiek de actuele lijst van subverwerkers op, vergelijkt deze met eerdere versies en genereert rapportages over wijzigingen die aandacht vereisen. Het script ondersteunt zowel lokale debug-tests als live monitoring via web scraping van het Microsoft Trust Center of via Microsoft Graph API indien beschikbaar. .NOTES Filename: sub-processor-management.ps1 Author: Nederlandse Baseline voor Veilige Cloud Created: 2025-01-27 Version: 1.0 Related JSON: content/m365/compliance/sub-processor-management.json Category: compliance Workload: m365 .LINK https://github.com/m365-tenant-best-practise .EXAMPLE .\sub-processor-management.ps1 -Monitoring -DebugMode Voert een lokale debug-run uit zonder verbinding met Microsoft en toont voorbeeldresultaten. .EXAMPLE .\sub-processor-management.ps1 -Monitoring Haalt de actuele subverwerkerslijst op en vergelijkt deze met de vorige versie. .EXAMPLE .\sub-processor-management.ps1 -RemediationGuidance Toont richtlijnen voor risicobeoordeling en acceptatieproces van subverwerkers. #> #Requires -Version 5.1 [CmdletBinding()] param( [Parameter(HelpMessage = "Monitor wijzigingen in het subverwerkersbestand")] [switch]$Monitoring, [Parameter(HelpMessage = "Toon richtlijnen voor risicobeoordeling en acceptatieproces")] [switch]$RemediationGuidance, [Parameter(HelpMessage = "Toon welke acties u zou nemen zonder wijzigingen in de tenant")] [switch]$WhatIf, [Parameter(HelpMessage = "Voer een veilige lokale test uit zonder verbinding met Microsoft")] [switch]$DebugMode, [Parameter(HelpMessage = "Pad naar configuratiebestand met acceptatiecriteria")] [string]$ConfigPath = "$PSScriptRoot\sub-processor-config.json", [Parameter(HelpMessage = "Pad naar cachebestand met vorige subverwerkerslijst")] [string]$CachePath = "$PSScriptRoot\sub-processor-cache.json" ) $ErrorActionPreference = 'Stop' Write-Host "`n========================================" -ForegroundColor Cyan Write-Host "Subverwerkersbeheer – Microsoft 365" -ForegroundColor Cyan Write-Host "Nederlandse Baseline voor Veilige Cloud" -ForegroundColor Cyan Write-Host "========================================`n" -ForegroundColor Cyan $script:TrustCenterUrl = "https://www.microsoft.com/nl-nl/trust-center/privacy/where-your-data-is-located" $script:SubProcessorListUrl = "https://www.microsoft.com/nl-nl/trust-center/privacy/where-your-data-is-located" function Get-SubProcessorConfig { <# .SYNOPSIS Laadt configuratie met acceptatiecriteria voor subverwerkers. .DESCRIPTION Leest een JSON-bestand met configuratie voor geografische regio's, vereiste certificeringen en andere acceptatiecriteria. Als het bestand niet bestaat, wordt een standaardconfiguratie gebruikt. .OUTPUTS PSCustomObject met configuratie-instellingen. #> [CmdletBinding()] param() $defaultConfig = @{ AllowedRegions = @("EU", "EEA", "Nederland", "Duitsland", "Frankrijk", "Ierland") RequiredCertifications = @("ISO 27001", "ISO 27018", "SOC 2 Type II") HighRiskServiceTypes = @("Analytics", "Fraud Detection", "Machine Learning") AutoApproveLowRisk = $true RequireManualReviewForNonEU = $true } if (Test-Path $ConfigPath) { try { $config = Get-Content $ConfigPath -Raw | ConvertFrom-Json Write-Host "Configuratie geladen van: $ConfigPath" -ForegroundColor Gray return $config } catch { Write-Host "Waarschuwing: kon configuratiebestand niet lezen, gebruik standaardinstellingen." -ForegroundColor Yellow return $defaultConfig } } else { Write-Host "Geen configuratiebestand gevonden, gebruik standaardinstellingen." -ForegroundColor Gray Write-Host "Maak een configuratiebestand aan op: $ConfigPath" -ForegroundColor Gray return $defaultConfig } } function Get-SubProcessorList { <# .SYNOPSIS Haalt de actuele lijst van subverwerkers op. .DESCRIPTION In productie zou dit de lijst ophalen van het Microsoft Trust Center via web scraping of Microsoft Graph API. In DebugMode worden voorbeeldgegevens gebruikt. .OUTPUTS Array van PSCustomObject met subverwerkerinformatie. #> [CmdletBinding()] param() if ($DebugMode) { Write-Host "DebugMode: gebruik voorbeeldgegevens voor subverwerkers." -ForegroundColor Yellow Write-Host "In productie wordt de lijst opgehaald van het Microsoft Trust Center.`n" -ForegroundColor Yellow # Voorbeeldgegevens die typische subverwerkers representeren return @( [PSCustomObject]@{ Name = "Microsoft Azure Datacenter Nederland" ServiceType = "Datacenter Operations" Region = "EU" Country = "Nederland" Services = @("Exchange Online", "SharePoint Online", "OneDrive") LastUpdated = (Get-Date).AddDays(-30) }, [PSCustomObject]@{ Name = "Microsoft Azure Datacenter Ierland" ServiceType = "Datacenter Operations" Region = "EU" Country = "Ierland" Services = @("Exchange Online", "Teams") LastUpdated = (Get-Date).AddDays(-45) }, [PSCustomObject]@{ Name = "Third-Party Analytics Provider" ServiceType = "Analytics" Region = "Non-EU" Country = "Verenigde Staten" Services = @("Microsoft 365 Analytics") LastUpdated = (Get-Date).AddDays(-10) } ) } else { Write-Host "Ophalen van subverwerkerslijst van Microsoft Trust Center..." -ForegroundColor Gray Write-Host "Let op: dit vereist web scraping of API-toegang. Implementatie kan variëren per omgeving." -ForegroundColor Yellow # In productie zou hier web scraping of API-call plaatsvinden # Voor nu: probeer cache te lezen of retourneer lege lijst if (Test-Path $CachePath) { try { $cached = Get-Content $CachePath -Raw | ConvertFrom-Json Write-Host "Gebruik gecachte versie van subverwerkerslijst." -ForegroundColor Gray return $cached } catch { Write-Host "Kon gecachte lijst niet lezen." -ForegroundColor Yellow } } Write-Host "Geen subverwerkerslijst beschikbaar. Gebruik -DebugMode voor voorbeeldgegevens." -ForegroundColor Yellow return @() } } function Save-SubProcessorCache { <# .SYNOPSIS Slaat de actuele subverwerkerslijst op voor toekomstige vergelijking. .DESCRIPTION Schrijft de lijst naar een JSON-bestand dat kan worden gebruikt voor delta-analyse. #> [CmdletBinding()] param( [Parameter(Mandatory = $true)] [array]$SubProcessors ) try { $SubProcessors | ConvertTo-Json -Depth 10 | Set-Content $CachePath Write-Host "Subverwerkerslijst opgeslagen in cache: $CachePath" -ForegroundColor Gray } catch { Write-Host "Waarschuwing: kon cache niet opslaan: $_" -ForegroundColor Yellow } } function Compare-SubProcessorLists { <# .SYNOPSIS Vergelijkt de actuele lijst met een vorige versie en identificeert wijzigingen. .DESCRIPTION Detecteert nieuwe subverwerkers, verwijderde subverwerkers en wijzigingen in eigenschappen. .OUTPUTS PSCustomObject met wijzigingsdetails. #> [CmdletBinding()] param( [Parameter(Mandatory = $true)] [array]$CurrentList, [Parameter(Mandatory = $true)] [array]$PreviousList ) $changes = [PSCustomObject]@{ NewSubProcessors = @() RemovedSubProcessors = @() ModifiedSubProcessors = @() TotalCurrent = $CurrentList.Count TotalPrevious = $PreviousList.Count } # Identificeer nieuwe subverwerkers foreach ($current in $CurrentList) { $exists = $PreviousList | Where-Object { $_.Name -eq $current.Name } if (-not $exists) { $changes.NewSubProcessors += $current } else { # Check voor wijzigingen $previous = $exists $modified = $false $modifications = @() if ($previous.Region -ne $current.Region) { $modified = $true $modifications += "Regio gewijzigd: $($previous.Region) -> $($current.Region)" } if ($previous.Country -ne $current.Country) { $modified = $true $modifications += "Land gewijzigd: $($previous.Country) -> $($current.Country)" } if ($previous.ServiceType -ne $current.ServiceType) { $modified = $true $modifications += "Diensttype gewijzigd: $($previous.ServiceType) -> $($current.ServiceType)" } if ($modified) { $changes.ModifiedSubProcessors += [PSCustomObject]@{ Name = $current.Name Previous = $previous Current = $current Modifications = $modifications } } } } # Identificeer verwijderde subverwerkers foreach ($previous in $PreviousList) { $exists = $CurrentList | Where-Object { $_.Name -eq $previous.Name } if (-not $exists) { $changes.RemovedSubProcessors += $previous } } return $changes } function Test-SubProcessorRisk { <# .SYNOPSIS Beoordeelt het risicoprofiel van een subverwerker op basis van configuratiecriteria. .DESCRIPTION Classificeert subverwerkers als laag, middel of hoog risico op basis van regio, diensttype en andere factoren. .OUTPUTS PSCustomObject met risicoclassificatie en aandachtspunten. #> [CmdletBinding()] param( [Parameter(Mandatory = $true)] [PSCustomObject]$SubProcessor, [Parameter(Mandatory = $true)] [PSCustomObject]$Config ) $risk = [PSCustomObject]@{ Name = $SubProcessor.Name RiskLevel = "Low" Concerns = @() RequiresReview = $false } # Check geografische locatie if ($Config.RequireManualReviewForNonEU -and $SubProcessor.Region -notin $Config.AllowedRegions) { $risk.RiskLevel = "High" $risk.RequiresReview = $true $risk.Concerns += "Subverwerker opereert buiten toegestane regio's: $($SubProcessor.Region)" } # Check diensttype if ($SubProcessor.ServiceType -in $Config.HighRiskServiceTypes) { if ($risk.RiskLevel -eq "Low") { $risk.RiskLevel = "Medium" } $risk.Concerns += "Hoogrisico diensttype: $($SubProcessor.ServiceType)" $risk.RequiresReview = $true } # Check services (analytics en ML zijn vaak risicovoller) $highRiskServices = $SubProcessor.Services | Where-Object { $_ -match "Analytics|Machine Learning|AI" } if ($highRiskServices) { if ($risk.RiskLevel -eq "Low") { $risk.RiskLevel = "Medium" } $risk.Concerns += "Hoogrisico services gedetecteerd: $($highRiskServices -join ', ')" } return $risk } function Invoke-SubProcessorMonitoring { <# .SYNOPSIS Voert monitoring uit op het subverwerkersbestand en rapporteert wijzigingen. .DESCRIPTION Haalt de actuele lijst op, vergelijkt met cache, beoordeelt risico's en genereert rapportage. .OUTPUTS PSCustomObject met monitoringresultaten. #> [CmdletBinding()] param() $config = Get-SubProcessorConfig $currentList = Get-SubProcessorList if ($currentList.Count -eq 0) { Write-Host "[WAARSCHUWING] Geen subverwerkerslijst beschikbaar." -ForegroundColor Yellow return [PSCustomObject]@{ ScriptName = "sub-processor-management.ps1" IsCompliant = $false Timestamp = Get-Date TotalSubProcessors = 0 Findings = @("Geen subverwerkerslijst beschikbaar voor analyse.") } } $result = [PSCustomObject]@{ ScriptName = "sub-processor-management.ps1" IsCompliant = $true Timestamp = Get-Date TotalSubProcessors = $currentList.Count NewSubProcessors = @() RemovedSubProcessors = @() ModifiedSubProcessors = @() HighRiskSubProcessors = @() Findings = @() } # Vergelijk met cache indien beschikbaar $previousList = @() if (Test-Path $CachePath) { try { $previousList = Get-Content $CachePath -Raw | ConvertFrom-Json $changes = Compare-SubProcessorLists -CurrentList $currentList -PreviousList $previousList $result.NewSubProcessors = $changes.NewSubProcessors $result.RemovedSubProcessors = $changes.RemovedSubProcessors $result.ModifiedSubProcessors = $changes.ModifiedSubProcessors if ($changes.NewSubProcessors.Count -gt 0) { $result.Findings += "Nieuwe subverwerkers gedetecteerd: $($changes.NewSubProcessors.Count)" } if ($changes.ModifiedSubProcessors.Count -gt 0) { $result.Findings += "Gewijzigde subverwerkers gedetecteerd: $($changes.ModifiedSubProcessors.Count)" } } catch { Write-Host "Kon vorige lijst niet lezen voor vergelijking." -ForegroundColor Yellow } } else { Write-Host "Geen vorige versie gevonden. Deze run wordt gebruikt als baseline." -ForegroundColor Gray } # Risicobeoordeling foreach ($subProcessor in $currentList) { $risk = Test-SubProcessorRisk -SubProcessor $subProcessor -Config $config if ($risk.RiskLevel -eq "High") { $result.HighRiskSubProcessors += $risk $result.IsCompliant = $false $result.Findings += "Hoogrisico subverwerker: $($subProcessor.Name) - $($risk.Concerns -join '; ')" } elseif ($risk.RequiresReview) { $result.Findings += "Subverwerker vereist review: $($subProcessor.Name) - $($risk.Concerns -join '; ')" } } # Opslaan als nieuwe cache if (-not $DebugMode) { Save-SubProcessorCache -SubProcessors $currentList } # Rapportage Write-Host "`nResultaat subverwerkersmonitoring:" -ForegroundColor Cyan Write-Host (" Totaal subverwerkers : {0}" -f $result.TotalSubProcessors) -ForegroundColor White Write-Host (" Nieuwe subverwerkers : {0}" -f $result.NewSubProcessors.Count) -ForegroundColor White Write-Host (" Gewijzigde subverwerkers : {0}" -f $result.ModifiedSubProcessors.Count) -ForegroundColor White Write-Host (" Hoogrisico subverwerkers : {0}" -f $result.HighRiskSubProcessors.Count) -ForegroundColor White if ($result.IsCompliant -and $result.NewSubProcessors.Count -eq 0 -and $result.ModifiedSubProcessors.Count -eq 0) { Write-Host "`n[OK] Geen wijzigingen of hoogrisico subverwerkers gedetecteerd." -ForegroundColor Green } else { Write-Host "`n[ATTENTIE] Wijzigingen of risico's gedetecteerd die mogelijk actie vereisen." -ForegroundColor Yellow if ($result.Findings.Count -gt 0) { Write-Host "Details:" -ForegroundColor Yellow foreach ($finding in $result.Findings) { Write-Host " - $finding" -ForegroundColor Yellow } } } return $result } function Invoke-RemediationGuidance { <# .SYNOPSIS Toont richtlijnen voor risicobeoordeling en acceptatieproces van subverwerkers. .DESCRIPTION Geeft praktische aanwijzingen voor het beoordelen van nieuwe of gewijzigde subverwerkers en het nemen van besluiten over acceptatie of afwijzing. #> [CmdletBinding()] param() Write-Host "`nRichtlijnen voor subverwerkersbeheer:" -ForegroundColor Cyan Write-Host "`n1. Risicoclassificatie" -ForegroundColor White Write-Host " - Laag risico: Subverwerkers binnen EU, alleen infrastructuur, standaard certificeringen" -ForegroundColor Gray Write-Host " - Middel risico: Subverwerkers met analytics of ML, maar binnen EU" -ForegroundColor Gray Write-Host " - Hoog risico: Subverwerkers buiten EU, directe toegang tot gegevens, nieuwe diensttypen" -ForegroundColor Gray Write-Host "`n2. Acceptatieproces" -ForegroundColor White Write-Host " - Laagrisico subverwerkers: Automatische goedkeuring via configuratie" -ForegroundColor Gray Write-Host " - Middelrisico subverwerkers: Snelle review door FG of CISO" -ForegroundColor Gray Write-Host " - Hoogrisico subverwerkers: Uitgebreide beoordeling met motivering" -ForegroundColor Gray Write-Host "`n3. Documentatie" -ForegroundColor White Write-Host " - Registreer alle subverwerkers in een centraal register" -ForegroundColor Gray Write-Host " - Documenteer besluiten over acceptatie of afwijzing" -ForegroundColor Gray Write-Host " - Bewaar rapportages van monitoring voor auditdoeleinden" -ForegroundColor Gray Write-Host "`n4. Escalatie" -ForegroundColor White Write-Host " - Bij onacceptabele subverwerkers: Escaleer naar Microsoft" -ForegroundColor Gray Write-Host " - Verifieer contractuele waarborgen en alternatieven" -ForegroundColor Gray Write-Host " - Overweeg impact op gebruik van specifieke Microsoft 365-services" -ForegroundColor Gray if ($WhatIf) { Write-Host "`nWhatIf: bovenstaande richtlijnen beschrijven het proces, er worden geen acties uitgevoerd." -ForegroundColor Yellow } } try { if ($RemediationGuidance) { Invoke-RemediationGuidance } elseif ($Monitoring) { $monitorResult = Invoke-SubProcessorMonitoring if ($monitorResult.IsCompliant -and $monitorResult.NewSubProcessors.Count -eq 0) { exit 0 } else { exit 1 } } else { Write-Host "Beschikbare parameters:" -ForegroundColor Yellow Write-Host " -Monitoring : Monitor wijzigingen in subverwerkersbestand" -ForegroundColor Gray Write-Host " -RemediationGuidance : Toon richtlijnen voor risicobeoordeling" -ForegroundColor Gray Write-Host " -DebugMode : Voer een veilige lokale test uit" -ForegroundColor Gray Write-Host " -WhatIf : Toon richtlijnen zonder actie" -ForegroundColor Gray Write-Host "`nVoorbeeld: .\sub-processor-management.ps1 -Monitoring -DebugMode" -ForegroundColor Cyan } } catch { Write-Error "Scriptuitvoering is mislukt: $_" exit 2 } finally { Write-Host "`n========================================`n" -ForegroundColor Cyan } # Exitcodes: # 0 = Compliant, geen wijzigingen # 1 = Niet compliant of wijzigingen gedetecteerd # 2 = Fout tijdens uitvoering

Risico zonder implementatie

Risico zonder implementatie
High: Zonder gestructureerd subverwerkersbeheer kan de organisatie niet aantonen dat zij voldoet aan AVG-verplichtingen voor transparantie en controle over subverwerkers. Dit leidt tot verhoogd risico op niet-naleving, mogelijke sancties van toezichthouders en reputatieschade.

Management Samenvatting

Richt een gestructureerd proces in voor het monitoren, beoordelen en documenteren van subverwerkers binnen Microsoft 365. Gebruik het bijbehorende PowerShell-script voor geautomatiseerde monitoring en rapportage, en zorg voor duidelijke governance met toegewezen rollen en verantwoordelijkheden. Dit artikel en script geven Nederlandse overheidsorganisaties een praktisch kader om AVG-compliant om te gaan met de complexiteit van moderne clouddiensten.