Настройка Приватного канала Azure для учетной записи Azure Cosmos DB

ПРИМЕНИМО К: Nosql Mongodb Кассандра Гремлин Таблица

С помощью Приватный канал Azure можно подключиться к учетной записи Azure Cosmos DB через частную конечную точку. Частная конечная точка — это набор частных IP-адресов в подсети в виртуальной сети. Затем можно ограничить доступ к учетной записи Azure Cosmos DB через частные IP-адреса. Если Приватный канал сочетается с ограничительными политиками NSG, это помогает снизить риск кражи данных. Дополнительные сведения о частных конечных точках см. в статье Что такое Приватный канал Azure?

Примечание

Приватный канал не предотвращает разрешение конечных точек Azure Cosmos DB с помощью общедоступной службы DNS. Фильтрация входящих запросов происходит на уровне приложения, а не на уровне транспортировки или сети.

Приватный канал позволяет пользователям получать доступ к учетной записи Azure Cosmos DB из виртуальной сети или из любой одноранговой виртуальной сети. Ресурсы, сопоставленные с Приватным каналом, также доступны локально по частному пирингу через VPN или Azure ExpressRoute.

Вы можете подключиться к учетной записи Azure Cosmos DB, настроенной с помощью Приватный канал, с помощью автоматического или ручного метода утверждения. Дополнительные сведения см. в разделе рабочий процесс утверждения документации по Приватный канал.

В этой статье описано, как настроить частные конечные точки для хранилища транзакций Azure Cosmos DB. Предполагается, что вы используете метод автоматического утверждения. Если вы используете аналитическое хранилище, см. статью Настройка частных конечных точек для аналитического хранилища.

Создание частной конечной точки с помощью портала Azure

Выполните следующие действия, чтобы создать частную конечную точку для существующей учетной записи Azure Cosmos DB с помощью портал Azure.

  1. Войдите в портал Azure, а затем выберите учетную запись Azure Cosmos DB.

  2. Выберите Сеть в списке параметров, а затем выберите + Частная конечная точка на вкладке Частный доступ :

    Снимок экрана: выбор для создания частной конечной точки в портал Azure

  3. В области Создание частной конечной точки — Основные введите или выберите следующие параметры.

    Параметр Значение
    Сведения о проекте
    Подписка Выберите свою подписку.
    Группа ресурсов Выберите группу ресурсов.
    Сведения об экземпляре
    Имя Введите любое имя для частной конечной точки. Если это имя уже используется, создайте уникальное имя.
    Регион Выберите регион, в котором требуется развернуть Приватный канал. Создайте частную конечную точку в том же расположении, где находится виртуальная сеть.
  4. По завершении выберите Next: Ресурс.

  5. В области Создание частной конечной точки — ресурс введите или выберите следующие сведения:

    Параметр Значение
    Метод подключения Выберите Подключиться к ресурсу Azure в моем каталоге.

    Затем можно выбрать один из ресурсов для настройки Приватного канала. Или можно подключиться к чужому ресурсу, используя предоставленный вам ИД или псевдоним ресурса.
    Подписка Выберите свою подписку.
    Тип ресурса Выберите Microsoft.AzureCosmosDB/databaseAccounts.
    Ресурс Выберите свою учетную запись Azure Cosmos DB.
    Целевой подресурс Выберите тип API Azure Cosmos DB, который нужно сопоставить. По умолчанию используется только один вариант для API для SQL, MongoDB и Cassandra. Для API для Gremlin и Table можно также выбрать NoSQL , так как эти API взаимодействуют с API для NoSQL. Если у вас есть выделенный шлюз , подготовленный для учетной записи API для NoSQL, вы также увидите параметр SqlDedicated.
  6. Выберите Далее: Виртуальная сеть.

  7. В области Создание частной конечной точки — виртуальная сеть введите или выберите следующие сведения:

    Параметр Значение
    Виртуальная сеть Выберите свою виртуальную сеть.
    Подсеть Выберите подсеть.
  8. Выберите Далее: DNS.

  9. В области Создание частной конечной точки — DNS введите или выберите следующие сведения:

    Параметр Значение
    Интеграция с частной зоной DNS Выберите Да.

    Для частного подключения к частной конечной точке требуется запись DNS. Рекомендуем интегрировать частную конечную точку с частной зоной DNS. Вы также можете использовать собственные DNS-серверы или создать записи DNS с использованием файлов узлов на своих виртуальных машинах.

    Если для этого параметра выбирается "Да", также создается группа частных зон DNS. Группа зон DNS устанавливает связь между частной зоной DNS и частной конечной точкой. Эта ссылка помогает автоматически обновлять частную зону DNS при обновлении частной конечной точки. Например, при добавлении или удалении регионов частная зона DNS обновляется автоматически.
    Имя конфигурации Выберите подписку и группу ресурсов.

    Частная зона DNS определяется автоматически. Ее нельзя изменить на портале Azure.
  10. Выберите Далее: Проверка тегов>и создание. На странице Просмотр и создание Azure проверит вашу конфигурацию.

  11. При появлении сообщения Проверка пройдена нажмите кнопку Создать.

При наличии утвержденного Приватный канал для учетной записи Azure Cosmos DB в портал Azure параметр Все сети в области Брандмауэр и виртуальные сети недоступен.

Типы API и имена частных зон

Ознакомьтесь с конфигурацией DNS частной конечной точки Azure , чтобы получить более подробное описание частных зон и конфигураций DNS для частной конечной точки. В следующей таблице показано сопоставление различных типов API учетных записей Azure Cosmos DB, поддерживаемых подресурсов и соответствующих имен частных зон. Вы также можете получить доступ к учетным записям Gremlin и API для таблиц через API для NoSQL, поэтому для этих API есть две записи. Кроме того, существует дополнительная запись для API NoSQL для учетных записей, использующих выделенный шлюз.

Тип API учетной записи Azure Cosmos DB Поддерживаемые идентификаторы подресурсов или групп Имя частной зоны
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
Таблица Таблица privatelink.table.cosmos.azure.com
Таблица SQL privatelink.documents.azure.com

Получение частных IP-адресов

После подготовки частной конечной точки можно запросить IP-адреса. Чтобы просмотреть IP-адреса на портале Azure, выполните следующие действия.

  1. Найдите частную конечную точку, созданную ранее. В данном случае это cdbPrivateEndpoint3.
  2. Перейдите на вкладку Обзор, чтобы просмотреть параметры DNS и IP-адреса.

Снимок экрана: частные IP-адреса в портал Azure

Для каждой частной конечной точки создается несколько IP-адресов.

  • Один для глобальной конечной точки, не зависящей от региона, учетной записи Azure Cosmos DB.
  • По одному для каждого региона, где развернута учетная запись Azure Cosmos DB.

Создание частной конечной точки с помощью Azure PowerShell

Выполните следующий скрипт PowerShell, чтобы создать частную конечную точку с именем MyPrivateEndpoint для существующей учетной записи Azure Cosmos DB. Замените значения переменных на значения для вашей среды.

$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

Интеграция частной конечной точки с частной зоной DNS

После создания частной конечной точки ее можно интегрировать с частной зоной DNS с помощью следующего сценария 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

Получение частных IP-адресов

После подготовки частной конечной точки можно запросить IP-адреса и сопоставление полного доменного имени с помощью следующего сценария 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
}

Создание частной конечной точки с помощью Azure CLI

Выполните следующий скрипт Azure CLI, чтобы создать частную конечную точку с именем myPrivateEndpoint для существующей учетной записи Azure Cosmos DB. Замените значения переменных на значения для вашей среды.

# 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

Интеграция частной конечной точки с частной зоной DNS

После создания частной конечной точки ее можно интегрировать с частной зоной DNS с помощью следующего сценария Azure CLI.

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

Создание частной конечной точки с помощью шаблона Resource Manager

Можно настроить Приватный канал, создав частную конечную точку в подсети виртуальной сети. Это достигается с помощью шаблона Azure Resource Manager.

Используйте следующий код, чтобы создать шаблон Resource Manager с именем PrivateEndpoint_template.json. Этот шаблон создает частную конечную точку для существующей учетной записи Azure Cosmos DB vAPI для NoSQL в существующей виртуальной сети.

@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

Настройка файла параметров для шаблона

Создайте файл параметров для шаблона и назовите его PrivateEndpoint_parameters.json. Добавьте следующий код в файл параметров.

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

Развертывание шаблона с помощью сценария PowerShell

Создайте сценарий PowerShell со следующим содержимым. Перед запуском сценария замените идентификатор подписки, имя группы ресурсов и другие значения переменных на значения вашей среды.

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

В сценарии PowerShell переменная GroupId может содержать только одно значение. Это значение является типом API учетной записи. Допустимые значения: Sql, SqlDedicated, MongoDB, Cassandra, Gremlin и Table. Некоторые типы учетных записей Azure Cosmos DB доступны через несколько API. Пример:

  • В API для учетных записей NoSQL добавлен параметр для учетных записей, настроенных для использования выделенного шлюза.
  • Доступ к API для учетных записей Gremlin можно получить как из Gremlin, так и из API для учетных записей NoSQL.
  • Доступ к API для учетных записей таблиц можно получить как из учетных записей таблиц, так и из учетных записей API для NoSQL.

Для этих учетных записей необходимо создать одну частную конечную точку для каждого типа API. Если вы создаете частную конечную точку для SqlDedicated, необходимо добавить вторую конечную точку для Sql , если вы хотите подключиться к учетной записи с помощью стандартного шлюза. Соответствующий тип API указывается в массиве GroupId.

После успешного развертывания шаблона должны отобразиться выходные данные, аналогичные приведенным ниже. Если частные конечные точки настроены правильно, параметр provisioningState должен иметь значение Succeeded.

Снимок экрана: выходные данные развертывания для шаблона Resource Manager.

После развертывания шаблона частные IP-адреса резервируются в подсети. Правило брандмауэра учетной записи Azure Cosmos DB настроено на прием подключений только из частной конечной точки.

Интеграция частной конечной точки с частной зоной DNS

Используйте следующий код, чтобы создать шаблон Resource Manager с именем PrivateZone_template.json. Этот шаблон создает частную зону DNS для существующей учетной записи API Azure Cosmos DB для NoSQL в существующей виртуальной сети.

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

Настройка файла параметров для шаблона

Создайте для шаблона следующие два файла параметров. Создайте файл PrivateZone_parameters.json со следующим кодом:

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

Используйте следующий код, чтобы создать шаблон Resource Manager с именем PrivateZoneGroup_template.json. Этот шаблон создает частную группу зоны DNS для существующей учетной записи API Azure Cosmos DB для NoSQL в существующей виртуальной сети.

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

Настройка файла параметров для шаблона

Создайте для шаблона следующие два файла параметров. Создайте файл PrivateZoneGroup_parameters.json. на новый код:

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

Развертывание шаблона с помощью сценария PowerShell

Создайте сценарий PowerShell со следующим содержимым. Перед запуском сценария замените идентификатор подписки, имя группы ресурсов и другие значения переменных на значения вашей среды.

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

Настройка пользовательской службы DNS

Необходимо использовать частную зону DNS в подсети, в которой была создана частная конечная точка. Настройте конечные точки таким образом, чтобы каждый частный IP-адрес был сопоставлен с записью DNS. См. свойство fqdns в приведенном ранее ответе.

При создании частной конечной точки ее можно интегрировать с частной зоной DNS в Azure. Если вместо этого вы решили использовать пользовательскую зону DNS, необходимо настроить ее, чтобы добавить записи DNS для всех частных IP-адресов, зарезервированных для частной конечной точки.

Важно!

Именно разрешение DNS определяет, проходят ли эти запросы через частные конечные точки или по стандартному общедоступному маршруту. Убедитесь, что локальная DNS корректно ссылается на частный IP-адрес, сопоставленный с частной конечной точкой.

При использовании Приватного канала совместно с правилами брандмауэра возможны следующие ситуации и результаты.

  • Если правила брандмауэра не настроены, по умолчанию весь трафик может получить доступ к учетной записи Azure Cosmos DB.

  • Если вы настраиваете общедоступный трафик или конечную точку службы и создаете частные конечные точки, то для разных типов входящего трафика применяется соответствующий тип правила брандмауэра. Если частная конечная точка настроена в подсети, где также настроена конечная точка службы:

    • трафик к учетной записи базы данных, сопоставленной с частной конечной точкой, маршрутизируется через частную конечную точку;
    • трафик к другим учетным записям базы данных из подсети маршрутизируется через конечную точку службы.
  • Если вы не настраиваете общедоступный трафик или конечную точку службы и создаете частные конечные точки, то учетная запись Azure Cosmos DB будет доступна только через частные конечные точки. Если вы не настроите общедоступный трафик или конечную точку службы, после того как все утвержденные частные конечные точки будут отклонены или удалены, учетная запись будет открыта для всей сети, если PublicNetworkAccess для нее не задано значение Отключено.

Блокировка доступа из общедоступной сети во время создания учетной записи

Как описано в предыдущем разделе, и если не заданы определенные правила брандмауэра, добавление частной конечной точки делает учетную запись Azure Cosmos DB доступной только через частные конечные точки. Это означает, что учетная запись Azure Cosmos DB может быть получена из общедоступного трафика после ее создания и до добавления частной конечной точки. Чтобы убедиться, что доступ к общедоступной сети отключен еще до создания частных конечных точек, можно установить для флага publicNetworkAccessзначение Отключено во время создания учетной записи. Обратите внимание, что этот флаг имеет приоритет над любым правилом IP-адреса или виртуальной сети. Весь трафик общедоступной и виртуальной сети блокируется, если для флага задано значение Отключено, даже если исходный IP-адрес или виртуальная сеть разрешены в конфигурации брандмауэра.

Пример использования этого флага см. в этом шаблоне azure Resource Manager.

Добавление частных конечных точек в существующую учетную запись Azure Cosmos DB без простоя

По умолчанию добавление частной конечной точки в существующую учетную запись приводит к короткому простою примерно в пять минут. Чтобы избежать простоя, выполните следующие инструкции.

  1. Добавьте правила IP или виртуальной сети в конфигурацию брандмауэра, чтобы в явной форме разрешить подключения клиентов.
  2. Подождите 10 минут и убедитесь, что обновление конфигурации выполнено.
  3. Настройте новую частную конечную точку.
  4. Удалите правила брандмауэра, заданные на шаге 1.

Примечание

Если вы запускаете приложения, использующие пакеты SDK для Azure Cosmos DB, во время обновления конфигурации могут возникать временные ожидания. Убедитесь, что приложение устойчиво к временным сбоям подключения и имеет логику повторных попыток в случае необходимости.

Диапазон портов при использовании режима прямого подключения

При использовании Приватный канал с учетной записью Azure Cosmos DB через подключение в прямом режиме необходимо убедиться, что открыт полный диапазон TCP-портов (от 0 до 65535).

Обновление частной конечной точки при добавлении или удалении региона

Существует три региона для развертывания учетных записей Azure Cosmos DB: западная часть США, центральная часть США и Западная Европа. При создании частной конечной точки для вашей учетной записи в подсети зарезервированы четыре частных IP-адреса. Существует один IP-адрес для каждого из трех регионов и один IP-адрес для глобальной конечной точки, не зависящей от региона. Позже вы можете добавить новый регион в учетную запись Azure Cosmos DB. Частная зона DNS обновляется следующим образом.

  • Если используется группа частных зон DNS

    Если вы используете группу частных зон DNS, частная зона DNS автоматически обновляется при обновлении частной конечной точки. В предыдущем примере после добавления нового региона частная зона DNS обновилась автоматически.

  • Если частная группа зоны DNS не используется:

    Если вы не используете частную группу зон DNS, для добавления или удаления регионов в учетную запись Azure Cosmos DB необходимо добавить или удалить записи DNS для этой учетной записи. После добавления или удаления регионов можно обновить частную зону DNS подсети, чтобы отразить добавленные или удаленные записи DNS и соответствующие им частные IP-адреса.

    В предыдущем примере после добавления нового региона необходимо добавить соответствующую запись DNS в частную зону DNS или пользовательскую службу DNS. Аналогичные действия необходимы и при удалении региона. После удаления региона необходимо удалить соответствующую запись DNS из вашей частной зоны DNS или пользовательской службы DNS.

Текущие ограничения

При использовании Приватный канал с учетной записью Azure Cosmos DB действуют следующие ограничения.

  • В одной учетной записи Azure Cosmos DB не может быть более 200 частных конечных точек.

  • При использовании Приватный канал с учетной записью Azure Cosmos DB через подключение в прямом режиме можно использовать только протокол TCP. Протокол HTTP в настоящее время не поддерживается.

  • При использовании API Azure Cosmos DB для учетной записи MongoDB для учетных записей на сервере версии 3.6 или более поздней поддерживается частная конечная точка (то есть учетные записи, использующие конечную точку в формате *.mongo.cosmos.azure.com). Приватный канал не поддерживается для учетных записей на сервере версии 3.2 (то есть учетных записей, использующих конечную точку в формате *.documents.azure.com). Чтобы использовать Приватный канал, необходимо перенести старые учетные записи на новую версию.

  • При использовании API Azure Cosmos DB для учетной записи MongoDB с Приватный канал средства и библиотеки должны поддерживать идентификацию имени службы (SNI) или передавать appName параметр из строки подключения для правильного подключения. Некоторые старые средства и библиотеки могут быть несовместимы с функцией Приватный канал.

  • Администратору сети должно быть предоставлено по крайней мере разрешение в учетной Microsoft.DocumentDB/databaseAccounts/PrivateEndpointConnectionsApproval/action записи Azure Cosmos DB область на создание автоматически утвержденных частных конечных точек.

  • В настоящее время утвердить отклоненное подключение частной конечной точки нельзя. Вместо этого повторно создайте частную конечную точку, чтобы возобновить частное подключение. Служба приватного канала Azure Cosmos DB автоматически утверждает повторно созданную частную конечную точку.

Ограничения на интеграцию частной зоны DNS

Если вы не используете группу частных зон DNS, записи DNS в частной зоне DNS не удаляются автоматически при удалении частной конечной точки или при удалении региона из учетной записи Azure Cosmos DB. Необходимо вручную удалить записи DNS перед:

  • добавлением новой частной конечной точки, связанной с этой частной зоной DNS;
  • добавлением нового региона в любую учетную запись базы данных с частными конечными точками, связанными с этой частной зоной DNS.

Если не очистить записи DNS, могут возникнуть непредвиденные проблемы с плоскостью данных. Эти проблемы включают сбои данных в регионах, добавленных после удаления частной конечной точки или удаления региона.

Дальнейшие действия

Дополнительные сведения о средствах безопасности Azure Cosmos DB см. в следующих статьях.