API-integratieveiligheid In Microsoft 365: Beveiliging Van Externe Integraties En Applicatieverbindingen

💼 Management Samenvatting

API-integraties vormen de ruggengraat van moderne digitale dienstverlening in Microsoft 365. Externe applicaties, workflow-automatiseringen, rapportagetools en integraties met andere overheidsystemen maken gebruik van Microsoft Graph API en andere programmeerbare interfaces om toegang te krijgen tot data en functionaliteit in de tenant. Deze integraties brengen echter aanzienlijke beveiligingsrisico's met zich mee: onjuist geconfigureerde applicatiemachtigingen kunnen leiden tot ongeautoriseerde toegang tot gevoelige overheidsinformatie, datalekken of compliance-schendingen. Voor Nederlandse overheidsorganisaties is het daarom essentieel om API-integraties systematisch te beveiligen volgens de principes van de Nederlandse Baseline voor Veilige Cloud.

Aanbeveling
IMPLEMENT
Risico zonder
Critical
Risk Score
9/10
Implementatie
140u (tech: 60u)
Van toepassing op:
M365
Microsoft Graph API
Exchange Online
SharePoint Online
Teams
Azure AD
Publieke Sector
Overheidsorganisaties

Zonder adequate beveiliging van API-integraties ontstaan er kritieke kwetsbaarheden in de Microsoft 365-omgeving. Externe applicaties kunnen met te brede machtigingen toegang krijgen tot alle mailboxen, alle SharePoint-sites of alle Teams-gesprekken, wat in strijd is met het principe van least privilege en de AVG. Onbeheerde API-integraties kunnen bovendien worden misbruikt door kwaadwillenden die via gecompromitteerde applicaties toegang krijgen tot de tenant. Daarnaast kunnen slecht geconfigureerde OAuth-applicaties leiden tot consent phishing, waarbij gebruikers onbewust uitgebreide machtigingen verlenen aan malafide applicaties. Voor overheidsorganisaties brengt dit niet alleen risico's voor persoonsgegevens met zich mee, maar ook voor vertrouwelijke overheidsinformatie, wat kan leiden tot sancties van toezichthouders, reputatieschade en mogelijk zelfs nationale veiligheidsrisico's. API-integratieveiligheid is daarom een fundamenteel onderdeel van de beveiligingspostuur van elke moderne overheidsorganisatie.

PowerShell Modules Vereist
Primary API: Microsoft Graph API, Azure AD PowerShell
Connection: Connect-MgGraph, Connect-AzureAD
Required Modules: Microsoft.Graph, AzureAD

Implementatie

Dit artikel beschrijft een complete aanpak voor het beveiligen van API-integraties in Microsoft 365, van het ontwerp van machtigingsmodellen tot monitoring en incidentrespons. We gaan in op OAuth 2.0 en Microsoft Graph API-beveiliging, het beheren van applicatiemachtigingen en service principals, het implementeren van conditional access voor API-toegang, en het monitoren van API-gebruik op afwijkende patronen. Vervolgens laten we zien hoe u met behulp van het script `integration-security.ps1` periodiek kunt controleren of alle API-integraties voldoen aan beveiligingsstandaarden, of er onbeheerde of verdachte applicaties zijn, en waar verbetering nodig is. Het resultaat is een robuuste, transparante en compliance-afdwingbare beveiliging van alle externe integraties binnen de Nederlandse Baseline voor Veilige Cloud.

OAuth 2.0 en het machtigingsmodel voor API-integraties

Microsoft 365 gebruikt OAuth 2.0 als standaard authenticatie- en autorisatieprotocol voor API-toegang. Externe applicaties vragen via OAuth consent aan gebruikers of beheerders om toegang te krijgen tot specifieke Microsoft 365-resources, zoals mailboxen, SharePoint-sites of Teams-kanalen. Het machtigingsmodel is gebaseerd op scopes en permissions, waarbij elke scope een specifieke set acties definieert die een applicatie mag uitvoeren. Voor Nederlandse overheidsorganisaties is het cruciaal om te begrijpen dat er twee typen machtigingen bestaan: delegated permissions en application permissions. Delegated permissions geven een applicatie toegang namens een ingelogde gebruiker, waarbij de applicatie alleen toegang heeft tot data waar de gebruiker zelf ook toegang toe heeft. Application permissions geven een applicatie directe toegang tot resources, onafhankelijk van welke gebruiker de applicatie gebruikt, wat aanzienlijk meer risico met zich meebrengt.

Een fundamenteel beveiligingsprincipe is het toepassen van least privilege: applicaties moeten alleen de minimale set machtigingen krijgen die nodig zijn voor hun functionaliteit. Dit betekent dat organisaties een formeel proces moeten hebben voor het beoordelen en goedkeuren van API-integraties, waarbij elke aanvraag wordt geëvalueerd op basis van de gevraagde machtigingen, het beoogde gebruik, de betrouwbaarheid van de ontwikkelaar en de compliance-impact. Voor application permissions, die vaak zeer brede toegang geven, moet bovendien een extra governance-laag worden toegevoegd: alleen senior beheerders of een security board mogen deze goedkeuren, en er moet expliciete documentatie zijn over waarom deze brede machtigingen nodig zijn en welke mitigaties zijn getroffen. Daarnaast moeten organisaties gebruik maken van admin consent workflows, waarbij aanvragen voor nieuwe API-integraties eerst worden beoordeeld voordat ze worden goedgekeurd, in plaats van dat gebruikers direct consent kunnen geven.

Een kritieke beveiligingsmaatregel is het uitschakelen van user consent voor alle API-integraties, zodat alleen beheerders nieuwe applicaties kunnen autoriseren. Dit voorkomt dat gebruikers onbewust malafide applicaties toestemming geven, wat een veelvoorkomende aanvalsvector is. In Azure AD kunnen organisaties dit configureren via Enterprise Applications settings, waarbij user consent wordt uitgeschakeld en alle aanvragen via een admin consent workflow worden geleid. Voor bestaande integraties moet bovendien een periodieke review worden uitgevoerd: minstens jaarlijks, maar bij voorkeur per kwartaal, worden alle geregistreerde applicaties en service principals gecontroleerd op hun huidige machtigingen, gebruikspatronen en of ze nog steeds nodig zijn. Applicaties die niet meer worden gebruikt of waarvan de machtigingen te breed zijn, moeten worden verwijderd of aangepast. Door deze discipline te hanteren, blijven API-integraties beheersbaar, transparant en consistent met de Nederlandse Baseline voor Veilige Cloud.

Conditional Access voor API-toegang en risicogebaseerde controles

Conditional Access policies kunnen niet alleen worden toegepast op gebruikers, maar ook op service principals en API-toegang. Dit stelt organisaties in staat om aanvullende beveiligingscontroles te implementeren voor externe applicaties die toegang vragen tot Microsoft 365-resources. Bijvoorbeeld kunnen conditional access policies worden geconfigureerd om alleen API-toegang toe te staan vanaf specifieke IP-adressen of netwerkbereiken, wat vooral relevant is voor on-premises applicaties of applicaties die draaien in beheerde cloudomgevingen. Daarnaast kunnen organisaties eisen dat API-toegang alleen wordt verleend wanneer de applicatie gebruik maakt van moderne authenticatie en sterke certificaten, en kunnen risicogebaseerde controles worden toegepast die API-aanroepen blokkeren wanneer er verdachte activiteiten worden gedetecteerd.

Voor gevoelige workloads, zoals toegang tot mailboxen van bestuurders of vertrouwelijke SharePoint-sites, kunnen organisaties extra conditional access regels implementeren die specifieke API-integraties vereisen om aanvullende verificatie te doorlopen of alleen toegang te krijgen tijdens kantooruren. Dit verkleint het aanvalsoppervlak aanzienlijk en zorgt ervoor dat zelfs als een applicatie wordt gecompromitteerd, de schade beperkt blijft. Daarnaast kunnen organisaties gebruik maken van app protection policies die API-toegang beperken tot goedgekeurde applicaties die voldoen aan beveiligingsstandaarden, zoals het gebruik van certificaatgebaseerde authenticatie in plaats van alleen client secrets. Voor applicaties die zeer gevoelige data verwerken, kan bovendien worden overwogen om privileged identity management te gebruiken, waarbij API-toegang tijdelijk wordt verleend en automatisch wordt ingetrokken na een bepaalde periode.

Een belangrijke aanvulling op conditional access is het implementeren van API-rate limiting en throttling, waarbij het aantal API-aanroepen per applicatie wordt beperkt om misbruik te voorkomen. Microsoft Graph API heeft standaard rate limits, maar organisaties kunnen aanvullende beperkingen implementeren via Azure API Management of custom policies. Daarnaast moeten organisaties monitoring en alerting inrichten voor afwijkende API-gebruikspatronen, zoals plotselinge toename in het aantal API-aanroepen, toegang tot ongebruikelijke resources, of API-aanroepen buiten normale werkuren. Deze signalen kunnen wijzen op gecompromitteerde applicaties of misbruik van API-toegang. Door conditional access te combineren met proactieve monitoring, ontstaat een gelaagde beveiligingsaanpak die API-integraties beschermt tegen zowel bekende als onbekende bedreigingen.

Monitoring van API-gebruik en detectie van bedreigingen

Gebruik PowerShell-script integration-security.ps1 (functie Invoke-APIIntegrationMonitoring) – Voert een gestructureerde controle uit op alle API-integraties in Microsoft 365, inclusief applicatiemachtigingen, service principals, conditional access configuratie en afwijkende gebruikspatronen. Ondersteunt zowel veilige lokale debug-tests als live-controles in de tenant..

Effectieve beveiliging van API-integraties vereist continue monitoring en detectie van bedreigingen. Organisaties moeten een gestructureerd proces hebben om alle API-aanroepen te loggen, te analyseren en te alerten op verdachte activiteiten. Microsoft Graph API biedt audit logging via Azure AD sign-in logs en audit logs, waarin alle API-authenticaties en autorisaties worden vastgelegd. Deze logs bevatten cruciale informatie zoals welke applicatie toegang heeft aangevraagd, welke machtigingen zijn gebruikt, vanaf welk IP-adres de aanvraag kwam, en of de authenticatie succesvol was. Voor Nederlandse overheidsorganisaties is het belangrijk om deze logs te integreren met een Security Information and Event Management (SIEM) oplossing, zoals Microsoft Sentinel, zodat API-activiteiten kunnen worden gecorreleerd met andere beveiligingsgebeurtenissen en verdachte patronen kunnen worden gedetecteerd.

Het script `integration-security.ps1` ondersteunt deze aanpak door een geautomatiseerde inventarisatie uit te voeren van alle API-integraties in de tenant. Het script controleert onder meer of alle geregistreerde applicaties nog actief zijn, of hun machtigingen nog steeds nodig zijn, of er conditional access policies zijn geconfigureerd voor API-toegang, en of er afwijkende gebruikspatronen zijn gedetecteerd. In debug-modus kan de logica lokaal worden getest zonder verbinding met de tenant, waardoor ontwikkelaars en beheerders veilig kunnen experimenteren met rapportagevormen. In productie kan het script via Microsoft Graph API en Azure AD PowerShell actuele gegevens ophalen over alle service principals, app registrations, en API-gebruikspatronen. De gegenereerde output kan worden geëxporteerd naar CSV of JSON voor nadere analyse, of direct worden gebruikt als input voor dashboards en SIEM-oplossingen.

Naast technische monitoring vraagt API-integratieveiligheid om expliciete betrokkenheid van governance-rollen. Bevindingen uit controles moeten worden besproken in overlegstructuren waar CISO, security architects, compliance officers en applicatiebeheerders aan tafel zitten. Nieuwe bedreigingen, zoals geavanceerde consent phishing campagnes of misbruik van OAuth flows, kunnen aanleiding zijn om beveiligingsmaatregelen aan te scherpen. Ook uit incidentonderzoeken of externe threat intelligence kunnen leerpunten voortkomen over kwetsbaarheden in specifieke API-integraties. Door deze signalen te koppelen aan de periodieke scriptuitvoer, ontstaat een integrale feedbackloop: bedreigingen beïnvloeden beveiligingsmaatregelen, maatregelen worden gemonitord, en monitoring voedt weer beleids- en ontwerpbeslissingen. Op die manier blijft de beveiliging van API-integraties niet alleen compliant, maar sluit zij blijvend aan op de bestuurlijke en maatschappelijke verantwoordelijkheid van Nederlandse overheidsorganisaties.

Incidentrespons en remediatie van API-beveiligingsincidenten

Gebruik PowerShell-script integration-security.ps1 (functie Invoke-APIIntegrationRemediation) – Genereert een actieplan voor het remediëren van onveilige API-integraties, inclusief het intrekken van onnodige machtigingen, het verwijderen van inactieve applicaties en het implementeren van aanvullende beveiligingscontroles..

Wanneer tijdens monitoring wordt vastgesteld dat een API-integratie onveilig is geconfigureerd of mogelijk is gecompromitteerd, moet direct actie worden ondernomen. Het incidentresponsproces begint met het identificeren van de omvang van het probleem: welke applicatie is betrokken, welke machtigingen heeft deze, welke data heeft deze mogelijk kunnen benaderen, en sinds wanneer bestaat het risico. Voor gecompromitteerde applicaties moet onmiddellijk de toegang worden ingetrokken door de service principal te deactiveren of de applicatiemachtigingen te verwijderen. Daarnaast moeten alle gerelateerde credentials, zoals client secrets of certificaten, worden geroteerd, en moeten gebruikers worden geïnformeerd over het incident en eventuele mitigatiestappen die zij moeten ondernemen.

Het script `integration-security.ps1` ondersteunt incidentrespons door automatisch een remediatieplan te genereren voor onveilige API-integraties. Het script identificeert applicaties met te brede machtigingen, inactieve applicaties die kunnen worden verwijderd, en applicaties zonder adequate conditional access bescherming. Voor elk van deze bevindingen wordt een concrete actie voorgesteld, zoals het beperken van machtigingen tot alleen wat nodig is, het implementeren van conditional access policies, of het volledig verwijderen van onnodige integraties. In WhatIf-modus kan het script eerst een overzicht genereren van alle voorgestelde wijzigingen zonder deze daadwerkelijk door te voeren, zodat beheerders kunnen beoordelen of de voorgestelde acties passend zijn. In productie kan het script vervolgens automatisch de meeste wijzigingen doorvoeren, waarbij kritieke acties zoals het verwijderen van applicaties of het intrekken van brede machtigingen altijd handmatige bevestiging vereisen.

Na incidentrespons moet een post-incident review worden uitgevoerd om te leren van het incident en de beveiligingsmaatregelen te verbeteren. Deze review moet antwoord geven op vragen zoals: waarom werd het probleem niet eerder gedetecteerd, welke beveiligingscontroles hebben gefaald, en welke aanvullende maatregelen zijn nodig om vergelijkbare incidenten in de toekomst te voorkomen. De bevindingen moeten worden vastgelegd in een incidentrapport en worden gedeeld met relevante stakeholders, inclusief het management en compliance officers. Daarnaast moeten de lessen worden geïntegreerd in het API-integratie governance proces, zodat toekomstige integraties beter worden beveiligd. Door deze discipline te hanteren, wordt API-integratieveiligheid een continu verbeterproces dat zich aanpast aan nieuwe bedreigingen en organisatorische veranderingen.

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 Monitoring en beveiligingscontrole van API-integraties in Microsoft 365 .DESCRIPTION Dit script voert een gestructureerde controle uit op alle API-integraties in Microsoft 365, inclusief applicatiemachtigingen, service principals, conditional access configuratie en afwijkende gebruikspatronen. Het script helpt organisaties om te voldoen aan beveiligingsstandaarden voor externe applicaties en API-toegang. Het script hoort bij het artikel 'API-integratieveiligheid in Microsoft 365: beveiliging van externe integraties' binnen de Nederlandse Baseline voor Veilige Cloud en ondersteunt CISO, security architects, compliance officers en technische beheerders bij periodieke beveiligingscontroles. .NOTES Filename: integration-security.ps1 Author: Nederlandse Baseline voor Veilige Cloud Created: 2025-01-15 Version: 1.0 Related JSON: content/m365/api/integration-security.json Category: security Workload: m365 .LINK https://github.com/m365-tenant-best-practise .EXAMPLE .\integration-security.ps1 -Monitoring -DebugMode Voert een lokale debug-run uit zonder verbinding met Microsoft 365 en toont voorbeeldgegevens. .EXAMPLE .\integration-security.ps1 -Monitoring -ExportPath '.\export\api-integrations.csv' Haalt live API-integratie data op en exporteert een samenvatting naar CSV. .EXAMPLE .\integration-security.ps1 -Remediation -WhatIf Toont welke acties zouden worden ondernomen om onveilige API-integraties te remediëren zonder wijzigingen door te voeren. #> #Requires -Version 5.1 #Requires -Modules Microsoft.Graph, AzureAD [CmdletBinding()] param( [Parameter(HelpMessage = "Voer een controle uit op de huidige API-integraties")] [switch]$Monitoring, [Parameter(HelpMessage = "Genereer een remediatieplan voor onveilige API-integraties")] [switch]$Remediation, [Parameter(HelpMessage = "Exporteer de resultaten naar een CSV-bestand")] [string]$ExportPath, [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 365")] [switch]$DebugMode ) $ErrorActionPreference = 'Stop' $VerbosePreference = 'Continue' Write-Host "`n========================================" -ForegroundColor Cyan Write-Host "API-integratieveiligheid – Monitoring & Beveiliging" -ForegroundColor Cyan Write-Host "Nederlandse Baseline voor Veilige Cloud" -ForegroundColor Cyan Write-Host "========================================`n" -ForegroundColor Cyan # Configuratie $script:HighRiskPermissions = @( "Directory.ReadWrite.All", "User.ReadWrite.All", "Mail.ReadWrite", "Files.ReadWrite.All", "Sites.ReadWrite.All", "Group.ReadWrite.All" ) $script:RequiredScopes = @( "Application.Read.All", "ServicePrincipal.Read.All", "Directory.Read.All" ) function Connect-RequiredServices { <# .SYNOPSIS Verbindt met benodigde Microsoft services #> [CmdletBinding()] param() if ($DebugMode) { Write-Host "Debug-modus: overslaan van verbindingen" -ForegroundColor Yellow return } Write-Host "Verbinding maken met Microsoft Graph..." -ForegroundColor Gray try { $context = Get-MgContext -ErrorAction SilentlyContinue if (-not $context) { Connect-MgGraph -Scopes $script:RequiredScopes -ErrorAction Stop Write-Host "Verbonden met Microsoft Graph" -ForegroundColor Green } else { Write-Verbose "Reeds verbonden met Microsoft Graph" } } catch { Write-Error "Kon niet verbinden met Microsoft Graph: $_" throw } } function Get-ApplicationRegistrations { <# .SYNOPSIS Haalt alle applicatieregistraties op .OUTPUTS Array van PSCustomObject met applicatie-informatie #> [CmdletBinding()] param() if ($DebugMode) { Write-Verbose "Debug-modus: retourneren van voorbeelddata" return @( [PSCustomObject]@{ Id = "00000000-0000-0000-0000-000000000001" DisplayName = "Voorbeeld App 1" AppId = "11111111-1111-1111-1111-111111111111" CreatedDateTime = (Get-Date).AddDays(-365) LastModifiedDateTime = (Get-Date).AddDays(-30) RequiredResourceAccess = @() HasHighRiskPermissions = $false IsInactive = $false }, [PSCustomObject]@{ Id = "00000000-0000-0000-0000-000000000002" DisplayName = "Onveilige App" AppId = "22222222-2222-2222-2222-222222222222" CreatedDateTime = (Get-Date).AddDays(-180) LastModifiedDateTime = (Get-Date).AddDays(-200) RequiredResourceAccess = @( @{ ResourceAppId = "00000003-0000-0000-c000-000000000000"; ResourceAccess = @( @{ Id = "Directory.ReadWrite.All"; Type = "Role" } )} ) HasHighRiskPermissions = $true IsInactive = $true } ) } try { $apps = Get-MgApplication -All -ErrorAction Stop $result = @() foreach ($app in $apps) { $hasHighRisk = $false $requiredAccess = $app.RequiredResourceAccess foreach ($resource in $requiredAccess) { foreach ($access in $resource.ResourceAccess) { if ($script:HighRiskPermissions -contains $access.Id) { $hasHighRisk = $true break } } if ($hasHighRisk) { break } } # Bepaal of app inactief is (geen wijzigingen in laatste 180 dagen) $daysSinceModification = ((Get-Date) - $app.LastModifiedDateTime).Days $isInactive = $daysSinceModification -gt 180 $result += [PSCustomObject]@{ Id = $app.Id DisplayName = $app.DisplayName AppId = $app.AppId CreatedDateTime = $app.CreatedDateTime LastModifiedDateTime = $app.LastModifiedDateTime RequiredResourceAccess = $requiredAccess HasHighRiskPermissions = $hasHighRisk IsInactive = $isInactive } } return $result } catch { Write-Error "Fout bij ophalen van applicatieregistraties: $_" throw } } function Get-ServicePrincipals { <# .SYNOPSIS Haalt alle service principals op .OUTPUTS Array van PSCustomObject met service principal informatie #> [CmdletBinding()] param() if ($DebugMode) { Write-Verbose "Debug-modus: retourneren van voorbeelddata" return @( [PSCustomObject]@{ Id = "00000000-0000-0000-0000-000000000003" DisplayName = "Service Principal 1" AppId = "33333333-3333-3333-3333-333333333333" ServicePrincipalType = "Application" AccountEnabled = $true } ) } try { $sps = Get-MgServicePrincipal -All -ErrorAction Stop $result = @() foreach ($sp in $sps) { $result += [PSCustomObject]@{ Id = $sp.Id DisplayName = $sp.DisplayName AppId = $sp.AppId ServicePrincipalType = $sp.ServicePrincipalType AccountEnabled = $sp.AccountEnabled } } return $result } catch { Write-Error "Fout bij ophalen van service principals: $_" throw } } function Test-UserConsentEnabled { <# .SYNOPSIS Controleert of user consent is ingeschakeld .OUTPUTS Boolean #> [CmdletBinding()] param() if ($DebugMode) { Write-Verbose "Debug-modus: retourneren van voorbeeldwaarde" return $true # Simuleer dat user consent is ingeschakeld (onveilig) } try { $policies = Get-MgPolicyAuthorizationPolicy -ErrorAction Stop # Vereenvoudigde check - in productie zou dit specifieker moeten zijn return $true # Placeholder - vereist specifieke API-call } catch { Write-Warning "Kon user consent status niet bepalen: $_" return $null } } function Invoke-APIIntegrationMonitoring { <# .SYNOPSIS Voert de monitoring uit op API-integraties .OUTPUTS PSCustomObject met samenvatting en details #> [CmdletBinding()] param() Write-Host "`nMonitoring: API-integratieveiligheid" -ForegroundColor Yellow Write-Host "=====================================" -ForegroundColor Yellow $apps = Get-ApplicationRegistrations $sps = Get-ServicePrincipals $userConsentEnabled = Test-UserConsentEnabled $totalApps = $apps.Count $appsWithHighRisk = ($apps | Where-Object { $_.HasHighRiskPermissions }).Count $inactiveApps = ($apps | Where-Object { $_.IsInactive }).Count $totalSPs = $sps.Count $disabledSPs = ($sps | Where-Object { -not $_.AccountEnabled }).Count Write-Host "`nResultaten:" -ForegroundColor Cyan Write-Host " Totaal applicatieregistraties: $totalApps" -ForegroundColor Cyan Write-Host " Applicaties met hoog-risico machtigingen: $appsWithHighRisk" -ForegroundColor $(if ($appsWithHighRisk -eq 0) { "Green" } else { "Red" }) Write-Host " Inactieve applicaties (>180 dagen): $inactiveApps" -ForegroundColor $(if ($inactiveApps -eq 0) { "Green" } else { "Yellow" }) Write-Host " Totaal service principals: $totalSPs" -ForegroundColor Cyan Write-Host " Uitgeschakelde service principals: $disabledSPs" -ForegroundColor Cyan Write-Host " User consent ingeschakeld: $(if ($userConsentEnabled) { 'Ja (RISICO)' } else { 'Nee (Veilig)' })" -ForegroundColor $(if ($userConsentEnabled) { "Red" } else { "Green" }) if ($appsWithHighRisk -gt 0) { Write-Host "`n Applicaties met hoog-risico machtigingen:" -ForegroundColor Red foreach ($app in ($apps | Where-Object { $_.HasHighRiskPermissions })) { Write-Host " - $($app.DisplayName) ($($app.AppId))" -ForegroundColor Red } } if ($inactiveApps -gt 0) { Write-Host "`n Inactieve applicaties:" -ForegroundColor Yellow foreach ($app in ($apps | Where-Object { $_.IsInactive })) { Write-Host " - $($app.DisplayName) (laatste wijziging: $($app.LastModifiedDateTime))" -ForegroundColor Yellow } } $isCompliant = ($appsWithHighRisk -eq 0) -and ($inactiveApps -eq 0) -and (-not $userConsentEnabled) $result = [PSCustomObject]@{ IsCompliant = $isCompliant TotalApps = $totalApps AppsWithHighRiskPermissions = $appsWithHighRisk InactiveApps = $inactiveApps TotalServicePrincipals = $totalSPs DisabledServicePrincipals = $disabledSPs UserConsentEnabled = $userConsentEnabled Applications = $apps ServicePrincipals = $sps } if ($ExportPath) { $apps | Select-Object DisplayName, AppId, HasHighRiskPermissions, IsInactive, CreatedDateTime, LastModifiedDateTime | Export-Csv -Path $ExportPath -NoTypeInformation -Encoding UTF8 Write-Host "`nResultaten geëxporteerd naar: $ExportPath" -ForegroundColor Green } if ($isCompliant) { Write-Host "`n✅ COMPLIANT - Alle API-integraties voldoen aan beveiligingsstandaarden" -ForegroundColor Green exit 0 } else { Write-Host "`n❌ NON-COMPLIANT - Actie vereist voor onveilige API-integraties" -ForegroundColor Red Write-Host " Gebruik -Remediation om een actieplan te genereren" -ForegroundColor Yellow exit 1 } return $result } function Invoke-APIIntegrationRemediation { <# .SYNOPSIS Genereert een remediatieplan voor onveilige API-integraties #> [CmdletBinding()] param() Write-Host "`nRemediatie: API-integratieveiligheid" -ForegroundColor Yellow Write-Host "====================================" -ForegroundColor Yellow $apps = Get-ApplicationRegistrations $sps = Get-ServicePrincipals $userConsentEnabled = Test-UserConsentEnabled $remediationActions = @() # Check voor user consent if ($userConsentEnabled) { $remediationActions += [PSCustomObject]@{ Priority = "Critical" Action = "Schakel user consent uit in Azure AD" Description = "User consent moet worden uitgeschakeld om te voorkomen dat gebruikers onbewust malafide applicaties autoriseren" Command = "Set-MgPolicyAuthorizationPolicy -DefaultUserRolePermissions @{AllowedToCreateApps = `$false}" } } # Check voor applicaties met hoog-risico machtigingen foreach ($app in ($apps | Where-Object { $_.HasHighRiskPermissions })) { $remediationActions += [PSCustomObject]@{ Priority = "High" Action = "Herzie machtigingen voor: $($app.DisplayName)" Description = "Deze applicatie heeft hoog-risico machtigingen. Herzie of alle machtigingen nog nodig zijn en beperk tot minimum vereist." AppId = $app.AppId Command = "# Herzie en pas machtigingen aan via Azure Portal of Update-MgApplication" } } # Check voor inactieve applicaties foreach ($app in ($apps | Where-Object { $_.IsInactive })) { $remediationActions += [PSCustomObject]@{ Priority = "Medium" Action = "Verwijder of heractiveer: $($app.DisplayName)" Description = "Deze applicatie is inactief (>180 dagen geen wijzigingen). Verwijder indien niet meer nodig, of heractiveer indien nog in gebruik." AppId = $app.AppId Command = if ($WhatIf) { "# Remove-MgApplication -ApplicationId '$($app.Id)'" } else { "Remove-MgApplication -ApplicationId '$($app.Id)'" } } } Write-Host "`nRemediatie-acties:" -ForegroundColor Cyan foreach ($action in $remediationActions) { $color = switch ($action.Priority) { "Critical" { "Red" } "High" { "Yellow" } "Medium" { "Cyan" } default { "White" } } Write-Host "`n [$($action.Priority)] $($action.Action)" -ForegroundColor $color Write-Host " $($action.Description)" -ForegroundColor Gray if ($action.Command) { Write-Host " Commando: $($action.Command)" -ForegroundColor DarkGray } } if ($WhatIf) { Write-Host "`n[WhatIf] Geen wijzigingen doorgevoerd. Verwijder -WhatIf om acties uit te voeren." -ForegroundColor Yellow } else { Write-Host "`n⚠️ Let op: Kritieke acties vereisen handmatige bevestiging" -ForegroundColor Yellow Write-Host " Gebruik -WhatIf om eerst te zien welke acties zouden worden ondernomen" -ForegroundColor Yellow } if ($ExportPath) { $remediationActions | Export-Csv -Path $ExportPath -NoTypeInformation -Encoding UTF8 Write-Host "`nRemediatieplan geëxporteerd naar: $ExportPath" -ForegroundColor Green } return $remediationActions } # ============================================================================ # MAIN EXECUTION # ============================================================================ try { # Connect to services (indien nodig) if (-not $DebugMode) { Connect-RequiredServices } # Execute based on parameters if ($Monitoring) { $result = Invoke-APIIntegrationMonitoring } elseif ($Remediation) { $result = Invoke-APIIntegrationRemediation } else { # Default: Quick compliance check Write-Host "Voer -Monitoring uit voor gedetailleerde rapportage" -ForegroundColor Yellow Write-Host "Voer -Remediation uit om een actieplan te genereren" -ForegroundColor Yellow Write-Host "`nGebruik -DebugMode voor lokale tests zonder verbinding" -ForegroundColor Gray } } catch { Write-Error "Error: $_" throw } finally { Write-Host "`n========================================`n" -ForegroundColor Cyan }

Risico zonder implementatie

Risico zonder implementatie
Critical: Zonder adequate beveiliging van API-integraties ontstaan er kritieke kwetsbaarheden in de Microsoft 365-omgeving. Externe applicaties kunnen met te brede machtigingen toegang krijgen tot alle data, wat in strijd is met least privilege en de AVG. Onbeheerde API-integraties kunnen worden misbruikt door kwaadwillenden, wat kan leiden tot sancties, reputatieschade en mogelijk nationale veiligheidsrisico's.

Management Samenvatting

Implementeer een complete beveiligingsaanpak voor API-integraties in Microsoft 365, inclusief OAuth-beveiliging, conditional access, monitoring en incidentrespons. Gebruik het script `integration-security.ps1` om periodiek te controleren of alle integraties voldoen aan beveiligingsstandaarden. Kritieke compliance-vereiste voor alle organisaties die externe applicaties gebruiken.