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

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

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

Внимание

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

Настройка конечной точки службы реестра доступна в уровне обслуживания реестра контейнеров Премиум. Сведения о уровнях и ограничениях служб реестра см. в разделе "Функции и ограничения SKU контейнера Azure". Каждый реестр Premium поддерживает не более 100 правил виртуальной сети.

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

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

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

Внимание

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

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

Предварительные условия

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

  • Если у вас еще нет реестра контейнеров, создайте его (обязательно с уровнем "Премиум") и отправьте в него пример образа, взятый из 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

Вы увидите выходные данные, подтверждающие правильность работы установки.

Установка 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 хоста с помощью команды az acr 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