Restricción del acceso a un registro de contenedor mediante un punto de conexión de servicio en una red virtual de Azure

Azure Virtual Network proporciona acceso de red seguro y privado a los recursos locales y de Azure. Un punto de conexión de servicio le permite proteger la dirección IP pública del registro de contenedor solo en la red virtual. Este punto de conexión proporciona al tráfico una ruta óptima hasta el recurso a través de una red troncal de Azure. Las identidades de la red virtual y la subred también se transmiten con cada solicitud.

En este artículo se muestra cómo configurar un punto de conexión de servicio de registro de contenedor (versión preliminar) en una red virtual.

Cada registro admite un máximo de cien reglas de red virtual.

Importante

Azure Container Registry admite ahora Azure Private Link, lo que permite colocar los puntos de conexión privados desde una red virtual en un registro. Se puede acceder a los puntos de conexión privados desde dentro de la red virtual mediante direcciones IP privadas. Se recomienda usar puntos de conexión privados en lugar de puntos de conexión de servicio en la mayoría de los escenarios de red. El registro de contenedor no admite la habilitación de las características de vínculo privado y punto de conexión de servicio configuradas desde una red virtual. Por lo tanto, se recomienda ejecutar la lista y quitar las reglas de red según sea necesario.

La configuración de un punto de conexión de servicio de registro está disponible en el nivel de servicio Premium del registro de contenedor. Para obtener información sobre los límites y los niveles de servicio de los registros, consulte SKU de Azure Container Registry.

Limitaciones de vista previa

  • El futuro desarrollo de puntos de conexión de servicio para Azure Container Registry no está planeado actualmente. En su lugar, se recomienda usar puntos de conexión privados.
  • No se puede usar Azure Portal para configurar puntos de conexión de servicio en un registro.
  • Para acceder a un registro de contenedor en un punto de conexión de servicio, solo se pueden usar como host un clúster de Azure Kubernetes Service o una máquina virtual de Azure. No se admiten otros servicios de Azure, como Azure Container Instances.
  • Los puntos de conexión de servicio para Azure Container Registry no se admiten en la nube Azure US Government ni en la nube Microsoft Azure operado por 21Vianet.

Importante

Algunas funcionalidades pueden no estar disponibles o requerir más configuración en un registro de contenedor que restringe el acceso a puntos de conexión privados, subredes seleccionadas o direcciones IP.

  • Cuando se deshabilita el acceso de red público a un registro, el acceso al registro por parte de determinados servicios de confianza, incluido Azure Security Center, requiere habilitar una configuración de red para omitir las reglas de red.
  • Una vez que se haya deshabilitado el acceso de red, las instancias de determinados servicios de Azure, como Azure DevOps Services, no tienen acceso actualmente al registro de contenedor.
  • Actualmente, los puntos de conexión privados no se admiten con agentes administrados de Azure DevOps. Tendrá que usar un agente autohospedado con línea de visión de red al punto de conexión privado.
  • Si el registro tiene un punto de conexión privado aprobado y el acceso de la red pública está deshabilitado, los repositorios y las etiquetas no se pueden enumerar fuera de la red virtual mediante Azure Portal, la CLI de Azure u otras herramientas.

Prerrequisitos

  • Para usar los pasos de la CLI de Azure de este artículo, se requieren la versión 2.0.58 de la CLI de Azure, o cualquier versión posterior. Si necesita instalarla o actualizarla, vea Instalación de la CLI de Azure.

  • Si aún no tiene un registro de contenedor, créelo (se requiere un nivel Premium) e inserte una imagen de ejemplo, como hello-world, desde Docker Hub. Por ejemplo, use Azure Portal o la CLI de Azure para crear un registro.

  • Si quiere restringir el acceso al registro mediante un punto de conexión de servicio en otra suscripción de Azure, registre el proveedor de recursos para Azure Container Registry en esa suscripción. Por ejemplo:

    az account set --subscription <Name or ID of subscription of virtual network>
    
    az provider register --namespace Microsoft.ContainerRegistry
    

Creación de una máquina virtual con funcionalidad Docker

Para fines de prueba, use una máquina virtual Ubuntu con funcionalidad Docker para acceder a un registro de contenedor de Azure. Para usar la autenticación de Microsoft Entra en el registro, instale también la CLI de Azure en la máquina virtual. Si ya tiene una máquina virtual de Azure, omita este paso.

Puede usar el mismo grupo de recursos para la máquina virtual y el registro de contenedor. Esta configuración simplifica la limpieza al final, pero no es necesaria. Si elige crear un grupo de recursos independiente para la máquina virtual y la red virtual, ejecute az group create. En el ejemplo siguiente se da por sentado que ha establecido variables de entorno para el nombre del grupo de recursos y la ubicación del registro:

az group create --name $RESOURCE_GROUP --location $REGISTRY_LOCATION

Ahora, implemente una máquina virtual de Azure con Ubuntu mediante az vm create. En el ejemplo siguiente se crea una máquina virtual denominada myDockerVM.

VM_NAME=myDockerVM

az vm create \
  --resource-group $RESOURCE_GROUP \
  --name $VM_NAME \
  --image Ubuntu2204 \
  --admin-username azureuser \
  --generate-ssh-keys

La máquina virtual tarda unos minutos en crearse. Cuando se complete el comando, anote el valor publicIpAddress mostrado por la CLI de Azure. Use esta dirección para establecer conexiones SSH con la máquina virtual.

Instalación de Docker en la máquina virtual

Después de ejecutar la máquina virtual, establezca una conexión SSH con la máquina virtual. Reemplace publicIpAddress por la dirección IP pública de la máquina virtual.

ssh azureuser@publicIpAddress

Ejecute los siguientes comandos para instalar Docker en la máquina virtual Ubuntu:

sudo apt-get update
sudo apt install docker.io -y

Después de la instalación, ejecute el siguiente comando para comprobar que Docker se ejecute correctamente en la máquina virtual:

sudo docker run -it hello-world

Salida:

Hello from Docker!
This message shows that your installation appears to be working correctly.
[...]

Instalación de la CLI de Azure

Siga los pasos del artículo Instalación de la CLI de Azure con apt para instalar la CLI de Azure en la máquina virtual de Ubuntu. Por ejemplo:

curl -sL https://aka.ms/InstallAzureCLIDeb | sudo bash

Salga de la conexión SSH.

Configuración el acceso de red al registro

En esta sección se configura el registro de contenedor para permitir el acceso desde una subred de una red virtual de Azure. Los pasos se proporcionan mediante la CLI de Azure.

Incorporación de un punto de conexión de servicio a una subred

Al crear una máquina virtual, Azure crea de manera predeterminada crea una red virtual en el mismo grupo de recursos. El nombre de dicha red virtual se basa en el nombre de la máquina virtual. Por ejemplo, si asigna a la máquina virtual el nombre myDockerVM, el nombre predeterminado de la red virtual es myDockerVMVNET, con una subred llamada myDockerVMSubnet. Compruébelo mediante el comando az network vnet list:

az network vnet list \
  --resource-group myResourceGroup \
  --query "[].{Name: name, Subnet: subnets[0].name}"

Salida:

[
  {
    "Name": "myDockerVMVNET",
    "Subnet": "myDockerVMSubnet"
  }
]

Use el comando az network vnet subnet update para agregar un punto de conexión de servicio Microsoft.ContainerRegistry a la subred. Sustituya los nombres de la red virtual y de la subred en el siguiente comando:

az network vnet subnet update \
  --name myDockerVMSubnet \
  --vnet-name myDockerVMVNET \
  --resource-group myResourceGroup \
  --service-endpoints Microsoft.ContainerRegistry

Use el comando az network vnet subnet show para recuperar el identificador de recurso de la subred. Lo necesitará en un paso posterior para configurar una regla de acceso a la red.

az network vnet subnet show \
  --name myDockerVMSubnet \
  --vnet-name myDockerVMVNET \
  --resource-group myResourceGroup \
  --query "id"
  --output tsv

Salida:

/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/myResourceGroup/providers/Microsoft.Network/virtualNetworks/myDockerVMVNET/subnets/myDockerVMSubnet

Cambio del acceso de red predeterminado al registro

De manera predeterminada los registros de contenedor Azure permiten conexiones de hosts de cualquier red. Para limitar el acceso a una red seleccionada, cambie la acción predeterminada para denegar el acceso. Sustituya el nombre del registro en el siguiente comando az acr update:

az acr update --name myContainerRegistry --default-action Deny

Incorporación de una regla de red al registro

Use el comando az acr network-rule add para agregar una regla de red al registro que permita el acceso desde la subred de la máquina virtual. Sustituya el nombre del registro de contenedor y el identificador de recurso de la subred en el siguiente comando:

az acr network-rule add \
  --name mycontainerregistry \
  --subnet <subnet-resource-id>

Comprobación del acceso al registro

Después de esperar unos minutos para que se actualice la configuración, compruebe que la máquina virtual puede acceder al registro de contenedor. Cree una conexión SSH con la máquina virtual y ejecute el comando az acr login para iniciar sesión en el registro.

az acr login --name mycontainerregistry

Puede realizar las operaciones de registro, como ejecutar docker pull para extraer una imagen de ejemplo del registro. Sustituya una imagen y el valor de la etiqueta pertinente para el registro, y anteponga el nombre del servidor de inicio de sesión del registro (todo en minúsculas):

docker pull mycontainerregistry.azurecr.io/hello-world:v1

Docker extrae correctamente la imagen a la máquina virtual.

En este ejemplo se muestra que puede acceder al registro de contenedor privado a través de la regla de acceso a la red. Sin embargo, no se puede acceder al registro desde un host de inicio de sesión que no tenga configurada una regla de acceso de red. Si intenta iniciar sesión desde otro host mediante el comando az acr login o el comando docker login, el resultado será similar al siguiente:

Error response from daemon: login attempt to https://xxxxxxx.azurecr.io/v2/ failed with status: 403 Forbidden

Restauración del acceso al registro predeterminado

Para restaurar el registro para permitir el acceso de forma predeterminada, quite todas las reglas de red configuradas. Luego, establezca la acción predeterminado en permitir el acceso.

Eliminación de reglas de red

Para ver una lista de reglas de red configuradas para el registro, ejecute el siguiente comando az acr network-rule list:

az acr network-rule list --name mycontainerregistry 

En cada regla que esté configurada, ejecute el comando az acr network-rule remove para quitarla. Por ejemplo:

# Remove a rule that allows access for a subnet. Substitute the subnet resource ID.

az acr network-rule remove \
  --name mycontainerregistry \
  --subnet /subscriptions/ \
  xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/myResourceGroup/providers/Microsoft.Network/virtualNetworks/myDockerVMVNET/subnets/myDockerVMSubnet

Permitir acceso

Sustituya el nombre del registro en el siguiente comando az acr update:

az acr update --name myContainerRegistry --default-action Allow

Limpieza de recursos

Si ha creado todos los recursos de Azure en el mismo grupo de recursos y ya no los necesita, puede eliminarlos con el comando az group delete:

az group delete --name myResourceGroup

Pasos siguientes