Partage via


Restreindre l’accès à un registre de conteneurs à l’aide d’un point de terminaison de service dans un réseau virtuel Azure

Un réseau virtuel Azure fournit un accès réseau privé et sécurisé à vos ressources Azure et locales. Un point de terminaison de service vous permet de sécuriser l’adresse IP publique de votre registre de conteneurs uniquement pour votre réseau virtuel. Ce point de terminaison donne au trafic une route optimale vers la ressource via le réseau principal Azure. Les identités du réseau virtuel et du sous-réseau sont également transmises avec chaque demande.

Cet article explique comment configurer un point de terminaison de service de registre de conteneurs (préversion) dans un réseau virtuel.

Chaque registre prend en charge un maximum de 100 règles de réseau virtuel.

Important

Azure Container Registry prend désormais en charge Azure Private Link, ce qui permet de placer des points de terminaison privés d’un réseau virtuel sur un registre. Les points de terminaison privés sont accessibles à partir du réseau virtuel, à l’aide d’adresses IP privées. Nous vous recommandons d’utiliser des points de terminaison privés plutôt que des points de terminaison de service dans la plupart des scénarios réseau. Le registre de conteneurs ne prend pas en charge l’activation des fonctionnalités de liaison privée et de point de terminaison de service configurées à partir d’un réseau virtuel. Par conséquent, nous vous recommandons d’exécuter la liste et de supprimer les règles réseau en fonction des besoins.

La configuration d’un point de terminaison de service du registre est disponible dans le niveau de service de registre de conteneurs Premium. Pour plus d’informations sur les niveaux de service et les limites de registre, consultez Niveaux de service d’Azure Container Registry.

Limitations de la version préliminaire

  • Le développement futur des points de terminaison de service pour Azure Container Registry n’est pas planifié actuellement. Nous vous recommandons d’utiliser des points de terminaison privés à la place.
  • Vous ne pouvez pas utiliser le portail Azure pour configurer des points de terminaison de service sur un registre.
  • Seul un cluster Azure Kubernetes Service ou une machine virtuelle Azure peuvent être utilisés en tant qu’hôtes pour accéder à un registre de conteneurs dans un réseau virtuel. Les autres services Azure, y compris Azure Container Instances, ne sont pas pris en charge.
  • Les points de terminaison de service pour Azure Container Registry ne sont pas pris en charge dans le cloud Azure US Government ni le cloud Microsoft Azure géré par 21Vianet.

Important

Certaines fonctionnalités peuvent ne pas être disponibles ou nécessitent une configuration supplémentaire dans un registre de conteneurs qui restreint l’accès aux points de terminaison privés, aux sous-réseaux sélectionnés ou aux adresses IP.

  • Lorsque l’accès réseau public à un registre est désactivé, l’accès au registre par certains services approuvés, y compris Azure Security Center nécessite l’activation d’un paramètre réseau pour contourner les règles de réseau.
  • Une fois l’accès au réseau public désactivé, les instances de certains services Azure, notamment Azure DevOps Services, ne peuvent plus accéder au registre de conteneurs.
  • Les points de terminaison privés ne sont actuellement pas pris en charge avec les agents managés Azure DevOps. Vous devez utiliser un agent auto-hébergé avec une ligne de vue réseau vers le point de terminaison privé.
  • Si le registre dispose d’un point de terminaison privé approuvé et que l’accès au réseau public est désactivé, les référentiels et les étiquettes ne peuvent pas être listés en dehors du réseau virtuel à l’aide du Portail Azure, d’Azure CLI ou d’autres outils.

Prérequis

  • Pour utiliser les étapes Azure CLI décrites dans cet article, vous devez disposer d’Azure CLI version 2.0.58 ou ultérieure. Si vous devez installer ou mettre à niveau, voir Installer Azure CLI.

  • Si vous ne disposez pas d’un registre de conteneurs, créez-en un (niveau Premium requis) et envoyez (push) un exemple d’image comme hello-world à partir de Docker Hub. Par exemple, utilisez le portail Azure ou Azure CLI pour créer un registre.

  • Si vous souhaitez restreindre l’accès au registre à l’aide d’un point de terminaison de service dans un autre abonnement Azure, inscrivez le fournisseur de ressources pour Azure Container Registry dans cet abonnement. Par exemple :

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

Créer une machine virtuelle compatible Docker

À des fins de test, utilisez une machine virtuelle Ubuntu compatible Docker pour accéder à un registre de conteneurs Azure. Pour utiliser l’authentification Microsoft Entra auprès du registre, installez également Azure CLI sur la machine virtuelle. Si vous disposez déjà d’une machine virtuelle, ignorez cette étape de création.

Vous pouvez utiliser le même groupe de ressources pour votre machine virtuelle et votre registre de conteneurs. Cette configuration simplifie le nettoyage à la fin, mais n’est pas nécessaire. Si vous choisissez de créer un groupe de ressources distinct pour la machine virtuelle et le réseau virtuel, exécutez az group create. L’exemple suivant suppose que vous avez défini des variables d’environnement pour le nom du groupe de ressources et l’emplacement du Registre :

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

À présent, déployez une machine virtuelle Azure Ubuntu par défaut avec az vm create. L’exemple suivant crée une machine virtuelle nommée myDockerVM.

VM_NAME=myDockerVM

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

Il faut quelques minutes pour que la machine virtuelle soit créée. Après l’exécution de la commande, notez la valeur de publicIpAddress qui s’affiche dans l’interface Azure CLI. Utilisez cette adresse pour établir des connexions SSH avec la machine virtuelle.

Installer Docker sur la machine virtuelle

Établissez une connexion SSH avec la machine virtuelle dès qu’elle est en cours d’exécution. Remplacez publicIpAddress par l’adresse IP publique de votre machine virtuelle.

ssh azureuser@publicIpAddress

Exécutez les commandes suivantes pour installer Docker sur la machine virtuelle Ubuntu :

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

Après l’installation, exécutez la commande suivante pour vérifier que Docker s’exécute correctement sur la machine virtuelle :

sudo docker run -it hello-world

Sortie :

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

Installer l’interface de ligne de commande Microsoft Azure

Suivez les étapes de la section Installer Azure CLI avec apt pour installer Azure CLI sur votre machine virtuelle Ubuntu. Par exemple :

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

Quittez la connexion SSH.

Configurer l’accès réseau pour le registre

Dans cette section, configurez votre registre de conteneurs pour autoriser l’accès à partir d’un sous-réseau dans un réseau virtuel Azure. Les étapes sont fournies à l’aide d’Azure CLI.

Ajouter un point de terminaison de service à un sous-réseau

Quand vous créez une machine virtuelle, Azure crée par défaut un réseau virtuel dans le même groupe de ressources. Le nom du réseau virtuel est basé sur le nom de la machine virtuelle. Par exemple, si vous nommez votre machine virtuelle myDockerVM, le nom de réseau virtuel par défaut est myDockerVMVNET, avec un sous-réseau nommé myDockerVMSubnet. Vérifiez cela à l’aide de la commande az network vnet list :

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

Sortie :

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

Utilisez la commande az network vnet subnet update pour ajouter un point de terminaison de service Microsoft.ContainerRegistry à votre sous-réseau. Substituez les noms de vos réseau virtuel et sous-réseau dans la commande suivante :

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

Utilisez la commande az network vnet subnet show pour récupérer l’ID de ressource du sous-réseau. Vous en aurez besoin à une étape ultérieure pour configurer une règle d’accès réseau.

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

Sortie :

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

Changer l’accès réseau par défaut au registre

Par défaut, un registre de conteneurs Azure autorise les connexions à partir d’hôtes sur n’importe quel réseau. Pour limiter l’accès à un réseau sélectionné, changez l’action par défaut de manière à refuser l’accès. Substituez le nom de votre registre dans la commande az acr update suivante :

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

Ajouter une règle de réseau au registre

Utilisez la commande az acr network-rule add pour ajouter à votre registre une règle de réseau qui autorise l’accès à partir du sous-réseau de la machine virtuelle. Substituez le nom du registre de conteneur et l’ID de ressource du sous-réseau dans la commande suivante :

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

Vérifier l’accès au registre

Après avoir attendu quelques minutes que la configuration se mette à jour, vérifiez que la machine virtuelle peut accéder au registre de conteneurs. Établissez une connexion SSH à votre machine virtuelle, puis exécutez la commande az acr login pour vous connecter à votre registre.

az acr login --name mycontainerregistry

Vous pouvez effectuer des opérations de registre telles que l’exécution de docker pull pour tirer (pull) un exemple d’image du registre. Substituez une valeur d’image et d’étiquette appropriée pour votre registre, précédée du nom du serveur de connexion du registre (le tout en minuscules) :

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

Docker tire (pull) correctement l’image sur la machine virtuelle.

Cet exemple montre que vous pouvez accéder au registre de conteneurs privé via la règle d’accès réseau. Toutefois, le registre est inaccessible à partir d’un hôte de connexion pour lequel aucune règle d’accès réseau n’est configurée. Si vous essayez de vous connecter à partir d’un autre hôte à l’aide de la commande az acr login ou docker login, la sortie est similaire à ce qui suit :

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

Restaurer l’accès au registre par défaut

Pour restaurer le registre afin d’autoriser l’accès par défaut, supprimez toutes les règles de réseau qui sont configurées. Ensuite, définissez l’action par défaut pour autoriser l’accès.

Supprimer les règles de réseau

Pour afficher la liste des règles de réseau configurées pour votre registre, exécutez la commande az acr network-rule list suivante :

az acr network-rule list --name mycontainerregistry 

Pour chaque règle configurée, exécutez la commande az acr network-rule remove pour la supprimer. Par exemple :

# 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

Autoriser l’accès

Substituez le nom de votre registre dans la commande az acr update suivante :

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

Nettoyer les ressources

Si vous avez créé toutes les ressources Azure dans le même groupe de ressources et que vous n’en avez plus besoin, vous pouvez éventuellement supprimer les ressources à l’aide d’une seule commande az group delete :

az group delete --name myResourceGroup

Étapes suivantes