Azure Applications: API Management Beveiliging In Applicatie-architecturen

💼 Management Samenvatting

Voor moderne Azure Applications vormen API's de ruggengraat van integraties tussen front-end, back-end en ketenpartners. Azure API Management fungeert hierbij als beveiligde toegangspoort, maar alleen wanneer het bewust is geïntegreerd in de applicatie-architectuur en voldoet aan de eisen van de Nederlandse Baseline voor Veilige Cloud, BIO en NIS2.

Aanbeveling
IMPLEMENTEER EEN STANDAARD API MANAGEMENT-BEVEILIGINGSKADER VOOR ALLE AZURE APPLICATIONS
Risico zonder
High
Risk Score
9/10
Implementatie
140u (tech: 90u)
Van toepassing op:
Azure App Service
Azure Functions
Azure API Management
Microservices
Web Apps

In veel organisaties groeien API's en integraties organisch mee met applicatieontwikkeling. Nieuwe microservices, mobiele apps en externe leveranciers koppelen zich rechtstreeks op back-end endpoints of via minimaal geconfigureerde API Management-instanties. Zonder een expliciet beveiligingsontwerp ontstaan sluiproutes: beheer-API's die per ongeluk publiek bereikbaar zijn, test-omgevingen die productiesleutels gebruiken, of applicaties die tokens niet goed valideren. Voor Nederlandse overheidsorganisaties kan één zwak beveiligde API leiden tot ongeautoriseerde toegang tot basisregistraties, zaaksystemen of persoonsgegevens. Daarnaast vragen auditors en toezichthouders steeds nadrukkelijker naar aantoonbare maatregelen op API-niveau: hoe is authenticatie ingericht, welke autorisatiepatronen worden gebruikt, welke logging is geconfigureerd en hoe wordt misbruik gedetecteerd? Zonder integraal beeld vanuit applicatieperspectief blijft API Management een geïsoleerde gateway in plaats van een volwaardig onderdeel van de beveiligingsarchitectuur.

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

Implementatie

Dit artikel beschrijft hoe u Azure API Management structureel integreert in uw Azure Application-architectuur als beveiligingslaag rond alle API's. We behandelen de rol van API Management in een Zero Trust-architectuur, ontwerpkeuzes voor het scheiden van interne en externe API-oppervlakken, standaard security policies voor tokenvalidatie, throttling en inputvalidatie, en de inrichting van logging en monitoring die direct aansluit op SOC- en auditprocessen. De nadruk ligt op praktische toepassing binnen Nederlandse overheidsorganisaties: hoe u ontwikkelteams standaardpatronen biedt, hoe u productieketens beschermt zonder innovatie te blokkeren, en hoe u met het bijbehorende PowerShell-script periodiek kunt toetsen of uw API Management-instanties daadwerkelijk voldoen aan de overeengekomen beveiligingsstandaarden.

De rol van API Management in Azure Application-architecturen

Wanneer organisaties Azure Applications ontwikkelen, ontstaat al snel een landschap van web apps, function apps, logic apps en achterliggende databronnen. Zonder centrale regie eindigen veel integraties in point-to-point verbindingen: front-ends die rechtstreeks met back-ends praten, mobiele apps die endpoints benaderen zonder gateway, of ketenpartners die individuele services aanroepen via custom endpoints. Dit leidt tot een versnipperd beveiligingsbeeld waarin elk team zijn eigen authenticatie- en autorisatiemechanismen bedenkt, logging ad-hoc inricht en DDoS-bescherming, schema-validatie of rate limiting zelden consequent worden toegepast. Azure API Management biedt de mogelijkheid om deze wildgroei terug te brengen tot een beheersbare, centrale laag waarin alle externe en een groot deel van de interne API-stromen samenkomen. Vanuit applicatie-architectuurperspectief wordt API Management daarmee geen optionele add-on, maar een kerncomponent in de beveiligings- en integratiestrategie.

In een volwassen architectuur wordt onderscheid gemaakt tussen verschillende API-oppervlakken: een externe façade die door burgers, bedrijven en ketenpartners wordt gebruikt; interne API's voor samenwerking tussen microservices en applicatiecomponenten; en beheer- of onderhouds-API's die uitsluitend toegankelijk zijn voor operations- en ontwikkelteams. Voor elk van deze oppervlakken definieert u aparte API Management-instanties of ten minste gescheiden API-producten en policies. Externe façades krijgen de strengste beveiliging: verplichte integratie met Microsoft Entra ID, uitgebreide JWT-validatie, restrictieve CORS-configuraties, rate limiting op basis van abonnementen en IP-filtering, en data masking voor gevoelige velden in logging. Interne API's leunen sterker op netwerksegmentatie, private endpoints en managed identities, maar blijven dezelfde principes voor tokenvalidatie en logging volgen. Beheer-API's worden verborgen achter beheernetwerken, just-in-time toegangsmechanismen en aanvullende authenticatie-eisen, zoals step-up MFA of certificaatgebaseerde toegang.

Cruciaal is dat deze keuzes worden vastgelegd in een architectuurkader dat standaard is voor alle Azure Applications binnen de organisatie. Nieuwe applicaties krijgen niet de vrijheid om willekeurig wel of geen API Management te gebruiken, maar kiezen uit een beperkt aantal goedgekeurde patronen die aansluiten op de Nederlandse Baseline voor Veilige Cloud. Dit kader beschrijft onder meer welke soorten API's altijd via API Management moeten lopen, welke minimale beveiligingsinstellingen gelden per risicoklasse, hoe u omgaat met test-, acceptatie- en productieomgevingen, en hoe logging en monitoring zijn ingericht. Door deze afspraken te combineren met geautomatiseerde deployment-templates – bijvoorbeeld Bicep of Terraform die API Management, policies, diagnostic settings en private endpoints standaard configureren – ontstaat een herhaalbare inrichting. Architecten en CISO's houden overzicht en kunnen aantoonbaar maken dat alle Azure Applications dezelfde basisbeveiliging hanteren, terwijl ontwikkelteams profiteren van een voorspelbaar platform dat beveiliging grotendeels als ingebouwde dienst aanbiedt.

Identiteit, authenticatie en integratie met Azure API Management

Gebruik PowerShell-script api-management-security.ps1 (functie Invoke-Monitoring) – Inventariseert Azure API Management-services en beoordeelt of kernbeveiligingsmaatregelen – zoals TLS, logging en managed identities – aanwezig zijn en voldoet aan de afgesproken drempelwaarden..

Voor applicatieteams is de integratie tussen Azure Applications en Azure API Management in de eerste plaats een identiteitsvraagstuk. Alle productie-API's moeten worden beveiligd met moderne, token-gebaseerde authenticatie op basis van OAuth2 en OpenID Connect, waarbij Microsoft Entra ID fungeert als centrale identity provider. In de praktijk betekent dit dat elke API die via API Management wordt ontsloten, een bijbehorende app-registratie heeft in Entra ID, waarin scopes en app-rollen zijn gedefinieerd die precies aansluiten op de functionaliteit van de API. Front-end applicaties – bijvoorbeeld een burgerportaal – verkrijgen tokens via de authorization code flow met PKCE, terwijl backend-services en integraties gebruikmaken van client credentials of managed identities. In alle gevallen wordt de API beschermd door validate-jwt-policies in API Management die handtekeningen, issuer, audience, vervaltijd en relevante claims strikt controleren voordat verkeer wordt doorgelaten naar de achterliggende Azure Application.

Vanuit het perspectief van de Azure Application is het belangrijk dat tokenvalidatie niet alleen op gateway-niveau plaatsvindt, maar ook binnen de applicatie zelf. Dit geldt zowel voor App Services als Functions. De applicatie moet JWT-tokens verifiëren met dezelfde parameters als API Management: de juiste issuer-URL, de correcte audience en noodzakelijke claims zoals rollen of groepen. Dit vormt een extra beveiligingslaag voor het geval een gatewayconfiguratie onbedoeld wordt omzeild, bijvoorbeeld door een misconfiguratie of doordat een intern endpoint toch extern bereikbaar blijkt te zijn. Daarnaast moeten applicaties correct omgaan met tokenverversing, foutafhandeling bij verlopen of ongeldig verklaarde tokens, en het afhandelen van sessies na role-changes of intrekking van rechten. Voor service-to-service scenario's is het gebruik van managed identities de norm: App Services en Functions authenticeren zich bij API Management en achterliggende services zonder dat secrets of certificaten in code of configuratie hoeven te worden opgeslagen. Dit vermindert het risico op credential leakage aanzienlijk en vereenvoudigt beheer, mits alle betrokken resources correct zijn geconfigureerd.

Een volwassen integratie omvat ook conditional access en contextbewuste toegangsbeslissingen. Voor API's die gevoelige gegevens of kritieke processen ontsluiten, kan het nodig zijn om aanvullende eisen te stellen, zoals verplichte MFA voor beheerders, blokkeren van toegang vanuit hoog-risicolocaties of het eisen van een compliant device. Deze policies worden in Entra ID geconfigureerd en werken samen met de API Management-configuratie: wanneer een risico wordt gedetecteerd, kan toegang tot de API volledig worden geblokkeerd of worden beperkt tot specifieke bewerkingen. Applicatieteams moeten hier rekening mee houden in hun ontwerp: foutmeldingen en user flows moeten duidelijk communiceren waarom toegang wordt geweigerd en welke stappen een gebruiker kan nemen om alsnog toegang te krijgen. Voor dienst-naar-dienstscenario's kan een vergelijkbare risicogestuurde aanpak worden ingevoerd door de privileges van service principals en managed identities strikt te beperken en periodiek te herzien, waarbij afwijkingen worden gedetecteerd via het monitoring- en rapportagescript.

Policies voor validatie, bedreigingsbescherming en performancebeheersing

Gebruik PowerShell-script api-management-security.ps1 (functie Invoke-Remediation) – Genereert een overzicht van API Management-instanties met beveiligingsgaps en tekstuele aanbevelingen voor verbeteringen op het gebied van logging, private endpoints en identity-integratie..

Naast authenticatie spelen policies voor validatie en bedreigingsbescherming een centrale rol in de beveiliging van Azure Applications die via API Management worden ontsloten. Alle inkomende requests moeten worden gecontroleerd op structuur, type en omvang voordat zij de achterliggende applicaties bereiken. Voor JSON-API's betekent dit het gebruik van schema-validatiepolicies die controleren of payloads voldoen aan het gedefinieerde contract, inclusief verplichte velden en toegestane waarden. Hiermee worden malformed of onverwachte payloads vroegtijdig geblokkeerd, wat de kans op injectie-aanvallen, parsingfouten en onvoorziene codepaden binnen de applicatie reduceert. Voor XML- of SOAP-achtige API's geldt hetzelfde principe, aangevuld met bescherming tegen XML External Entity (XXE)-aanvallen en andere parser-kwetsbaarheden. Deze validatie moet niet worden gezien als vervanging van inputvalidatie in de applicatie zelf, maar als extra schild in een defense-in-depth strategie.

Threat protection in API Management richt zich op het herkennen en blokkeren van gedrag dat kan wijzen op misbruik of aanvallen. Rate limiting en throttling policies beperken het aantal requests per tijdseenheid per abonnement, client-ID of IP-adres en beschermen zo zowel de gateway als de achterliggende Azure Applications tegen overbelasting. In combinatie met IP-filtering en, waar mogelijk, private endpoints, ontstaat een robuuste perimeter: interne beheer- en onderhouds-API's worden alleen toegankelijk vanaf beheernetwerken of specifieke VPN's, terwijl publieke API's alsnog drempels hebben die geautomatiseerde scraping en brute-force pogingen bemoeilijken. Aanvullende policies kunnen worden ingezet voor data masking – het afschermen van gevoelige velden zoals BSN of andere identificerende gegevens in responses en logs – en voor het blokkeren van bekende aanvalspatronen, bijvoorbeeld door het detecteren van SQL- of command-injection in queryparameters en headers. Voor applicatieteams is het belangrijk om deze policies als standaardonderdeel van de deployment-pijplijn te zien en niet als optionele "nice to have"; zonder deze laag worden back-end services direct blootgesteld aan elke fout of aanval die de gateway passeert.

Performancebeheersing en beveiliging zijn onlosmakelijk met elkaar verbonden. Overmatig generieke policies op elk endpoint kunnen latency en kosten verhogen, terwijl te weinig policies het risico op incidenten vergroot. Daarom is het zinvol om een gelaagde aanpak te kiezen: generieke baseline-policies op product- of API-niveau die minimale eisen afdwingen voor alle services, aangevuld met specifieke policies op operation-niveau voor hoog-risico-endpoints. Een kritisch beheerendpoint kan bijvoorbeeld strengere rate limits en aanvullende logging krijgen dan een publieke lees-API met uitsluitend geaggregeerde, niet-persoonsgebonden data. Door metrics uit Application Insights en Log Analytics te gebruiken – bijvoorbeeld gemiddelde response tijden per endpoint, aantal geblokkeerde requests door policies en foutcodes – kunnen architecten en ontwikkelteams de balans tussen beveiliging en performance continu bijsturen. Het PowerShell-script helpt hierbij door per API Management-instantie een beknopte compliancescore te berekenen, die kan worden gebruikt om omgevingen met verhoogd risico of achterblijvende implementatie vroegtijdig te signaleren.

Monitoring, governance en compliance voor API-beveiliging in applicatielandschappen

Een veilig ingerichte API Management-laag is geen statisch eindpunt, maar een doorlopend proces van monitoring, bijsturen en verantwoording. Voor Nederlandse overheidsorganisaties betekent dit dat API-beveiliging expliciet onderdeel moet zijn van de governance-structuur rond cloud en applicatieontwikkeling. CISO-organisatie, architectuurboard en productowners spreken gezamenlijk af welke drempelwaarden gelden voor API Management-configuraties – bijvoorbeeld een minimale compliancescore per omgeving, verplichte logging naar een centrale Log Analytics-werkruimte en het structureel gebruik van managed identities voor alle dienst-naar-dienstcommunicatie. Het bijbehorende PowerShell-script automatiseert een deel van deze governance door periodiek feitelijke configuratiegegevens op te halen en om te zetten in concreet leesbare rapportages voor security- en managementteams. Hierdoor ontstaat een herhaalbare cyclus: meten, analyseren, verbeteren en opnieuw meten, die direct aantoonbaar is richting auditors en toezichthouders.

Monitoring strekt zich uit over meerdere lagen: API Management zelf, de achterliggende Azure Applications en het bredere platform. In API Management worden diagnostische logs en metrics geconfigureerd naar Log Analytics of een SIEM, waar dashboards inzicht geven in request-volumes, foutcodes, authenticatiefouten, policy-blokkades en latency. De achterliggende App Services en Functions leveren aanvullende telemetrie via Application Insights, zodat correlatie mogelijk is tussen gateway-events en applicatiegedrag. Security operations teams gebruiken deze gegevens om afwijkingen te detecteren: plotselinge pieken in verkeer naar specifieke endpoints, herhaalde 401- of 403-responses vanaf bepaalde IP-adressen, of een toename van requests die door schema-validatie worden geweigerd. In incidentresponsprocessen worden deze signalen gekoppeld aan draaiboeken voor containment en herstel, inclusief het tijdelijk blokkeren van problematische clients, het aanscherpen van policies of het aanpassen van limieten. Door alle stappen en bevindingen gestructureerd vast te leggen, ontstaat een audittrail die rechtstreeks bruikbaar is voor BIO- en NIS2-verantwoording.

Vanuit complianceperspectief sluit een volwassen API Management-inrichting direct aan op de eisen uit BIO, ISO 27001 en de Nederlandse Baseline voor Veilige Cloud. Governance-documenten beschrijven de gekozen patronen en standaarden; technische configuraties in Azure tonen de daadwerkelijke implementatie; en periodieke rapportages uit scripts en monitoringtools leveren het bewijs dat deze standaarden ook in de praktijk worden nageleefd. Voor applicatieteams betekent dit dat API-beveiliging niet langer een eenmalig project is, maar een vast onderdeel van de ontwikkel- en beheercyclus: iedere nieuwe API wordt standaard voorzien van policies, logging en monitoring; iedere wijziging wordt getoetst aan het architectuurkader; en iedere productie-release wordt vergezeld van een geactualiseerde compliancemeting. Zo wordt API Management een integraal, aantoonbaar veilig onderdeel van de applicatie-architectuur, in plaats van een losse component waar pas naar wordt gekeken wanneer zich een incident voordoet.

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
<# ================================================================================ AZURE POWERSHELL SCRIPT - Nederlandse Baseline voor Veilige Cloud ================================================================================ .SYNOPSIS Azure Applications: API Management beveiliging .DESCRIPTION Controleert of Azure API Management-services die Azure Applications ontsluiten zijn voorzien van essentiële beveiligingsmaatregelen, waaronder: - TLS 1.2+ configuratie - Diagnostische logging naar Log Analytics / Event Hubs - Managed identities voor veilige dienst-naar-dienstcommunicatie - Private endpoints voor netwerkisolatie (waar passend) In Monitoring-modus toont het script een samenvattend overzicht en compliancescore per API Management-service. In Remediation-modus wordt een tekstueel adviesrapport gegeven met concrete vervolgstappen. .NOTES Filename: api-management-security.ps1 Author: Nederlandse Baseline voor Veilige Cloud Created: 2025-11-26 Last Modified: 2025-11-26 Version: 1.0 Related JSON: content/azure/application/api-management-security.json .PARAMETER WhatIf Toont wat het script zou doen zonder daadwerkelijk wijzigingen of bestanden aan te maken. .PARAMETER Monitoring Voert een uitgebreide compliancecheck uit en toont resultaten in de console. .PARAMETER Remediation Genereert een tekstueel overzicht van niet-conforme API Management-services en aanbevelingen voor verbeteracties. .PARAMETER SubscriptionId Optionele lijst met SubscriptionId's om de scope van de controle te beperken. Als geen waarden worden opgegeven, wordt de huidige context of alle toegankelijke abonnementen gebruikt (afhankelijk van RBAC-rechten). .PARAMETER LocalDebug Draait het script in lokale debugmodus met gesimuleerde data, zonder Azure verbinding of calls naar API Management. Te gebruiken voor snelle testen. .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. #> #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 = "Azure Applications: API Management beveiliging" $PolicyDescription = "Controleert of Azure API Management-services die Azure Applications ontsluiten zijn voorzien van essentiële beveiligingsmaatregelen (TLS, logging, managed identities, private endpoints)." 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 wanneer LocalDebug is uitgeschakeld. #> [CmdletBinding()] param() if ($LocalDebug) { Write-Verbose "LocalDebug 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 $context = Get-AzContext -ErrorAction SilentlyContinue } if ($context) { Write-Verbose "Verbonden met Azure: $($context.Subscription.Name)" } else { Write-Warning "Geen geldige Azure-context gevonden na Connect-AzAccount." } } catch { Write-Error "Kon geen verbinding maken met Azure: $_" throw } } function Get-DebugApiManagementData { <# .SYNOPSIS Levert gesimuleerde API Management-data voor lokale tests. #> [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 = $false HasManagedIdentity = $false HasPrivateEndpoint = $false HasCustomDomains = $false SecurityComplianceScore = 50 }, [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 per API Management-service. #> [CmdletBinding()] param() if ($LocalDebug) { Write-Verbose "Gebruik van gesimuleerde API Management-data (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 { $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 } # TLS-configuratie (Azure API Management ondersteunt standaard TLS 1.2+) $hasTls12OrHigher = $true # Diagnostische 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" } # Managed identity $hasManagedIdentity = $false try { if ($apimService.Identity -and $apimService.Identity.PrincipalId) { $hasManagedIdentity = $true } } catch { Write-Verbose "Kon identity configuratie niet ophalen voor $serviceName" } # Private endpoints $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" } # Custom domains (indicatie voor certificaatbeheer) $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" } # Compliancescore bepalen (eenvoudige wegingsfactoren) $complianceScore = 0 if ($hasTls12OrHigher) { $complianceScore += 20 } if ($hasDiagnosticLogging) { $complianceScore += 25 } if ($hasManagedIdentity) { $complianceScore += 15 } if ($hasPrivateEndpoint) { $complianceScore += 20 } if ($hasCustomDomains) { $complianceScore += 10 } if ($apimService.Sku.Name -in @('Premium', 'Isolated')) { $complianceScore += 10 } if ($complianceScore -gt 100) { $complianceScore = 100 } $subscriptionName = (Get-AzSubscription -SubscriptionId $subscriptionIdValue -ErrorAction SilentlyContinue).Name $results += [PSCustomObject]@{ SubscriptionId = $subscriptionIdValue SubscriptionName = $subscriptionName 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-beveiliging. .OUTPUTS PSCustomObject met samenvattende 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-application" IsCompliant = $true Timestamp = Get-Date Details = "Er zijn geen API Management-services gevonden in de huidige scope." Recommendations = @() Services = @() } } # Minimale drempelwaarde voor basiscompliance $nonCompliant = $services | Where-Object { $_.SecurityComplianceScore -lt 70 } $isCompliant = ($nonCompliant.Count -eq 0) $details = if ($isCompliant) { "Alle gevonden API Management-services voldoen aan de minimale beveiligingsdrempel." } else { "Een of meer API Management-services missen essentiële beveiligingsconfiguraties en voldoen niet aan de minimale drempel van 70%." } $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 stuur logs naar een centrale Log Analytics-werkruimte of SIEM." $recommendations += "Configureer managed identities voor alle API Management-services die met andere Azure-resources communiceren." $recommendations += "Implementeer private endpoints voor productie- en hoog-risico-omgevingen om netwerkisolatie te verbeteren." $recommendations += "Gebruik custom domains met geldig certificaat voor alle publieke productie-API's." $recommendations += "Documenteer de gekozen beveiligingsconfiguraties en toets deze periodiek tegen de Nederlandse Baseline voor Veilige Cloud." } return [PSCustomObject]@{ ScriptName = "api-management-security-application" 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: $($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 minimale beveiligingsdrempel." -ForegroundColor Green } else { Write-Host "`n❌ NON-COMPLIANT - Eén of meer API Management-services missen essentiële beveiligingsconfiguraties." -ForegroundColor Red if ($result.Recommendations) { 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 met een lage beveiligingsscore. #> [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 voldoen aan de minimale beveiligingsdrempel. Geen remediatie nodig." -ForegroundColor Green return $result } Write-Host "`nNiet-conforme API Management-services (score lager dan 70%):" -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 (dev/test/acc/prod) en kriticiteit." -ForegroundColor Yellow Write-Host "2. Implementeer TLS 1.2+ met sterke cipher suites en valide certificaten." -ForegroundColor Yellow Write-Host "3. Schakel diagnostische logging in en stuur logs naar Log Analytics of uw SIEM." -ForegroundColor Yellow Write-Host "4. Configureer managed identities voor veilige toegang tot andere Azure-resources." -ForegroundColor Yellow Write-Host "5. Overweeg private endpoints voor productie-omgevingen en hoog-risico-API's." -ForegroundColor Yellow Write-Host "6. Leg de gekozen configuraties vast in architectuur- en beveiligingsdocumentatie." -ForegroundColor Yellow if ($WhatIf) { Write-Host "`nWhatIf is ingeschakeld: er worden geen wijzigingen doorgevoerd; alleen een rapport is getoond." -ForegroundColor Cyan } return $result } try { Write-Host "`n========================================" -ForegroundColor Cyan Write-Host "Script: api-management-security (Azure Applications)" -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 Write-Host "Alle gecontroleerde API Management-services voldoen aan de minimale beveiligingsdrempel." -ForegroundColor Green } else { Write-Host "`n⚠️ VERBETERING AANBEVOLEN" -ForegroundColor Yellow Write-Host "Eén of meer API Management-services hebben een lage beveiligingsscore." -ForegroundColor Yellow 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 een standaard beveiligingskader rond Azure API Management kunnen applicatieteams per project eigen keuzes maken, wat leidt tot inconsistente beveiliging, openstaande beheer-API's, ontbrekende logging en beperkte zichtbaarheid op misbruik. Eén zwak beveiligde gateway of API kan voldoende zijn om gevoelige gegevens of kritieke systemen te compromitteren, met juridische, financiële en reputatieschade tot gevolg.

Management Samenvatting

Integreer Azure API Management als centrale beveiligingslaag in alle Azure Application-architecturen. Standaardiseer authenticatie via Microsoft Entra ID, implementeer validate-jwt-, throttling- en validatiepolicies, zorg voor centrale logging en monitoring en gebruik het bijbehorende PowerShell-script om periodiek de feitelijke beveiligingsstatus te meten. Zo ontstaat een herhaalbare, aantoonbaar veilige aanpak die voldoet aan de Nederlandse Baseline voor Veilige Cloud, BIO, ISO 27001 en NIS2.