Restricción del acceso a la red a los recursos de PaaS con puntos de conexión de servicio de red virtual mediante la CLI de Azure

Los puntos de conexión de servicio de red virtual permiten que el acceso de la red a algunos recursos de servicio de Azure esté restringido a una subred de la red virtual. También se puede quitar el acceso de Internet a los recursos. Los puntos de conexión de servicio proporcionan a la red virtual conexión directa con los servicios de Azure compatibles, de modo que se puede usar el espacio de direcciones privadas de la red virtual para acceder a los servicios de Azure. El tráfico destinado a los recursos de Azure a través de los puntos de conexión de servicio siempre se mantiene en la red troncal de Microsoft Azure. En este artículo aprenderá a:

  • Crear una red virtual con una subred
  • Agregar una subred y habilitar un punto de conexión de servicio
  • Crear un recurso de Azure y permitir que la red solo pueda acceder a él desde una subred
  • Implementar una máquina virtual en cada subred
  • Confirmar el acceso a un recurso desde una subred
  • Confirmar que se ha denegado el acceso a un recurso desde una subred e Internet

Si no tiene una suscripción a Azure, cree una cuenta gratuita de Azure antes de empezar.

Requisitos previos

  • En este artículo se necesita la versión 2.0.28 o posterior de la CLI de Azure. Si usa Azure Cloud Shell, ya está instalada la versión más reciente.

Creación de una red virtual

Antes de crear una red virtual, cree un grupo de recursos para ella y los demás recursos que se crearon en este artículo. Cree un grupo de recursos con az group create. En el ejemplo siguiente, se crea un grupo de recursos denominado myResourceGroup en la ubicación eastus.

az group create \
  --name myResourceGroup \
  --location eastus

Cree una red virtual con una subred con az network vnet create.

az network vnet create \
  --name myVirtualNetwork \
  --resource-group myResourceGroup \
  --address-prefix 10.0.0.0/16 \
  --subnet-name Public \
  --subnet-prefix 10.0.0.0/24

Habilitación de un punto de conexión de servicio

Puede habilitar puntos de conexión de servicio únicamente para los servicios que admiten estos puntos de conexión. Vea los servicios habilitados para puntos de conexión de servicio disponibles en una ubicación de Azure con az network vnet list-endpoint-services. En el ejemplo siguiente se devuelve una lista de servicios habilitados para puntos de conexión de servicio disponibles en la región eastus. La lista de servicios devuelta crecerá con el tiempo a medida que más servicios de Azure pasan a estar habilitados para puntos de conexión de servicio.

az network vnet list-endpoint-services \
  --location eastus \
  --out table

Cree una subred adicional en la red virtual con az network vnet subnet create. En este ejemplo, se crea un punto de conexión de servicio para Microsoft.Storage para la subred:

az network vnet subnet create \
  --vnet-name myVirtualNetwork \
  --resource-group myResourceGroup \
  --name Private \
  --address-prefix 10.0.1.0/24 \
  --service-endpoints Microsoft.Storage

Restricción del acceso de la red para una subred

Cree un grupo de seguridad de red con az network nsg create. En el ejemplo siguiente se crea un grupo de seguridad de red denominado myNsgPrivate.

az network nsg create \
  --resource-group myResourceGroup \
  --name myNsgPrivate

Asocie el grupo de seguridad de red a la subred Private con az network vnet subnet update. En el ejemplo siguiente se asocia el grupo de seguridad de red myNsgPrivate a la subred Private:

az network vnet subnet update \
  --vnet-name myVirtualNetwork \
  --name Private \
  --resource-group myResourceGroup \
  --network-security-group myNsgPrivate

Cree reglas de seguridad con az network nsg rule create. La regla siguiente permite el acceso de salida a las direcciones IP públicas asignadas al servicio Azure Storage:

az network nsg rule create \
  --resource-group myResourceGroup \
  --nsg-name myNsgPrivate \
  --name Allow-Storage-All \
  --access Allow \
  --protocol "*" \
  --direction Outbound \
  --priority 100 \
  --source-address-prefix "VirtualNetwork" \
  --source-port-range "*" \
  --destination-address-prefix "Storage" \
  --destination-port-range "*"

Cada grupo de seguridad de red contiene varias reglas de seguridad predeterminadas. La regla siguiente invalida una regla de seguridad predeterminada que permite el acceso de salida a todas las direcciones IP públicas. La opción destination-address-prefix "Internet" deniega el acceso de salida a todas las direcciones IP públicas. La regla anterior invalida esta regla porque su prioridad es más alta, lo que permite el acceso a las direcciones IP públicas de Azure Storage.

az network nsg rule create \
  --resource-group myResourceGroup \
  --nsg-name myNsgPrivate \
  --name Deny-Internet-All \
  --access Deny \
  --protocol "*" \
  --direction Outbound \
  --priority 110 \
  --source-address-prefix "VirtualNetwork" \
  --source-port-range "*" \
  --destination-address-prefix "Internet" \
  --destination-port-range "*"

La siguiente regla permite la entrada de tráfico SSH en la subred desde cualquier lugar. La regla invalidará cualquier regla de seguridad predeterminada que deniegue todo el tráfico de entrada procedente de Internet. SSH se admite en la subred, por lo que dicha conectividad podrá probarse en un paso posterior.

az network nsg rule create \
  --resource-group myResourceGroup \
  --nsg-name myNsgPrivate \
  --name Allow-SSH-All \
  --access Allow \
  --protocol Tcp \
  --direction Inbound \
  --priority 120 \
  --source-address-prefix "*" \
  --source-port-range "*" \
  --destination-address-prefix "VirtualNetwork" \
  --destination-port-range "22"

Restricción del acceso de la red a un recurso

Los pasos que deben seguirse para restringir el acceso de la red a los recursos creados con servicios de Azure habilitados para puntos de conexión de servicio varían en función del servicio. Consulte en la documentación de cada servicio concreto los pasos necesarios para dicho servicio. Como ejemplo, de aquí en adelante se explican los pasos necesarios para restringir el acceso de red en una cuenta de Azure Storage.

Crear una cuenta de almacenamiento

Cree una cuenta de almacenamiento de Azure con az storage account create. Remplace <replace-with-your-unique-storage-account-name> por un nombre que sea único en todas las ubicaciones de Azure, que tenga entre 3 y 24 caracteres de longitud y que esté compuesto exclusivamente de números y letras en minúscula.

storageAcctName="<replace-with-your-unique-storage-account-name>"

az storage account create \
  --name $storageAcctName \
  --resource-group myResourceGroup \
  --sku Standard_LRS \
  --kind StorageV2

Después de crear la cuenta de almacenamiento, recupere la cadena de conexión para dicha cuenta en una variable con az storage account show-connection-string. La cadena de conexión se utiliza para crear un recurso compartido de archivos en un paso posterior.

saConnectionString=$(az storage account show-connection-string \
  --name $storageAcctName \
  --resource-group myResourceGroup \
  --query 'connectionString' \
  --out tsv)

Vea el contenido de la variable y anote el valor de AccountKey devuelto en la salida, porque se utilizará en un paso posterior.

echo $saConnectionString

Creación de un recurso compartido de archivos en la cuenta de almacenamiento

Cree un recurso compartido de archivos en la cuenta de almacenamiento con az storage share create. En un paso posterior, este recurso compartido de archivos está montado para confirmar el acceso de red a él.

az storage share create \
  --name my-file-share \
  --quota 2048 \
  --connection-string $saConnectionString > /dev/null

Denegación de todo el acceso a la red a una cuenta de almacenamiento

De forma predeterminada, las cuentas de almacenamiento aceptan conexiones de red procedentes de clientes de cualquier red. Para limitar el acceso a redes seleccionadas, cambie la acción predeterminada a Deny con az storage account update. Una vez que se deniega el acceso a la red, no se puede acceder a la cuenta de almacenamiento desde ninguna red.

az storage account update \
  --name $storageAcctName \
  --resource-group myResourceGroup \
  --default-action Deny

Habilitación del acceso de red desde una subred

Permita el acceso a la red a la cuenta de almacenamiento desde la subred Private con az storage account network-rule add.

az storage account network-rule add \
  --resource-group myResourceGroup \
  --account-name $storageAcctName \
  --vnet-name myVirtualNetwork \
  --subnet Private

Creación de máquinas virtuales

Para probar el acceso de la red a una cuenta de almacenamiento, implemente una máquina virtual en cada subred.

Creación de la primera máquina virtual

Cree una máquina virtual en la subred Public con az vm create. Si las claves SSH no existen en la ubicación de claves predeterminada, el comando las crea. Para utilizar un conjunto específico de claves, utilice la opción --ssh-key-value.

az vm create \
  --resource-group myResourceGroup \
  --name myVmPublic \
  --image Ubuntu2204 \
  --vnet-name myVirtualNetwork \
  --subnet Public \
  --generate-ssh-keys

La máquina virtual tarda en crearse unos minutos. Después de crear la máquina virtual, la CLI de Azure muestra información similar a la del ejemplo siguiente:

{
  "fqdns": "",
  "id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/myResourceGroup/providers/Microsoft.Compute/virtualMachines/myVmPublic",
  "location": "eastus",
  "macAddress": "00-0D-3A-23-9A-49",
  "powerState": "VM running",
  "privateIpAddress": "10.0.0.4",
  "publicIpAddress": "13.90.242.231",
  "resourceGroup": "myResourceGroup"
}

Tome nota de publicIpAddress en la salida devuelta. En un paso posterior, usaremos esta dirección para obtener acceso a la máquina virtual desde Internet.

Creación de la segunda máquina virtual

az vm create \
  --resource-group myResourceGroup \
  --name myVmPrivate \
  --image Ubuntu2204 \
  --vnet-name myVirtualNetwork \
  --subnet Private \
  --generate-ssh-keys

La máquina virtual tarda en crearse unos minutos. Después de la creación, tome nota de publicIpAddress en la salida devuelta. En un paso posterior, usaremos esta dirección para obtener acceso a la máquina virtual desde Internet.

Confirmación del acceso a la cuenta de almacenamiento

SSH en la máquina virtual myVmPrivate. Reemplace <publicIpAddress> por la dirección IP pública de la VM myVmPrivate.

ssh <publicIpAddress>

Cree una carpeta para un punto de montaje:

sudo mkdir /mnt/MyAzureFileShare

Monte el recurso compartido de archivos de Azure en el directorio que ha creado. Antes de ejecutar el siguiente comando, reemplace <storage-account-name> con el nombre de cuenta y <storage-account-key> con la clave que recuperada en Crear una cuenta de almacenamiento.

sudo mount --types cifs //<storage-account-name>.file.core.windows.net/my-file-share /mnt/MyAzureFileShare --options vers=3.0,username=<storage-account-name>,password=<storage-account-key>,dir_mode=0777,file_mode=0777,serverino

Recibirá el símbolo del sistema user@myVmPrivate:~$. El recurso compartido de archivos de Azure se montó correctamente en /mnt/MyAzureFileShare.

Asegúrese de que la máquina virtual no tiene conectividad de salida con otras direcciones IP públicas:

ping bing.com -c 4

Dado que el grupo de seguridad de red asociado a la subred Privada no permite el acceso de salida a otras direcciones IP públicas que no sean las direcciones asignadas al servicio Azure Storage, no recibirá ninguna respuesta.

Salga de la sesión de SSH en la máquina virtual myVmPrivate.

Confirmación de la denegación del acceso a la cuenta de almacenamiento

Use el siguiente comando para crear una sesión de SSH con la máquina virtual myVmPublic. Reemplace <publicIpAddress> por la dirección IP pública de la máquina virtual myVmPublic:

ssh <publicIpAddress>

Cree un directorio para un punto de montaje:

sudo mkdir /mnt/MyAzureFileShare

Intente montar el recurso compartido de archivos de Azure en el directorio que ha creado. En este artículo se asume que ha implementado la versión más reciente de Ubuntu. Si está utilizando versiones anteriores de Ubuntu, consulte Montaje en Linux para instrucciones adicionales sobre el montaje de recursos compartidos de archivos. Antes de ejecutar el siguiente comando, reemplace <storage-account-name> con el nombre de cuenta y <storage-account-key> con la clave que recuperada en Crear una cuenta de almacenamiento:

sudo mount --types cifs //storage-account-name>.file.core.windows.net/my-file-share /mnt/MyAzureFileShare --options vers=3.0,username=<storage-account-name>,password=<storage-account-key>,dir_mode=0777,file_mode=0777,serverino

El acceso se deniega y recibe un error mount error(13): Permission denied porque la máquina virtual myVmPublic está implementada dentro la subred Public. La subred Public no tiene ningún punto de conexión de servicio habilitado para Azure Storage y la cuenta de almacenamiento solo permite el acceso de red desde la subred Private, no desde la subred Public.

Salga de la sesión de SSH en la máquina virtual myVmPublic.

Desde su equipo, intente ver los recursos compartidos en la cuenta de almacenamiento con az storage share list. Reemplace <account-name> y <account-key> con el nombre de la cuenta de almacenamiento y la clave de Crear una cuenta de almacenamiento:

az storage share list \
  --account-name <account-name> \
  --account-key <account-key>

El acceso se deniega y recibe el error This request is not authorized to perform this operation (Esta solicitud no está autorizada para realizar esta operación) porque el equipo no está en la subred Private de la red virtual MyVirtualNetwork.

Limpieza de recursos

Cuando ya no se necesiten, use az group delete para quitar el grupo de recursos y todos los recursos que contenga.

az group delete --name myResourceGroup --yes

Pasos siguientes

En este artículo, ha habilitado un punto de conexión de servicio en una subred de la red virtual. Ha aprendido que los puntos de conexión de servicio pueden habilitarse para los recursos implementados con varios servicios de Azure. Ha creado una cuenta de Azure Storage y ha hecho que el acceso de la red a la cuenta de almacenamiento esté limitado exclusivamente a los recursos que se encuentran en una subred de la red virtual. Para más información acerca de los puntos de conexión de servicio, consulte Introducción a los puntos de conexión de un servicio y Administración de subredes.

Si tiene varias redes virtuales en la cuenta, es posible que desee conectar dos de ellas para que los recursos que están dentro de cada red virtual puedan comunicarse entre sí. Para obtener información sobre cómo hacerlo, consulte Conexión de redes virtuales.