Azure Private Link configureren voor een Azure Cosmos DB-account

VAN TOEPASSING OP: Nosql MongoDB Cassandra Gremlin Tabel

Met behulp van Azure Private Link kunt u verbinding maken met een Azure Cosmos DB-account via een privé-eindpunt. Het privé-eindpunt is een set privé-IP-adressen in een subnet binnen uw virtuele netwerk. Vervolgens kunt u de toegang tot een Azure Cosmos DB-account via privé-IP-adressen beperken. Wanneer Private Link wordt gecombineerd met beperkende NSG-beleidsregels, helpt dit het risico op gegevensexfiltratie te verminderen. Zie Wat is Azure Private Link? voor meer informatie over privé-eindpunten.

Notitie

Private Link voorkomt niet dat uw Azure Cosmos DB-eindpunten worden omgezet door openbare DNS. Het filteren van binnenkomende aanvragen vindt plaats op toepassingsniveau, niet op transport- of netwerkniveau.

met Private Link kunnen gebruikers toegang krijgen tot een Azure Cosmos DB-account vanuit het virtuele netwerk of vanuit een virtueel peernetwerk. Resources die zijn toegewezen aan Private Link zijn ook on-premises toegankelijk via privépeering via VPN of Azure ExpressRoute.

U kunt verbinding maken met een Azure Cosmos DB-account dat is geconfigureerd met Private Link met behulp van de automatische of handmatige goedkeuringsmethode. Zie de sectie goedkeuringswerkstroom van de Private Link-documentatie voor meer informatie.

In dit artikel wordt beschreven hoe u privé-eindpunten instelt voor de transactionele opslag van Azure Cosmos DB. Hierbij wordt ervan uitgegaan dat u de methode voor automatische goedkeuring gebruikt. Als u de analytische opslag gebruikt, raadpleegt u Privé-eindpunten configureren voor de analytische opslag.

Een privé-eindpunt maken met behulp van de Azure Portal

Volg deze stappen om een privé-eindpunt te maken voor een bestaand Azure Cosmos DB-account met behulp van de Azure Portal:

  1. Meld u aan bij de Azure Portal en selecteer vervolgens een Azure Cosmos DB-account.

  2. Selecteer Netwerken in de lijst met instellingen en selecteer vervolgens + Privé-eindpunt op het tabblad Persoonlijke toegang :

    Schermopname van selecties voor het maken van een privé-eindpunt in de Azure Portal

  3. Voer in het deelvenster Een privé-eindpunt maken - Basisinformatie de volgende gegevens in of selecteer deze:

    Instelling Waarde
    Projectgegevens
    Abonnement Selecteer uw abonnement.
    Resourcegroep Selecteer een resourcegroep.
    Exemplaardetails
    Naam Voer een naam in voor uw privé-eindpunt. Als deze naam wordt gebruikt, maakt u een unieke naam.
    Region Selecteer de regio waarin u Private Link wilt implementeren. Maak het privé-eindpunt op dezelfde locatie als uw virtuele netwerk.
  4. Selecteer Volgende: Resource.

  5. Voer in het deelvenster Een privé-eindpunt maken - Resource de volgende gegevens in of selecteer deze:

    Instelling Waarde
    Verbindingsmethode Selecteer Verbinding maken met een Azure-resource in mijn directory.

    U kunt vervolgens een van uw resources kiezen om Private Link in te stellen. U kunt ook verbinding maken met de resource van iemand anders met behulp van een resource-id of alias die met u is gedeeld.
    Abonnement Selecteer uw abonnement.
    Resourcetype Selecteer Microsoft.AzureCosmosDB/databaseAccounts.
    Resource Selecteer uw Azure Cosmos DB-account.
    Subresource van doel Selecteer het Type Azure Cosmos DB-API dat u wilt toewijzen. Dit is standaard slechts één keuze voor de API's voor SQL, MongoDB en Cassandra. Voor de API's voor Gremlin en Table kunt u ook NoSQL kiezen, omdat deze API's interoperabel zijn met de API voor NoSQL. Als u een toegewezen gateway hebt ingericht voor een API voor NoSQL-account, ziet u ook een optie voor SqlDedicated.
  6. Selecteer Volgende: Virtual Network.

  7. Voer in het deelvenster Een privé-eindpunt maken - Virtual Network de volgende gegevens in of selecteer deze:

    Instelling Waarde
    Virtueel netwerk Selecteer uw virtuele netwerk.
    Subnet Selecteer uw subnet.
  8. Selecteer Volgende: DNS.

  9. Voer in het deelvenster Een privé-eindpunt maken - DNS de volgende gegevens in of selecteer deze:

    Instelling Waarde
    Integreren met privé-DNS-zone Selecteer Ja.

    Als u privé verbinding wilt maken met uw privé-eindpunt, hebt u een DNS-record nodig. U wordt aangeraden uw privé-eindpunt te integreren met een privé-DNS-zone. U kunt ook uw eigen DNS-servers gebruiken of DNS-records maken met behulp van de hostbestanden op uw virtuele machines.

    Wanneer u Ja selecteert voor deze optie, wordt er ook een privé-DNS-zonegroep gemaakt. DNS-zonegroep is een koppeling tussen de privé-DNS-zone en het privé-eindpunt. Met deze koppeling kunt u de privé-DNS-zone automatisch bijwerken wanneer er een update voor het privé-eindpunt is. Wanneer u bijvoorbeeld regio's toevoegt of verwijdert, wordt de privé-DNS-zone automatisch bijgewerkt.
    Configuratienaam Selecteer uw abonnement en resourcegroep.

    De privé-DNS-zone wordt automatisch bepaald. U kunt deze niet wijzigen met behulp van de Azure Portal.
  10. Selecteer Volgende: Tags>beoordelen en maken. Op de pagina Controleren en maken valideert Azure uw configuratie.

  11. Als u het bericht Validatie geslaagd ziet, selecteert u Maken.

Wanneer u een goedgekeurde Private Link voor een Azure Cosmos DB-account hebt, is in de Azure Portal de optie Alle netwerken in het deelvenster Firewall en virtuele netwerken niet beschikbaar.

API-typen en namen van privézones

Raadpleeg Dns-configuratie van Azure-privé-eindpunt voor een gedetailleerdere uitleg over privézones en DNS-configuraties voor privé-eindpunten. De volgende tabel toont de toewijzing tussen verschillende Azure Cosmos DB-account-API-typen, ondersteunde subresources en de bijbehorende namen van privézones. U hebt ook toegang tot de Gremlin- en API for Table-accounts via de API voor NoSQL, dus er zijn twee vermeldingen voor deze API's. Er is ook een extra vermelding voor de API voor NoSQL voor accounts die de toegewezen gateway gebruiken.

API-type Azure Cosmos DB-account Ondersteunde subresources of groeps-id's Naam van privézone
NoSQL SQL privatelink.documents.azure.com
NoSQL SqlDedicated privatelink.sqlx.cosmos.azure.com
Cassandra Cassandra privatelink.cassandra.cosmos.azure.com
Mongo MongoDB privatelink.mongo.cosmos.azure.com
Gremlin Gremlin privatelink.gremlin.cosmos.azure.com
Gremlin SQL privatelink.documents.azure.com
Tabel Tabel privatelink.table.cosmos.azure.com
Tabel SQL privatelink.documents.azure.com

De privé-IP-adressen ophalen

Nadat het privé-eindpunt is ingericht, kunt u een query uitvoeren op de IP-adressen. De IP-adressen van de Azure Portal weergeven:

  1. Zoek naar het privé-eindpunt dat u eerder hebt gemaakt. In dit geval is het cdbPrivateEndpoint3.
  2. Selecteer het tabblad Overzicht om de DNS-instellingen en IP-adressen weer te geven.

Schermopname van privé-IP-adressen in de Azure Portal

Er worden meerdere IP-adressen gemaakt per privé-eindpunt:

  • Een voor het globale regio-agnostische eindpunt van het Azure Cosmos DB-account.
  • Eén voor elke regio waarin het Azure Cosmos DB-account is geïmplementeerd.

Een privé-eindpunt maken met behulp van Azure PowerShell

Voer het volgende PowerShell-script uit om een privé-eindpunt met de naam MyPrivateEndpoint te maken voor een bestaand Azure Cosmos DB-account. Vervang de variabelewaarden door de details voor uw omgeving.

$SubscriptionId = "<your Azure subscription ID>"
# Resource group where the Azure Cosmos DB account and virtual network resources are located
$ResourceGroupName = "myResourceGroup"
# Name of the Azure Cosmos DB account
$CosmosDbAccountName = "mycosmosaccount"

# Resource for the Azure Cosmos DB account: Sql, SqlDedicated, MongoDB, Cassandra, Gremlin, or Table
$CosmosDbSubResourceType = "Sql"
# Name of the existing virtual network
$VNetName = "myVnet"
# Name of the target subnet in the virtual network
$SubnetName = "mySubnet"
# Name of the private endpoint to create
$PrivateEndpointName = "MyPrivateEndpoint"
# Location where the private endpoint can be created. The private endpoint should be created in the same location where your subnet or the virtual network exists
$Location = "westcentralus"

$cosmosDbResourceId = "/subscriptions/$($SubscriptionId)/resourceGroups/$($ResourceGroupName)/providers/Microsoft.DocumentDB/databaseAccounts/$($CosmosDbAccountName)"

$privateEndpointConnection = New-AzPrivateLinkServiceConnection -Name "myConnectionPS" -PrivateLinkServiceId $cosmosDbResourceId -GroupId $CosmosDbSubResourceType
 
$virtualNetwork = Get-AzVirtualNetwork -ResourceGroupName  $ResourceGroupName -Name $VNetName  
 
$subnet = $virtualNetwork | Select -ExpandProperty subnets | Where-Object  {$_.Name -eq $SubnetName}  
 
$privateEndpoint = New-AzPrivateEndpoint -ResourceGroupName $ResourceGroupName -Name $PrivateEndpointName -Location $Location -Subnet  $subnet -PrivateLinkServiceConnection $privateEndpointConnection

Het privé-eindpunt integreren met een privé-DNS-zone

Nadat u het privé-eindpunt hebt gemaakt, kunt u dit integreren met een privé-DNS-zone met behulp van het volgende PowerShell-script:

Import-Module Az.PrivateDns

# Zone name differs based on the API type and group ID you are using. 
$zoneName = "privatelink.documents.azure.com"
$zone = New-AzPrivateDnsZone -ResourceGroupName $ResourceGroupName `
  -Name $zoneName

$link  = New-AzPrivateDnsVirtualNetworkLink -ResourceGroupName $ResourceGroupName `
  -ZoneName $zoneName `
  -Name "myzonelink" `
  -VirtualNetworkId $virtualNetwork.Id  
 
$pe = Get-AzPrivateEndpoint -Name $PrivateEndpointName `
  -ResourceGroupName $ResourceGroupName

$networkInterface = Get-AzResource -ResourceId $pe.NetworkInterfaces[0].Id `
  -ApiVersion "2019-04-01"

# Create DNS configuration

$PrivateDnsZoneId = $zone.ResourceId

$config = New-AzPrivateDnsZoneConfig -Name $zoneName `
 -PrivateDnsZoneId $PrivateDnsZoneId

## Create a DNS zone group
New-AzPrivateDnsZoneGroup -ResourceGroupName $ResourceGroupName `
 -PrivateEndpointName $PrivateEndpointName `
 -Name "MyPrivateZoneGroup" `
 -PrivateDnsZoneConfig $config

De privé-IP-adressen ophalen

Nadat het privé-eindpunt is ingericht, kunt u een query uitvoeren op de IP-adressen en de FQDN-toewijzing met behulp van het volgende PowerShell-script:

$pe = Get-AzPrivateEndpoint -Name MyPrivateEndpoint -ResourceGroupName myResourceGroup
$networkInterface = Get-AzNetworkInterface -ResourceId $pe.NetworkInterfaces[0].Id
foreach ($IPConfiguration in $networkInterface.IpConfigurations)
{
    Write-Host $IPConfiguration.PrivateIpAddress ":" $IPConfiguration.PrivateLinkConnectionProperties.Fqdns
}

Een privé-eindpunt maken met behulp van Azure CLI

Voer het volgende Azure CLI-script uit om een privé-eindpunt met de naam myPrivateEndpoint te maken voor een bestaand Azure Cosmos DB-account. Vervang de variabelewaarden door de details voor uw omgeving.

# Resource group where the Azure Cosmos DB account and virtual network resources are located
ResourceGroupName="myResourceGroup"

# Subscription ID where the Azure Cosmos DB account and virtual network resources are located
SubscriptionId="<your Azure subscription ID>"

# Name of the existing Azure Cosmos DB account
CosmosDbAccountName="mycosmosaccount"

# API type of your Azure Cosmos DB account: Sql, SqlDedicated, MongoDB, Cassandra, Gremlin, or Table
CosmosDbSubResourceType="Sql"

# Name of the virtual network to create
VNetName="myVnet"

# Name of the subnet to create
SubnetName="mySubnet"

# Name of the private endpoint to create
PrivateEndpointName="myPrivateEndpoint"

# Name of the private endpoint connection to create
PrivateConnectionName="myConnection"

az network vnet create \
 --name $VNetName \
 --resource-group $ResourceGroupName \
 --subnet-name $SubnetName

az network vnet subnet update \
 --name $SubnetName \
 --resource-group $ResourceGroupName \
 --vnet-name $VNetName \
 --disable-private-endpoint-network-policies true

az network private-endpoint create \
    --name $PrivateEndpointName \
    --resource-group $ResourceGroupName \
    --vnet-name $VNetName  \
    --subnet $SubnetName \
    --private-connection-resource-id "/subscriptions/$SubscriptionId/resourceGroups/$ResourceGroupName/providers/Microsoft.DocumentDB/databaseAccounts/$CosmosDbAccountName" \
    --group-ids $CosmosDbSubResourceType \
    --connection-name $PrivateConnectionName

Het privé-eindpunt integreren met een privé-DNS-zone

Nadat u het privé-eindpunt hebt gemaakt, kunt u dit integreren met een privé-DNS-zone met behulp van het volgende Azure CLI-script:

#Zone name differs based on the API type and group ID you are using. 
zoneName="privatelink.documents.azure.com"

az network private-dns zone create --resource-group $ResourceGroupName \
   --name  $zoneName

az network private-dns link vnet create --resource-group $ResourceGroupName \
   --zone-name  $zoneName\
   --name myzonelink \
   --virtual-network $VNetName \
   --registration-enabled false 

#Create a DNS zone group
az network private-endpoint dns-zone-group create \
   --resource-group $ResourceGroupName \
   --endpoint-name $PrivateEndpointName \
   --name "MyPrivateZoneGroup" \
   --private-dns-zone $zoneName \
   --zone-name "myzone"

Een privé-eindpunt maken met behulp van een Resource Manager-sjabloon

U kunt Private Link instellen door een privé-eindpunt te maken in een subnet van een virtueel netwerk. U bereikt dit met behulp van een Azure Resource Manager-sjabloon.

Gebruik de volgende code om een Resource Manager sjabloon met de naam PrivateEndpoint_template.json te maken. Met deze sjabloon maakt u een privé-eindpunt voor een bestaand Azure Cosmos DB vAPI for NoSQL-account in een bestaand virtueel netwerk.

@description('Location for all resources.')
param location string = resourceGroup().location
param privateEndpointName string
param resourceId string
param groupId string
param subnetId string

resource privateEndpoint 'Microsoft.Network/privateEndpoints@2019-04-01' = {
  name: privateEndpointName
  location: location
  properties: {
    subnet: {
      id: subnetId
    }
    privateLinkServiceConnections: [
      {
        name: 'MyConnection'
        properties: {
          privateLinkServiceId: resourceId
          groupIds: [
            groupId
          ]
          requestMessage: ''
        }
      }
    ]
  }
}

output privateEndpointNetworkInterface string = privateEndpoint.properties.networkInterfaces[0].id

Het parameterbestand voor de sjabloon definiëren

Maak een parameterbestand voor de sjabloon en geef deze de naam PrivateEndpoint_parameters.json. Voeg de volgende code toe aan het parameterbestand:

{
    "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentParameters.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
        "privateEndpointName": {
            "value": ""
        },
        "resourceId": {
            "value": ""
        },
        "groupId": {
            "value": ""
        },
        "subnetId": {
            "value": ""
        }
    }
}

De sjabloon implementeren met behulp van een PowerShell-script

Maak een PowerShell-script met behulp van de volgende code. Voordat u het script uitvoert, vervangt u de abonnements-id, de naam van de resourcegroep en andere variabelewaarden door de details voor uw omgeving.

### This script creates a private endpoint for an existing Azure Cosmos DB account in an existing virtual network

## Step 1: Fill in these details. Replace the variable values with the details for your environment.
$SubscriptionId = "<your Azure subscription ID>"
# Resource group where the Azure Cosmos DB account and virtual network resources are located
$ResourceGroupName = "myResourceGroup"
# Name of the Azure Cosmos DB account
$CosmosDbAccountName = "mycosmosaccount"
# API type of the Azure Cosmos DB account. It can be one of the following: "Sql", "SqlDedicated", "MongoDB", "Cassandra", "Gremlin", "Table"
$CosmosDbSubResourceType = "Sql"
# Name of the existing virtual network
$VNetName = "myVnet"
# Name of the target subnet in the virtual network
$SubnetName = "mySubnet"
# Name of the private endpoint to create
$PrivateEndpointName = "myPrivateEndpoint"

$cosmosDbResourceId = "/subscriptions/$($SubscriptionId)/resourceGroups/$($ResourceGroupName)/providers/Microsoft.DocumentDB/databaseAccounts/$($CosmosDbAccountName)"
$VNetResourceId = "/subscriptions/$($SubscriptionId)/resourceGroups/$($ResourceGroupName)/providers/Microsoft.Network/virtualNetworks/$($VNetName)"
$SubnetResourceId = "$($VNetResourceId)/subnets/$($SubnetName)"
$PrivateEndpointTemplateFilePath = "PrivateEndpoint_template.json"
$PrivateEndpointParametersFilePath = "PrivateEndpoint_parameters.json"

## Step 2: Sign in to your Azure account and select the target subscription.
Login-AzAccount
Select-AzSubscription -SubscriptionId $subscriptionId

## Step 3: Make sure private endpoint network policies are disabled in the subnet.
$VirtualNetwork= Get-AzVirtualNetwork -Name "$VNetName" -ResourceGroupName "$ResourceGroupName"
($virtualNetwork | Select -ExpandProperty subnets | Where-Object  {$_.Name -eq "$SubnetName"} ).PrivateEndpointNetworkPolicies = "Disabled"
$virtualNetwork | Set-AzVirtualNetwork

## Step 4: Create the private endpoint.
Write-Output "Deploying private endpoint on $($resourceGroupName)"
$deploymentOutput = New-AzResourceGroupDeployment -Name "PrivateCosmosDbEndpointDeployment" `
    -ResourceGroupName $resourceGroupName `
    -TemplateFile $PrivateEndpointTemplateFilePath `
    -TemplateParameterFile $PrivateEndpointParametersFilePath `
    -SubnetId $SubnetResourceId `
    -ResourceId $CosmosDbResourceId `
    -GroupId $CosmosDbSubResourceType `
    -PrivateEndpointName $PrivateEndpointName

$deploymentOutput

In het PowerShell-script kan de GroupId variabele slechts één waarde bevatten. Deze waarde is het API-type van het account. Toegestane waarden zijn: Sql, SqlDedicated, MongoDB, GremlinCassandra, en Table. Sommige Azure Cosmos DB-accounttypen zijn toegankelijk via meerdere API's. Bijvoorbeeld:

  • De API voor NoSQL-accounts heeft een extra optie voor accounts die zijn geconfigureerd voor het gebruik van de toegewezen gateway.
  • De API voor Gremlin-accounts kan worden geopend vanuit zowel Gremlin- als API voor NoSQL-accounts.
  • De API voor Tabelaccounts kan worden geopend vanuit zowel Table- als API for NoSQL-accounts.

Voor deze accounts moet u één privé-eindpunt maken voor elk API-type. Als u een privé-eindpunt maakt voor SqlDedicated, hoeft u alleen een tweede eindpunt toe te voegen als Sql u ook verbinding wilt maken met uw account via de standaardgateway. Het bijbehorende API-type wordt opgegeven in de GroupId matrix.

Nadat de sjabloon is geïmplementeerd, ziet u uitvoer die vergelijkbaar is met wat in de volgende afbeelding wordt weergegeven. De provisioningState waarde is Succeeded als de privé-eindpunten correct zijn ingesteld.

Schermopname van de implementatie-uitvoer voor de sjabloon Resource Manager.

Nadat de sjabloon is geïmplementeerd, worden de privé-IP-adressen gereserveerd in het subnet. De firewallregel van het Azure Cosmos DB-account is geconfigureerd om alleen verbindingen van het privé-eindpunt te accepteren.

Het privé-eindpunt integreren met een privé-DNS-zone

Gebruik de volgende code om een Resource Manager sjabloon met de naam PrivateZone_template.json te maken. Met deze sjabloon maakt u een privé-DNS-zone voor een bestaand Azure Cosmos DB-API voor NoSQL-account in een bestaand virtueel netwerk.

{
    "$schema": "http://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
        "privateZoneName": {
            "type": "string"
        },
        "VNetId": {
            "type": "string"
        }        
    },
    "resources": [
        {
            "name": "[parameters('privateZoneName')]",
            "type": "Microsoft.Network/privateDnsZones",
            "apiVersion": "2018-09-01",
            "location": "global",
            "properties": {                
            }
        },
        {
            "type": "Microsoft.Network/privateDnsZones/virtualNetworkLinks",
            "apiVersion": "2018-09-01",
            "name": "[concat(parameters('privateZoneName'), '/myvnetlink')]",
            "location": "global",
            "dependsOn": [
                "[resourceId('Microsoft.Network/privateDnsZones', parameters('privateZoneName'))]"
            ],
            "properties": {
                "registrationEnabled": false,
                "virtualNetwork": {
                    "id": "[parameters('VNetId')]"
                }
            }
        }        
    ]
}

Het parameterbestand voor de sjabloon definiëren

Maak de volgende twee parameters voor de sjabloon. Maak de PrivateZone_parameters.json met de volgende code:

{
    "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentParameters.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
        "privateZoneName": {
            "value": ""
        },
        "VNetId": {
            "value": ""
        }
    }
}

Gebruik de volgende code om een Resource Manager sjabloon met de naam PrivateZoneGroup_template.json te maken. Met deze sjabloon maakt u een privé-DNS-zonegroep voor een bestaand Azure Cosmos DB-API voor NoSQL-account in een bestaand virtueel netwerk.

{
    "$schema": "http://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
        "privateZoneName": {
            "type": "string"
        },
        "PrivateEndpointDnsGroupName": {
            "value": "string"
        },
        "privateEndpointName":{
            "value": "string"
        }        
    },
    "resources": [
        {
            "type": "Microsoft.Network/privateEndpoints/privateDnsZoneGroups",
            "apiVersion": "2020-06-01",
            "name": "[parameters('PrivateEndpointDnsGroupName')]",
            "location": "global",
            "dependsOn": [
                "[resourceId('Microsoft.Network/privateDnsZones', parameters('privateZoneName'))]",
                "[variables('privateEndpointName')]"
            ],
          "properties": {
            "privateDnsZoneConfigs": [
              {
                "name": "config1",
                "properties": {
                  "privateDnsZoneId": "[resourceId('Microsoft.Network/privateDnsZones', parameters('privateZoneName'))]"
                }
              }
            ]
          }
        }
    ]
}

Het parameterbestand voor de sjabloon definiëren

Maak de volgende twee parameters voor de sjabloon. Maak de PrivateZoneGroup_parameters.json. met de volgende code:

{
    "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentParameters.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
        "privateZoneName": {
            "value": ""
        },
        "PrivateEndpointDnsGroupName": {
            "value": ""
        },
        "privateEndpointName":{
            "value": ""
        }
    }
}

De sjabloon implementeren met behulp van een PowerShell-script

Maak een PowerShell-script met behulp van de volgende code. Voordat u het script uitvoert, vervangt u de abonnements-id, de naam van de resourcegroep en andere variabelewaarden door de details voor uw omgeving.

### This script:
### - creates a private zone
### - creates a private endpoint for an existing Azure Cosmos DB account in an existing VNet
### - maps the private endpoint to the private zone

## Step 1: Fill in these details. Replace the variable values with the details for your environment.
$SubscriptionId = "<your Azure subscription ID>"
# Resource group where the Azure Cosmos DB account and virtual network resources are located
$ResourceGroupName = "myResourceGroup"
# Name of the Azure Cosmos DB account
$CosmosDbAccountName = "mycosmosaccount"
# API type of the Azure Cosmos DB account. It can be one of the following: "Sql", "SqlDedicated", "MongoDB", "Cassandra", "Gremlin", "Table"
$CosmosDbSubResourceType = "Sql"
# Name of the existing virtual network
$VNetName = "myVnet"
# Name of the target subnet in the virtual network
$SubnetName = "mySubnet"
# Name of the private zone to create
$PrivateZoneName = "myPrivateZone.documents.azure.com"
# Name of the private endpoint to create
$PrivateEndpointName = "myPrivateEndpoint"

# Name of the DNS zone group to create
$PrivateEndpointDnsGroupName = "myPrivateDNSZoneGroup"

$cosmosDbResourceId = "/subscriptions/$($SubscriptionId)/resourceGroups/$($ResourceGroupName)/providers/Microsoft.DocumentDB/databaseAccounts/$($CosmosDbAccountName)"
$VNetResourceId = "/subscriptions/$($SubscriptionId)/resourceGroups/$($ResourceGroupName)/providers/Microsoft.Network/virtualNetworks/$($VNetName)"
$SubnetResourceId = "$($VNetResourceId)/subnets/$($SubnetName)"
$PrivateZoneTemplateFilePath = "PrivateZone_template.json"
$PrivateZoneParametersFilePath = "PrivateZone_parameters.json"
$PrivateEndpointTemplateFilePath = "PrivateEndpoint_template.json"
$PrivateEndpointParametersFilePath = "PrivateEndpoint_parameters.json"
$PrivateZoneGroupTemplateFilePath = "PrivateZoneGroup_template.json"
$PrivateZoneGroupParametersFilePath = "PrivateZoneGroup_parameters.json"

## Step 2: Login your Azure account and select the target subscription
Login-AzAccount 
Select-AzSubscription -SubscriptionId $subscriptionId

## Step 3: Make sure private endpoint network policies are disabled in the subnet
$VirtualNetwork= Get-AzVirtualNetwork -Name "$VNetName" -ResourceGroupName "$ResourceGroupName"
($virtualNetwork | Select -ExpandProperty subnets | Where-Object  {$_.Name -eq "$SubnetName"} ).PrivateEndpointNetworkPolicies = "Disabled"
$virtualNetwork | Set-AzVirtualNetwork

## Step 4: Create the private zone
New-AzResourceGroupDeployment -Name "PrivateZoneDeployment" `
    -ResourceGroupName $ResourceGroupName `
    -TemplateFile $PrivateZoneTemplateFilePath `
    -TemplateParameterFile $PrivateZoneParametersFilePath `
    -PrivateZoneName $PrivateZoneName `
    -VNetId $VNetResourceId

## Step 5: Create the private endpoint
Write-Output "Deploying private endpoint on $($resourceGroupName)"
$deploymentOutput = New-AzResourceGroupDeployment -Name "PrivateCosmosDbEndpointDeployment" `
    -ResourceGroupName $resourceGroupName `
    -TemplateFile $PrivateEndpointTemplateFilePath `
    -TemplateParameterFile $PrivateEndpointParametersFilePath `
    -SubnetId $SubnetResourceId `
    -ResourceId $CosmosDbResourceId `
    -GroupId $CosmosDbSubResourceType `
    -PrivateEndpointName $PrivateEndpointName
$deploymentOutput

## Step 6: Create the private zone
New-AzResourceGroupDeployment -Name "PrivateZoneGroupDeployment" `
    -ResourceGroupName $ResourceGroupName `
    -TemplateFile $PrivateZoneGroupTemplateFilePath `
    -TemplateParameterFile $PrivateZoneGroupParametersFilePath `
    -PrivateZoneName $PrivateZoneName `
    -PrivateEndpointName $PrivateEndpointName`
    -PrivateEndpointDnsGroupName $PrivateEndpointDnsGroupName

Aangepaste DNS configureren

Gebruik een privé-DNS-zone binnen het subnet waarin u het privé-eindpunt hebt gemaakt. Configureer de eindpunten zo dat elk privé-IP-adres wordt toegewezen aan een DNS-vermelding. Zie de eigenschap fqdns in het antwoord dat eerder is weergegeven.

Wanneer u het privé-eindpunt maakt, kunt u dit integreren met een privé-DNS-zone in Azure. Als u ervoor kiest om in plaats daarvan een aangepaste DNS-zone te gebruiken, moet u deze configureren om DNS-records toe te voegen voor alle privé-IP-adressen die zijn gereserveerd voor het privé-eindpunt.

Belangrijk

Het is de DNS-resolutie van uw aanvragen die bepaalt of deze aanvragen via uw privé-eindpunten gaan of de standaard openbare route nemen. Zorg ervoor dat uw lokale DNS correct verwijst naar het privé-IP-adres dat is toegewezen door uw privé-eindpunt.

De volgende situaties en resultaten zijn mogelijk wanneer u Private Link gebruikt in combinatie met firewallregels:

  • Als u geen firewallregels configureert, heeft al het verkeer standaard toegang tot een Azure Cosmos DB-account.

  • Als u openbaar verkeer of een service-eindpunt configureert en u privé-eindpunten maakt, worden verschillende typen binnenkomend verkeer geautoriseerd door het bijbehorende type firewallregel. Als een privé-eindpunt is geconfigureerd in een subnet waar het service-eindpunt ook is geconfigureerd:

    • verkeer naar het databaseaccount dat is toegewezen door het privé-eindpunt, wordt gerouteerd via een privé-eindpunt,
    • verkeer naar andere databaseaccounts van het subnet wordt gerouteerd via het service-eindpunt.
  • Als u geen openbaar verkeer of service-eindpunt configureert en u privé-eindpunten maakt, is het Azure Cosmos DB-account alleen toegankelijk via de privé-eindpunten. Als u geen openbaar verkeer of een service-eindpunt configureert nadat alle goedgekeurde privé-eindpunten zijn geweigerd of verwijderd, is het account geopend voor het hele netwerk, tenzij PublicNetworkAccess is ingesteld op Uitgeschakeld.

Openbare netwerktoegang blokkeren tijdens het maken van het account

Zoals beschreven in de vorige sectie, en tenzij er specifieke firewallregels zijn ingesteld, maakt het toevoegen van een privé-eindpunt uw Azure Cosmos DB-account alleen toegankelijk via privé-eindpunten. Dit betekent dat het Azure Cosmos DB-account kan worden bereikt vanuit openbaar verkeer nadat het is gemaakt en voordat een privé-eindpunt wordt toegevoegd. Om ervoor te zorgen dat openbare netwerktoegang is uitgeschakeld, zelfs vóór het maken van privé-eindpunten, kunt u de vlag instellen op Uitgeschakeld tijdens het maken van het publicNetworkAccess account. Houd er rekening mee dat deze vlag voorrang heeft op een IP-adres of virtuele netwerkregel. Al het openbare en virtuele netwerkverkeer wordt geblokkeerd wanneer de vlag is ingesteld op Uitgeschakeld, zelfs als het bron-IP-adres of het virtuele netwerk is toegestaan in de firewallconfiguratie.

Zie deze Azure Resource Manager-sjabloon voor een voorbeeld van het gebruik van deze vlag.

Privé-eindpunten toevoegen aan een bestaand Azure Cosmos DB-account zonder downtime

Standaard resulteert het toevoegen van een privé-eindpunt aan een bestaand account in een korte downtime van ongeveer vijf minuten. Volg deze instructies om deze downtime te voorkomen:

  1. Voeg IP- of virtuele netwerkregels toe aan uw firewallconfiguratie om uw clientverbindingen expliciet toe te staan.
  2. Wacht tien minuten om ervoor te zorgen dat de configuratie-update wordt toegepast.
  3. Configureer uw nieuwe privé-eindpunt.
  4. Verwijder de firewallregels die zijn ingesteld in stap 1.

Notitie

Als u toepassingen uitvoert die gebruikmaken van de Azure Cosmos DB SDK's, zijn er mogelijk tijdelijke time-outs tijdens de configuratie-update. Zorg ervoor dat uw toepassing is ontworpen om bestand te zijn tegen tijdelijke verbindingsfouten en dat er logica voor opnieuw proberen is ingesteld voor het geval dat nodig is.

Poortbereik bij gebruik van directe modus

Wanneer u Private Link gebruikt met een Azure Cosmos DB-account via een directe modusverbinding, moet u ervoor zorgen dat het volledige bereik van TCP-poorten (0 - 65535) is geopend.

Een privé-eindpunt bijwerken wanneer u een regio toevoegt of verwijdert

Er zijn drie regio's voor azure Cosmos DB-accountimplementaties: VS -west, VS - centraal en Europa - west. Wanneer u een privé-eindpunt voor uw account maakt, worden vier privé-IP-adressen gereserveerd in het subnet. Er is één IP-adres voor elk van de drie regio's en er is één IP-adres voor het globale regio-agnostische eindpunt. Later kunt u een nieuwe regio toevoegen aan het Azure Cosmos DB-account. De privé-DNS-zone wordt als volgt bijgewerkt:

  • Als privé-DNS-zonegroep wordt gebruikt:

    Als u een privé-DNS-zonegroep gebruikt, wordt de privé-DNS-zone automatisch bijgewerkt wanneer het privé-eindpunt wordt bijgewerkt. In het vorige voorbeeld, na het toevoegen van een nieuwe regio, wordt de privé-DNS-zone automatisch bijgewerkt.

  • Als de privé-DNS-zonegroep niet wordt gebruikt:

    Als u geen privé-DNS-zonegroep gebruikt, moet u DNS-vermeldingen voor dat account toevoegen aan of verwijderen van regio's aan een Azure Cosmos DB-account. Nadat regio's zijn toegevoegd of verwijderd, kunt u de privé-DNS-zone van het subnet bijwerken om de toegevoegde of verwijderde DNS-vermeldingen en de bijbehorende privé-IP-adressen weer te geven.

    In het vorige voorbeeld moet u, nadat u de nieuwe regio hebt toegevoegd, een bijbehorende DNS-record toevoegen aan uw privé-DNS-zone of uw aangepaste DNS. U kunt dezelfde stappen gebruiken wanneer u een regio verwijdert. Nadat u de regio hebt verwijderd, moet u de bijbehorende DNS-record verwijderen uit uw privé-DNS-zone of uw aangepaste DNS.

Huidige beperkingen

De volgende beperkingen zijn van toepassing wanneer u Private Link gebruikt met een Azure Cosmos DB-account:

  • U kunt niet meer dan 200 privé-eindpunten hebben in één Azure Cosmos DB-account.

  • Wanneer u Private Link gebruikt met een Azure Cosmos DB-account via een directe modusverbinding, kunt u alleen het TCP-protocol gebruiken. Het HTTP-protocol wordt momenteel niet ondersteund.

  • Wanneer u de API van Azure Cosmos DB gebruikt voor een MongoDB-account, wordt een privé-eindpunt ondersteund voor accounts met serverversie 3.6 of hoger (dat wil gezegd, accounts die het eindpunt gebruiken in de indeling *.mongo.cosmos.azure.com). Private Link wordt niet ondersteund voor accounts met serverversie 3.2 (dat wil gezegd, accounts die het eindpunt gebruiken in de indeling *.documents.azure.com). Als u Private Link wilt gebruiken, moet u oude accounts migreren naar de nieuwe versie.

  • Wanneer u de API van Azure Cosmos DB gebruikt voor een MongoDB-account met een Private Link, moeten hulpprogramma's en bibliotheken servicenaamidentificatie (SNI) ondersteunen of de appName parameter van de connection string doorgeven om correct verbinding te maken. Sommige oudere hulpprogramma's en bibliotheken zijn mogelijk niet compatibel met de functie Private Link.

  • Aan een netwerkbeheerder moet ten minste de Microsoft.DocumentDB/databaseAccounts/PrivateEndpointConnectionsApproval/action machtiging voor het Azure Cosmos DB-accountbereik worden verleend om automatisch goedgekeurde privé-eindpunten te maken.

  • Op dit moment kunt u een geweigerde privé-eindpuntverbinding niet goedkeuren. Maak in plaats daarvan het privé-eindpunt opnieuw om de privéverbinding te hervatten. De Azure Cosmos DB Private Link-service keurt automatisch het opnieuw gemaakte privé-eindpunt goed.

Beperkingen voor integratie van privé-DNS-zones

Tenzij u een privé-DNS-zonegroep gebruikt, worden DNS-records in de privé-DNS-zone niet automatisch verwijderd wanneer u een privé-eindpunt of een regio verwijdert uit het Azure Cosmos DB-account. U moet de DNS-records handmatig verwijderen voordat:

  • Een nieuw privé-eindpunt toevoegen dat is gekoppeld aan deze privé-DNS-zone.
  • Een nieuwe regio toevoegen aan een databaseaccount met privé-eindpunten die zijn gekoppeld aan deze privé-DNS-zone.

Als u de DNS-records niet opschoont, kunnen onverwachte problemen met het gegevensvlak optreden. Deze problemen omvatten gegevensstoring in regio's die zijn toegevoegd na het verwijderen van het privé-eindpunt of het verwijderen van regio's.

Volgende stappen

Zie de volgende artikelen voor meer informatie over de beveiligingsfuncties van Azure Cosmos DB: