Restringir o acesso a um registro de contêiner usando um ponto de extremidade de serviço em uma rede virtual do Azure

A Rede Virtual do Azure fornece rede segura e privada para seus recursos do Azure e locais. Um ponto de extremidade de serviço permite que você proteja o endereço IP público do registro de contêiner apenas para sua rede virtual. Esse ponto de extremidade fornece ao tráfego uma rota ideal para o recurso na rede de backbone do Azure. As identidades da rede virtual e da sub-rede também são transmitidas a cada solicitação.

Este artigo mostra como configurar um ponto de extremidade do serviço de registro de contêiner (visualização) em uma rede virtual.

Cada registo suporta um máximo de 100 regras de rede virtual.

Importante

O Registro de Contêiner do Azure agora dá suporte ao Azure Private Link, permitindo que pontos de extremidade privados de uma rede virtual sejam colocados em um registro. Os pontos de extremidade privados são acessíveis a partir da rede virtual, usando endereços IP privados. Recomendamos o uso de pontos de extremidade privados em vez de pontos de extremidade de serviço na maioria dos cenários de rede. O registro de contêiner não oferece suporte à habilitação de recursos de ponto de extremidade de serviço e link privado configurados a partir de uma rede virtual. Portanto, recomendamos executar a lista e remover as regras de rede, conforme necessário.

A configuração de um ponto de extremidade do serviço de registro está disponível na camada de serviço de registro de contêiner Premium . Para obter informações sobre camadas e limites de serviço do Registro, consulte Camadas de serviço do Registro de Contêiner do Azure.

Limitações de pré-visualização

  • O desenvolvimento futuro de pontos de extremidade de serviço para o Registro de Contêiner do Azure não está planejado no momento. Em vez disso, recomendamos o uso de pontos de extremidade privados.
  • Você não pode usar o portal do Azure para configurar pontos de extremidade de serviço em um registro.
  • Somente um cluster do Serviço Kubernetes do Azure ou uma máquina virtual do Azure pode ser usado como um host para acessar um registro de contêiner usando um ponto de extremidade de serviço. Não há suporte para outros serviços do Azure, incluindo Instâncias de Contêiner do Azure.
  • Os pontos de extremidade de serviço para o Registro de Contêiner do Azure não são suportados na nuvem do Azure US Government ou no Microsoft Azure operado pela nuvem 21Vianet.

Importante

Algumas funcionalidades podem não estar disponíveis ou exigir mais configuração em um registro de contêiner que restrinja o acesso a pontos de extremidade privados, sub-redes selecionadas ou endereços IP.

  • Quando o acesso à rede pública a um registo está desativado, o acesso ao registo por determinados serviços fidedignos, incluindo o Centro de Segurança do Azure, requer a ativação de uma definição de rede para ignorar as regras de rede.
  • Depois que o acesso à rede pública é desabilitado, instâncias de determinados serviços do Azure, incluindo os Serviços de DevOps do Azure, não conseguem acessar o registro do contêiner.
  • Atualmente, não há suporte para pontos de extremidade privados com agentes gerenciados do Azure DevOps. Você precisará usar um agente auto-hospedado com linha de visão de rede para o ponto de extremidade privado.
  • Se o registro tiver um ponto de extremidade privado aprovado e o acesso à rede pública estiver desabilitado, os repositórios e marcas não poderão ser listados fora da rede virtual usando o portal do Azure, a CLI do Azure ou outras ferramentas.

Pré-requisitos

  • Para usar as etapas da CLI do Azure neste artigo, a CLI do Azure versão 2.0.58 ou posterior é necessária. Se precisar de instalar ou atualizar, veja Install Azure CLI (Instalar o Azure CLI).

  • Se você ainda não tiver um registro de contêiner, crie um (camada Premium necessária) e envie por push uma imagem de exemplo, como hello-world do Docker Hub. Por exemplo, use o portal do Azure ou a CLI do Azure para criar um registro.

  • Se você quiser restringir o acesso ao Registro usando um ponto de extremidade de serviço em uma assinatura diferente do Azure, registre o provedor de recursos para o Registro de Contêiner do Azure nessa assinatura. Por exemplo:

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

Criar uma máquina virtual habilitada para Docker

Para fins de teste, use uma VM do Ubuntu habilitada para Docker para acessar um registro de contêiner do Azure. Para usar a autenticação do Microsoft Entra no Registro, instale também a CLI do Azure na VM. Se você já tiver uma máquina virtual do Azure, ignore esta etapa de criação.

Você pode usar o mesmo grupo de recursos para sua máquina virtual e seu registro de contêiner. Esta configuração simplifica a limpeza no final, mas não é necessária. Se você optar por criar um grupo de recursos separado para a máquina virtual e a rede virtual, execute az group create. O exemplo a seguir pressupõe que você tenha definido variáveis de ambiente para o nome do grupo de recursos e o local do Registro:

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

Agora implante uma máquina virtual padrão do Ubuntu Azure com az vm create. O exemplo a seguir cria uma VM chamada myDockerVM.

VM_NAME=myDockerVM

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

Demora alguns minutos até que a VM seja criada. Quando o comando for concluído, anote o publicIpAddress exibido pela CLI do Azure. Use esse endereço para fazer conexões SSH com a VM.

Instalar o Docker na VM

Depois que a VM estiver em execução, faça uma conexão SSH com a VM. Substitua publicIpAddress pelo endereço IP público da sua VM.

ssh azureuser@publicIpAddress

Execute os seguintes comandos para instalar o Docker na VM do Ubuntu:

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

Após a instalação, execute o seguinte comando para verificar se o Docker está sendo executado corretamente na VM:

sudo docker run -it hello-world

Resultado:

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

Instalar a CLI do Azure

Siga as etapas em Instalar a CLI do Azure com o apt para instalar a CLI do Azure em sua máquina virtual do Ubuntu. Por exemplo:

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

Saia da conexão SSH.

Configurar o acesso à rede para o Registro

Nesta seção, configure seu registro de contêiner para permitir o acesso de uma sub-rede em uma rede virtual do Azure. As etapas são fornecidas usando a CLI do Azure.

Adicionar um ponto de extremidade de serviço a uma sub-rede

Quando você cria uma VM, o Azure por padrão cria uma rede virtual no mesmo grupo de recursos. O nome da rede virtual é baseado no nome da máquina virtual. Por exemplo, se você nomear sua máquina virtual myDockerVM, o nome de rede virtual padrão será myDockerVMVNET, com uma sub-rede chamada myDockerVMSubnet. Verifique isso usando o comando az network vnet list :

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

Resultado:

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

Use o comando az network vnet subnet update para adicionar um ponto de extremidade do serviço Microsoft.ContainerRegistry à sua sub-rede. Substitua os nomes da sua rede virtual e sub-rede no seguinte comando:

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

Use o comando az network vnet subnet show para recuperar o ID do recurso da sub-rede. Você precisa disso em uma etapa posterior para configurar uma regra de acesso à rede.

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

Resultado:

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

Alterar o acesso de rede padrão ao Registro

Por padrão, um registro de contêiner do Azure permite conexões de hosts em qualquer rede. Para limitar o acesso a uma rede selecionada, altere a ação padrão para negar o acesso. Substitua o nome do seu registro no seguinte comando az acr update :

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

Adicionar regra de rede ao registo

Use o comando az acr network-rule add para adicionar uma regra de rede ao seu registro que permita o acesso a partir da sub-rede da VM. Substitua o nome do registro do contêiner e a ID do recurso da sub-rede no seguinte comando:

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

Verificar o acesso ao registo

Depois de aguardar alguns minutos para que a configuração seja atualizada, verifique se a VM pode acessar o registro do contêiner. Faça uma conexão SSH com sua VM e execute o comando az acr login para fazer login no seu registro.

az acr login --name mycontainerregistry

Você pode executar operações do Registro, como executar docker pull para extrair uma imagem de exemplo do Registro. Substitua uma imagem e um valor de tag apropriados para o seu registro, prefixados com o nome do servidor de login do registro (todos em minúsculas):

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

O Docker extrai com êxito a imagem para a VM.

Este exemplo demonstra que você pode acessar o registro de contêiner privado por meio da regra de acesso à rede. No entanto, o registo não pode ser acedido a partir de um anfitrião de início de sessão que não tenha uma regra de acesso à rede configurada. Se você tentar fazer login de outro host usando o az acr login comando ou docker login comando, a saída será semelhante à seguinte:

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

Restaurar o acesso padrão ao Registro

Para restaurar o registo para permitir o acesso por predefinição, remova todas as regras de rede configuradas. Em seguida, defina a ação padrão para permitir o acesso.

Remover regras de rede

Para ver uma lista de regras de rede configuradas para o seu registo, execute o seguinte comando az acr network-rule list :

az acr network-rule list --name mycontainerregistry 

Para cada regra configurada, execute o comando az acr network-rule remove para removê-la. Por exemplo:

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

Substitua o nome do seu registro no seguinte comando az acr update :

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

Clean up resources (Limpar recursos)

Se você criou todos os recursos do Azure no mesmo grupo de recursos e não precisa mais deles, opcionalmente pode excluir os recursos usando um único comando az group delete :

az group delete --name myResourceGroup

Próximos passos