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 uma rede privada segura para seus recursos locais e do Azure. Um ponto de extremidade de serviço permite proteger o endereço IP público do registro de contêiner somente para sua rede virtual. Esse ponto de extremidade fornece ao tráfego uma rota ideal para o recurso pela rede de backbone do Azure. As identidades de rede virtual e a sub-rede também são transmitidas com cada solicitação.

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

Cada registro dá suporte a, no máximo, 100 regras de rede virtual.

Importante

O Registro de Contêiner do Azure agora oferece suporte ao Link Privado do Azure, permitindo que pontos de extremidade privados de uma rede virtual sejam colocados em um registro. Os pontos de extremidade privados podem ser acessados de dentro da rede virtual, usando endereços IP privados. É recomendável usar 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 dá suporte à habilitação de recursos de link privado e de ponto de extremidade de serviço configurados 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 de serviço de registro está disponível na camada de serviço Premium do registro de contêiner. Para saber mais sobre os limites e as camadas de serviço do registro, confira Camadas de serviço do Registro de Contêiner do Azure.

Limitações de 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. 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 de Kubernetes do Azure ou a máquina virtual do Azure pode ser usado como 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 do serviço para o Registro de Contêiner do Azure não são suportados na nuvem Azure US Government ou na nuvem do Microsoft Azure operada pela 21Vianet.

Importante

Algumas funcionalidades podem estar indisponíveis ou exigir configurações adicionais 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 para um registro está desabilitado, o acesso ao registro por determinados serviços confiáveis, incluindo a Central de Segurança do Azure, requer a habilitação de uma configuração de rede para ignorar as regras de rede.
  • Depois que o acesso à rede pública é desabilitado, as instâncias de alguns serviços do Azure, incluindo o Azure DevOps Services, atualmente não conseguem acessar o registro de contêiner.
  • No momento, 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 as marcas não poderão ser listados fora da rede virtual usando o portal do Azure, o 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 você precisa instalar ou atualizar, consulte Instalar a CLI do Azure.

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

  • Se você deseja restringir o acesso ao registro usando um ponto de extremidade de serviço em uma assinatura diferente do Azure, registre o provedor de recursos do 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 Ubuntu habilitada para Docker para acessar um registro de contêiner do Azure. Para usar a autenticação do Microsoft Entra para o registro, instale, também, o CLI do Azure na VM. Se já tiver uma máquina virtual do Azure, ignore esta etapa de criação.

É possível usar o mesmo grupo de recursos para sua máquina virtual e o registro de contêiner. Essa 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ê definiu 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 Azure no Ubuntu 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

A criação da VM demora alguns minutos. Quando o comando for concluído, observe o publicIpAddress exibido pela CLI do Azure. Use esse endereço para estabelecer conexões SSH à VM.

Instalar o Docker na VM

Depois que a VM estiver em execução, estabeleça uma conexão SSH à VM. Substitua publicIpAddress pelo endereço IP público da 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á funcionando corretamente na VM:

sudo docker run -it hello-world

Saída:

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 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 acesso à rede para o registro

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

Habilitar um ponto de extremidade de serviço para uma sub-rede

Ao criar 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 o nome da máquina virtual for myDockerVM, o nome padrão da rede virtual será myDockerVMVNET e o da sub-rede será myDockerVMSubnet. Verifique isso usando o comando AZ Network vnet List :

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

Saída:

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

Use o comando az network vnet subnet update para adicionar um ponto de extremidade de serviço Microsoft.ContainerRegistry à sua sub-rede. Substitua os nomes de 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 a ID do recurso da sub-rede. Você precisará 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

Saída:

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

Alterar o acesso de rede padrão para o registro

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

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

Adicionar regra de rede ao registro

Use o comando az acr network-rule add para adicionar uma regra de rede ao registro que permite o acesso a partir da sub-rede da VM. Substitua o nome do registro de 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 registro

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

az acr login --name mycontainerregistry

Você pode executar operações de registro, como docker pull, para efetuar pull de uma amostra de imagem do registro. Substitua uma imagem e um valor de marca apropriados ao registro, prefixado com o nome do servidor de logon do registro (todas as letras minúsculas):

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

O Docker efetua pull da imagem com êxito 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 registro não pode ser acessado a partir de um host de logon que não possui uma regra de acesso à rede configurada. Se você tentar efetuar logon de outro host usando o comando az acr login ou docker login, 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 do registro

Para restaurar o registro para permitir acesso por padrão, remova quaisquer 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 registro, 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 registro pelo seguinte comando az acr update:

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

Limpar os recursos

Se você criou todos os recursos do Azure no mesmo grupo de recursos e não precisa mais deles, é possível excluí-los usando um único comando az group delete:

az group delete --name myResourceGroup

Próximas etapas