Beveiligingsconfiguratie Voor Azure OpenAI Service In Nederlandse Overheidsorganisaties

💼 Management Samenvatting

Azure OpenAI Service biedt Nederlandse overheidsorganisaties toegang tot geavanceerde taalmodellen, maar vereist een robuuste beveiligingsconfiguratie om te voldoen aan BIO, NIS2 en AVG-vereisten. Een correct geconfigureerde beveiligingsarchitectuur voorkomt onbevoegde toegang, datalekken, misbruik en compliance-risico's.

Aanbeveling
RICHT EEN COMPREHENSIEF BEVEILIGINGSCONFIGURATIE IN VOOR AZURE OPENAI
Risico zonder
High
Risk Score
9/10
Implementatie
220u (tech: 100u)
Van toepassing op:
Azure OpenAI Service
Azure
Cognitive Services
Publieke Sector

Zonder adequate beveiligingsconfiguratie loopt Azure OpenAI Service het risico op onbevoegde toegang tot gevoelige data, datalekken via prompts of responses, misbruik van API-credentials, netwerkaanvallen en niet-naleving van wettelijke verplichtingen. Voor Nederlandse overheidsorganisaties kan dit leiden tot ernstige beveiligingsincidenten, reputatieschade, juridische aansprakelijkheid en kritische auditbevindingen. Door een gelaagde beveiligingsaanpak te implementeren met sterke authenticatie, netwerkisolatie, encryptie, toegangsbeheer en monitoring, wordt Azure OpenAI een veilig en beheersbaar platform dat voldoet aan alle relevante normen.

PowerShell Modules Vereist
Primary API: Azure OpenAI API, Azure Management API, Azure Key Vault
Connection: Connect-AzAccount
Required Modules: Az.Accounts, Az.Resources, Az.CognitiveServices, Az.KeyVault, Az.Network

Implementatie

Dit artikel beschrijft een praktische beveiligingsconfiguratie voor Azure OpenAI Service specifiek voor Nederlandse overheidsorganisaties. We behandelen authenticatie en autorisatie met Azure AD en managed identities, netwerkbeveiliging via private endpoints en virtual networks, encryptie in transit en at rest met customer-managed keys, toegangsbeheer via RBAC en API keys management, logging en monitoring voor security events, en integratie met bestaande security- en compliancekaders. Het doel is een concrete, toetsbare set beveiligingsmaatregelen die CISO's, security officers en beheerteams in staat stelt om Azure OpenAI aantoonbaar veilig in te richten binnen de Nederlandse publieke sector.

Authenticatie en autorisatie voor Azure OpenAI

Authenticatie en autorisatie vormen de eerste verdedigingslinie voor Azure OpenAI Service. Nederlandse overheidsorganisaties moeten ervoor zorgen dat alleen geautoriseerde gebruikers en applicaties toegang hebben tot de service, en dat deze toegang wordt gecontroleerd op basis van het principe van least privilege. Azure OpenAI ondersteunt verschillende authenticatiemethoden: API keys voor eenvoudige scenario's, Azure Active Directory (Entra ID) voor geïntegreerde identiteitsbeheer, en managed identities voor service-to-service authenticatie zonder credentials in code op te slaan.

Voor productie-omgevingen in de publieke sector is het essentieel om Azure AD-authenticatie te gebruiken in plaats van API keys. API keys zijn statisch, moeilijk te roteren, en bieden geen granulariteit in toegangscontrole. Azure AD daarentegen maakt het mogelijk om gebruikers en applicaties te authenticeren via OAuth 2.0 en OpenID Connect, waarbij toegang wordt beheerd via Azure RBAC-rollen zoals 'Cognitive Services User', 'Cognitive Services Contributor' of custom rollen met specifieke rechten. Dit sluit naadloos aan bij bestaande identity governance-processen en maakt het mogelijk om toegang centraal te beheren, te monitoren en te auditen.

Managed identities vormen de meest veilige optie voor applicaties die Azure OpenAI aanroepen vanuit Azure-services zoals Azure Functions, App Services of Virtual Machines. Door gebruik te maken van system-assigned of user-assigned managed identities hoeven er geen credentials te worden opgeslagen in code, configuratiebestanden of environment variables, wat het risico op credential leakage aanzienlijk vermindert. Managed identities worden automatisch beheerd door Azure, kunnen worden gekoppeld aan specifieke resources, en maken het mogelijk om toegang te verlenen op basis van de identiteit van de resource in plaats van gedeelde credentials.

Naast authenticatie moet autorisatie worden geconfigureerd via Azure RBAC. Organisaties moeten expliciete rollen definiëren voor verschillende gebruikersgroepen: ontwikkelaars die experimenteren met Azure OpenAI, applicaties die de service in productie gebruiken, beheerders die configuraties aanpassen, en auditors die toegang nodig hebben voor compliance-controles. Door gebruik te maken van Azure AD-groepen kunnen deze rollen centraal worden beheerd en gekoppeld aan bestaande functie- en mandaatstructuren. Het bijbehorende PowerShell-script helpt beheerders om periodiek te controleren of RBAC-configuraties correct zijn ingesteld en of er geen onbevoegde toegang is verleend.

Netwerkbeveiliging en isolatie

Netwerkbeveiliging is cruciaal om te voorkomen dat Azure OpenAI-verkeer wordt onderschept, gemanipuleerd of blootgesteld aan onbevoegde partijen. Standaard is Azure OpenAI toegankelijk via het publieke internet, wat betekent dat alle API-calls over het openbare netwerk gaan. Voor Nederlandse overheidsorganisaties die werken met gevoelige data of strikte compliance-vereisten is dit vaak onacceptabel. Daarom moet netwerkisolatie worden geïmplementeerd via private endpoints, virtual networks en network security groups.

Private endpoints maken het mogelijk om Azure OpenAI te benaderen via een privé-IP-adres binnen een Azure Virtual Network, waardoor verkeer nooit het publieke internet verlaat. Dit biedt verschillende voordelen: verkeer blijft binnen de Azure-backbone, netwerkverkeer kan worden gecontroleerd via Network Security Groups of Azure Firewall, en toegang kan worden beperkt tot specifieke subnetten of resources. Voor organisaties die hybride netwerken hebben met ExpressRoute of VPN-verbindingen, kunnen private endpoints worden geconfigureerd zodat on-premises systemen ook via privé-verbindingen toegang hebben tot Azure OpenAI zonder via het publieke internet te gaan.

Virtual Network-integratie maakt het mogelijk om Azure OpenAI-resources te koppelen aan specifieke virtual networks, waarbij toegang kan worden beperkt tot resources binnen die netwerken. Dit voorkomt dat resources buiten de geautoriseerde netwerken toegang hebben tot de service, zelfs als ze beschikken over geldige credentials. Network Security Groups kunnen worden gebruikt om aanvullende firewallregels te definiëren op basis van source IP-adressen, poorten en protocollen, waardoor een defense-in-depth-benadering ontstaat waarbij meerdere lagen van netwerkbeveiliging elkaar aanvullen.

Voor organisaties die extra beveiliging nodig hebben, kan Azure Private Link worden gecombineerd met service endpoints en Azure Firewall Premium voor geavanceerde threat protection. Azure Firewall Premium biedt TLS-inspectie, intrusion detection en prevention, en URL filtering, waardoor ook binnen private netwerken verdacht verkeer kan worden gedetecteerd en geblokkeerd. Het bijbehorende PowerShell-script kan helpen om te controleren of private endpoints correct zijn geconfigureerd, of network security groups de juiste regels bevatten, en of er geen onbeveiligde publieke toegang is ingeschakeld.

Encryptie in transit en at rest

Gebruik PowerShell-script security-configuration.ps1 (functie Invoke-Monitoring) – Controleert of Azure OpenAI-resources zijn geconfigureerd met adequate encryptie, private endpoints en toegangsbeheer, en rapporteert over compliance met beveiligingsvereisten..

Encryptie is essentieel om te voorkomen dat data worden onderschept of gelezen door onbevoegde partijen, zowel tijdens transport over het netwerk als wanneer data worden opgeslagen. Azure OpenAI gebruikt standaard TLS 1.2 of hoger voor alle API-communicatie, wat encryptie in transit garandeert. Organisaties moeten echter expliciet controleren dat alleen moderne TLS-versies worden gebruikt en dat verouderde protocollen zoals TLS 1.0 of 1.1 zijn uitgeschakeld. Daarnaast moeten API-clients worden geconfigureerd om alleen verbindingen te accepteren met geldige certificaten en om certificate pinning te gebruiken waar mogelijk om man-in-the-middle-aanvallen te voorkomen.

Voor encryptie at rest biedt Azure OpenAI standaard encryptie met door Microsoft beheerde keys. Voor Nederlandse overheidsorganisaties die strikte controle willen over encryptiekeys, bijvoorbeeld vanwege compliance-vereisten of data sovereignty-overwegingen, kan customer-managed keys (CMK) worden geconfigureerd via Azure Key Vault. Met CMK worden encryptiekeys beheerd door de organisatie zelf, kunnen keys worden geroteerd volgens eigen schema's, en kunnen keys worden beschermd met hardware security modules (HSM) voor extra beveiliging. Dit is met name relevant voor high-risk use-cases waarbij gevoelige persoonsgegevens of vertrouwelijke overheidsinformatie worden verwerkt.

Azure Key Vault-integratie maakt het mogelijk om encryptiekeys centraal te beheren, te roteren en te monitoren. Keys kunnen worden beschermd met soft delete en purge protection om te voorkomen dat keys per ongeluk worden verwijderd, en toegang tot keys kan worden gecontroleerd via Azure RBAC en Key Vault access policies. Organisaties moeten een key rotation-strategie definiëren waarbij keys regelmatig worden vervangen, oude keys worden gearchiveerd voor decryptie van historische data, en key usage wordt gelogd voor audit-doeleinden. Het bijbehorende PowerShell-script kan helpen om te controleren of CMK correct is geconfigureerd, of keys voldoende worden beschermd, en of key rotation-processen worden nageleefd.

Naast encryptie van data zelf moeten organisaties ook aandacht besteden aan de beveiliging van metadata, logs en audit trails. Deze informatie kan eveneens gevoelig zijn en moet worden beschermd tegen onbevoegde toegang. Door gebruik te maken van Azure Monitor en Log Analytics met customer-managed keys kunnen ook logs worden versleuteld met organisatie-eigen keys, waardoor een end-to-end encryptie-aanpak ontstaat waarbij alle data, ongeacht waar deze zich bevinden, worden beschermd met dezelfde hoge standaarden.

Toegangsbeheer en API keys management

Toegangsbeheer voor Azure OpenAI moet worden ingericht volgens het principe van least privilege, waarbij gebruikers en applicaties alleen de minimale rechten krijgen die nodig zijn voor hun specifieke taken. Dit voorkomt onbevoegd gebruik, datalekken en kostenoverschrijdingen. In Azure kan toegangsbeheer worden geregeld via Azure RBAC, waarbij rollen worden gedefinieerd zoals 'Cognitive Services OpenAI User', 'Cognitive Services OpenAI Contributor' of custom rollen met specifieke rechten per model of functie.

Voor organisaties die nog steeds API keys gebruiken, bijvoorbeeld voor legacy-applicaties of externe integraties, is het essentieel om een strikt key management-proces in te richten. API keys moeten worden behandeld als gevoelige credentials en moeten worden opgeslagen in beveiligde locaties zoals Azure Key Vault, environment variables met beperkte toegang, of secret management tools. Keys moeten regelmatig worden geroteerd, bijvoorbeeld elk kwartaal of na een security-incident, en oude keys moeten worden gerevoked zodra nieuwe keys actief zijn. Het bijbehorende PowerShell-script kan helpen om te monitoren welke API keys actief zijn, wanneer deze zijn aangemaakt, en of rotation-schema's worden nageleefd.

Rate limiting is een belangrijke technische control die voorkomt dat individuele gebruikers of applicaties overmatig gebruik maken van Azure OpenAI, wat kan leiden tot hoge kosten, performance-problemen of misbruik. Door per gebruiker, applicatie of subscription limieten in te stellen op het aantal API-calls per minuut, uur of dag, kunnen organisaties gebruik beheersen en anomalieën detecteren. Rate limits moeten worden afgestemd op de verwachte use-cases: voor experimentele of development-omgevingen kunnen lagere limieten worden ingesteld, terwijl productie-omgevingen met goedgekeurde use-cases hogere limieten kunnen krijgen. Monitoring van rate limit violations kan helpen om misbruik of onbedoelde overconsumptie snel te signaleren.

Tot slot moet toegangsbeheer worden gekoppeld aan identity governance. Wanneer medewerkers van rol veranderen of de organisatie verlaten, moeten hun toegangsrechten tot Azure OpenAI automatisch worden aangepast of ingetrokken. Dit kan worden geautomatiseerd via integratie met HR-systemen, Azure AD lifecycle management of identity governance tools. Door deze koppeling te maken, voorkomt u dat voormalige medewerkers of personen met verouderde rollen nog steeds toegang hebben tot gevoelige AI-diensten, wat een belangrijk security- en compliance-risico vormt.

Logging, monitoring en security events

Gebruik PowerShell-script security-configuration.ps1 (functie Invoke-Remediation) – Analyseert beveiligingsconfiguraties en genereert aanbevelingen voor verbetering van authenticatie, netwerkbeveiliging, encryptie en toegangsbeheer..

Uitgebreide logging en monitoring zijn essentieel om security events te detecteren, incidenten te onderzoeken en compliance te waarborgen. Azure OpenAI integreert met Azure Monitor en Log Analytics, waardoor alle API-calls, authenticatiepogingen, configuratiewijzigingen en fouten kunnen worden gelogd. Voor Nederlandse overheidsorganisaties is het belangrijk om te bepalen welke events moeten worden gelogd, hoe lang logs moeten worden bewaard (bijvoorbeeld 7 jaar voor bepaalde overheidsdocumenten), en wie toegang heeft tot logdata voor security- en audit-doeleinden.

Security events die moeten worden gemonitord omvatten onder andere: mislukte authenticatiepogingen, ongebruikelijke API-usage patterns die kunnen wijzen op misbruik, wijzigingen aan beveiligingsconfiguraties zoals RBAC-rollen of network security groups, toegangspogingen van onbekende IP-adressen of locaties, en rate limit violations. Door gebruik te maken van Azure Sentinel of andere SIEM-oplossingen kunnen deze events worden geaggregeerd, geanalyseerd en gekoppeld aan security playbooks voor geautomatiseerde respons.

Diagnostic settings moeten worden geconfigureerd om logs te verzenden naar een centrale Log Analytics-werkruimte, waar logs kunnen worden geanalyseerd, opgeslagen en beschermd. Voor gevoelige omgevingen kan het nodig zijn om logs te versleutelen met customer-managed keys, toegang te beperken tot geautoriseerde security teams, en logs te archiveren naar immutable storage voor lange-termijn bewaarvereisten. Het bijbehorende PowerShell-script kan helpen om te controleren of diagnostic settings correct zijn geconfigureerd, of logretentiebeleid wordt nageleefd, en of er geen ongebruikelijke toegangspogingen zijn tot logdata.

Naast technische logging vraagt security om documentatie van beveiligingsconfiguraties en wijzigingen. Dit omvat niet alleen de technische instellingen, maar ook de business rationale voor beveiligingskeuzes, de risicoanalyses die zijn uitgevoerd, de goedkeuringen die zijn verkregen en de mitigerende maatregelen die zijn genomen. Door deze documentatie te koppelen aan technische logs via referenties, tags of metadata, ontstaat een compleet beeld dat zowel technisch als bestuurlijk bruikbaar is. Dit maakt het mogelijk om bij incidenten, audits of compliance-controles snel te kunnen aantonen welke beveiligingswaarborgen zijn ingericht en hoe deze worden gemonitord en onderhouden.

Integratie met compliance- en securitykaders

Beveiligingsconfiguratie voor Azure OpenAI moet worden geïntegreerd in bestaande compliance- en securitykaders zoals BIO, NIS2, AVG en ISO 27001. Dit betekent dat beveiligingsmaatregelen worden gekoppeld aan bestaande processen voor risicomanagement, change management, incident response en audit, zodat Azure OpenAI geen uitzonderingspositie inneemt maar onderdeel wordt van de bredere informatiebeveiligingsgovernance. Door deze integratie voorkomt u dat er parallelle systemen ontstaan en dat AI-initiatieven buiten de reguliere security-governance vallen.

Voor de BIO betekent dit dat Azure OpenAI-use-cases worden beoordeeld volgens dezelfde risicoanalyses en beheersmaatregelen als andere kritieke systemen. Beveiligingsmaatregelen zoals logging, toegangsbeheer en encryptie sluiten aan bij bestaande BIO-controles, en AI-specifieke risico's worden toegevoegd aan het algemene risicoregister. Voor NIS2 betekent integratie dat beveiligingsconfiguraties worden gedocumenteerd, gemonitord en gerapporteerd volgens de vereisten voor essentiële en belangrijke entiteiten. Voor de AVG betekent integratie dat beveiligingsmaatregelen worden afgestemd op privacy-eisen, dat logging wordt geconfigureerd met respect voor persoonsgegevens, en dat data protection impact assessments (DPIA's) worden uitgevoerd voor use-cases die persoonsgegevens verwerken.

Een praktische manier om deze integratie te realiseren is door beveiligingsconfiguraties te documenteren in dezelfde formaten en systemen die worden gebruikt voor andere beveiligingsmaatregelen. Bijvoorbeeld door Azure OpenAI-configuraties op te nemen in het informatiebeveiligingsbeleid, door beveiligingsinstellingen te koppelen aan het applicatieregister, en door security-incidenten te registreren in hetzelfde incidentmanagementsysteem als andere security-incidenten. Door gebruik te maken van gestandaardiseerde tags, metadata en referenties kunnen verschillende systemen met elkaar worden gekoppeld, zodat auditors en bestuurders een integraal beeld krijgen van alle beveiligingsmaatregelen, inclusief die voor Azure OpenAI.

Tot slot vraagt compliance-integratie om periodieke validatie dat beveiligingsconfiguraties daadwerkelijk werken zoals bedoeld. Dit kan door middel van security audits, penetration tests, vulnerability scans of compliance-assessments die specifiek kijken naar de effectiviteit van beveiligingsmaatregelen voor Azure OpenAI. De uitkomsten van deze validaties moeten worden gebruikt om configuraties aan te scherpen, processen te verbeteren en training te actualiseren. Door deze validatiecyclus structureel in te bedden in bestaande audit- en complianceprocessen, blijft beveiligingsconfiguratie niet alleen op papier bestaan, maar wordt het een levend systeem dat continu wordt verbeterd en gevalideerd.

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 Beveiligingsconfiguratie Monitoring en Remediatie voor Azure OpenAI Service .DESCRIPTION Controleert of Azure OpenAI-resources zijn geconfigureerd met adequate beveiligingsmaatregelen zoals authenticatie, netwerkbeveiliging, encryptie en toegangsbeheer. Genereert aanbevelingen voor verbetering wanneer beveiligingsconfiguraties ontbreken of onvoldoende zijn. .NOTES Filename: security-configuration.ps1 Author: Nederlandse Baseline voor Veilige Cloud Created: 2025-01-15 Last Modified: 2025-01-15 Version: 1.0 Related JSON: content/azure/openai/security-configuration.json .LINK https://github.com/[org]/m365-tenant-best-practise .EXAMPLE .\security-configuration.ps1 -Monitoring Controleert of alle beveiligingsconfiguraties aanwezig zijn .EXAMPLE .\security-configuration.ps1 -Remediation Genereert aanbevelingen voor verbetering van beveiligingsconfiguraties #> #Requires -Version 5.1 #Requires -Modules Az.Accounts, Az.Resources, Az.CognitiveServices, Az.KeyVault, Az.Network [CmdletBinding()] param( [Parameter()] [switch]$WhatIf, [Parameter()] [switch]$Monitoring, [Parameter()] [switch]$Remediation ) $ErrorActionPreference = 'Stop' $VerbosePreference = 'Continue' # Configuratie $RequiredSecurityChecks = @( "AzureADAuthentication", "PrivateEndpoints", "CustomerManagedKeys", "DiagnosticLogging", "RBACConfiguration", "NetworkSecurityGroups" ) function Connect-RequiredServices { <# .SYNOPSIS Verbindt met benodigde Azure services #> [CmdletBinding()] param() Write-Verbose "Controleren van Azure verbinding..." try { $context = Get-AzContext -ErrorAction SilentlyContinue if (-not $context) { Write-Host "Verbinding maken met Azure..." -ForegroundColor Yellow Connect-AzAccount -ErrorAction Stop | Out-Null Write-Host "Verbonden met Azure" -ForegroundColor Green } else { Write-Verbose "Reeds verbonden met Azure" } } catch { Write-Error "Kon niet verbinden met Azure: $_" throw } } function Get-AzureOpenAIResources { <# .SYNOPSIS Haalt Azure OpenAI-resources op .OUTPUTS Array van Azure OpenAI-resources #> [CmdletBinding()] param() Write-Verbose "Ophalen van Azure OpenAI-resources..." try { $resources = Get-AzResource -ResourceType "Microsoft.CognitiveServices/accounts" -ErrorAction SilentlyContinue | Where-Object { $_.Kind -like "*OpenAI*" -or $_.Name -like "*openai*" } if (-not $resources) { Write-Verbose "Geen Azure OpenAI-resources gevonden" return @() } return $resources } catch { Write-Warning "Fout bij ophalen van Azure OpenAI-resources: $_" return @() } } function Test-AzureOpenAISecurityConfiguration { <# .SYNOPSIS Test of beveiligingsconfiguraties aanwezig zijn voor Azure OpenAI-resources .OUTPUTS PSCustomObject met compliance resultaten #> [CmdletBinding()] param() Write-Verbose "Controleren van Azure OpenAI beveiligingsconfiguraties..." $resources = Get-AzureOpenAIResources if ($resources.Count -eq 0) { Write-Host " Geen Azure OpenAI-resources gevonden in deze subscription" -ForegroundColor Yellow return @{ IsCompliant = $false TotalResources = 0 CompliantResources = 0 SecurityIssues = @() } } $securityIssues = @() $compliantCount = 0 foreach ($resource in $resources) { Write-Verbose "Controleren van resource: $($resource.Name)" $resourceIssues = @() # Check 1: Private Endpoints try { $privateEndpoints = Get-AzPrivateEndpoint -ErrorAction SilentlyContinue | Where-Object { $_.PrivateLinkServiceConnections.PrivateLinkServiceId -like "*$($resource.ResourceId)*" } if (-not $privateEndpoints -or $privateEndpoints.Count -eq 0) { $resourceIssues += "Geen private endpoints geconfigureerd" } } catch { $resourceIssues += "Kon private endpoints niet controleren" } # Check 2: Diagnostic Settings try { $diagSettings = Get-AzDiagnosticSetting -ResourceId $resource.ResourceId -ErrorAction SilentlyContinue if (-not $diagSettings) { $resourceIssues += "Geen diagnostic settings geconfigureerd" } } catch { $resourceIssues += "Kon diagnostic settings niet controleren" } # Check 3: Customer-Managed Keys (vereenvoudigde check) try { $resourceConfig = Get-AzCognitiveServicesAccount -ResourceGroupName $resource.ResourceGroupName -Name $resource.Name -ErrorAction SilentlyContinue if ($resourceConfig) { # Check of encryption is geconfigureerd (vereenvoudigd) if (-not $resourceConfig.Properties.encryption) { $resourceIssues += "Geen customer-managed keys geconfigureerd (gebruikt Microsoft-managed keys)" } } } catch { $resourceIssues += "Kon encryption-configuratie niet controleren" } # Check 4: Network Security (vereenvoudigd) try { $vnetRules = Get-AzCognitiveServicesAccountNetworkRuleSet -ResourceGroupName $resource.ResourceGroupName -Name $resource.Name -ErrorAction SilentlyContinue if (-not $vnetRules -or ($vnetRules.VirtualNetworkRules.Count -eq 0 -and $vnetRules.DefaultAction -eq "Allow")) { $resourceIssues += "Geen virtual network rules geconfigureerd (publieke toegang mogelijk)" } } catch { # Sommige resources ondersteunen mogelijk geen network rules Write-Verbose "Network rules check niet beschikbaar voor deze resource" } if ($resourceIssues.Count -eq 0) { Write-Host " ✅ Beveiligingsconfiguratie OK: $($resource.Name)" -ForegroundColor Green $compliantCount++ } else { Write-Host " ⚠️ Beveiligingsproblemen gevonden: $($resource.Name)" -ForegroundColor Yellow foreach ($issue in $resourceIssues) { Write-Host " - $issue" -ForegroundColor Yellow } $securityIssues += [PSCustomObject]@{ ResourceName = $resource.Name ResourceGroup = $resource.ResourceGroupName Issues = $resourceIssues } } } $isCompliant = ($securityIssues.Count -eq 0) -and ($resources.Count -gt 0) return @{ IsCompliant = $isCompliant TotalResources = $resources.Count CompliantResources = $compliantCount SecurityIssues = $securityIssues } } function Invoke-Monitoring { <# .SYNOPSIS Monitort de beveiligingsconfiguratie status van Azure OpenAI-resources #> [CmdletBinding()] param() Write-Host "`nMonitoring: Azure OpenAI Beveiligingsconfiguratie" -ForegroundColor Yellow Write-Host "=================================================" -ForegroundColor Yellow Connect-RequiredServices $result = Test-AzureOpenAISecurityConfiguration Write-Host "`nResultaten:" -ForegroundColor Cyan Write-Host " Totaal Azure OpenAI-resources: $($result.TotalResources)" -ForegroundColor Cyan Write-Host " Compliante resources: $($result.CompliantResources)" -ForegroundColor Cyan Write-Host " Resources met beveiligingsproblemen: $($result.SecurityIssues.Count)" -ForegroundColor $(if ($result.SecurityIssues.Count -eq 0) { "Green" } else { "Red" }) if ($result.SecurityIssues.Count -gt 0) { Write-Host "`n Beveiligingsproblemen per resource:" -ForegroundColor Red foreach ($issue in $result.SecurityIssues) { Write-Host "`n Resource: $($issue.ResourceName) ($($issue.ResourceGroup))" -ForegroundColor Yellow foreach ($problem in $issue.Issues) { Write-Host " - $problem" -ForegroundColor Red } } } if ($result.IsCompliant) { Write-Host "`n✅ COMPLIANT - Alle Azure OpenAI-resources zijn correct geconfigureerd" -ForegroundColor Green exit 0 } else { Write-Host "`n❌ NON-COMPLIANT - Actie vereist voor beveiligingsconfiguraties" -ForegroundColor Red Write-Host " Gebruik -Remediation om aanbevelingen te genereren" -ForegroundColor Yellow exit 1 } } function Invoke-Remediation { <# .SYNOPSIS Genereert aanbevelingen voor verbetering van beveiligingsconfiguraties #> [CmdletBinding()] param() Write-Host "`nRemediatie: Azure OpenAI Beveiligingsconfiguratie Aanbevelingen" -ForegroundColor Yellow Write-Host "================================================================" -ForegroundColor Yellow Connect-RequiredServices $result = Test-AzureOpenAISecurityConfiguration if ($result.TotalResources -eq 0) { Write-Host " Geen Azure OpenAI-resources gevonden" -ForegroundColor Yellow exit 0 } if ($result.SecurityIssues.Count -eq 0) { Write-Host " Geen beveiligingsproblemen gevonden" -ForegroundColor Green exit 0 } Write-Host "`nAanbevelingen per resource:" -ForegroundColor Cyan foreach ($issue in $result.SecurityIssues) { Write-Host "`n Resource: $($issue.ResourceName) ($($issue.ResourceGroup))" -ForegroundColor Yellow Write-Host " Problemen:" -ForegroundColor Yellow foreach ($problem in $issue.Issues) { Write-Host " - $problem" -ForegroundColor Red # Genereer specifieke aanbevelingen if ($problem -like "*private endpoints*") { Write-Host " Aanbeveling: Configureer private endpoints via Azure Portal of PowerShell:" -ForegroundColor Cyan Write-Host " New-AzPrivateEndpoint -ResourceGroupName '$($issue.ResourceGroup)' -Name 'pe-$($issue.ResourceName)' ..." -ForegroundColor Gray } elseif ($problem -like "*diagnostic settings*") { Write-Host " Aanbeveling: Configureer diagnostic settings naar Log Analytics:" -ForegroundColor Cyan Write-Host " Set-AzDiagnosticSetting -ResourceId <resourceId> -WorkspaceId <workspaceId> ..." -ForegroundColor Gray } elseif ($problem -like "*customer-managed keys*") { Write-Host " Aanbeveling: Configureer customer-managed keys via Azure Key Vault:" -ForegroundColor Cyan Write-Host " Update-AzCognitiveServicesAccount -EncryptionKeySource 'Microsoft.KeyVault' ..." -ForegroundColor Gray } elseif ($problem -like "*virtual network rules*") { Write-Host " Aanbeveling: Configureer virtual network rules of beperk publieke toegang:" -ForegroundColor Cyan Write-Host " Update-AzCognitiveServicesAccountNetworkRuleSet -DefaultAction 'Deny' ..." -ForegroundColor Gray } } } Write-Host "`nAlgemene aanbevelingen:" -ForegroundColor Cyan Write-Host " 1. Gebruik Azure AD-authenticatie in plaats van API keys waar mogelijk" -ForegroundColor White Write-Host " 2. Configureer private endpoints voor alle productie-resources" -ForegroundColor White Write-Host " 3. Gebruik customer-managed keys voor encryptie at rest" -ForegroundColor White Write-Host " 4. Schakel diagnostic logging in voor alle resources" -ForegroundColor White Write-Host " 5. Beperk netwerktoegang via virtual network rules" -ForegroundColor White Write-Host " 6. Implementeer Azure Policy om deze configuraties af te dwingen" -ForegroundColor White Write-Host "`n✅ Aanbevelingen gegenereerd. Implementeer deze stapsgewijs en test na elke wijziging." -ForegroundColor Green exit 0 } # ============================================================================ # MAIN EXECUTION # ============================================================================ try { Write-Host "`n========================================" -ForegroundColor Cyan Write-Host "Azure OpenAI Beveiligingsconfiguratie" -ForegroundColor Cyan Write-Host "Nederlandse Baseline voor Veilige Cloud" -ForegroundColor Cyan Write-Host "========================================`n" -ForegroundColor Cyan # Execute based on parameters if ($Monitoring) { Invoke-Monitoring } elseif ($Remediation) { Invoke-Remediation } else { # Default: Compliance check Connect-RequiredServices $result = Test-AzureOpenAISecurityConfiguration if ($result.IsCompliant) { Write-Host "`n✅ COMPLIANT" -ForegroundColor Green } else { Write-Host "`n❌ NON-COMPLIANT" -ForegroundColor Red Write-Host "`nRun met -Monitoring voor gedetailleerde rapportage" -ForegroundColor Yellow Write-Host "Run met -Remediation om aanbevelingen te genereren" -ForegroundColor Yellow } return $result } } catch { Write-Error "Error: $_" throw } finally { Write-Host "`n========================================`n" -ForegroundColor Cyan }

Risico zonder implementatie

Risico zonder implementatie
High: Zonder adequate beveiligingsconfiguratie loopt Azure OpenAI Service het risico op onbevoegde toegang, datalekken, misbruik en niet-naleving van BIO, NIS2 en AVG. Dit kan leiden tot ernstige beveiligingsincidenten, reputatieschade, juridische aansprakelijkheid en kritische auditbevindingen.

Management Samenvatting

Implementeer sterke authenticatie met Azure AD en managed identities, configureer netwerkbeveiliging via private endpoints en virtual networks, gebruik encryptie in transit en at rest met customer-managed keys, beheer toegang via RBAC en API keys management, configureer uitgebreide logging en monitoring, en integreer alles in bestaande compliance- en securitykaders. Door deze configuraties structureel in te richten en periodiek te valideren, wordt Azure OpenAI een veilig en beheersbaar platform dat voldoet aan alle relevante normen.