Ограничение доступа к реестру контейнеров с использованием конечной точки службы в виртуальной сети Azure

Виртуальная сеть Azure обеспечивает безопасное и конфиденциальное сетевое подключение для Azure и локальных ресурсов. Конечная точка службы позволяет защитить общедоступный IP-адрес реестра контейнеров, разрешая доступ к нему только из виртуальной сети. Такая конечная точка направляет трафик к ресурсу по оптимальному маршруту в магистральной сети Azure. В каждом запросе также передаются удостоверения виртуальной сети и подсети.

В этой статье показано, как настроить в виртуальной сети конечную точку службы реестра контейнеров (предварительная версия).

Каждый реестр поддерживает не более 100 правил виртуальной сети.

Важно!

Реестр контейнеров Azure теперь поддерживает Приватный канал Azure, что позволяет размещать в реестре частные конечные точки из виртуальной сети. Частные конечные точки доступны только из виртуальной сети через частные IP-адреса. Мы рекомендуем в большинстве сетевых сценариев использовать частные конечные точки вместо конечных точек службы. Реестр контейнеров не поддерживает включение функций приватного канала и конечной точки службы, настроенных из виртуальной сети. Поэтому рекомендуется запускать список и удалять сетевые правила по мере необходимости.

Настройка конечной точки службы для реестра доступна для реестра контейнеров с уровнем Премиум. Ознакомиться с информацией об уровнях служб реестра и ограничениях можно в статье Уровни служб Реестра контейнеров Azure.

Ограничения предварительной версии

  • Дальнейшая доработка конечных точек службы для реестра контейнеров Azure пока не планируется. Мы рекомендуем использовать вместо них частные конечные точки.
  • Вы не сможете настроить конечные точки службы для реестра на портале Azure.
  • В качестве узла для доступа к реестру контейнеров через конечную точку службы можно использовать только кластер Службы Azure Kubernetes или виртуальную машину Azure. Другие службы Azure, в том числе Экземпляры контейнеров Azure, не поддерживаются.
  • Конечные точки службы для Реестр контейнеров Azure не поддерживаются в облаке Azure для государственных организаций США или Microsoft Azure, управляемом облаком 21Vianet.

Важно!

Некоторые функции могут быть недоступны или требовать большего объема настройки в реестре контейнеров, который ограничивает доступ к частным конечным точкам, выбранным подсетям или IP-адресам.

  • Если доступ к реестру через общедоступную сеть отключен, для доступа к реестру с помощью определенных доверенных служб, в том числе, через Центр безопасности Azure, требуется включение параметра сети для обхода сетевых правил.
  • После отключения доступа к общедоступной сети экземпляры некоторых служб Azure, включая Azure DevOps Services, в настоящее время не могут получить доступ к реестру контейнеров.
  • Частные конечные точки в настоящее время не поддерживаются управляемыми агентами Azure DevOps. Вам потребуется использовать локальный агент с сетевой линией видимости к частной конечной точке.
  • Если в реестре есть утвержденная частная конечная точка и доступ через общедоступную сеть отключен, репозитории и теги нельзя включить в список за пределами виртуальной сети с помощью портала Azure, Azure CLI или других средств.

Необходимые компоненты

  • Для выполнения действий с Azure CLI, описанных в этой статье, потребуется Azure CLI версии 2.0.58 или более поздней. Если вам необходимо выполнить установку или обновление, см. статью Установка Azure CLI 2.0.

  • Если у вас еще нет реестра контейнеров Azure, создайте его (обязательно с уровнем "Премиум") и отправьте в него из Docker Hub пример образа, например hello-world. Создать реестр можно на портале Azure или с помощью Azure CLI.

  • Если вы хотите ограничить доступ к реестру, используя конечную точку службы из другой подписки Azure, зарегистрируйте в такой подписке поставщик ресурсов для реестра контейнеров Azure. Например:

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

Создайте виртуальную машину с поддержкой Docker

Для целей тестирования используйте виртуальную машину Ubuntu с поддержкой Docker для доступа к реестру контейнеров Azure. Чтобы использовать проверку подлинности Microsoft Entra в реестре, также установите Azure CLI на виртуальной машине. Если у вас уже есть виртуальная машина Azure, пропустите этот шаг создания.

Вы можете использовать одну и ту же группу ресурсов для виртуальной машины и реестра контейнеров. Эта настройка упрощает очистку в конце, но не является обязательной. Если вы решили создать отдельную группу ресурсов для виртуальной машины и виртуальной сети, выполните команду az group create. В следующем примере предполагается, что вы установили переменные среды для имени группы ресурсов и расположения реестра:

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

Разверните виртуальную машину Azure Ubuntu по умолчанию с помощью команды az vm create. В следующем примере создается виртуальная машина с именем myDockerVM:

VM_NAME=myDockerVM

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

Создание виртуальной машины может занять несколько минут. После выполнения команды запишите значение publicIpAddress, отображаемое Azure CLI. Этот адрес используется для установления SSH-подключений к виртуальной машине.

Установка Docker на виртуальной машине

После запуска виртуальной машины установите SSH-подключение к ней. Замените publicIpAddress общедоступным IP-адресом виртуальной машины.

ssh azureuser@publicIpAddress

Выполните следующую команду, чтобы установить Docker на виртуальную машину Ubuntu:

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

После установки выполните следующую команду, чтобы проверить правильность работы Docker на виртуальной машине:

sudo docker run -it hello-world

Выходные данные:

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

Установка расширения для Azure CLI

Выполните действия, описанные в статье Установка Azure CLI с помощью apt, чтобы установить Azure CLI на виртуальной машине Ubuntu. Например:

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

Выйдите из SSH-подключения.

Настройка сетевого доступа к реестру

В этом разделе вы настроите для реестра контейнеров доступ из подсети, расположенной в виртуальной сети Azure. Действия выполняются с помощью Azure CLI.

Добавление конечной точки службы в подсеть

При создании виртуальной машины Azure по умолчанию создает в той же группе ресурсов виртуальную сеть. Имя для этой виртуальной сети создается автоматически на основе имени виртуальной машины. Например, если вы присвоите виртуальной машине имя myDockerVM, то созданная по умолчанию виртуальная сеть будет называться myDockerVMVNET, а подсеть в ней — myDockerVMSubnet. Вы можете проверить этот механизм с помощью команды az network vnet list:

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

Выходные данные:

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

Выполните команду az network vnet subnet update, чтобы добавить конечную точку службы Microsoft.ContainerRegistry в существующую подсеть. Подставьте имена виртуальной сети и подсети в следующую команду:

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

Выполните команду az network vnet subnet show, чтобы получить идентификатор ресурса для этой подсети. Он потребуется вам на следующем шаге, чтобы настроить правило сетевого доступа.

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

Выходные данные:

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

Изменение сетевого доступа по умолчанию для реестра

По умолчанию реестр контейнеров Azure разрешает подключения от узлов в любой сети. Чтобы разрешить доступ только из выбранной сети, установите режим запрета доступа по умолчанию. Подставьте нужное имя реестра в следующей команде az acr update:

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

Добавление сетевого правила для реестра

Выполните команду az acr network-rule add, чтобы добавить в реестр правило сетевого доступа, которое разрешает доступ из подсети, в которой расположена виртуальная машина. Подставьте имя реестра контейнеров и идентификатор ресурса подсети в следующую команду:

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

Проверка доступа к реестру

Подождите несколько минут, чтобы конфигурация обновилась, а затем убедитесь, что виртуальная машина может обращаться к реестру контейнеров. Создайте SSH-подключение к виртуальной машине и выполните команду az acr login, чтобы войти в реестр.

az acr login --name mycontainerregistry

Попробуйте выполнить какие-либо операции с реестром, например выполните команду docker pull, чтобы извлечь пример образа. Замените значения образа и тега реальными значениями из вашего реестра, а также добавьте в качестве префикса имя сервера для входа в реестр (в нижнем регистре):

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

Средство Docker должно успешно передать образ на виртуальную машину.

Этот пример демонстрирует настройку доступа к частному реестру контейнеров с помощью правила сетевого доступа. Однако доступ к реестру будет невозможен с узла входа, на котором не настроено правило сетевого доступа. При попытке войти с другого узла с помощью команды az acr login или docker login вы получите примерно такой результат, как показано ниже:

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

Восстановление доступа к реестру по умолчанию

Чтобы восстановить стандартный режим доступа к реестру, удалите все настроенные сетевые правила. Затем установите режим разрешения доступа по умолчанию.

Удаление сетевых правил

Чтобы просмотреть список сетевых правил, настроенных для реестра, выполните следующую команду az acr network-rule list:

az acr network-rule list --name mycontainerregistry 

Для каждого настроенного правила выполните команду az acr network-rule remove, чтобы удалить его. Например:

# 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

Разрешить доступ

Подставьте нужное имя реестра в следующей команде az acr update:

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

Очистка ресурсов

Если вы создали все ресурсы Azure в одной группе ресурсов и они вам больше не нужны, вы можете удалить все ресурсы сразу одной командой az group delete.

az group delete --name myResourceGroup

Следующие шаги