Configuración de Azure Private Link para una cuenta de Azure Cosmos DB

SE APLICA A: NoSQL MongoDB Cassandra Gremlin Table

Al usar Azure Private Link, puede conectarse a una cuenta de Azure Cosmos DB a través de un punto de conexión privado. El punto de conexión privado es un conjunto de direcciones IP privadas en una subred dentro de la red virtual. A continuación, puede limitar el acceso a una cuenta de Azure Cosmos DB a través de direcciones IP privadas. Cuando Private Link se combina con las directivas de NSG restringidas, esto ayuda a reducir el riesgo de filtración de datos. Para más información sobre los puntos de conexión privados, consulte ¿Qué es Azure Private Link?

Nota:

Private Link no impide que el DNS público resuelva los puntos de conexión de Azure Cosmos DB. El filtrado de solicitudes entrantes se produce en el nivel de aplicación, no en el nivel de transporte ni de red.

Private Link permite a los usuarios obtener acceso a una cuenta de Azure Cosmos DB desde dentro de la red virtual o cualquier red virtual emparejada. También se puede acceder a los recursos asignados a Private Link en el entorno local a través de un emparejamiento privado a través de VPN o Azure ExpressRoute.

Puede conectarse a una cuenta de Azure Cosmos DB configurada con Private Link mediante el método de aprobación automático o manual. Para obtener más información, consulte la sección flujo de trabajo de aprobación de la documentación de Private Link.

En este artículo se describe cómo configurar puntos de conexión privados para un almacén transaccional de Azure Cosmos DB. Se da por supuesto que usa el método de aprobación automático. Si está usando el almacén analítico, consulte Configuración de puntos de conexión privados para el almacén analítico.

Creación de un punto de conexión privado mediante Azure Portal

Siga estos pasos para crear un punto de conexión privado para una cuenta de Azure Cosmos DB existente mediante Azure Portal:

  1. Inicie sesión en Azure Portal y seleccione una cuenta de Azure Cosmos DB.

  2. Seleccione Redes en la lista de opciones de configuración y luego seleccione + Punto de conexión privado en la pestaña Acceso privado:

    Captura de pantalla de selecciones para la creación de un punto de conexión privado en Azure Portal

  3. En el panel Crear un punto de conexión privado: aspectos básicos, escriba o seleccione los siguientes detalles:

    Configuración Value
    Detalles del proyecto
    Suscripción Seleccione su suscripción.
    Resource group Seleccione un grupo de recursos.
    Detalles de instancia
    Nombre Escriba cualquier nombre para su punto de conexión privado. Si el nombre ya existe, cree uno único.
    Region Seleccione la región en la que desea implementar Private Link. Cree el punto de conexión privado en la misma ubicación donde existe la red virtual.
  4. Seleccione Siguiente: Resource (Siguiente: Recurso).

  5. En el panel Crear un punto de conexión privado - Recurso, escriba o seleccione esta información:

    Configuración Value
    Método de conexión Seleccione Conectarse a un recurso de Azure en mi directorio.

    A continuación, puede elegir uno de sus recursos para configurar Private Link. O bien, puede conectarse al recurso de otro usuario mediante un alias o identificador del recurso que haya compartido con usted.
    Suscripción Seleccione su suscripción.
    Tipo de recurso Seleccione Microsoft.AzureCosmosDB/databaseAccounts.
    Resource Seleccione la cuenta de Azure Cosmos DB.
    Subrecurso de destino Seleccione el tipo de API de Azure Cosmos DB que desea asignar. Esta configuración toma como valor predeterminado solo una opción para las API para SQL, MongoDB y Cassandra. En el caso de las API para Gremlin y Table, también puede elegir NoSQL, ya que estas API son interoperables con la API para NoSQL. Si tiene una puerta de enlace dedicada aprovisionada para una cuenta de la API para NoSQL, también puede ver una opción para SqlDedicated.
  6. Seleccione Siguiente: Máquinas virtuales.

  7. En el panel Crear un punto de conexión privado - Virtual Network, escriba o seleccione esta información:

    Configuración Value
    Virtual network Seleccione la red virtual.
    Subnet Seleccione la subred.
  8. Seleccione Next: DNS (Siguiente: DNS).

  9. En el panel Crear un punto de conexión privado - DNS, escriba o seleccione esta información:

    Configuración Valor
    Integración con una zona DNS privada Seleccione .

    Para conectar de forma privada con el punto de conexión privado, necesita un registro DNS. Se recomienda integrar el punto de conexión privado con una zona DNS privada. También se pueden usar los servidores DNS propios o bien crear registros DNS con los archivos de host de las máquinas virtuales.

    Al seleccionar Sí en esta opción, también se crea un grupo de zonas DNS privadas. El grupo de zonas DNS es un vínculo entre la zona DNS privada y el punto de conexión privado. Este vínculo le ayuda a actualizar automáticamente la zona DNS privada cuando hay una actualización del punto de conexión privado. Por ejemplo, al agregar o quitar regiones, la zona DNS privada se actualiza automáticamente.
    Nombre de la configuración Seleccione su suscripción y grupo de recursos.

    La zona DNS privada se determina automáticamente. No puede cambiarla con Azure Portal.
  10. Seleccione Siguiente: Etiquetas>Revisar y crear. En la página Revisar y crear, Azure valida la configuración.

  11. Cuando reciba el mensaje Validación superada, seleccione Crear.

Cuando tenga una instancia de Private Link aprobada para una cuenta de Azure Cosmos DB, la opción Todas las redes en el panel Firewall y redes virtuales no estará disponible en Azure Portal.

Tipos de API y nombres de zona privada

Revise la configuración de DNS del punto de conexión privado de Azure para obtener una explicación más detallada sobre las zonas privadas y las configuraciones de DNS para el punto de conexión privado. En la tabla siguiente, se muestra la asignación entre diferentes tipos de API de la cuenta de Azure Cosmos DB, los subrecursos admitidos y los nombres de zona privada correspondientes. También se puede acceder a las cuentas de Gremlin y la API para Table a través de la API para NoSQL, por lo que hay dos entradas para estas API. También hay una entrada adicional para la API para NoSQL para las cuentas que usan la puerta de enlace dedicada.

Tipo de API de la cuenta de Azure Cosmos DB Subrecursos admitidos o identificaciones de grupo Nombre de zona privada
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
Tabla Tabla privatelink.table.cosmos.azure.com
Tabla Sql privatelink.documents.azure.com

Capturar direcciones IP privadas

Una vez aprovisionado el punto de conexión privado, puede consultar las direcciones IP. Para ver las direcciones IP desde Azure Portal:

  1. Busque el punto de conexión privado que creó anteriormente. En este caso, es cdbPrivateEndpoint3.
  2. Seleccione la pestaña Información general para ver la configuración de DNS y las direcciones IP.

Captura de pantalla de direcciones IP privadas en Azure Portal

Se crean varias direcciones IP por punto de conexión privado:

  • Una para el punto de conexión (global e independiente de la región) de la cuenta de Azure Cosmos DB.
  • Una para cada región donde se ha implementado la cuenta de Azure Cosmos DB.

Creación de un punto de conexión privado mediante Azure PowerShell

Ejecute el siguiente script de PowerShell para crear un punto de conexión privado denominado MyPrivateEndpoint para una cuenta de Azure Cosmos DB existente. Reemplace los valores variables por los detalles de su entorno.

$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

Integración del punto de conexión privado con una zona DNS privada

Después de crear el punto de conexión privado, puede integrarlo con una zona DNS privada mediante el siguiente script de 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

Capturar direcciones IP privadas

Después de haber aprovisionado el punto de conexión privado, puede consultar las direcciones IP y la asignación de FQDN mediante el siguiente script de 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
}

Cree un punto de conexión privado mediante la CLI de Azure

Ejecute el siguiente script de la CLI de Azure para crear un punto de conexión privado denominado myPrivateEndpoint para una cuenta de Azure Cosmos DB existente. Reemplace los valores variables por los detalles de su entorno.

# 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

Integración del punto de conexión privado con una zona DNS privada

Después de crear el punto de conexión privado, puede integrarlo con una zona DNS privada mediante el siguiente script de la CLI de 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"

Creación de un punto de conexión privado mediante una plantilla de Resource Manager

Para configurar Private Link, cree un punto de conexión privado en una subred de la red virtual. Para ello, use una plantilla de Azure Resource Manager.

Use este código para crear una plantilla de Resource Manager denominada PrivateEndpoint_template.json. Esta plantilla crea un punto de conexión privado para una cuenta existente de una API con versión (vAPI) de Azure Cosmos DB for NoSQL en una red virtual existente.

@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

Definición del archivo de parámetros para la plantilla

Cree un archivo de parámetros para la plantilla y asígnele el nombre PrivateEndpoint_parameters.json. Agregue el siguiente código al archivo de parámetros:

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

Implementación de la plantilla mediante un script de PowerShell

Cree un script de PowerShell con el código siguiente. Antes de ejecutar el script, reemplace el identificador de la suscripción, el nombre del grupo de recursos y otros valores de variables con los detalles de su entorno.

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

En el script de PowerShell, la variable GroupId puede contener solo un valor. Ese valor es el tipo de API de la cuenta. Los valores permitidos son: Sql, SqlDedicated, MongoDB, Cassandra, Gremlin, y Table. Algunos tipos de cuenta de Azure Cosmos DB son accesibles a través de varias API. Por ejemplo:

  • Las cuentas de la API para NoSQL tienen una opción agregada para las cuentas configuradas para usar la puerta de enlace dedicada.
  • Se puede acceder a las cuentas de la API para Gremlin desde cuentas de Gremlin y la API para NoSQL.
  • Se puede acceder a las cuentas de la API para Table desde cuentas de Table y la API para NoSQL.

Para esas cuentas, debe crear un punto de conexión privado para cada tipo de API. Si va a crear un punto de conexión privado para SqlDedicated, solo debe agregar un segundo punto de conexión para Sql si también desea conectarse a su cuenta mediante la puerta de enlace estándar. El tipo de API correspondiente se especifica en la matriz GroupId.

Una vez que la plantilla se ha implementado correctamente, puede ver un resultado similar a la que se muestra en la siguiente imagen. Si los puntos de conexión privados están configurados correctamente, el valor provisioningState es Succeeded.

Captura de pantalla del resultado de la implementación de la plantilla de Resource Manager.

Una vez implementada la plantilla, las direcciones IP privadas se reservan dentro de la subred. La regla de firewall de la cuenta de Azure Cosmos DB está configurada para aceptar conexiones solo del punto de conexión privado.

Integración del punto de conexión privado con una zona DNS privada

Use este código para crear una plantilla de Resource Manager llamada PrivateZone_template.json. Esta plantilla crea una zona DNS para una cuenta existente de la API de Azure Cosmos DB para NoSQL en una red virtual existente.

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

Definición del archivo de parámetros para la plantilla

Cree los dos siguientes archivos de parámetros para la plantilla. Cree PrivateZone_parameters.json con este código:

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

Use este código para crear una plantilla de Resource Manager con el nombre PrivateZoneGroup_template.json. Esta plantilla crea un grupo de zonas DNS privadas para una cuenta de la API de Azure Cosmos DB para NoSQL existente en una red virtual existente.

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

Definición del archivo de parámetros para la plantilla

Cree los dos siguientes archivos de parámetros para la plantilla. Cree el archivo PrivateZoneGroup_parameters.json. por el siguiente:

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

Implementación de la plantilla mediante un script de PowerShell

Cree un script de PowerShell con el código siguiente. Antes de ejecutar el script, reemplace el identificador de la suscripción, el nombre del grupo de recursos y otros valores de variables con los detalles de su entorno.

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

Configuración de DNS personalizado

Debe usar una zona DNS privada dentro de la subred en la que ha creado el punto de conexión privado. Configure los puntos de conexión de modo que cada dirección IP privada se asigne a una entrada DNS Consulte la propiedad fqdns en la respuesta mostrada anteriormente.

Al crear el punto de conexión privado, puede integrarlo con una zona DNS privada en Azure. Si, en su lugar, elige usar una zona DNS personalizada, debe configurarla para agregar registros DNS para todas las direcciones IP privadas reservadas para el punto de conexión privado.

Importante

Es la resolución DNS de las solicitudes la que determina si estas solicitudes se realizan a través de los puntos de conexión privados o toman la ruta pública estándar. Asegúrese de que el DNS local hace referencia correctamente a la dirección IP privada asignada por el punto de conexión privado.

Las situaciones y resultados que se muestran a continuación son posibles cuando se usa Private Link en combinación con las reglas de firewall:

  • Si no configura ninguna regla de firewall, todo el tráfico podrá tener acceso a una cuenta de Azure Cosmos DB de manera predeterminada.

  • Si configura el tráfico público o un punto de conexión de servicio y crea puntos de conexión privados, los distintos tipos de tráfico entrante estarán autorizados por el tipo de regla de firewall correspondiente. Si un punto de conexión privado se configura en una subred donde también se configura el punto de conexión de servicio:

    • el tráfico a la cuenta de base de datos asignado por el punto de conexión privado se enruta a través del punto de conexión privado.
    • el tráfico a otras cuentas de base de datos de la subred se enruta a través del punto de conexión de servicio.
  • Si no configura ningún tráfico público ni punto de conexión de servicio y crea puntos de conexión privados, la cuenta de Azure Cosmos DB solo es accesible a través de los puntos de conexión privados. Si no configura ningún tráfico público ni punto de conexión de servicio, después de que se rechacen o eliminen todos los puntos de conexión privados aprobados, la cuenta estará abierta a toda la red, a menos que PublicNetworkAccess se establezca en Deshabilitado.

Bloqueo del acceso a la red pública durante la creación de la cuenta

Tal como se describe en la sección anterior y, a menos que se hayan establecido reglas de firewall específicas, la adición de un punto de conexión privado hace que su cuenta de Azure Cosmos DB sea accesible solo a través de puntos de conexión privados. Esto significa que se puede acceder a la cuenta de Azure Cosmos DB desde el tráfico público una vez creada y antes de que se agregue un punto de conexión privado. Para asegurarse de que el acceso a la red pública esté deshabilitado incluso antes de la creación de puntos de conexión privados, puede establecer la marca publicNetworkAccess en Deshabilitado durante la creación de la cuenta. Tenga en cuenta que esta marca tiene prioridad sobre cualquier regla de red virtual o IP. Todo el tráfico público y de la red virtual se bloquea cuando la marca se establece en Deshabilitado, aunque la dirección IP de origen o la red virtual se permitan en la configuración del firewall.

Consulte esta plantilla de Azure Resource Manager para obtener un ejemplo que muestra cómo usar esta marca.

Incorporación de puntos de conexión privados a una cuenta de Azure Cosmos DB existente sin tiempo de inactividad

De forma predeterminada, al agregar un punto de conexión privado a una cuenta existente, se produce un breve tiempo de inactividad de aproximadamente cinco minutos. Siga estas instrucciones para evitar este tiempo de inactividad:

  1. Agregue reglas de IP o red virtual a la configuración del firewall para permitir explícitamente las conexiones del cliente.
  2. Espere 10 minutos para asegurarse de que entra en vigor la actualización de la configuración.
  3. Configure el nuevo punto de conexión privado.
  4. Quite las reglas de firewall establecidas en el paso 1.

Nota

Si tiene aplicaciones en ejecución mediante los SDK de Azure Cosmos DB, es posible que haya tiempos de espera transitorios durante la actualización de configuración. Asegúrese de que la aplicación está diseñada para ser resistente a errores de conectividad transitorios y de tener lógica de reintento en su lugar en caso de que sea necesario.

Intervalo de puertos al usar el modo directo

Cuando use Private Link con una cuenta de Azure Cosmos DB a través de una conexión de modo directo, debe asegurarse de que todo el intervalo de puertos TCP (0-65535) esté abierto.

Actualización de un punto de conexión privado al agregar o quitar una región

Hay tres regiones para las implementaciones de cuentas de Azure Cosmos DB: Oeste de EE. UU., Centro de EE. UU. y Oeste de Europa. Cuando crea un punto de conexión privado para la cuenta, se reservan cuatro direcciones IP privadas en la subred. Hay una dirección IP para cada una de las tres regiones y una para el punto de conexión global o independiente de la región. Más adelante, puede agregar una nueva región a la cuenta de Azure Cosmos DB. La zona DNS privada se actualiza de la siguiente manera:

  • Si se usa un grupo de zonas DNS privadas:

    Si usa un grupo de zonas DNS privadas, la zona DNS privada se actualiza de forma automática cuando lo hace el punto de conexión privado. En el ejemplo anterior, después de agregar una nueva región, la zona DNS privada se actualiza automáticamente.

  • Si no se usa ningún grupo de zonas DNS privadas:

    Si no usa ningún grupo de zonas DNS privadas, la incorporación o eliminación de regiones en una cuenta de Azure Cosmos DB requiere que se agreguen o quiten las entradas DNS de esa cuenta. Después de agregar o quitar regiones, puede actualizar la zona DNS privada de la subred para reflejar las entradas DNS agregadas o eliminadas y sus direcciones IP privadas correspondientes.

    En el ejemplo anterior, después de agregar la nueva región, debe agregar un registro DNS correspondiente a la zona DNS privada o al DNS personalizado. Puede seguir los mismos pasos al quitar una región. Después de quitar la región, debe quitar el registro DNS correspondiente a su zona DNS privada o a su DNS personalizado.

Limitaciones actuales

Al usar Private Link con una cuenta de Azure Cosmos DB, se aplican las siguientes limitaciones:

  • No puede tener más de 200 puntos de conexión privados en una misma cuenta de Azure Cosmos DB.

  • Al usar Private Link con una cuenta de Azure Cosmos DB a través de una conexión de modo directo, solo puede usar el protocolo TCP. Actualmente no se admite el protocolo HTTP.

  • Cuando usa la API de Azure Cosmos DB para una cuenta de MongoDB, solo se admite un punto de conexión privado para las cuentas en el servidor de la versión 3.6 (es decir, las cuentas que usan el punto de conexión con el formato *.mongo.cosmos.azure.com). Private Link no se admite para cuentas en el servidor de la versión 3.2 (es decir, las cuentas que usan el punto de conexión con el formato *.documents.azure.com). Para usar Private Link, debe migrar las cuentas anteriores a la nueva versión.

  • Cuando usa una cuenta de la API de Azure Cosmos DB para una instancia de MongoDB que tiene una instancia de Private Link, las herramientas y bibliotecas deben admitir la identificación del nombre de servicio (SNI) o pasar el parámetro appName de la cadena de conexión para conectarse de manera correcta. Es posible que algunas herramientas y bibliotecas anteriores no sean compatibles con la característica Private Link.

  • Debe concederse a un administrador de red al menos el permiso Microsoft.DocumentDB/databaseAccounts/PrivateEndpointConnectionsApproval/action en el ámbito de la cuenta de Azure Cosmos DB para crear puntos de conexión privados aprobados automáticamente.

  • Actualmente, no puede aprobar una conexión de punto de conexión privada que se haya rechazado. En su lugar, vuelva a crear el punto de conexión privado para reanudar la conectividad privada. El servicio Private Link de Azure Cosmos DB aprueba automáticamente el punto de conexión privado que se ha vuelto a crear.

Limitaciones de la integración de la zona DNS privada

A menos que use un grupo de zonas DNS privadas, los registros DNS de la zona DNS privada no se quitan de forma automática cuando se elimina un punto de conexión privado o se quita una región de la cuenta de Azure Cosmos DB. Debe quitar manualmente los registros DNS antes de realizar las siguientes actividades:

  • Agregar un nuevo punto de conexión privado conectado a esta zona DNS privada.
  • Agregar una nueva región a cualquier cuenta de base de datos que tenga puntos de conexión privados conectados a esta zona DNS privada.

Si no limpia los registros DNS, pueden producirse problemas del plano de datos inesperados. Entre estos problemas se incluye la interrupción de datos en regiones agregadas tras la eliminación de puntos de conexión privados o regiones.

Pasos siguientes

Para más información sobre las características de seguridad de Azure Cosmos DB, consulte los siguientes artículos: