Limitare l'accesso a un registro contenitori usando un endpoint di servizio in una rete virtuale di Azure

In Rete virtuale di Azure sono disponibili funzionalità per implementare una rete sicura e privata per le risorse locali e di Azure. Un endpoint di servizio consente di proteggere l'indirizzo IP pubblico del registro contenitori limitandolo alla sola rete virtuale. Questo endpoint indirizza il traffico in maniera ottimale alla risorsa sulla rete backbone di Azure. Con ogni richiesta vengono anche trasmesse le identità della rete virtuale e della subnet.

Questo articolo illustra come configurare un endpoint di servizio del registro contenitori (anteprima) in una rete virtuale.

Ogni registro supporta un massimo di 100 regole di rete virtuale.

Importante

Registro Azure Container supporta ora il collegamento privato di Azure, consentendo l'inserimento di endpoint privati da una rete virtuale in un registro. Gli endpoint privati sono accessibili dall'interno della rete virtuale, mediante indirizzi IP privati. Nella maggior parte degli scenari di rete è consigliabile usare endpoint privati anziché endpoint di servizio. Il registro contenitori non supporta l'abilitazione delle funzionalità di collegamento privato ed endpoint di servizio configurate da una rete virtuale. È quindi consigliabile eseguire l'elenco e rimuovere le regole di rete in base alle esigenze.

La configurazione di un endpoint di servizio del registro è disponibile nel livello di servizio del registro contenitori Premium. Per informazioni sui livelli di servizio e sui limiti del registro contenitori, vedere Livelli di servizio del Registro Azure Container.

Limiti dell'anteprima

  • Lo sviluppo futuro di endpoint di servizio per Registro Azure Container non è attualmente pianificato. Si consiglia invece di usare endpoint privati.
  • Non è possibile usare il portale di Azure per configurare endpoint di servizio in un registro.
  • Per accedere a un registro contenitori tramite un endpoint di servizio, è possibile usare solo un cluster del servizio Azure Kubernetes o una macchina virtuale di Azure. Altri servizi di Azure, incluse le istanze di Container di Azure, non sono supportati.
  • Gli endpoint di servizio per Registro Azure Container non sono supportati nel cloud di Azure US Government o in Microsoft Azure gestito dal cloud 21Vianet.

Importante

Alcune funzionalità potrebbero non essere disponibili o richiedere più configurazioni in un registro contenitori che limita l'accesso a endpoint privati, subnet selezionate o indirizzi IP.

  • Quando l'accesso alla rete pubblica a un registro è disabilitato, l'accesso al registro da parte di determinati servizi attendibili, incluso il Centro sicurezza di Azure, richiede l'abilitazione di un'impostazione di rete per ignorare le regole di rete.
  • Dopo aver disabilitato l'accesso alla rete pubblica, le istanze di determinati servizi di Azure, tra cui Azure DevOps Services, non sono attualmente in grado di accedere al registro contenitori.
  • Gli endpoint privati non sono attualmente supportati con gli agenti gestiti di Azure DevOps. È necessario usare un agente self-hosted con la linea di rete per l'endpoint privato.
  • Se il registro ha un endpoint privato approvato e l'accesso alla rete pubblica è disabilitato, i repository e i tag non possono essere elencati all'esterno della rete virtuale usando il portale di Azure, l'interfaccia della riga di comando di Azure o altri strumenti.

Prerequisiti

  • Per usare i passaggi dell'interfaccia della riga di comando di Azure in questo articolo, è necessaria la versione 2.0.58 o successiva dell'interfaccia della riga di comando di Azure. Se è necessario eseguire l'installazione o l'aggiornamento, vedere Installare l'interfaccia della riga di comando di Azure.

  • Se non si dispone già di un registro contenitori, crearne uno (livello Premium obbligatorio) ed effettuare il push di un'immagine di esempio, come hello-world, da Docker Hub. Ad esempio, per creare un registro usare il portale di Azure oppure l'interfaccia della riga di comando di Azure.

  • Per limitare l'accesso al registro usando un endpoint di servizio in un'altra sottoscrizione di Azure, registrare il provider di risorse per Registro Azure Container nella sottoscrizione. Ad esempio:

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

Creare una macchina virtuale abilitata per Docker

A scopo di test, usare una macchina virtuale Ubuntu abilitata per Docker per accedere a un registro Azure Container. Per usare l'autenticazione di Microsoft Entra nel Registro di sistema, installare anche l'interfaccia della riga di comando di Azure nella macchina virtuale. Se si dispone già di una macchina virtuale di Azure, ignorare questo passaggio di creazione.

È possibile usare lo stesso gruppo di risorse per la macchina virtuale e il registro contenitori. Tale configurazione semplifica la pulizia finale, ma non è necessaria. Se si sceglie di creare un gruppo di risorse separato per la macchina virtuale e la rete virtuale, eseguire creare gruppo az. L'esempio seguente presuppone che siano state impostate le variabili di ambiente per il nome del gruppo di risorse e il percorso del Registro di sistema:

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

A questo punto, distribuire una macchina virtuale di Azure Ubuntu predefinita con az vm create. L'esempio seguente crea una macchina virtuale denominata myDockerVM.

VM_NAME=myDockerVM

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

Per creare la macchina virtuale sono necessari alcuni minuti. Dopo aver eseguito il comando, prendere nota del publicIpAddress visualizzato dall'interfaccia della riga di comando di Azure. Usare questo indirizzo per stabilire connessioni SSH alla macchina virtuale.

Installare Docker nella macchina virtuale

Una volta che la macchina virtuale è in esecuzione, stabilire una connessione SSH alla macchina virtuale. Sostituire publicIpAddress con l'indirizzo IP pubblico della macchina virtuale.

ssh azureuser@publicIpAddress

Eseguire i comandi seguenti per installare Docker nella macchina virtuale Ubuntu:

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

Dopo l'installazione, eseguire il comando seguente per verificare la corretta esecuzione di Docker nella macchina virtuale:

sudo docker run -it hello-world

Output:

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

Installare l'interfaccia della riga di comando di Azure

Seguire i passaggi descritti in Installare l'interfaccia della riga di comando di Azure con APT per installare l'interfaccia della riga di comando di Azure nella macchina virtuale Ubuntu. Ad esempio:

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

Uscire dalla connessione SSH.

Configurare l'accesso alla rete per il registro

In questa sezione, si vedrà come configurare il registro contenitori per consentire l'accesso da una subnet in una rete virtuale di Azure. I passaggi vengono forniti usando l'interfaccia della riga di comando di Azure.

Aggiungere un endpoint di servizio a una subnet

Quando si crea una macchina virtuale, per impostazione predefinita Azure crea una rete virtuale nello stesso gruppo di risorse. Il nome della rete virtuale si basa sul nome della macchina virtuale. Se, ad esempio, si rinomina la macchina virtuale in myDockerVM, il nome della rete virtuale predefinito sarà myDockerVMVNET, con una subnet denominata myDockerVMSubnet. Verificare questa impostazione usando il comando az network vnet list:

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

Output:

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

Usare il comando az network vnet subnet update per aggiungere un endpoint di servizio Microsoft.ContainerRegistry alla subnet. Sostituire i nomi della rete virtuale e della subnet nel comando seguente:

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

Usare il comando az network vnet subnet show per recuperare l'ID risorsa della subnet. Questo sarà necessario in un passaggio successivo per configurare una regola di accesso alla rete.

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

Output:

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

Modificare la regola predefinita di accesso al registro

Per impostazione predefinita, un registro contenitori di Azure consente le connessioni da host in qualsiasi rete. Per limitare l'accesso a una rete selezionata, modificare l'azione predefinita per negare l'accesso. Sostituire il nome del registro con nel seguente comando az acr update:

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

Aggiungere una regola di rete al registro

Usare il comando az acr network-rule add per aggiungere una regola di rete al registro che consenta l'accesso dalla subnet della macchina virtuale. Sostituire il nome del registro contenitori e l'ID della risorsa della subnet nel comando seguente:

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

Verificare l'accesso al registro

Dopo alcuni minuti di attesa per l'aggiornamento della configurazione, verificare che la macchina virtuale sia in grado di accedere al registro contenitori. Creare una connessione SSH alla macchina virtuale ed eseguire il comando az acr login per accedere al registro.

az acr login --name mycontainerregistry

È possibile eseguire operazioni del registro, ad esempio eseguire docker pull per eseguire il pull di un'immagine di esempio dal registro. Sostituire un'immagine e un valore di tag appropriati per il registro, preceduto dal nome del server di accesso del registro di sistema (tutto minuscolo):

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

Docker esegue correttamente il pull dell'immagine nella macchina virtuale.

Questo esempio dimostra che è possibile accedere al registro contenitori privato tramite la regola di accesso alla rete. Non è tuttavia possibile accedere al registro di sistema da un host di accesso in cui non è configurata una regola di accesso alla rete. Se si tenta di eseguire l'accesso da un altro host usando il comando az acr login o docker login, l'output sarà simile al seguente:

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

Ripristinare l'accesso predefinito al registro

Per ripristinare il registro in modo da consentire l'accesso per impostazione predefinita, rimuovere tutte le regole di rete configurate. Impostare quindi l'azione predefinita per consentire l'accesso.

Rimuovere regole di rete

Per visualizzare un elenco di regole di rete configurate per il registro, eseguire il seguente comando az acr network-rule list:

az acr network-rule list --name mycontainerregistry 

Per ogni regola configurata, eseguire il comando az acr network-rule remove per rimuoverla. Ad esempio:

# 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

Consentire l'accesso

Sostituire il nome del registro con nel seguente comando az acr update:

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

Pulire le risorse

Se tutte le risorse di Azure sono state create nello stesso gruppo di risorse e non sono più necessarie, è possibile eliminare facoltativamente le risorse usando un singolo comando az group delete:

az group delete --name myResourceGroup

Passaggi successivi