Azure API Beveiliging: Strategisch Raamwerk Voor Veilige API-implementaties

💼 Management Samenvatting

Beveiliging van API's vormt een kritieke pijler in moderne cloudarchitecturen voor Nederlandse overheidsorganisaties. Azure API Management biedt uitgebreide mogelijkheden om API's te beveiligen, maar vereist een strategische aanpak die authenticatie, autorisatie, encryptie, validatie en monitoring integraal adresseert. Dit artikel beschrijft een compleet beveiligingsraamwerk dat aansluit op de Nederlandse Baseline voor Veilige Cloud en voldoet aan BIO, NIS2 en AVG-eisen.

Aanbeveling
RICHT EEN STRUCTUREEL API-BEVEILIGINGSRAAMWERK IN VOOR ALLE API MANAGEMENT-SERVICES
Risico zonder
High
Risk Score
9/10
Implementatie
130u (tech: 80u)
Van toepassing op:
Azure
Azure API Management
REST API's
GraphQL API's
Microservices
Web Services

API's vormen de ruggengraat van moderne digitale dienstverlening in Nederlandse overheidsorganisaties. Ze faciliteren gegevensuitwisseling tussen systemen, ketenpartners en burgers, maar vormen tegelijkertijd potentiële aanvalsvectoren. Zonder adequate beveiliging ontstaan ernstige risico's: onbevoegde toegang tot gevoelige persoonsgegevens, datalekken door onvoldoende encryptie, denial-of-service aanvallen die kritieke diensten verstoren, en misbruik van API-endpoints voor data-extractie of systeemcompromittatie. Vooral in omgevingen met meerdere ontwikkelteams, leveranciers en cloud-abonnementen is het lastig om overzicht te houden over welke API's daadwerkelijk adequaat zijn beveiligd. Bestuurders en CISO's moeten echter aantoonbaar kunnen maken dat passende technische maatregelen zijn getroffen volgens BIO, ISO 27001 en NIS2, terwijl toezichthouders steeds nadrukkelijker vragen naar concreet bewijs van API-beveiliging. Een enkel slecht beveiligd API-endpoint kan immers toegang geven tot gevoelige gegevens of kritieke systemen, met mogelijk grote reputatieschade, wettelijke meldplichten en sancties tot gevolg.

PowerShell Modules Vereist
Primary API: Azure Resource Manager (ARM), Azure API Management REST API
Connection: Connect-AzAccount
Required Modules: Az.ApiManagement, Az.Resources, Az.Monitor

Implementatie

Dit artikel beschrijft een strategisch en praktisch raamwerk voor API-beveiliging binnen Azure-omgevingen, specifiek gericht op Nederlandse overheidsorganisaties. We behandelen de belangrijkste beveiligingsdomeinen: identiteitsbeheer en authenticatie (OAuth2, OpenID Connect, JWT-tokenvalidatie en integratie met Microsoft Entra ID), autorisatie en toegangscontrole (rolgebaseerde toegang, claims-based autorisatie en fine-grained permissies), encryptie en transportbeveiliging (TLS-configuratie, certificaatbeheer en end-to-end encryptie), inputvalidatie en sanitatie (schema-validatie, injection-preventie en data masking), netwerkbeveiliging en CORS-configuratie (IP-filtering, geografische beperkingen en restrictieve CORS-instellingen), en monitoring en incidentrespons (logging, threat detection, anomaly detection en geautomatiseerde alerts). Daarnaast laten we zien hoe u met het bijbehorende PowerShell-script een feitelijk overzicht maakt van de beveiligingsstatus van API Management-services binnen uw abonnementen, zodat verbeteracties prioriteerbaar en herhaalbaar worden aangestuurd. De focus ligt op realistische implementatie in omgevingen met meerdere teams en leveranciers, waarbij compliance-eisen, cloud-schaalbaarheid en ontwikkelsnelheid met elkaar in balans moeten blijven.

Strategisch beveiligingsraamwerk voor API's in overheidscontext

Een effectief API-beveiligingsraamwerk voor Nederlandse overheidsorganisaties moet aansluiten bij de Nederlandse Baseline voor Veilige Cloud en gebaseerd zijn op bewezen principes: Zero Trust, defense in depth, least privilege en aantoonbaarheid. Zero Trust betekent dat geen enkel API-verzoek standaard wordt vertrouwd, ongeacht de bron of netwerklocatie. Elke aanroep wordt geauthenticeerd en geautoriseerd, en toegang wordt alleen verleend op basis van expliciete rechten en contextuele factoren zoals tijd, locatie en apparaatstatus. Defense in depth houdt in dat meerdere beveiligingslagen worden toegepast: netwerkbeveiliging op infrastructuurniveau, gateway-beveiliging op API Management-niveau, authenticatie en autorisatie op policy-niveau, validatie op applicatie-niveau, en aanvullende controles in de achterliggende services. Deze gelaagde aanpak zorgt ervoor dat een zwakke plek in één laag niet automatisch leidt tot volledige compromittatie van het systeem. Least privilege tenslotte vereist dat API-consumenten uitsluitend toegang krijgen tot de endpoints en operaties die nodig zijn voor hun specifieke use case, met minimale rechten die strikt zijn begrensd op basis van functie, rol en context.

Voor Nederlandse overheidsorganisaties zijn compliance-eisen uit de Baseline Informatiebeveiliging Overheid (BIO), NIS2 en AVG leidend bij het ontwerpen van het beveiligingsraamwerk. BIO schrijft voor dat organisaties adequate toegangscontrole moeten implementeren (control 09.01), logging en monitoring moeten inrichten (control 12.02), encryptie moeten toepassen voor gevoelige gegevens (control 13.01), en bescherming moeten bieden tegen aanvallen zoals denial-of-service (control 14.01). NIS2 versterkt deze eisen voor aanbieders van essentiële en belangrijke diensten door expliciet te eisen dat passende technische en organisatorische maatregelen worden getroffen om risico's voor netwerk- en informatiesystemen te beperken. De AVG voegt daar nog specifieke eisen aan toe voor de verwerking van persoonsgegevens, zoals dataminimalisatie, pseudonimisering en encryptie. Een goed API-beveiligingsraamwerk vertaalt deze abstracte eisen naar concrete technische configuraties, policies en controles die aantoonbaar zijn en periodiek kunnen worden getest en geverifieerd.

De praktische implementatie van het raamwerk vereist governance op meerdere niveaus. Op strategisch niveau moet bestuur of directie expliciet keuzes maken over welke API's als kritiek worden beschouwd, welke beschikbaarheidseisen gelden, en welke maximale uitvalduur acceptabel is. Op tactisch niveau werken cloudplatformteams, security officers en architecten samen om standaardbeveiligingsconfiguraties te definiëren die automatisch worden toegepast op nieuwe API's, inclusief policy-templates, monitoring- en logging-richtlijnen, en escalatieprocedures voor security events. Op operationeel niveau zijn ontwikkelteams, beheerders en leveranciers verantwoordelijk voor de daadwerkelijke implementatie en onderhoud van beveiligingsconfiguraties, waarbij afwijkingen van standaarden expliciet moeten worden goedgekeurd en gedocumenteerd. Door deze governance-structuur te koppelen aan geautomatiseerde controles en periodieke audits ontstaat een duurzaam evenwicht tussen innovatie en beveiliging: teams kunnen nieuwe API's ontwikkelen binnen duidelijke kaders, terwijl bestuurders en toezichthouders vertrouwen kunnen ontlenen aan aantoonbare, meetbare beveiligingsmaatregelen.

Identiteitsbeheer en authenticatie voor API's

Gebruik PowerShell-script api-management-security.ps1 (functie Invoke-Monitoring) – Voert een beveiligingscontrole uit op API Management-services en rapporteert over identiteitsbeheer, authenticatieconfiguraties en integratie met Microsoft Entra ID..

Authenticatie vormt de eerste en belangrijkste verdedigingslinie voor API-beveiliging. Alle productie-API's moeten zijn geconfigureerd met robuuste authenticatiemechanismen die aansluiten bij de organisatie-identiteitsarchitectuur. Voor Nederlandse overheidsorganisaties is Microsoft Entra ID de logische identity provider, omdat het naadloze integratie biedt met bestaande identiteitsinfrastructuur, ondersteuning voor meervoudige authenticatie en voorwaardelijke toegang, en centrale beheerbaarheid van gebruikers, groepen en rollen. Azure API Management ondersteunt verschillende authenticatiepatronen: OAuth2 en OpenID Connect voor gebruikersscenario's waarbij eindgebruikers interactief inloggen, client credentials flow voor service-to-service communicatie waarbij applicaties namens zichzelf authenticeren, en certificate-based authenticatie voor high-security scenario's waarbij extra beveiliging vereist is. De keuze voor een authenticatiepatroon hangt af van het gebruiksscenario, de risicoclassificatie van de API en de beschikbare identiteitsinfrastructuur.

JWT-tokenvalidatie vormt de kern van moderne API-authenticatie. Azure API Management ondersteunt tokenvalidatie via de validate-jwt policy, die controleert op token-signatuur (om te verifiëren dat het token afkomstig is van een vertrouwde issuer), expiratie (om te voorkomen dat verlopen tokens worden gebruikt), issuer (om te controleren dat het token is uitgegeven door de verwachte identity provider), audience (om te verifiëren dat het token bedoeld is voor de specifieke API), en specifieke claims (om aanvullende contextuele informatie te extraheren voor autorisatiebeslissingen). Deze validatie moet worden toegepast op alle API-verzoeken waarbij authenticatie vereist is, en moet plaatsvinden voordat andere policies worden uitgevoerd om te voorkomen dat ongeldige tokens worden verwerkt door downstream policies. Voor productie-omgevingen is het belangrijk om token caching te configureren om performance te optimaliseren, maar ook om cache-invalidatie te implementeren wanneer tokens worden ingetrokken of wanneer beveiligingsincidenten optreden. Daarnaast moeten refresh tokens veilig worden beheerd: ze moeten worden opgeslagen in beveiligde storage, worden versleuteld in transit, en moeten worden geroteerd volgens een gedefinieerd schema.

Voor legacy-systemen die nog geen moderne authenticatie ondersteunen, kunnen migratiepaden worden ontworpen die geleidelijk modernisering faciliteren. Denk aan API Management policies die basic authenticatie accepteren maar deze intern omzetten naar moderne tokens voordat verzoeken worden doorgestuurd naar achterliggende services, of aan wrappers rond legacy-API's die moderne authenticatie aan de buitenkant afhandelen terwijl het interne systeem ongewijzigd blijft. Dergelijke overgangsoplossingen moeten expliciet worden gedocumenteerd als tijdelijk en risicovol, met concrete plannen voor volledige migratie naar moderne authenticatie binnen een gedefinieerde termijn. Het is belangrijk om te beseffen dat wrappers en omzettingen aanvullende beveiligingsrisico's introduceren en daarom alleen moeten worden gebruikt wanneer volledige migratie niet direct haalbaar is.

Autorisatie en toegangscontrole op API-niveau

Autorisatie bepaalt wat geauthenticeerde gebruikers en services daadwerkelijk mogen doen binnen een API. In Azure API Management kan autorisatie op verschillende niveaus worden geconfigureerd: op gateway-niveau via policies die controleren of een gebruiker of service toegang heeft tot een specifieke API, op operatie-niveau waarbij toegang wordt gecontroleerd per HTTP-methode en endpoint, en op gegevensniveau waarbij policies kunnen controleren of een gebruiker toegang heeft tot specifieke resources op basis van claims in JWT-tokens. Voor Nederlandse overheidsorganisaties is het gebruikelijk om autorisatie te baseren op rollen en groepen in Microsoft Entra ID, waarbij API Management policies JWT-tokens valideren en claims extraheren om toegangsbeslissingen te nemen. Dit sluit aan bij de Zero Trust-principes en maakt het mogelijk om toegang centraal te beheren via Entra ID zonder dat elke API afzonderlijk autorisatielogica hoeft te implementeren.

Fine-grained autorisatie vereist dat claims in JWT-tokens worden gebruikt om toegangsbeslissingen te nemen. Veelvoorkomende claims zijn rol (bijvoorbeeld 'admin', 'user', 'read-only'), organisatie-eenheid (bijvoorbeeld 'afdeling-belastingen', 'gemeente-amsterdam'), classificatie van de gebruiker (bijvoorbeeld 'intern', 'extern', 'leverancier'), en specifieke permissies (bijvoorbeeld 'lees-persoonsgegevens', 'wijzig-vergunningen'). API Management policies kunnen deze claims extraheren en gebruiken in conditionele logica om te bepalen of een verzoek mag worden uitgevoerd. Een beheer-API voor het herstarten van back-end workloads mag bijvoorbeeld alleen toegankelijk zijn voor gebruikers met de rol 'system-administrator' binnen een specifieke organisatie-eenheid, terwijl een lees-API voor openbare informatie breder beschikbaar kan zijn maar nog steeds logging vereist voor audit-doeleinden. Belangrijk is dat autorisatiebeslissingen zoveel mogelijk worden gebaseerd op centraal beheerde groepen en rollen, zodat wijzigingen in toegangsrechten op één plek kunnen worden doorgevoerd en automatisch doorwerken naar alle betrokken API's.

Geavanceerde autorisatiescenario's kunnen context-afhankelijke beslissingen omvatten: bijvoorbeeld toegang tot gevoelige gegevens alleen tijdens kantooruren, alleen vanaf geautoriseerde IP-adressen of netwerksegmenten, of alleen wanneer de gebruiker recent meervoudige authenticatie heeft doorlopen. Azure API Management ondersteunt dergelijke contextuele autorisatie via policies die aanvullende voorwaarden kunnen evalueren voordat toegang wordt verleend. Voor high-security API's kan het bovendien nodig zijn om aanvullende verificatiestappen te vereisen, zoals het valideren van certificaten, het controleren van device compliance, of het uitvoeren van risicobeoordelingen via externe services. Door deze geavanceerde autorisatiepatronen te combineren met centrale identity governance ontstaat een krachtig en flexibel toegangsbeheersysteem dat aansluit bij de complexiteit en verantwoordelijkheden van moderne overheidsorganisaties.

Encryptie en transportbeveiliging voor API-verkeer

Encryptie vormt de basis voor vertrouwelijke gegevensbescherming in API-communicatie. Alle API-verkeer moet worden versleuteld in transit via Transport Layer Security (TLS), waarbij minimaal TLS 1.2 wordt vereist en TLS 1.3 wordt aanbevolen voor nieuwe implementaties. Azure API Management ondersteunt TLS-versies via configuratie op service-niveau en via policies die kunnen worden gebruikt om specifieke TLS-eisen af te dwingen. Belangrijk is dat weak cipher suites worden uitgeschakeld en dat perfect forward secrecy wordt afgedwongen om ervoor te zorgen dat gestolen private keys niet kunnen worden gebruikt om eerdere sessies te ontsleutelen. Certificaatbeheer is kritiek: alle certificaten moeten worden beheerd via Azure Key Vault of een ander centraal certificaatbeheersysteem, certificaten moeten worden gemonitord op verloopdatum en automatisch worden vernieuwd, en self-signed certificaten moeten volledig worden vermeden in productie-omgevingen behalve voor specifieke testscenario's.

Naast transport-encryptie is het belangrijk om gevoelige gegevens ook te beschermen wanneer deze worden gelogd of doorgestuurd naar monitoring- en analyticsystemen. Data masking policies kunnen worden gebruikt om creditcardnummers, burgerservicenummers, wachtwoorden en andere gevoelige informatie te verbergen in logs en responsen. Deze policies werken op basis van reguliere expressies die patronen identificeren en vervangen door gemaskerde waarden. Het is cruciaal dat masking consistent wordt toegepast: niet alleen in response bodies, maar ook in logs, error messages en debugging output. Verder moeten API Management-services worden geconfigureerd om security headers te verzenden die browsers en clients instrueren over beveiligingsgedrag: Strict-Transport-Security (HSTS) om HTTPS af te dwingen, X-Content-Type-Options om MIME-sniffing te voorkomen, X-Frame-Options om clickjacking-aanvallen te voorkomen, en Content-Security-Policy om cross-site scripting (XSS) te beperken.

Voor API's die werken met persoonsgegevens in het kader van de AVG is aanvullende encryptie vereist. Gevoelige persoonsgegevens moeten worden versleuteld at rest in achterliggende databases en storage accounts, en encryptie keys moeten worden beheerd via Azure Key Vault met role-based access control. In sommige gevallen kan end-to-end encryptie nodig zijn, waarbij gegevens worden versleuteld op de client en pas worden ontsleuteld in de eindbestemming, zonder dat de API Management-service toegang heeft tot de onversleutelde data. Dit vereist specifieke policyconfiguraties die encryptie en decryptie afhandelen zonder dat gevoelige informatie wordt blootgesteld aan de gateway zelf. Voor Nederlandse overheidsorganisaties kan dit vooral relevant zijn voor API's die werken met bijzondere persoonsgegevens zoals medische gegevens, strafrechtelijke gegevens of andere hoog-risico informatie.

Inputvalidatie en bedreigingsbescherming

Inputvalidatie en sanitatie zijn fundamentele beveiligingsmaatregelen om te voorkomen dat kwaadaardige of malformed payloads de achterliggende systemen bereiken. Azure API Management biedt verschillende policies voor validatie: validate-content policies die controleren of request- of response-bodies voldoen aan gespecificeerde schema's (bijvoorbeeld JSON Schema of XML Schema), check-header policies die controleren op aanwezigheid en waarde van specifieke HTTP-headers, en check-query-parameter policies die query-parameters valideren. Validatie moet worden toegepast op zowel inkomende verzoeken (om injection-aanvallen en malformed data te voorkomen) als uitgaande responsen (om te voorkomen dat gevoelige gegevens per ongeluk worden gelekt via response-bodies). Voor API's die werken met gestructureerde data zoals JSON of XML is schema-validatie essentieel om ervoor te zorgen dat alle verzoeken en responsen voldoen aan de verwachte structuur en datatype-eisen.

Sanitatie gaat een stap verder dan validatie: niet alleen wordt gecontroleerd of input voldoet aan de verwachte structuur, maar ook worden potentiële gevaarlijke patronen verwijderd of onschadelijk gemaakt. Dit is vooral belangrijk voor API's die user-generated content accepteren of die data doorsturen naar andere systemen. Common injection-aanvallen die moeten worden voorkomen omvatten SQL injection (waarbij SQL-code wordt ingesloten in input parameters), NoSQL injection (voor document databases zoals MongoDB), command injection (waarbij operating system commands worden uitgevoerd), LDAP injection (voor directory services), en XML/XXE injection (voor XML-parsers). API Management policies kunnen worden gebruikt om dergelijke patronen te detecteren en te blokkeren voordat ze de achterliggende services bereiken. Belangrijk is dat validatie- en sanitatiepolicies worden gebaseerd op whitelisting (alleen toegestane patronen) in plaats van blacklisting (blokkeren van bekende gevaarlijke patronen), omdat blacklists altijd incompleet zijn en nieuwe aanvalstechnieken kunnen omzeilen.

Rate limiting en throttling vormen aanvullende beveiligingsmaatregelen om misbruik en denial-of-service aanvallen te voorkomen. Door het aantal verzoeken per tijdseenheid te beperken op basis van abonnement, client-ID of IP-adres, wordt voorkomen dat één partij een belangrijke API overbelast of grote hoeveelheden gegevens onttrekt. Quota's over langere perioden (bijvoorbeeld per dag of maand) helpen bij het begrenzen van structureel intensief gebruik en kunnen worden afgestemd op contractuele afspraken met ketenpartners. In combinatie met IP-filtering ontstaat een krachtig geheel: interne beheer-API's kunnen bijvoorbeeld worden beperkt tot specifieke IP-bereiken van de organisatie of van een beveiligd beheersegment. Voor publieke API's is het verstandig om in elk geval drempelwaarden te definiëren die opvallende pieken in verkeer direct afvangen. Alle limieten en blokkades moeten worden gelogd en gekoppeld aan monitoring zodat security operations afwijkende patronen actief kan onderzoeken en, waar nodig, aanvullende maatregelen kan nemen.

Monitoring, compliance en governance voor API-beveiliging

Gebruik PowerShell-script api-management-security.ps1 (functie Invoke-Remediation) – Genereert een overzicht van API Management-services die niet aan beveiligingscriteria voldoen en geeft tekstuele aanbevelingen voor vervolgstappen en governance..

Uitgebreide logging en monitoring zijn essentieel voor operationele beveiliging en compliance. Azure API Management biedt verschillende logging-mogelijkheden: diagnostic logs die informatie vastleggen over alle API-verzoeken inclusief timestamps, client-identificatie, endpoints, HTTP-methoden, response-codes en latency, application insights-integratie voor gedetailleerde analytics en custom telemetry, en event hub-integratie voor real-time event processing en integratie met SIEM-systemen. Voor Nederlandse overheidsorganisaties is het gebruikelijk om alle API-verzoeken te loggen met minimaal de volgende informatie: timestamp van het verzoek, client-IP-adres of client-identificatie, geauthenticeerde gebruiker of service principal, aangeroepen endpoint en HTTP-methode, request- en response-headers (met uitzondering van gevoelige headers zoals authorization), response-statuscode en -latency, en eventuele foutmeldingen of uitzonderingen. Deze logs moeten centraal worden opgeslagen met een bewaarperiode die voldoet aan compliance-vereisten (bijvoorbeeld 7 jaar voor audit-doeleinden volgens BIO-normen).

Security monitoring moet verder gaan dan alleen logging: actieve detectie van verdacht gedrag, anomalieën en potentiële aanvallen is essentieel. Azure API Management kan worden geïntegreerd met Azure Sentinel of andere SIEM-systemen voor threat detection en incident response. Belangrijke security events die moeten worden gemonitord omvatten: herhaalde authenticatiefouten (mogelijke brute-force-aanvallen), ongebruikelijke toegangspatronen (bijvoorbeeld toegang buiten kantooruren of vanaf onbekende locaties), grote aantallen verzoeken binnen korte tijd (mogelijke denial-of-service-aanvallen), verzoeken die validatiefouten veroorzaken (mogelijke injection-aanvallen), en verzoeken die worden geblokkeerd door security policies (mogelijke exploitatiepogingen). Automatische alerts moeten worden geconfigureerd voor kritieke security events, met escalatieprocedures voor high-severity incidents. Door deze monitoring te koppelen aan een gestructureerd incident response-proces ontstaat een proactieve beveiligingspostuur die niet alleen reageert op bekende bedreigingen, maar ook nieuwe aanvalspatronen tijdig kan detecteren en mitigeren.

Vanuit complianceperspectief sluiten API Management beveiligingsconfiguraties direct aan op eisen uit de BIO, ISO 27001 en NIS2. Deze kaders vragen onder meer om adequate toegangscontrole op basis van behoefte, logging en monitoring van kritieke systemen, bescherming tegen denial-of-service-aanvallen, encryptie van gevoelige gegevens, en aantoonbaar beheer van API-beveiliging. In auditdossiers wordt niet alleen gekeken naar beleidsdocumenten, maar ook naar concrete bewijsstukken uit de technische inrichting: beveiligingsconfiguratieoverzichten, rapportages uit monitoring- en beveiligingstools, en beschrijvingen van incidentafhandeling en verbeteracties. Door de output van het beveiligingsscript op te nemen in periodieke rapportages aan CISO-organisatie en lijnmanagement, en deze te koppelen aan een portfolio van verbetermaatregelen, ontstaat een sluitende audittrail. Zo kan worden aangetoond welke API's wanneer zijn beveiligd, welke resterende risico's nog worden geaccepteerd en welke afspraken zijn gemaakt over vervolgstappen. Een goed ingerichte governance-structuur maakt van API-beveiliging een vast onderdeel van bredere cloud security- en risicobeheersing, waardoor bestuurders en toezichthouders vertrouwen kunnen ontlenen aan aantoonbare, meetbare beveiligingsmaatregelen die passen bij de schaal en verantwoordelijkheid van de Nederlandse overheid.

Compliance & Frameworks

Automation

Gebruik het onderstaande PowerShell script om deze security control te monitoren en te implementeren. Het script bevat functies voor zowel monitoring (-Monitoring) als remediation (-Remediation).

PowerShell
<# .SYNOPSIS Controleert of Azure API Management-services correct zijn geconfigureerd met adequate beveiligingsmaatregelen. .DESCRIPTION Dit script inventariseert alle Azure API Management-services in de opgegeven of alle abonnementen en controleert of essentiële beveiligingsmaatregelen zijn geconfigureerd, waaronder identiteitsbeheer en authenticatie, TLS-configuratie en encryptie, logging en monitoring, en basis netwerkbeveiliging. In monitoringmodus wordt een rapport gegenereerd met de beveiligingsstatus per API Management-service. In remediatiemodus wordt een overzicht gemaakt van services zonder adequate beveiligingsconfiguratie met concrete aanbevelingen voor vervolgacties. .NOTES Filename: api-management-security.ps1 Author: Nederlandse Baseline voor Veilige Cloud Created: 2025-01-15 Last Modified: 2025-01-15 Version: 1.0 Related JSON: content/azure/api/api-management-security.json .LINK https://github.com/[org]/m365-tenant-best-practise .EXAMPLE .\api-management-security.ps1 -Monitoring Voert een controle uit op alle toegankelijke abonnementen en toont de beveiligingsstatus per API Management-service. .EXAMPLE .\api-management-security.ps1 -Remediation Genereert een overzicht van API Management-services zonder adequate beveiligingsconfiguratie en aanbevelingen voor herstel. .EXAMPLE .\api-management-security.ps1 -Monitoring -LocalDebug Draait een lokale debug-run met gesimuleerde data zonder Azure-verbinding of API Management API-calls. #> #Requires -Version 5.1 [CmdletBinding()] param( [Parameter()] [switch]$WhatIf, [Parameter()] [switch]$Monitoring, [Parameter()] [switch]$Remediation, [Parameter()] [string[]]$SubscriptionId, [Parameter()] [switch]$LocalDebug ) $ErrorActionPreference = 'Stop' $VerbosePreference = 'Continue' $PolicyName = "API Management beveiliging correct geconfigureerd" $PolicyDescription = "Controleert of Azure API Management-services voorzien zijn van essentiële beveiligingsmaatregelen zoals identiteitsbeheer, authenticatie, TLS-configuratie, encryptie, logging en monitoring." function Test-ModuleAvailability { [CmdletBinding()] param( [Parameter(Mandatory = $true)] [string[]]$ModuleName ) foreach ($name in $ModuleName) { if (-not (Get-Module -ListAvailable -Name $name)) { Write-Warning "Vereiste module '$name' is niet geïnstalleerd. Installeer deze module voor volledige functionaliteit." } } } function Connect-RequiredServices { <# .SYNOPSIS Maakt verbinding met Azure als dat nog niet is gebeurd. #> [CmdletBinding()] param() if ($LocalDebug) { Write-Verbose "LocalDebug is ingeschakeld; er wordt geen Azure-verbinding opgezet." return } Test-ModuleAvailability -ModuleName @('Az.Accounts', 'Az.Resources', 'Az.ApiManagement', 'Az.Monitor') try { $context = Get-AzContext -ErrorAction SilentlyContinue if (-not $context) { Write-Host "Verbinding maken met Azure..." -ForegroundColor Yellow Connect-AzAccount -ErrorAction Stop | Out-Null } else { Write-Verbose "Reeds verbonden met Azure: $($context.Subscription.Name)" } } catch { Write-Error "Kon geen verbinding maken met Azure: $_" throw } } function Get-DebugApiManagementData { [CmdletBinding()] param() return @( [PSCustomObject]@{ SubscriptionId = "00000000-0000-0000-0000-000000000010" SubscriptionName = "DBG-Overheid-NonProd" ResourceGroupName = "rg-apim-nonprod" ServiceName = "apim-nonprod-01" Location = "westeurope" Sku = "Standard" HasTls12OrHigher = $true HasDiagnosticLogging = $true HasManagedIdentity = $false HasPrivateEndpoint = $false HasCustomDomains = $false SecurityComplianceScore = 55 }, [PSCustomObject]@{ SubscriptionId = "00000000-0000-0000-0000-000000000020" SubscriptionName = "DBG-Overheid-Prod" ResourceGroupName = "rg-apim-prod" ServiceName = "apim-prod-01" Location = "westeurope" Sku = "Premium" HasTls12OrHigher = $true HasDiagnosticLogging = $true HasManagedIdentity = $true HasPrivateEndpoint = $true HasCustomDomains = $true SecurityComplianceScore = 95 } ) } function Get-ApiManagementSecurityStatus { <# .SYNOPSIS Haalt alle API Management-services op en bepaalt of essentiële beveiligingsmaatregelen zijn geconfigureerd. .OUTPUTS PSCustomObject met API Management-service- en beveiligingsinformatie. #> [CmdletBinding()] param() if ($LocalDebug) { Write-Verbose "Gebruik van gesimuleerde API Management beveiligingsdata (LocalDebug)." return Get-DebugApiManagementData } Write-Verbose "Ophalen van API Management-services via Azure Resource Graph..." $query = @' resources | where type == "microsoft.apimanagement/service" | project id, name, location, subscriptionId, resourceGroup, sku, properties '@ $argParams = @{ Query = $query } if ($SubscriptionId) { $argParams['Subscription'] = $SubscriptionId } $services = Search-AzGraph @argParams $results = @() foreach ($service in $services) { $serviceName = $service.name $resourceGroup = $service.resourceGroup $subscriptionIdValue = $service.subscriptionId Write-Verbose "Controleren van API Management-service: $serviceName" try { # Haal de API Management-service op $apimService = Get-AzApiManagement -ResourceGroupName $resourceGroup -Name $serviceName -ErrorAction SilentlyContinue if (-not $apimService) { Write-Warning "Kon API Management-service '$serviceName' niet ophalen. Mogelijk ontbreken rechten." continue } # Controleer TLS-configuratie (Azure API Management ondersteunt standaard TLS 1.2+) $hasTls12OrHigher = $true # Controleer of diagnostic settings zijn geconfigureerd (indicatie voor logging) $hasDiagnosticLogging = $false try { $diagnosticSettings = Get-AzDiagnosticSetting -ResourceId $apimService.Id -ErrorAction SilentlyContinue if ($diagnosticSettings -and $diagnosticSettings.Logs.Count -gt 0) { $hasDiagnosticLogging = $true } } catch { Write-Verbose "Kon diagnostic settings niet ophalen voor $serviceName" } # Controleer op managed identity (voor beveiligde toegang tot andere Azure-services) $hasManagedIdentity = $false try { if ($apimService.Identity -and $apimService.Identity.PrincipalId) { $hasManagedIdentity = $true } } catch { Write-Verbose "Kon identity configuratie niet ophalen voor $serviceName" } # Controleer op private endpoints (voor netwerkisolatie) $hasPrivateEndpoint = $false try { $privateEndpoints = Get-AzPrivateEndpoint -ResourceGroupName $resourceGroup -ErrorAction SilentlyContinue | Where-Object { $_.PrivateLinkServiceConnections | Where-Object { $_.PrivateLinkServiceId -eq $apimService.Id } } if ($privateEndpoints) { $hasPrivateEndpoint = $true } } catch { Write-Verbose "Kon private endpoints niet ophalen voor $serviceName" } # Controleer op custom domains (indicatie voor TLS/certificaat configuratie) $hasCustomDomains = $false try { $customDomains = Get-AzApiManagementCustomDomain -ApiManagementName $serviceName -ResourceGroupName $resourceGroup -ErrorAction SilentlyContinue if ($customDomains) { $hasCustomDomains = $true } } catch { Write-Verbose "Kon custom domains niet ophalen voor $serviceName" } # Bepaal compliance score op basis van beschikbare informatie $complianceScore = 0 if ($hasTls12OrHigher) { $complianceScore += 20 } if ($hasDiagnosticLogging) { $complianceScore += 25 } if ($hasManagedIdentity) { $complianceScore += 15 } if ($hasPrivateEndpoint) { $complianceScore += 20 } if ($hasCustomDomains) { $complianceScore += 10 } # Premium/Isolated SKU's hebben meer beveiligingsfeatures if ($apimService.Sku.Name -in @("Premium", "Isolated")) { $complianceScore += 10 } # Cap score op 100 if ($complianceScore -gt 100) { $complianceScore = 100 } $results += [PSCustomObject]@{ SubscriptionId = $subscriptionIdValue SubscriptionName = (Get-AzSubscription -SubscriptionId $subscriptionIdValue -ErrorAction SilentlyContinue).Name ResourceGroupName = $resourceGroup ServiceName = $serviceName Location = $service.location Sku = $service.sku.name HasTls12OrHigher = $hasTls12OrHigher HasDiagnosticLogging = $hasDiagnosticLogging HasManagedIdentity = $hasManagedIdentity HasPrivateEndpoint = $hasPrivateEndpoint HasCustomDomains = $hasCustomDomains SecurityComplianceScore = $complianceScore } } catch { Write-Warning "Fout bij controleren van API Management-service '$serviceName': $_" } } return $results } function Test-Compliance { <# .SYNOPSIS Bepaalt de compliancestatus voor API Management beveiligingsconfiguratie. .OUTPUTS PSCustomObject met samenvatting van de resultaten. #> [CmdletBinding()] param() $services = Get-ApiManagementSecurityStatus if (-not $services -or $services.Count -eq 0) { Write-Verbose "Geen API Management-services gevonden in de geselecteerde scope." return [PSCustomObject]@{ ScriptName = "api-management-security" IsCompliant = $true Timestamp = Get-Date Details = "Er zijn geen API Management-services gevonden in de huidige scope." Recommendations = @() Services = @() } } $nonCompliant = $services | Where-Object { $_.SecurityComplianceScore -lt 70 } $isCompliant = ($nonCompliant.Count -eq 0) $details = if ($isCompliant) { "Alle gevonden API Management-services hebben essentiële beveiligingsmaatregelen geconfigureerd." } else { "Een of meer API Management-services missen essentiële beveiligingsconfiguraties en voldoen niet aan de minimale compliance-eisen." } $recommendations = @() if (-not $isCompliant) { $recommendations += "Zorg dat alle API Management-services TLS 1.2 of hoger afdwingen en geen zwakke cipher suites ondersteunen." $recommendations += "Schakel diagnostische logging in en configureer integratie met Log Analytics of Event Hubs voor centrale monitoring." $recommendations += "Configureer managed identities voor beveiligde toegang tot andere Azure-services zonder credentials op te slaan." $recommendations += "Overweeg private endpoints voor API Management-services om netwerkisolatie te verbeteren." $recommendations += "Configureer custom domains met geldige certificaten voor productie-omgevingen." $recommendations += "Implementeer authenticatie- en autorisatiepolicies voor alle API's om onbevoegde toegang te voorkomen." $recommendations += "Documenteer beveiligingsconfiguraties en zorg voor periodieke reviews en updates." } return [PSCustomObject]@{ ScriptName = "api-management-security" IsCompliant = $isCompliant Timestamp = Get-Date Details = $details Recommendations = $recommendations Services = $services } } function Invoke-Monitoring { <# .SYNOPSIS Voert een monitoring-run uit en toont de beveiligingsstatus per API Management-service. #> [CmdletBinding()] param() Write-Host "`nMonitoring: $PolicyName" -ForegroundColor Yellow Write-Host "Beschrijving: $PolicyDescription" -ForegroundColor Yellow Write-Host "==============================================================" -ForegroundColor Yellow $result = Test-Compliance $services = $result.Services if ($services.Count -gt 0) { Write-Host "`nGevonden API Management-services:" -ForegroundColor Cyan foreach ($service in $services) { $statusColor = if ($service.SecurityComplianceScore -ge 70) { "Green" } else { "Red" } $statusText = "Compliance Score: $($service.SecurityComplianceScore)% - " + "TLS: $(if ($service.HasTls12OrHigher) { 'Ja' } else { 'Nee' }), " + "Logging: $(if ($service.HasDiagnosticLogging) { 'Ja' } else { 'Nee' }), " + "Managed Identity: $(if ($service.HasManagedIdentity) { 'Ja' } else { 'Nee' }), " + "Private Endpoint: $(if ($service.HasPrivateEndpoint) { 'Ja' } else { 'Nee' })" Write-Host ("- {0}/{1} ({2}, {3}) - {4}" -f $service.SubscriptionName, $service.ServiceName, $service.Location, $service.Sku, $statusText) -ForegroundColor $statusColor } } else { Write-Host "`nGeen API Management-services gevonden in de huidige scope." -ForegroundColor Cyan } if ($result.IsCompliant) { Write-Host "`n✅ COMPLIANT - Alle API Management-services voldoen aan de basisvoorwaarden voor beveiliging." -ForegroundColor Green } else { Write-Host "`n❌ NON-COMPLIANT - Eén of meer API Management-services missen essentiële beveiligingsconfiguraties." -ForegroundColor Red Write-Host "Aanbevolen acties:" -ForegroundColor Yellow foreach ($rec in $result.Recommendations) { Write-Host (" - {0}" -f $rec) -ForegroundColor Yellow } } return $result } function Invoke-Remediation { <# .SYNOPSIS Geeft een remediatie-overzicht voor API Management-services zonder adequate beveiligingsconfiguratie. #> [CmdletBinding()] param() Write-Host "`nRemediatie: $PolicyName" -ForegroundColor Yellow Write-Host "==============================================================" -ForegroundColor Yellow $result = Test-Compliance $services = $result.Services | Where-Object { $_.SecurityComplianceScore -lt 70 } if (-not $services -or $services.Count -eq 0) { Write-Host "Alle API Management-services beschikken over adequate beveiligingsconfiguraties. Geen remediatie nodig." -ForegroundColor Green return $result } Write-Host "`nNiet-conforme API Management-services (beveiligingsconfiguratie onvoldoende):" -ForegroundColor Red foreach ($service in $services) { Write-Host ("- Subscription: {0}" -f $service.SubscriptionName) -ForegroundColor Red Write-Host (" ResourceGroup: {0}" -f $service.ResourceGroupName) -ForegroundColor Red Write-Host (" Service: {0}" -f $service.ServiceName) -ForegroundColor Red Write-Host (" Locatie: {0}" -f $service.Location) -ForegroundColor Red Write-Host (" SKU: {0}" -f $service.Sku) -ForegroundColor Red Write-Host (" Compliance: {0}%" -f $service.SecurityComplianceScore) -ForegroundColor Red Write-Host "" } Write-Host "Aanbevolen vervolgstappen:" -ForegroundColor Yellow Write-Host "1. Classificeer de niet-conforme services naar omgeving (ontwikkel, test, acceptatie, productie) en kriticiteit." -ForegroundColor Yellow Write-Host "2. Bepaal per service welke beveiligingsmaatregelen vereist zijn op basis van het risicoprofiel en compliance-eisen." -ForegroundColor Yellow Write-Host "3. Implementeer TLS-configuratie en certificaatbeheer, zorg voor TLS 1.2 of hoger met perfect forward secrecy." -ForegroundColor Yellow Write-Host "4. Schakel diagnostische logging in en configureer integratie met Log Analytics of Event Hubs voor centrale monitoring." -ForegroundColor Yellow Write-Host "5. Configureer managed identities voor beveiligde toegang tot andere Azure-services zonder credentials op te slaan." -ForegroundColor Yellow Write-Host "6. Overweeg private endpoints voor API Management-services om netwerkisolatie te verbeteren, vooral voor productie-omgevingen." -ForegroundColor Yellow Write-Host "7. Ontwerp en implementeer authenticatie- en autorisatiepolicies, beginnend met OAuth2/JWT-validatie voor alle API's." -ForegroundColor Yellow Write-Host "8. Documenteer beveiligingsconfiguraties en zorg voor periodieke reviews en updates in het governance- en risicoregister." -ForegroundColor Yellow if ($WhatIf) { Write-Host "`nWhatIf is ingeschakeld: er worden geen wijzigingen doorgevoerd; alleen een rapport is gegenereerd." -ForegroundColor Cyan } return $result } try { Write-Host "`n========================================" -ForegroundColor Cyan Write-Host "Script: api-management-security" -ForegroundColor Cyan Write-Host "Nederlandse Baseline voor Veilige Cloud" -ForegroundColor Cyan Write-Host "========================================`n" -ForegroundColor Cyan Connect-RequiredServices if ($Monitoring) { Invoke-Monitoring } elseif ($Remediation) { Invoke-Remediation } else { $result = Test-Compliance if ($result.IsCompliant) { Write-Host "`n✅ COMPLIANT" -ForegroundColor Green } else { Write-Host "`n❌ NON-COMPLIANT" -ForegroundColor Red Write-Host "Voer het script uit met -Monitoring of -Remediation voor meer details." -ForegroundColor Yellow } return $result } } catch { Write-Error "Er is een fout opgetreden in api-management-security.ps1: $_" throw } finally { Write-Host "`n========================================`n" -ForegroundColor Cyan }

Risico zonder implementatie

Risico zonder implementatie
High: Zonder structurele API-beveiligingsconfiguratie blijven API's vaak toegankelijk zonder adequate authenticatie, encryptie, validatie of monitoring. Een enkel onbeveiligd API-endpoint kan dan de toegangspoort vormen tot gevoelige gegevens of kritieke systemen, wat kan resulteren in datalekken, service-onderbrekingen en aantoonbare non-compliance met BIO, ISO 27001 en NIS2, met mogelijk grote reputatieschade en wettelijke gevolgen.

Management Samenvatting

Ontwikkel en implementeer een organisatiebreed API-beveiligingsraamwerk voor Azure API Management dat authenticatie en autorisatie, encryptie, inputvalidatie, netwerkbeveiliging en monitoring integraal adresseert. Gebruik het bijbehorende PowerShell-script om de feitelijke beveiligingsstatus van API Management-services periodiek te meten, verbeteracties te prioriteren en de voortgang aantoonbaar te maken in rapportages aan bestuurders, CISO en auditors. Zo wordt API Management een volwaardig en veilig platform binnen de Nederlandse Baseline voor Veilige Cloud.