Konfigurowanie usługi Azure Private Link dla konta usługi Azure Cosmos DB

DOTYCZY: Nosql Mongodb Cassandra Gremlin Tabeli

Korzystając z Azure Private Link, możesz nawiązać połączenie z kontem usługi Azure Cosmos DB za pośrednictwem prywatnego punktu końcowego. Prywatny punkt końcowy to zestaw prywatnych adresów IP w podsieci w sieci wirtualnej. Następnie możesz ograniczyć dostęp do konta usługi Azure Cosmos DB za pośrednictwem prywatnych adresów IP. Po połączeniu Private Link z restrykcyjnymi zasadami sieciowej grupy zabezpieczeń pomaga zmniejszyć ryzyko eksfiltracji danych. Aby dowiedzieć się więcej na temat prywatnych punktów końcowych, zobacz Co to jest Azure Private Link?

Uwaga

Private Link nie uniemożliwia rozpoznawania punktów końcowych usługi Azure Cosmos DB przez publiczny system DNS. Filtrowanie żądań przychodzących odbywa się na poziomie aplikacji, a nie na poziomie transportu ani sieci.

Private Link umożliwia użytkownikom dostęp do konta usługi Azure Cosmos DB z poziomu sieci wirtualnej lub z dowolnej równorzędnej sieci wirtualnej. Zasoby mapowane na Private Link są również dostępne lokalnie za pośrednictwem prywatnej komunikacji równorzędnej za pośrednictwem sieci VPN lub usługi Azure ExpressRoute.

Możesz nawiązać połączenie z kontem usługi Azure Cosmos DB skonfigurowanym przy użyciu Private Link przy użyciu metody automatycznego lub ręcznego zatwierdzania. Aby dowiedzieć się więcej, zobacz sekcję przepływu pracy zatwierdzania w dokumentacji Private Link.

W tym artykule opisano sposób konfigurowania prywatnych punktów końcowych dla magazynu transakcyjnego usługi Azure Cosmos DB. Przyjęto założenie, że używasz metody automatycznego zatwierdzania. Jeśli używasz magazynu analitycznego, zobacz Konfigurowanie prywatnych punktów końcowych dla magazynu analitycznego.

Tworzenie prywatnego punktu końcowego przy użyciu Azure Portal

Wykonaj następujące kroki, aby utworzyć prywatny punkt końcowy dla istniejącego konta usługi Azure Cosmos DB przy użyciu Azure Portal:

  1. Zaloguj się do Azure Portal, a następnie wybierz konto usługi Azure Cosmos DB.

  2. Wybierz pozycję Sieć z listy ustawień, a następnie wybierz pozycję + Prywatny punkt końcowy na karcie Dostęp prywatny :

    Zrzut ekranu przedstawiający opcje tworzenia prywatnego punktu końcowego w Azure Portal

  3. W okienku Tworzenie prywatnego punktu końcowego — Podstawy wprowadź lub wybierz następujące szczegóły:

    Ustawienie Wartość
    Szczegóły projektu
    Subskrypcja Wybierz subskrypcję.
    Grupa zasobów Wybierz grupę zasobów.
    Szczegóły wystąpienia
    Nazwa Wprowadź dowolną nazwę prywatnego punktu końcowego. Jeśli ta nazwa zostanie pobrana, utwórz unikatową nazwę.
    Region (Region) Wybierz region, w którym chcesz wdrożyć Private Link. Utwórz prywatny punkt końcowy w tej samej lokalizacji, w której istnieje twoja sieć wirtualna.
  4. Wybierz pozycję Dalej: Zasób.

  5. W okienku Tworzenie prywatnego punktu końcowego — zasób wprowadź lub wybierz następujące informacje:

    Ustawienie Wartość
    Metoda połączenia Wybierz pozycję Połącz z zasobem platformy Azure w moim katalogu.

    Następnie możesz wybrać jeden z zasobów do skonfigurowania Private Link. Możesz też nawiązać połączenie z zasobem innego użytkownika przy użyciu identyfikatora zasobu lub aliasu, który ci udostępnił.
    Subskrypcja Wybierz subskrypcję.
    Typ zasobu Wybierz pozycję Microsoft.AzureCosmosDB/databaseAccounts.
    Zasób Wybierz konto usługi Azure Cosmos DB.
    Docelowy podźródło Wybierz typ interfejsu API usługi Azure Cosmos DB, który chcesz mapować. Domyślnie jest to tylko jeden wybór interfejsów API dla baz danych SQL, MongoDB i Cassandra. W przypadku interfejsów API dla języka Gremlin i tabeli możesz również wybrać pozycję NoSQL , ponieważ te interfejsy API współdziałają z interfejsem API dla NoSQL. Jeśli masz dedykowaną bramę aprowizowaną dla konta interfejsu API dla noSQL, zobaczysz również opcję sqlDedicated.
  6. Wybierz pozycję Dalej: Virtual Network.

  7. W okienku Tworzenie prywatnego punktu końcowego — Virtual Network wprowadź lub wybierz następujące informacje:

    Ustawienie Wartość
    Sieć wirtualna Wybierz sieć wirtualną.
    Podsieć Wybierz podsieć.
  8. Wybierz pozycję Dalej: DNS.

  9. W okienku Tworzenie prywatnego punktu końcowego — DNS wprowadź lub wybierz następujące informacje:

    Ustawienie Wartość
    Integruj z prywatną strefą DNS Wybierz pozycję Tak.

    Aby połączyć się prywatnie z prywatnym punktem końcowym, potrzebny jest rekord DNS. Zalecamy zintegrowanie prywatnego punktu końcowego z prywatną strefą DNS. Możesz również użyć własnych serwerów DNS lub utworzyć rekordy DNS przy użyciu plików hosta na maszynach wirtualnych.

    Po wybraniu opcji tak dla tej opcji zostanie również utworzona prywatna grupa stref DNS. Grupa stref DNS jest łączem między prywatną strefą DNS a prywatnym punktem końcowym. Ten link ułatwia automatyczne aktualizowanie prywatnej strefy DNS w przypadku aktualizacji prywatnego punktu końcowego. Na przykład po dodaniu lub usunięciu regionów prywatna strefa DNS zostanie automatycznie zaktualizowana.
    Nazwa konfiguracji Wybierz swoją subskrypcję i grupę zasobów.

    Prywatna strefa DNS jest określana automatycznie. Nie można go zmienić przy użyciu Azure Portal.
  10. Wybierz pozycję Dalej: Przeglądanie tagów>i tworzenie. Na stronie Przeglądanie i tworzenie platforma Azure weryfikuje konfigurację.

  11. Po wyświetleniu komunikatu Sprawdzanie poprawności zakończone powodzeniem kliknij przycisk Utwórz.

Po zatwierdzeniu Private Link dla konta usługi Azure Cosmos DB w Azure Portal opcja Wszystkie sieci w okienku Zapora i sieci wirtualne jest niedostępna.

Typy interfejsów API i nazwy stref prywatnych

Zapoznaj się z konfiguracją dns prywatnego punktu końcowego platformy Azure , aby uzyskać bardziej szczegółowe wyjaśnienie dotyczące stref prywatnych i konfiguracji DNS dla prywatnego punktu końcowego. W poniższej tabeli przedstawiono mapowanie między różnymi typami interfejsu API kont usługi Azure Cosmos DB, obsługiwanymi podźródłami i odpowiednimi nazwami stref prywatnych. Dostęp do kont języka Gremlin i interfejsu API dla tabel można również uzyskać za pośrednictwem interfejsu API dla NoSQL, dlatego istnieją dwa wpisy dla tych interfejsów API. Istnieje również dodatkowy wpis dla interfejsu API dla noSQL dla kont korzystających z dedykowanej bramy.

Typ interfejsu API konta usługi Azure Cosmos DB Obsługiwane podźródła lub identyfikatory grup Nazwa strefy prywatnej
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
Tabela Tabela privatelink.table.cosmos.azure.com
Tabela Sql privatelink.documents.azure.com

Pobieranie prywatnych adresów IP

Po aprowizacji prywatnego punktu końcowego można wykonywać zapytania dotyczące adresów IP. Aby wyświetlić adresy IP z Azure Portal:

  1. Wyszukaj utworzony wcześniej prywatny punkt końcowy. W tym przypadku jest to cdbPrivateEndpoint3.
  2. Wybierz kartę Przegląd , aby wyświetlić ustawienia DNS i adresy IP.

Zrzut ekranu przedstawiający prywatne adresy IP w Azure Portal

Na prywatny punkt końcowy jest tworzonych wiele adresów IP:

  • Jeden dla globalnego, niezależnego od regionu punktu końcowego konta usługi Azure Cosmos DB.
  • Jeden dla każdego regionu, w którym jest wdrażane konto usługi Azure Cosmos DB.

Tworzenie prywatnego punktu końcowego przy użyciu Azure PowerShell

Uruchom następujący skrypt programu PowerShell, aby utworzyć prywatny punkt końcowy o nazwie MyPrivateEndpoint dla istniejącego konta usługi Azure Cosmos DB. Zastąp wartości zmiennych szczegółami środowiska.

$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

Integrowanie prywatnego punktu końcowego z prywatną strefą DNS

Po utworzeniu prywatnego punktu końcowego można zintegrować go z prywatną strefą DNS przy użyciu następującego skryptu programu PowerShell:

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

Pobieranie prywatnych adresów IP

Po aprowizacji prywatnego punktu końcowego można wykonywać zapytania dotyczące adresów IP i mapowania nazwy FQDN przy użyciu następującego skryptu programu PowerShell:

$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
}

Tworzenie prywatnego punktu końcowego przy użyciu interfejsu wiersza polecenia platformy Azure

Uruchom następujący skrypt interfejsu wiersza polecenia platformy Azure, aby utworzyć prywatny punkt końcowy o nazwie myPrivateEndpoint dla istniejącego konta usługi Azure Cosmos DB. Zastąp wartości zmiennych szczegółami środowiska.

# 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

Integrowanie prywatnego punktu końcowego z prywatną strefą DNS

Po utworzeniu prywatnego punktu końcowego można zintegrować go z prywatną strefą DNS przy użyciu następującego skryptu interfejsu wiersza polecenia platformy Azure:

#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"

Tworzenie prywatnego punktu końcowego przy użyciu szablonu Resource Manager

Możesz skonfigurować Private Link, tworząc prywatny punkt końcowy w podsieci sieci wirtualnej. Można to osiągnąć przy użyciu szablonu usługi Azure Resource Manager.

Użyj poniższego kodu, aby utworzyć szablon Resource Manager o nazwie PrivateEndpoint_template.json. Ten szablon tworzy prywatny punkt końcowy dla istniejącego konta usługi Azure Cosmos DB vAPI for NoSQL w istniejącej sieci wirtualnej.

@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

Definiowanie pliku parametrów dla szablonu

Utwórz plik parametrów dla szablonu i nadaj mu nazwę PrivateEndpoint_parameters.json. Dodaj następujący kod do pliku parameters:

{
    "$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": ""
        }
    }
}

Wdrażanie szablonu przy użyciu skryptu programu PowerShell

Utwórz skrypt programu PowerShell przy użyciu następującego kodu. Przed uruchomieniem skryptu zastąp identyfikator subskrypcji, nazwę grupy zasobów i inne wartości zmiennych szczegółami środowiska.

### 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

W skryscie programu PowerShell zmienna GroupId może zawierać tylko jedną wartość. Ta wartość jest typem interfejsu API konta. Dozwolone wartości to: Sql, , SqlDedicated, CassandraMongoDB, Gremlini Table. Niektóre typy kont usługi Azure Cosmos DB są dostępne za pośrednictwem wielu interfejsów API. Na przykład:

  • Konta interfejsu API dla noSQL mają dodatkową opcję dla kont skonfigurowanych do korzystania z dedykowanej bramy.
  • Dostęp do interfejsu API dla kont języka Gremlin można uzyskać zarówno z kont Języka Gremlin, jak i interfejsu API dla noSQL.
  • Dostęp do interfejsu API dla kont tabel można uzyskać z kont tabel i interfejsu API dla kont NoSQL.

W przypadku tych kont należy utworzyć jeden prywatny punkt końcowy dla każdego typu interfejsu API. Jeśli tworzysz prywatny punkt końcowy dla SqlDedicatedprogramu , musisz dodać tylko drugi punkt końcowy, Sql jeśli chcesz również nawiązać połączenie z kontem przy użyciu bramy standardowej. Odpowiedni typ interfejsu API jest określony w tablicy GroupId .

Po pomyślnym wdrożeniu szablonu można zobaczyć dane wyjściowe podobne do pokazanych na poniższej ilustracji. Wartość provisioningState jest określana Succeeded , jeśli prywatne punkty końcowe są poprawnie skonfigurowane.

Zrzut ekranu przedstawiający dane wyjściowe wdrożenia dla szablonu Resource Manager.

Po wdrożeniu szablonu prywatne adresy IP są zarezerwowane w podsieci. Reguła zapory konta usługi Azure Cosmos DB jest skonfigurowana do akceptowania połączeń tylko z prywatnego punktu końcowego.

Integrowanie prywatnego punktu końcowego z prywatną strefą DNS

Użyj poniższego kodu, aby utworzyć szablon Resource Manager o nazwie PrivateZone_template.json. Ten szablon tworzy prywatną strefę DNS dla istniejącego konta interfejsu API usługi Azure Cosmos DB dla noSQL w istniejącej sieci wirtualnej.

{
    "$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')]"
                }
            }
        }        
    ]
}

Definiowanie pliku parametrów dla szablonu

Utwórz następujący plik dwóch parametrów dla szablonu. Utwórz plik PrivateZone_parameters.json przy użyciu następującego kodu:

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

Użyj następującego kodu, aby utworzyć szablon Resource Manager o nazwie PrivateZoneGroup_template.json. Ten szablon tworzy prywatną grupę stref DNS dla istniejącego konta interfejsu API usługi Azure Cosmos DB dla noSQL w istniejącej sieci wirtualnej.

{
    "$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'))]"
                }
              }
            ]
          }
        }
    ]
}

Definiowanie pliku parametrów dla szablonu

Utwórz następujący plik dwóch parametrów dla szablonu. Utwórz plik PrivateZoneGroup_parameters.json. z następującym kodem:

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

Wdrażanie szablonu przy użyciu skryptu programu PowerShell

Utwórz skrypt programu PowerShell przy użyciu następującego kodu. Przed uruchomieniem skryptu zastąp identyfikator subskrypcji, nazwę grupy zasobów i inne wartości zmiennych szczegółami środowiska.

### 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

Konfigurowanie niestandardowego systemu DNS

Należy użyć prywatnej strefy DNS w podsieci, w której utworzono prywatny punkt końcowy. Skonfiguruj punkty końcowe, aby każdy prywatny adres IP był mapowany na wpis DNS. Zobacz właściwość fqdns w pokazanej wcześniej odpowiedzi.

Podczas tworzenia prywatnego punktu końcowego możesz zintegrować go z prywatną strefą DNS na platformie Azure. Jeśli zdecydujesz się zamiast tego użyć niestandardowej strefy DNS, musisz skonfigurować ją do dodawania rekordów DNS dla wszystkich prywatnych adresów IP zarezerwowanych dla prywatnego punktu końcowego.

Ważne

Jest to rozpoznawanie nazw DNS żądań, które określają, czy te żądania przechodzą przez prywatne punkty końcowe, czy też przyjmują standardową trasę publiczną. Upewnij się, że lokalny system DNS prawidłowo odwołuje się do prywatnego adresu IP zamapowanego przez prywatny punkt końcowy.

W przypadku używania Private Link w połączeniu z regułami zapory możliwe są następujące sytuacje i wyniki:

  • Jeśli nie skonfigurujesz żadnych reguł zapory, domyślnie cały ruch będzie mógł uzyskiwać dostęp do konta usługi Azure Cosmos DB.

  • W przypadku skonfigurowania ruchu publicznego lub punktu końcowego usługi i utworzenia prywatnych punktów końcowych różne typy ruchu przychodzącego są autoryzowane przez odpowiedni typ reguły zapory. Jeśli prywatny punkt końcowy jest skonfigurowany w podsieci, w której skonfigurowano również punkt końcowy usługi:

    • ruch do konta bazy danych zamapowany przez prywatny punkt końcowy jest kierowany za pośrednictwem prywatnego punktu końcowego,
    • ruch do innych kont bazy danych z podsieci jest kierowany za pośrednictwem punktu końcowego usługi.
  • Jeśli nie skonfigurujesz żadnego publicznego ruchu lub punktu końcowego usługi i utworzysz prywatne punkty końcowe, konto usługi Azure Cosmos DB będzie dostępne tylko za pośrednictwem prywatnych punktów końcowych. Jeśli nie skonfigurujesz ruchu publicznego ani punktu końcowego usługi, po odrzuceniu lub usunięciu wszystkich zatwierdzonych prywatnych punktów końcowych konto jest otwarte dla całej sieci, chyba że PublicNetworkAccess jest ustawione na wartość Wyłączone.

Blokowanie dostępu z sieci publicznej podczas tworzenia konta

Zgodnie z opisem w poprzedniej sekcji i chyba że zostały ustawione określone reguły zapory, dodanie prywatnego punktu końcowego sprawia, że konto usługi Azure Cosmos DB jest dostępne tylko za pośrednictwem prywatnych punktów końcowych. Oznacza to, że konto usługi Azure Cosmos DB można uzyskać z ruchu publicznego po jego utworzeniu i przed dodaniu prywatnego punktu końcowego. Aby upewnić się, że dostęp do sieci publicznej jest wyłączony jeszcze przed utworzeniem prywatnych punktów końcowych, możesz ustawić flagę publicNetworkAccessna Wyłączone podczas tworzenia konta. Należy pamiętać, że ta flaga ma pierwszeństwo przed dowolnym adresem IP lub regułą sieci wirtualnej. Cały ruch w sieci publicznej i wirtualnej jest blokowany, gdy flaga jest ustawiona na Wyłączone, nawet jeśli źródłowy adres IP lub sieć wirtualna jest dozwolony w konfiguracji zapory.

Aby zapoznać się z przykładem użycia tej flagi, zobacz ten szablon usługi Azure Resource Manager.

Dodawanie prywatnych punktów końcowych do istniejącego konta usługi Azure Cosmos DB bez przestojów

Domyślnie dodanie prywatnego punktu końcowego do istniejącego konta powoduje krótki przestój w ciągu około pięciu minut. Postępuj zgodnie z tymi instrukcjami, aby uniknąć tego przestoju:

  1. Dodaj reguły adresów IP lub sieci wirtualnej do konfiguracji zapory, aby jawnie zezwolić na połączenia klienckie.
  2. Poczekaj 10 minut, aby upewnić się, że aktualizacja konfiguracji jest stosowana.
  3. Skonfiguruj nowy prywatny punkt końcowy.
  4. Usuń reguły zapory ustawione w kroku 1.

Uwaga

Jeśli masz uruchomione aplikacje korzystające z zestawów SDK usługi Azure Cosmos DB, mogą wystąpić przejściowe przekroczenia limitu czasu podczas aktualizacji konfiguracji. Upewnij się, że aplikacja została zaprojektowana tak, aby była odporna na przejściowe błędy łączności i czy logika ponawiania prób została zaprojektowana w przypadku, gdy jest to konieczne.

Zakres portów w przypadku korzystania z trybu bezpośredniego

Jeśli używasz Private Link z kontem usługi Azure Cosmos DB za pośrednictwem połączenia w trybie bezpośrednim, musisz upewnić się, że otwarty jest pełny zakres portów TCP (0–65535).

Aktualizowanie prywatnego punktu końcowego podczas dodawania lub usuwania regionu

Istnieją trzy regiony wdrożeń kont usługi Azure Cosmos DB: Zachodnie stany USA, Środkowe stany USA i Europa Zachodnia. Podczas tworzenia prywatnego punktu końcowego dla konta w podsieci są zarezerwowane cztery prywatne adresy IP. Istnieje jeden adres IP dla każdego z trzech regionów i istnieje jeden adres IP dla globalnego punktu końcowego niezależnego od regionu. Później możesz dodać nowy region do konta usługi Azure Cosmos DB. Prywatna strefa DNS jest aktualizowana w następujący sposób:

  • Jeśli jest używana prywatna grupa stref DNS:

    Jeśli używasz prywatnej grupy stref DNS, prywatna strefa DNS zostanie automatycznie zaktualizowana po zaktualizowaniu prywatnego punktu końcowego. W poprzednim przykładzie po dodaniu nowego regionu prywatna strefa DNS zostanie automatycznie zaktualizowana.

  • Jeśli prywatna grupa stref DNS nie jest używana:

    Jeśli nie używasz prywatnej grupy stref DNS, dodawanie lub usuwanie regionów na koncie usługi Azure Cosmos DB wymaga dodania lub usunięcia wpisów DNS dla tego konta. Po dodaniu lub usunięciu regionów można zaktualizować prywatną strefę DNS podsieci, aby odzwierciedlić dodane lub usunięte wpisy DNS i odpowiadające im prywatne adresy IP.

    W poprzednim przykładzie po dodaniu nowego regionu należy dodać odpowiedni rekord DNS do prywatnej strefy DNS lub niestandardowej usługi DNS. Te same kroki można wykonać podczas usuwania regionu. Po usunięciu regionu należy usunąć odpowiedni rekord DNS z prywatnej strefy DNS lub niestandardowej usługi DNS.

Bieżące ograniczenia

Podczas korzystania z Private Link z kontem usługi Azure Cosmos DB obowiązują następujące ograniczenia:

  • Nie można mieć więcej niż 200 prywatnych punktów końcowych na jednym koncie usługi Azure Cosmos DB.

  • W przypadku używania Private Link z kontem usługi Azure Cosmos DB za pośrednictwem połączenia w trybie bezpośrednim można użyć tylko protokołu TCP. Protokół HTTP nie jest obecnie obsługiwany.

  • W przypadku korzystania z interfejsu API usługi Azure Cosmos DB dla konta bazy danych MongoDB prywatny punkt końcowy jest obsługiwany dla kont na serwerze w wersji 3.6 lub nowszej (czyli kont korzystających z punktu końcowego w formacie *.mongo.cosmos.azure.com). Private Link nie jest obsługiwana w przypadku kont na serwerze w wersji 3.2 (czyli kont korzystających z punktu końcowego w formacie *.documents.azure.com). Aby użyć Private Link, należy przeprowadzić migrację starych kont do nowej wersji.

  • Jeśli używasz interfejsu API usługi Azure Cosmos DB dla konta bazy danych MongoDB z Private Link, narzędzia i biblioteki muszą obsługiwać identyfikację nazw usług (SNI) lub przekazać appName parametr z parametrów połączenia, aby prawidłowo nawiązać połączenie. Niektóre starsze narzędzia i biblioteki mogą nie być zgodne z funkcją Private Link.

  • Administrator sieci powinien mieć co najmniej Microsoft.DocumentDB/databaseAccounts/PrivateEndpointConnectionsApproval/action uprawnienie w zakresie konta usługi Azure Cosmos DB w celu utworzenia automatycznie zatwierdzonych prywatnych punktów końcowych.

  • Obecnie nie można zatwierdzić odrzuconego połączenia prywatnego punktu końcowego. Zamiast tego ponownie utwórz prywatny punkt końcowy, aby wznowić łączność prywatną. Usługa łącza prywatnego usługi Azure Cosmos DB automatycznie zatwierdza ponownie utworzony prywatny punkt końcowy.

Ograniczenia integracji prywatnej strefy DNS

Jeśli nie używasz prywatnej grupy stref DNS, rekordy DNS w prywatnej strefie DNS nie są usuwane automatycznie po usunięciu prywatnego punktu końcowego lub usunięciu regionu z konta usługi Azure Cosmos DB. Przed wykonaniem następujących czynności należy ręcznie usunąć rekordy DNS:

  • Dodanie nowego prywatnego punktu końcowego połączonego z tą prywatną strefą DNS.
  • Dodanie nowego regionu do dowolnego konta bazy danych z prywatnymi punktami końcowymi połączonymi z tą prywatną strefą DNS.

Jeśli rekordy DNS nie są czyszczone, mogą wystąpić nieoczekiwane problemy z płaszczyzną danych. Te problemy obejmują awarię danych w regionach dodanych po usunięciu prywatnego punktu końcowego lub usunięciu regionu.

Następne kroki

Aby dowiedzieć się więcej o funkcjach zabezpieczeń usługi Azure Cosmos DB, zobacz następujące artykuły: