Azure Cosmos DB: Private Endpoints Configureren Voor Netwerkisolatie

💼 Management Samenvatting

Private Endpoints voor Azure Cosmos DB brengen NoSQL database-toegang volledig binnen een Azure Virtual Network met private IP-adressen, waardoor publieke blootstelling aan internet wordt geëlimineerd. Deze netwerkisolatie is essentieel voor Zero Trust-architecturen en voldoet aan NIS2-vereisten voor netwerksegmentatie van kritieke data-assets.

Aanbeveling
IMPLEMENTEER VERPLICHT VOOR PRODUCTIE-DATABASES
Risico zonder
Critical
Risk Score
9/10
Implementatie
4u (tech: 3u)
Van toepassing op:
Azure Cosmos DB

Standaard zijn Azure Cosmos DB-accounts toegankelijk via publieke internet endpoints met een wereldwijd verspreide URL die vanaf elke locatie ter wereld bereikbaar is. Voor databases met gevoelige data creëert deze publieke blootstelling onnodige beveiligingsrisico's: de database is toegankelijk vanaf elke locatie met een geldige connection string, wat betekent dat gelekte credentials direct wereldwijde toegang geven zonder geografische of op netwerk gebaseerde beperkingen, er is geen echte netwerksegmentatie mogelijk omdat de database fundamenteel naar internet gericht blijft, op IP gebaseerde firewall-regels zijn complex om te beheren en bieden onvoldoende bescherming omdat IP-adressen kunnen worden gespoofed of aanvallers kunnen opereren vanuit gewhiteliste ranges, en al het verkeer wordt gerouteerd via het publieke internet wat zowel langzamer is als een groter risico op verkeersinterceptie vormt. Private Endpoints transformeren deze architectuur fundamenteel door Cosmos DB volledig binnen een klant-beheerd Virtual Network te plaatsen met private IP-adressen uit het VNet-adresbereik, toegang uitsluitend mogelijk te maken vanuit het VNet of verbonden netwerken zoals on-premises datacenters via ExpressRoute of VPN, Network Security Group (NSG) controle mogelijk te maken voor gedetailleerde verkeerscontrole, publieke DNS-resolutie te elimineren waardoor de database niet meer vindbaar is op internet, verkeer te routeren via het Azure Backbone-netwerk wat zowel sneller als veiliger is, perfect af te stemmen op Zero Trust-principes waarbij netwerklocatie een verificatiefactor is, en compliance te waarborgen met NIS2 Artikel 21 dat netwerkisolatie vereist voor kritieke informatiesystemen. Dit is de aanbevolen architectuur voor alle productie Cosmos DB-accounts met gevoelige of bedrijfskritieke data.

PowerShell Modules Vereist
Primary API: Azure API
Connection: Connect-AzAccount
Required Modules: Az.CosmosDB, Az.Network

Implementatie

Deze maatregel implementeert Private Endpoints voor Azure Cosmos DB-accounts om volledige netwerkisolatie te realiseren. De implementatie omvat het aanmaken van een Private Endpoint-resource die wordt gekoppeld aan het specifieke Cosmos DB-account en een subnet binnen een bestaand Virtual Network. Elke Private Endpoint krijgt een private IP-adres uit het subnet-bereik dat fungeert als het enige toegangspunt voor de database. Cruciaal is dat voor elk Cosmos DB API-type een separate Private Endpoint moet worden geconfigureerd: SQL API gebruikt privatelink.documents.azure.com, MongoDB API gebruikt privatelink.mongo.cosmos.azure.com, Cassandra API, Gremlin API en Table API hebben elk hun eigen Private DNS Zone. De Private DNS Zone moet worden geconfigureerd en gekoppeld aan het VNet, wat ervoor zorgt dat DNS-queries voor de Cosmos DB FQDN vanuit het VNet worden omgezet naar het private IP-adres in plaats van het publieke endpoint. Applicaties die binnen het VNet draaien of via VPN/ExpressRoute verbonden zijn, gebruiken automatisch de private FQDN en verbinden via het Private Endpoint. Na succesvolle implementatie en DNS-verificatie (nslookup moet het private IP tonen) moet publicNetworkAccess worden ingesteld op 'Disabled', wat het publieke internet endpoint volledig uitschakelt. Connectiviteit moet grondig worden getest door verbindingen te maken vanuit een VM binnen het VNet (moet succesvol zijn) en van buiten het VNet (moet falen). De kosten bedragen circa €6 per Private Endpoint per maand per API-type, dus een Cosmos DB-account dat SQL API en MongoDB API gebruikt, kost €12 per maand aan Private Endpoint-kosten. Deze implementatie vereist 3-4 uur technisch werk, is ondersteund voor alle Cosmos DB API's, en is de sterk aanbevolen beveiligingsarchitectuur voor productie-omgevingen met gevoelige data of strikte compliance-vereisten.

Vereisten

Voordat u begint met de implementatie van Private Endpoints voor Azure Cosmos DB, moet u ervoor zorgen dat alle benodigde componenten en voorbereidingen zijn voltooid. Deze sectie beschrijft uitgebreid welke resources, configuraties en procedures essentieel zijn voor een succesvolle implementatie.

De primaire vereiste is een bestaand Azure Cosmos DB-account dat geconfigureerd moet worden met Private Endpoints. Dit account kan elk API-type ondersteunen, waaronder SQL API (Core API), MongoDB API, Cassandra API, Gremlin API of Table API. Het is belangrijk om te realiseren dat elk API-type dat u gebruikt een separate Private Endpoint vereist, wat betekent dat een Cosmos DB-account met meerdere API-types meerdere Private Endpoints nodig heeft. Zorg ervoor dat het Cosmos DB-account zich in een regio bevindt die ondersteuning biedt voor Private Endpoints, wat tegenwoordig vrijwel alle Azure-regio's omvat.

Een Azure Virtual Network (VNet) met een geschikt subnet is de tweede kritieke vereiste. Het VNet kan een bestaand netwerk zijn dat al wordt gebruikt voor andere Azure-resources, of een nieuw VNet dat specifiek wordt aangemaakt voor database-connectiviteit. Het subnet dat wordt gebruikt voor Private Endpoints moet voldoende IP-adressen bevatten om alle benodigde Private Endpoints te hosten. Een subnet met een /24 CIDR-blok (256 IP-adressen) is meestal voldoende voor de meeste organisaties, zelfs wanneer honderden Private Endpoints worden geconfigureerd. Het subnet moet worden geconfigureerd met Private Endpoint Network Policy uitgeschakeld, wat een vereiste is voor Private Endpoint-functionaliteit. Subnet-delegatie moet op NONE worden ingesteld.

Private DNS Zones zijn essentieel voor de correcte werking van Private Endpoints. Elke Cosmos DB API-type heeft een specifieke Private DNS Zone nodig: SQL API gebruikt privatelink.documents.azure.com, MongoDB API gebruikt privatelink.mongo.cosmos.azure.com, Cassandra API gebruikt privatelink.cassandra.cosmos.azure.com, Gremlin API gebruikt privatelink.gremlin.cosmos.azure.com, en Table API gebruikt privatelink.table.cosmos.azure.com. Deze Private DNS Zones moeten worden gekoppeld aan het Virtual Network via VNet-links, zodat DNS-queries vanuit resources binnen het VNet automatisch worden omgezet naar de private IP-adressen van de Private Endpoints in plaats van de publieke endpoints.

Applicaties en services die toegang nodig hebben tot de Cosmos DB-database moeten zich binnen hetzelfde Virtual Network bevinden, of verbonden zijn via VPN (Point-to-Site of Site-to-Site) of Azure ExpressRoute. Dit betekent dat alle applicaties die Cosmos DB moeten benaderen, moeten draaien op virtuele machines binnen het VNet, in Azure App Service met VNet-integratie, in Azure Functions met VNet-integratie, of via on-premises datacenters die zijn verbonden via VPN of ExpressRoute. Applicaties die alleen via het publieke internet toegankelijk zijn, kunnen na de implementatie van Private Endpoints en het uitschakelen van publieke toegang niet meer rechtstreeks verbinding maken met Cosmos DB.

Budgettaire overwegingen zijn belangrijk omdat Private Endpoints maandelijkse kosten met zich meebrengen. Elke Private Endpoint kost ongeveer €6 per maand, en aangezien elk API-type een separate Private Endpoint vereist, kunnen de kosten snel oplopen. Een Cosmos DB-account dat zowel SQL API als MongoDB API gebruikt, vereist twee Private Endpoints en kost dus €12 per maand aan Private Endpoint-kosten. Daarnaast zijn er kosten voor Private DNS Zones (ongeveer €0,50 per maand per zone, hoewel deze vaak gedeeld kunnen worden tussen meerdere Private Endpoints van hetzelfde type). Het is essentieel om deze kosten op te nemen in de budgetplanning en te communiceren met stakeholders.

Een break-glass procedure moet worden gedocumenteerd voordat de implementatie begint. Deze procedure beschrijft hoe toegang tot Cosmos DB kan worden hersteld in geval van een noodsituatie waarbij de Private Endpoint-configuratie problemen veroorzaakt of wanneer snelle toegang nodig is voor troubleshooting. De break-glass procedure moet onder meer bevatten: hoe publieke toegang tijdelijk kan worden ingeschakeld via Azure Portal of PowerShell, wie de autorisatie heeft om deze procedure uit te voeren, welke logging en auditing plaatsvindt wanneer break-glass wordt gebruikt, en hoe de normale Private Endpoint-configuratie wordt hersteld na het oplossen van het probleem. Deze procedure is kritiek omdat het uitschakelen van publieke toegang betekent dat normale management-tools zoals Azure Portal Data Explorer niet meer direct werken zonder VPN of Azure Bastion.

Implementatie

Een kritieke vereiste die vaak over het hoofd wordt gezien, is dat voor elk Cosmos DB API-type dat u gebruikt een separate Private Endpoint moet worden geconfigureerd. Dit betekent dat een Cosmos DB-account dat zowel SQL API als MongoDB API ondersteunt, twee volledig onafhankelijke Private Endpoints vereist. Deze architecturale vereiste heeft directe gevolgen voor zowel de implementatieplanning als de kostenstructuur. Voordat u begint met de implementatie, moet u daarom een volledige inventarisatie maken van alle API-types die door uw Cosmos DB-account worden gebruikt, en voor elk type een separate Private Endpoint budgetteren. De kosten bedragen €6 per Private Endpoint per maand, dus een account met twee API-types kost €12 per maand aan Private Endpoint-kosten alleen al.

De implementatie begint met de voorbereiding van het Virtual Network, wat de fundering vormt voor alle Private Endpoint-connectiviteit. Als u al een bestaand Virtual Network heeft dat geschikt is voor database-connectiviteit, kunt u dit gebruiken en bespaart u ongeveer 20 minuten aan implementatietijd. Als u een nieuw Virtual Network moet aanmaken, navigeert u in Azure Portal naar Virtual Networks en selecteert u Create. Geef het VNet een duidelijke naam zoals 'vnet-databases' die de functie duidelijk maakt. Het adresbereik moet zorgvuldig worden gekozen om conflicten te voorkomen met bestaande netwerken: een bereik zoals 10.2.0.0/16 biedt voldoende ruimte voor toekomstige uitbreidingen. De regio waarin het VNet wordt aangemaakt moet exact overeenkomen met de regio waarin uw Cosmos DB-account zich bevindt, omdat Private Endpoints alleen kunnen worden gekoppeld aan resources in dezelfde regio.

Binnen het Virtual Network moet een dedicated subnet worden aangemaakt specifiek voor Private Endpoints. Dit subnet moet worden geconfigureerd met een naam die de functie duidelijk maakt, zoals 'snet-private-endpoints-databases'. Het adresbereik voor dit subnet moet voldoende IP-adressen bevatten: een /24 CIDR-blok (10.2.1.0/24) biedt 256 IP-adressen, wat ruim voldoende is voor honderden Private Endpoints. Het is een best practice om dedicated subnets te gebruiken voor Private Endpoints in plaats van deze te mengen met applicatie-subnets, omdat dit het beheer van Network Security Groups aanzienlijk vereenvoudigt en betere netwerksegmentatie mogelijk maakt. De subnetconfiguratie vereist dat Private Endpoint Network Policy wordt uitgeschakeld (DISABLED), wat een technische vereiste is voor Private Endpoint-functionaliteit. Subnet-delegatie moet op NONE worden ingesteld, omdat Private Endpoints geen service-delegatie ondersteunen.

De tweede fase omvat het daadwerkelijk aanmaken van de Private Endpoint-resources voor elk Cosmos DB API-type. Deze fase duurt ongeveer 15 tot 20 minuten per Private Endpoint, en moet worden herhaald voor elk API-type dat uw Cosmos DB-account gebruikt. Begin door in Azure Portal naar uw Cosmos DB-account te navigeren en selecteer de sectie Networking. Klik vervolgens op Private endpoint connections en selecteer Add private endpoint om de wizard te starten.

In het Basics-tabblad van de Private Endpoint-wizard moet u een duidelijke naam opgeven die zowel het doel als het API-type aangeeft. Een naamconventie zoals 'pe-cosmosdb-[accountname]-[apitype]' maakt het eenvoudig om later te identificeren welk Private Endpoint bij welk account en API-type hoort. Bijvoorbeeld: 'pe-cosmosdb-prod-sql' voor een productie Cosmos DB-account met SQL API. Selecteer de resource group waarin de Private Endpoint moet worden aangemaakt; dit kan dezelfde resource group zijn als het Cosmos DB-account, of een dedicated networking resource group als uw organisatie netwerkresources gescheiden beheert. De regio moet exact overeenkomen met zowel de regio van het Cosmos DB-account als de regio van het Virtual Network, omdat Private Endpoints alleen kunnen worden gekoppeld aan resources in dezelfde regio.

Het Resource-tabblad is waar de koppeling tussen de Private Endpoint en het Cosmos DB-account wordt geconfigureerd. Het resource type wordt automatisch ingesteld op Microsoft.DocumentDB/databaseAccounts, wat correct is voor alle Cosmos DB-accounts. Selecteer het specifieke Cosmos DB-account waarvoor u de Private Endpoint configureert. Het meest kritieke onderdeel is de Target sub-resource selectie, waar u het exacte API-type moet kiezen: 'Sql' voor SQL API (ook wel Core API genoemd), 'MongoDB' voor MongoDB API, 'Cassandra' voor Cassandra API, 'Gremlin' voor Graph API, of 'Table' voor Table API. Deze selectie is absoluut kritiek omdat een verkeerde keuze resulteert in een Private Endpoint die niet functioneert voor het gewenste API-type. Als uw Cosmos DB-account meerdere API-types ondersteunt, moet u dit hele proces herhalen voor elk API-type met een separate Private Endpoint voor elk type.

In het Virtual Network-tabblad selecteert u het Virtual Network en het subnet dat u in fase 1 heeft voorbereid. Kies het dedicated subnet voor Private Endpoints (bijvoorbeeld 'snet-private-endpoints-databases') in plaats van applicatie-subnets. Voor de Private IP-configuratie wordt Dynamic aanbevolen, wat betekent dat Azure automatisch een beschikbaar IP-adres uit het subnet-bereik toewijst. Static IP-toewijzing is mogelijk maar zelden nodig en maakt het beheer complexer. De Private Endpoint krijgt een Network Interface Card (NIC) toegewezen met dit private IP-adres, wat het enige toegangspunt wordt voor Cosmos DB-connectiviteit vanuit het VNet.

Het DNS-tabblad is essentieel voor de correcte werking van Private Endpoints. U moet de optie Integrate with private DNS zone inschakelen (YES), wat ervoor zorgt dat Azure automatisch de benodigde DNS-configuratie uitvoert. Selecteer de juiste subscription en resource group voor de Private DNS Zone. Azure suggereert automatisch de correcte Private DNS Zone voor het geselecteerde API-type: privatelink.documents.azure.com voor SQL API, privatelink.mongo.cosmos.azure.com voor MongoDB API, privatelink.cassandra.cosmos.azure.com voor Cassandra API, privatelink.gremlin.cosmos.azure.com voor Gremlin API, en privatelink.table.cosmos.azure.com voor Table API. Als deze zones nog niet bestaan, worden ze automatisch aangemaakt. Azure creëert ook automatisch een VNet-link die de Private DNS Zone koppelt aan uw Virtual Network, en een DNS A-record dat de Cosmos DB FQDN (Fully Qualified Domain Name) omzet naar het private IP-adres van de Private Endpoint.

Na het voltooien van alle tabbladen, controleert u de configuratie in het Review + Create-tabblad en start u de deployment. Het aanmaken van een Private Endpoint duurt meestal 5 tot 10 minuten, waarbij Azure verschillende resources aanmaakt: een Network Interface Card (NIC) met een private IP-adres in het geselecteerde subnet, een DNS A-record in de Private DNS Zone die de Cosmos DB FQDN omzet naar het private IP-adres, en een VNet-link die de Private DNS Zone koppelt aan het Virtual Network. Tijdens de deployment wordt de Private Endpoint automatisch goedgekeurd door het Cosmos DB-account, wat betekent dat er geen handmatige goedkeuring nodig is.

De derde fase is absoluut kritiek voor de beveiliging, maar wordt helaas vaak overgeslagen door implementatieteams. Zonder deze stap blijft Cosmos DB toegankelijk via zowel het Private Endpoint als het publieke internet endpoint, wat een ernstig beveiligingsrisico vormt. Deze dual-mode toegang betekent dat alle voordelen van Private Endpoints teniet worden gedaan, omdat aanvallers nog steeds via het publieke endpoint kunnen proberen toegang te krijgen. Het uitschakelen van publieke netwerktoegang is daarom een verplichte stap die niet mag worden overgeslagen.

Om publieke netwerktoegang uit te schakelen, navigeert u in Azure Portal naar uw Cosmos DB-account en selecteert u de sectie Networking. Klik op Public network access en wijzig de instelling naar Disabled. Deze wijziging wordt direct toegepast en betekent dat het publieke internet endpoint volledig wordt uitgeschakeld. Als alternatief kunt u deze wijziging uitvoeren via PowerShell met de cmdlet Update-AzCosmosDBAccount, waarbij u de parameter -PublicNetworkAccess instelt op Disabled. Deze PowerShell-methode is vooral handig voor geautomatiseerde deployments of wanneer u meerdere Cosmos DB-accounts tegelijkertijd moet configureren.

Na het uitschakelen van publieke toegang moet u de configuratie valideren door te testen of het publieke endpoint inderdaad niet meer bereikbaar is. Probeer vanaf een apparaat dat niet verbonden is met het Virtual Network (bijvoorbeeld vanaf uw persoonlijke computer zonder VPN) verbinding te maken met het Cosmos DB-account via het publieke endpoint. Deze verbindingspoging moet falen met een connection timeout of vergelijkbare foutmelding, wat bevestigt dat het publieke endpoint correct is uitgeschakeld. Tegelijkertijd moet verbinding vanuit een virtuele machine binnen het VNet succesvol zijn, wat bevestigt dat het Private Endpoint correct functioneert.

Een belangrijke waarschuwing bij het uitschakelen van publieke toegang is dat Azure Portal management-tools zoals Data Explorer, metrics en logs niet meer direct werken zonder VPN-verbinding of Azure Bastion. Dit betekent dat u voor het beheren en monitoren van Cosmos DB moet verbinden via Azure Bastion (een beveiligde jump host service) of via een VPN-verbinding naar het Virtual Network. Zorg ervoor dat deze alternatieve toegangsmethoden zijn geconfigureerd voordat u publieke toegang uitschakelt, anders riskeert u dat u geen toegang meer heeft tot management-functionaliteiten. Documenteer deze wijziging in uw change management proces en informeer alle teamleden die Cosmos DB beheren over de nieuwe toegangsmethode.

De vierde en laatste fase omvat uitgebreide testing van zowel DNS-resolutie als connectiviteit om te verifiëren dat de Private Endpoint-configuratie correct functioneert. Deze fase duurt ongeveer 30 minuten maar is essentieel om te garanderen dat applicaties daadwerkelijk via het Private Endpoint kunnen verbinden en dat het publieke endpoint correct is uitgeschakeld. Begin door een test virtuele machine te deployen binnen het Virtual Network, of gebruik een bestaande VM die zich al in het VNet of een peered VNet bevindt. Deze VM wordt gebruikt voor alle connectivity-tests.

De eerste test is DNS-resolutie verificatie, wat cruciaal is omdat incorrecte DNS-configuratie de meest voorkomende oorzaak is van Private Endpoint-problemen. Voer vanaf de test-VM een nslookup-commando uit voor de Cosmos DB FQDN: voor SQL API gebruik [accountname].documents.azure.com, voor MongoDB API gebruik [accountname].mongo.cosmos.azure.com. Het resultaat moet een private IP-adres tonen uit het subnet-bereik (bijvoorbeeld 10.2.1.x), en NIET het publieke IP-adres van Cosmos DB. Als de nslookup het publieke IP-adres toont, betekent dit dat de Private DNS Zone-configuratie niet correct is, en moet u controleren of de VNet-link bestaat en of de Private DNS Zone correct is gekoppeld aan het Virtual Network.

De tweede test is een daadwerkelijke connectiviteitstest waarbij u probeert verbinding te maken met Cosmos DB vanaf de test-VM. Gebruik hiervoor de Cosmos DB SDK (bijvoorbeeld de .NET SDK, Python SDK of Node.js SDK) of een tool zoals Azure Data Explorer om een verbinding te maken met het Cosmos DB-account. Deze verbinding moet succesvol zijn wanneer u het correcte connection string gebruikt. Het connection string moet de standaard Cosmos DB FQDN bevatten (bijvoorbeeld [accountname].documents.azure.com voor SQL API), en de SDK of tool moet automatisch de private IP-adres gebruiken via DNS-resolutie. Als de verbinding faalt, controleer dan of de Network Security Group op het subnet geen uitgaand verkeer naar Cosmos DB blokkeert, en of de applicatiecode het juiste connection string gebruikt zonder oude publieke endpoint-referenties.

De derde test is een negatieve test die verifieert dat het publieke endpoint inderdaad niet meer bereikbaar is. Probeer vanaf een persoonlijk apparaat dat niet verbonden is met het Virtual Network (zonder VPN) verbinding te maken met het Cosmos DB-account. Deze verbindingspoging moet falen met een connection timeout, wat bevestigt dat er geen route bestaat naar het private IP-adres vanaf het publieke internet. Als deze test succesvol is (wat betekent dat de verbinding faalt zoals verwacht), bevestigt dit dat de netwerkisolatie correct is geïmplementeerd.

Als u problemen ondervindt tijdens de testing, zijn er verschillende troubleshooting-stappen die u kunt uitvoeren. Controleer eerst of de Private DNS Zone VNet-link bestaat en correct is geconfigureerd: navigeer naar de Private DNS Zone in Azure Portal en verifieer dat er een VNet-link bestaat die naar uw Virtual Network verwijst. Controleer vervolgens of Network Security Groups op het subnet geen uitgaand verkeer naar Cosmos DB blokkeren: NSG-regels moeten uitgaand verkeer naar de Cosmos DB private IP-adressen toestaan. Verifieer ten slotte dat applicatiecode het correcte connection string gebruikt zonder oude publieke endpoint-referenties, en dat de code niet hardcoded IP-adressen gebruikt die mogelijk niet meer geldig zijn na de Private Endpoint-implementatie.

⏱️ **Totale Implementatietijd**: 3-4 uur inclusief VNet setup (indien nieuw), Private Endpoint creation per API-type, DNS configuration, public access disable en extensive testing. Voor bestaand VNet: 2-3 uur.

💰 **Kosten**: Private Endpoint €6/maand per endpoint (meerdere endpoints indien multiple API types - bijvoorbeeld SQL + MongoDB = €12/maand), Private DNS Zone €0,50/maand (shared over alle Cosmos DB Private Endpoints), VNet gratis. Totaal: €6,50-20/maand afhankelijk van aantal API-types.

Monitoring

Gebruik PowerShell-script cosmosdb-private-endpoints-configured.ps1 (functie Invoke-Monitoring) – Controleren.

Continue monitoring van Private Endpoints is essentieel om te garanderen dat de netwerkisolatie behouden blijft en dat er geen onbevoegde wijzigingen worden aangebracht aan de configuratie. Het monitoring-proces omvat verschillende aspecten die regelmatig moeten worden gecontroleerd om de beveiliging en beschikbaarheid van de Cosmos DB-connectiviteit te waarborgen.

De eerste en meest kritieke monitoring-activiteit is het controleren van de Private Endpoint connection status, die altijd Approved moet zijn. Een status van Pending of Rejected wijst op een configuratieprobleem dat onmiddellijke aandacht vereist. U kunt deze status controleren via Azure Portal door naar het Cosmos DB-account te navigeren, de sectie Networking te selecteren, en de Private endpoint connections te bekijken. Elke Private Endpoint moet de status Approved tonen. Als een Private Endpoint de status Pending heeft, betekent dit meestal dat er een probleem is met de resource-configuratie of dat de Private Endpoint nog niet volledig is geïmplementeerd. Een status van Rejected wijst op een autorisatieprobleem of een configuratiefout die handmatige interventie vereist.

DNS-resolutie validatie is een tweede kritieke monitoring-activiteit die regelmatig moet worden uitgevoerd. Verifieer dat DNS-queries voor de Cosmos DB FQDN vanuit resources binnen het Virtual Network correct worden omgezet naar private IP-adressen in plaats van publieke IP-adressen. Dit kan worden gedaan door periodiek een nslookup-commando uit te voeren vanaf een virtuele machine binnen het VNet. Het resultaat moet consistent een private IP-adres tonen uit het subnet-bereik. Als de DNS-resolutie plotseling begint te wijzen naar een publiek IP-adres, wijst dit op een probleem met de Private DNS Zone-configuratie, mogelijk veroorzaakt door een verwijderde VNet-link of een gewijzigde DNS-configuratie. Dergelijke wijzigingen kunnen de netwerkisolatie compromitteren en moeten onmiddellijk worden onderzocht.

Network Security Group flow logs bieden waardevolle inzichten in het verkeerspatroon naar en van Cosmos DB via Private Endpoints. Door deze flow logs te monitoren, kunt u ongebruikelijke verkeerspatronen detecteren die kunnen wijzen op beveiligingsincidenten of configuratieproblemen. Analyseer regelmatig de flow logs voor het subnet dat de Private Endpoints host, en let op patronen zoals onverwachte pieken in verkeer, verbindingspogingen vanaf onbekende bronnen binnen het VNet, of abnormaal hoge volumes van data transfer. Deze patronen kunnen wijzen op potentiële beveiligingsbedreigingen of performance-problemen die aandacht vereisen. Configureer alerts op basis van flow log-data om automatisch te worden gewaarschuwd wanneer verdachte activiteiten worden gedetecteerd.

Een kritieke monitoring-activiteit is het configureren van alerts die worden geactiveerd wanneer een Private Endpoint wordt verwijderd of gewijzigd. Het onbedoeld verwijderen van een Private Endpoint kan resulteren in verlies van connectiviteit voor applicaties die afhankelijk zijn van Cosmos DB, en kan in sommige gevallen zelfs leiden tot het automatisch inschakelen van publieke toegang als fallback-mechanisme, wat de netwerkisolatie volledig teniet doet. Configureer Azure Monitor alerts die worden geactiveerd wanneer een Private Endpoint-resource wordt verwijderd of wanneer de connection status wijzigt van Approved naar een andere status. Deze alerts moeten worden geconfigureerd met een hoge prioriteit en moeten direct worden doorgestuurd naar het security team en de database administrators.

Kwartaalconnectiviteitstests zijn een best practice die helpt te verifiëren dat de Private Endpoint-configuratie na verloop van tijd correct blijft functioneren. Deze tests moeten worden uitgevoerd vanaf verschillende locaties: vanuit virtuele machines binnen het VNet (moet succesvol zijn), vanuit peered VNets (moet succesvol zijn als VNet-peering correct is geconfigureerd), vanuit on-premises datacenters via VPN of ExpressRoute (moet succesvol zijn), en vanaf het publieke internet zonder VPN (moet falen om netwerkisolatie te bevestigen). Documenteer de resultaten van deze tests en onderzoek eventuele afwijkingen onmiddellijk. Deze regelmatige tests helpen bij het vroegtijdig detecteren van configuratiewijzigingen die mogelijk de beveiliging compromitteren.

Compliance en Auditing

De implementatie van Private Endpoints voor Azure Cosmos DB draagt significant bij aan compliance met verschillende beveiligingsstandaarden en regelgeving die van toepassing zijn op Nederlandse overheidsorganisaties en bedrijven die werken met gevoelige data. Deze sectie beschrijft hoe Private Endpoints helpen bij het voldoen aan specifieke compliance-vereisten en welke audit-evidentie moet worden verzameld om deze compliance aan te tonen.

De CIS Azure Benchmark bevat specifieke aanbevelingen voor Cosmos DB netwerkbeveiliging die direct worden geadresseerd door Private Endpoints. De CIS-richtlijnen benadrukken het belang van netwerkisolatie voor databases die gevoelige data bevatten, en Private Endpoints bieden precies deze isolatie door Cosmos DB volledig binnen een Virtual Network te plaatsen. Bij compliance-audits moet u kunnen aantonen dat alle productie Cosmos DB-accounts zijn geconfigureerd met Private Endpoints en dat publieke netwerktoegang is uitgeschakeld. Documenteer de Private Endpoint-configuratie, inclusief welke API-types zijn geconfigureerd en welke subnets worden gebruikt, zodat auditors kunnen verifiëren dat de CIS-aanbevelingen worden nageleefd.

Zero Trust Architecture-principes vereisen dat netwerk-locatie wordt gebruikt als een verificatiefactor, wat betekent dat toegang tot resources niet automatisch moet worden verleend op basis van netwerk-locatie alleen, maar dat netwerkisolatie wel een fundamenteel onderdeel is van de beveiligingsarchitectuur. Private Endpoints aligneren perfect met Zero Trust-principes door Cosmos DB volledig te isoleren binnen een Virtual Network, waardoor de database niet meer bereikbaar is vanaf het publieke internet. Deze netwerkisolatie vormt een belangrijke laag in een gelaagde beveiligingsaanpak waarbij meerdere verificatiefactoren worden gecombineerd. Bij Zero Trust-implementaties moet u kunnen aantonen dat kritieke data-assets zoals Cosmos DB-databases zijn geïsoleerd op netwerkniveau, wat Private Endpoints precies bieden.

ISO 27001:2022 controle A.13.1.1 vereist dat organisaties netwerkcontroles implementeren om netwerkverkeer te beheren en te monitoren. Private Endpoints helpen bij het voldoen aan deze vereiste door netwerkverkeer naar Cosmos DB te beperken tot specifieke Virtual Networks en door Network Security Groups te gebruiken voor granulaire verkeerscontrole. De netwerkisolatie die Private Endpoints bieden, maakt het mogelijk om netwerkverkeer te segmenteren en te monitoren op een manier die voldoet aan ISO 27001-vereisten. Bij ISO 27001-audits moet u kunnen aantonen dat netwerkverkeer naar databases wordt gecontroleerd en gemonitord, wat wordt gefaciliteerd door de Private Endpoint-architectuur in combinatie met NSG flow logs en Azure Monitor.

De NIS2-richtlijn (Network and Information Systems Directive 2) Artikel 21 vereist specifiek dat essentiële entiteiten en belangrijke entiteiten netwerksegmentatie implementeren voor kritieke informatiesystemen. Private Endpoints voor Cosmos DB bieden precies deze netwerksegmentatie door databases volledig te isoleren binnen Virtual Networks. Voor Nederlandse organisaties die onder de NIS2-richtlijn vallen, is de implementatie van Private Endpoints voor productie-databases met kritieke data daarom niet alleen een best practice, maar een compliance-vereiste. Bij NIS2-compliance-audits moet u kunnen aantonen dat alle kritieke informatiesystemen, inclusief databases, zijn geconfigureerd met netwerksegmentatie, wat Private Endpoints precies bieden. Documenteer de netwerkarchitectuur en de manier waarop Private Endpoints bijdragen aan netwerksegmentatie om compliance met NIS2 Artikel 21 aan te tonen.

De BIO (Baseline Informatiebeveiliging Overheid) normen bevatten specifieke thema's voor netwerkbeveiliging, waaronder Thema 13.01.01 dat zich richt op netwerkbeveiliging en netwerksegmentatie. Private Endpoints helpen Nederlandse overheidsorganisaties bij het voldoen aan deze BIO-vereisten door netwerkisolatie te bieden voor databases met gevoelige overheidsdata. De BIO-normen benadrukken het belang van het scheiden van netwerksegmenten en het beperken van netwerktoegang tot wat strikt noodzakelijk is, wat precies wordt bereikt door Private Endpoints. Bij BIO-audits moet u kunnen aantonen dat netwerkbeveiligingsmaatregelen zijn geïmplementeerd volgens de BIO-normen, inclusief netwerksegmentatie voor databases. Documenteer hoe Private Endpoints bijdragen aan het voldoen aan BIO Thema 13.01.01 en verzamel audit-evidentie zoals Private Endpoint-configuraties, NSG-regels, en connectivity-testresultaten.

Remediatie

Gebruik PowerShell-script cosmosdb-private-endpoints-configured.ps1 (functie Invoke-Remediation) – Herstellen.

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 Cosmos DB: Private Endpoints Configured .DESCRIPTION CIS Azure Foundations Benchmark - Control 4.1.2 Controleert of Private Endpoints zijn geconfigureerd voor Cosmos DB accounts. Private Endpoints zorgen voor private connectivity zonder public internet exposure. Waarom is deze control belangrijk? - Elimineert public internet exposure - Network traffic blijft binnen Azure backbone - Integration met on-premises via ExpressRoute/VPN - Betere network segmentation .NOTES Filename: cosmosdb-private-endpoints-configured.ps1 Author: Nederlandse Baseline voor Veilige Cloud Version: 1.0 Related JSON: content/azure/databases/cosmosdb-private-endpoints-configured.json CIS Control: 4.1.2 .PARAMETER WhatIf Toont wat het script zou doen zonder daadwerkelijk wijzigingen door te voeren .PARAMETER Monitoring Voert compliance check uit en toont gedetailleerd rapport .PARAMETER Remediation Toont handmatige instructies voor Private Endpoint configuratie .PARAMETER Revert Draait wijzigingen terug (verwijdert Private Endpoints) .EXAMPLE .\cosmosdb-private-endpoints-configured.ps1 Voert basis compliance check uit .EXAMPLE .\cosmosdb-private-endpoints-configured.ps1 -Monitoring Toont gedetailleerd compliance rapport #> # ============================================================================ # REQUIREMENTS # ============================================================================ #Requires -Version 5.1 #Requires -Modules Az.Accounts #Requires -Modules Az.CosmosDB #Requires -Modules Az.Network # ============================================================================ # PARAMETERS # ============================================================================ [CmdletBinding()] param( [Parameter()][switch]$WhatIf, [Parameter()][switch]$Monitoring, [Parameter()][switch]$Remediation, [Parameter()][switch]$Revert ) # ============================================================================ # GLOBAL VARIABLES # ============================================================================ $ErrorActionPreference = 'Stop' $VerbosePreference = 'Continue' $PolicyName = "Azure Cosmos DB: Private Endpoints" # ============================================================================ # FUNCTION: Connect-RequiredServices # ============================================================================ function Connect-RequiredServices { function Invoke-Revert { Write-Host "`n⚠️ Manual removal required for Private Endpoints" -ForegroundColor Yellow Write-Host " Use Azure Portal or Remove-AzPrivateEndpoint cmdlet`n" -ForegroundColor Gray } try { $context = Get-AzContext if (-not $context) { Write-Verbose "Connecting to Azure..." Connect-AzAccount | Out-Null } else { Write-Verbose "Already connected to Azure as $($context.Account.Id)" } } catch { Write-Error "Failed to connect to Azure: $_" throw } } # ============================================================================ # FUNCTION: Test-Compliance # ============================================================================ function Test-Compliance { Write-Verbose "Testing compliance for: $PolicyName..." $result = [PSCustomObject]@{ ScriptName = "cosmosdb-private-endpoints-configured" PolicyName = $PolicyName IsCompliant = $false TotalResources = 0 CompliantCount = 0 NonCompliantCount = 0 Details = @() Recommendations = @() } function Invoke-Revert { Write-Host "`n⚠️ Manual removal required for Private Endpoints" -ForegroundColor Yellow Write-Host " Use Azure Portal or Remove-AzPrivateEndpoint cmdlet`n" -ForegroundColor Gray } try { Write-Verbose "Retrieving all Cosmos DB accounts..." $cosmosAccounts = Get-AzCosmosDBAccount -ErrorAction SilentlyContinue if (-not $cosmosAccounts) { $result.Details += "Geen Cosmos DB accounts gevonden in dit subscription" $result.IsCompliant = $true return $result } $result.TotalResources = @($cosmosAccounts).Count foreach ($account in $cosmosAccounts) { Write-Verbose "Checking account: $($account.Name)" function Invoke-Revert { Write-Host "`n⚠️ Manual removal required for Private Endpoints" -ForegroundColor Yellow Write-Host " Use Azure Portal or Remove-AzPrivateEndpoint cmdlet`n" -ForegroundColor Gray } try { $privateEndpoints = Get-AzPrivateEndpointConnection ` -PrivateLinkResourceId $account.Id ` -ErrorAction SilentlyContinue if ($privateEndpoints -and $privateEndpoints.Count -gt 0) { $approvedConnections = $privateEndpoints | Where-Object { $_.PrivateLinkServiceConnectionState.Status -eq 'Approved' } if ($approvedConnections) { $result.CompliantCount++ $result.Details += "✓ Account '$($account.Name)' heeft $($approvedConnections.Count) Private Endpoint(s)" } else { $result.NonCompliantCount++ $result.Details += "✗ Account '$($account.Name)' heeft Private Endpoints maar niet approved" $result.Recommendations += "Approve Private Endpoint connections voor '$($account.Name)'" } } else { $result.NonCompliantCount++ $result.Details += "✗ Account '$($account.Name)' heeft GEEN Private Endpoints (ResourceGroup: $($account.ResourceGroupName))" $result.Recommendations += "Configureer Private Endpoint voor '$($account.Name)'" } } catch { $result.NonCompliantCount++ $result.Details += "⚠️ Kon Private Endpoints niet controleren voor '$($account.Name)'" } } $result.IsCompliant = ($result.NonCompliantCount -eq 0) if ($result.NonCompliantCount -gt 0) { $result.Recommendations += "Run met -Remediation voor configuratie instructies" } } catch { $result.Details += "ERROR: $($_.Exception.Message)" } return $result } # ============================================================================ # FUNCTION: Invoke-Remediation # ============================================================================ function Invoke-Remediation { Write-Host "`nPrivate Endpoint configuratie instructies voor Cosmos DB..." -ForegroundColor Cyan Write-Host "=" * 80 -ForegroundColor Cyan Write-Host "`n⚠️ Private Endpoints vereisen handmatige configuratie" -ForegroundColor Yellow Write-Host "`n📋 CONFIGURATIE STAPPEN:" -ForegroundColor Cyan $script = @' # PowerShell voorbeeld $cosmosAccount = Get-AzCosmosDBAccount -Name "mycosmosdb" -ResourceGroupName "rg" $vnet = Get-AzVirtualNetwork -Name "myvnet" -ResourceGroupName "rg" $subnet = Get-AzVirtualNetworkSubnetConfig -Name "private-endpoints" -VirtualNetwork $vnet # Disable private endpoint network policies $subnet.PrivateEndpointNetworkPolicies = "Disabled" $vnet | Set-AzVirtualNetwork # Create Private Link Service Connection $privateEndpointConnection = New-AzPrivateLinkServiceConnection ` -Name "pe-connection-cosmosdb" ` -PrivateLinkServiceId $cosmosAccount.Id ` -GroupId "Sql" # Of "MongoDB", "Cassandra", "Gremlin", "Table" # Create Private Endpoint $privateEndpoint = New-AzPrivateEndpoint ` -ResourceGroupName "rg" ` -Name "pe-cosmosdb" ` -Location "westeurope" ` -Subnet $subnet ` -PrivateLinkServiceConnection $privateEndpointConnection # Configure Private DNS Zone $dnsZone = New-AzPrivateDnsZone -Name "privatelink.documents.azure.com" -ResourceGroupName "rg" $dnsLink = New-AzPrivateDnsVirtualNetworkLink -Name "vnet-link" -ResourceGroupName "rg" ` -ZoneName "privatelink.documents.azure.com" -VirtualNetworkId $vnet.Id # DNS Zone Group $dnsZoneConfig = New-AzPrivateDnsZoneConfig -Name "privatelink.documents.azure.com" ` -PrivateDnsZoneId $dnsZone.ResourceId $dnsZoneGroup = New-AzPrivateDnsZoneGroup -ResourceGroupName "rg" ` -PrivateEndpointName "pe-cosmosdb" -Name "default" -PrivateDnsZoneConfig $dnsZoneConfig # Disable public network access (optional) Update-AzCosmosDBAccount -ResourceGroupName "rg" -Name "mycosmosdb" -EnablePublicNetworkAccess $false '@ Write-Host $script -ForegroundColor DarkGray Write-Host "`n📚 DOCUMENTATIE:" -ForegroundColor Cyan Write-Host " https://learn.microsoft.com/azure/cosmos-db/how-to-configure-private-endpoints" -ForegroundColor Blue } # ============================================================================ # FUNCTION: Invoke-Monitoring # ============================================================================ function Invoke-Monitoring { $result = Test-Compliance Write-Host "`n========================================" -ForegroundColor Cyan Write-Host "$PolicyName" -ForegroundColor Cyan Write-Host "========================================" -ForegroundColor Cyan Write-Host "Cosmos DB accounts gecontroleerd: $($result.TotalResources)" -ForegroundColor White Write-Host "Compliant: $($result.CompliantCount)" -ForegroundColor Green $color = if ($result.NonCompliantCount -gt 0) { "Red" } else { "Green" } Write-Host "Non-compliant: $($result.NonCompliantCount)" -ForegroundColor $color if ($result.Details) { Write-Host "`nDetails:" -ForegroundColor Yellow foreach ($detail in $result.Details) { Write-Host " $detail" -ForegroundColor Gray } } if ($result.Recommendations) { Write-Host "`nAanbevelingen:" -ForegroundColor Yellow foreach ($recommendation in $result.Recommendations) { Write-Host " → $recommendation" -ForegroundColor Cyan } } return $result } # ============================================================================ # MAIN EXECUTION BLOCK # ============================================================================ function Invoke-Revert { Write-Host "`n⚠️ Manual removal required for Private Endpoints" -ForegroundColor Yellow Write-Host " Use Azure Portal or Remove-AzPrivateEndpoint cmdlet`n" -ForegroundColor Gray } try { Connect-RequiredServices if ($Monitoring) { Invoke-Monitoring } elseif ($Remediation) { if ($WhatIf) { Write-Host "`n=== WHATIF MODE ===" -ForegroundColor Yellow Write-Host "Zou Private Endpoint instructies tonen" -ForegroundColor Yellow Write-Host "===================`n" -ForegroundColor Yellow } else { Invoke-Remediation } } elseif ($Revert) { Invoke-Revert } else { $result = Test-Compliance Write-Host "`n========================================" -ForegroundColor Cyan Write-Host "Compliance Check: $PolicyName" -ForegroundColor Cyan Write-Host "========================================" -ForegroundColor Cyan if ($result.IsCompliant) { Write-Host "Status: [OK] COMPLIANT" -ForegroundColor Green } else { Write-Host "Status: [FAIL] NON-COMPLIANT" -ForegroundColor Red Write-Host "Aantal non-compliant accounts: $($result.NonCompliantCount)" -ForegroundColor Red Write-Host "`nRun met -Monitoring voor gedetailleerd rapport" -ForegroundColor Yellow Write-Host "Run met -Remediation voor configuratie instructies" -ForegroundColor Yellow } } } catch { Write-Error "An error occurred: $_" Write-Error $_.ScriptStackTrace exit 1 }

Risico zonder implementatie

Risico zonder implementatie
Critical: Zonder Private Endpoints blijft Azure Cosmos DB toegankelijk via publieke internet endpoints wat kritieke beveiligingsrisico's creëert voor databases met gevoelige data. Blootstelling aan internet betekent dat Cosmos DB permanent benaderbaar is vanaf elk IP-adres wereldwijd met geldige credentials, wat gelekte verbindingsstrings door GitHub commits, logbestanden of gecompromitteerde applicaties direct wereldwijde database-toegang geven zonder netwerkisolatie die dit kan blokkeren - aanvallers die credentials verkrijgen kunnen direct vanaf hun eigen infrastructuur de volledige database exfiltreren. Brute force-aanvallen op Cosmos DB-endpoints kunnen 24/7 worden uitgevoerd vanaf ontelbare IP-adressen zonder blokkering op VNet-niveau, wat aanvallen waarbij credentials worden geraden faciliteert. DDoS-aanvallen kunnen publieke Cosmos DB-endpoints overweldigen wat de beschikbaarheid in gevaar brengt. Zero Trust-principes worden geschonden waarbij netwerksegmentatie ontbreekt - alle services hebben potentiële toegang in plaats van expliciete weigering-standaard met isolatie op VNet-niveau. Compliance-schendingen ontstaan onder NIS2 Artikel 21 die netwerkisolatie verplicht stelt voor kritieke data-assets, ISO 27001 A.13.1.1 netwerktoegangscontrole-vereisten niet kunnen worden aangetoond, BIO 13.01 netwerksegmentatie-principes worden geschonden. Data-exfiltratie door gecompromitteerde applicaties of kwaadwillende insiders kan niet worden beperkt door controles op netwerkniveau - gestolen data kan via willekeurige internet-verbindingen worden geëxfiltreerd. Laterale beweging na een beveiligingsinbreuk wordt gefaciliteerd waarbij aanvallers vanaf naar internet blootgestelde Cosmos DB kunnen pivoteren naar andere resources. Het risico is kritiek voor productie Cosmos DB-accounts met persoonsgegevens, financiële data of bedrijfsgeheimen, hoog voor real-time transactionele databases, en essentieel voor compliance met Zero Trust en NIS2-vereisten.

Management Samenvatting

Private Endpoints voor Azure Cosmos DB elimineren publieke blootstelling aan internet door de database binnen een Azure Virtual Network te plaatsen met private IP-adressen, wat alleen VNet-toegang mogelijk maakt zonder internet-bereikbaarheid. Implementatie creëert Private Endpoint-resources die Cosmos DB koppelen aan VNet-subnets waarbij elke Cosmos DB API-type (SQL, MongoDB, Cassandra, Gremlin, Table) een separate Private Endpoint vereist voor isolatie. DNS-integratie via Private DNS Zones (privatelink.documents.azure.com voor SQL API, privatelink.mongo.cosmos.azure.com voor MongoDB) zorgt dat clients binnen VNet Cosmos DB omzetten naar private IP-adressen in plaats van publieke endpoints. Kritieke beveiligingsversterking: schakel publicNetworkAccess uit na Private Endpoint-implementatie om publiek endpoint volledig te blokkeren, wat toegang in dubbele modus (zowel private als public) voorkomt. Network Security Groups op Private Endpoint-subnets bieden gedetailleerde verkeersfiltering. Gebruikssituaties: productie-databases met gevoelige data die volledige internet-isolatie vereisen, multi-tier applicaties waar alleen backend-services in VNet Cosmos DB moeten benaderen, compliance-workloads onder NIS2/BIO waar netwerksegmentatie verplicht is, Zero Trust-architecturen met standaard weigerende netwerkbeleidsregels. Deze maatregel is verplicht voor ALLE productie Cosmos DB-accounts met gevoelige data, verplicht voor NIS2 Artikel 21 en ISO 27001 A.13.1.1 compliance, en wordt beschouwd als best practice voor Zero Trust-netwerkarchitecturen. Implementatie-inspanning: 3-4 uur per Cosmos DB-account (VNet-setup indien nieuw, Private Endpoint-aanmaak per API-type, DNS-configuratie, publieke toegang uitschakelen, testing), kosten: €6 per maand per Private Endpoint (meerdere endpoints indien meerdere API-types), Private DNS Zone €0,50 per maand. Rendement op investering komt van: 99 procent reductie in aanvalsoppervlak door eliminatie van blootstelling aan internet, voorkomen van onbevoegde toegang via gelekte credentials vanaf locaties buiten VNet, compliancesucces voor NIS2/ISO 27001, en het bereiken van Zero Trust-netwerksegmentatie.