Поделиться через


Аутентификация с помощью реестра контейнеров Azure из службы "Экземпляры контейнеров Azure"

Вы можете использовать субъект-службу Microsoft Entra для предоставления доступа к частным реестрам контейнеров в Реестр контейнеров Azure.

В этой статье вы узнаете, как создать и настроить субъект-службу Microsoft Entra с разрешениями на извлечение в реестр. Затем вы запустите контейнер в службе "Экземпляры контейнеров Azure" (ACI), которая извлекает образ контейнера из закрытого реестра, с помощью субъекта-службы для аутентификации.

Когда следует использовать субъект-службу

Субъект-службу следует использовать для аутентификации из ACI в сценариях автоматического входа, например в приложениях или службах, которые создают экземпляры контейнеров автоматически или другим способом без участия пользователя.

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

Субъекты-службы также следует использовать, если учетная запись администратора реестра отключена.

Создание субъекта-службы

Чтобы создать субъект-службу с доступом к реестру контейнеров, выполните следующий скрипт в Azure Cloud Shell или локальную установку Azure CLI. Скрипт отформатирован для оболочки Bash.

Перед выполнением сценария обновите переменную ACR_NAME с именем реестра контейнеров. Значение SERVICE_PRINCIPAL_NAME должно быть уникальным в клиенте Microsoft Entra. Если вы получаете ошибку "'http://acr-service-principal' already exists.", укажите другое имя для субъекта-службы.

Можно изменять значение --role в команде az ad sp create-for-rbac, если необходимо предоставить другие разрешения. Полный список ролей см. в разделе Роли и разрешения реестра контейнеров Azure.

После запуска скрипта запишите идентификатор и пароль субъекта-службы. Сохранив эти учетные данные, вы можете настроить приложения и службы для аутентификации в качестве субъектов-служб в реестре контейнеров.

#!/bin/bash
# This script requires Azure CLI version 2.25.0 or later. Check version with `az --version`.

# Modify for your environment.
# ACR_NAME: The name of your Azure Container Registry
# SERVICE_PRINCIPAL_NAME: Must be unique within your AD tenant
ACR_NAME=$containerRegistry
SERVICE_PRINCIPAL_NAME=$servicePrincipal

# Obtain the full registry ID
ACR_REGISTRY_ID=$(az acr show --name $ACR_NAME --query "id" --output tsv)
# echo $registryId

# Create the service principal with rights scoped to the registry.
# Default permissions are for docker pull access. Modify the '--role'
# argument value as desired:
# acrpull:     pull only
# acrpush:     push and pull
# owner:       push, pull, and assign roles
PASSWORD=$(az ad sp create-for-rbac --name $SERVICE_PRINCIPAL_NAME --scopes $ACR_REGISTRY_ID --role acrpull --query "password" --output tsv)
USER_NAME=$(az ad sp list --display-name $SERVICE_PRINCIPAL_NAME --query "[].appId" --output tsv)

# Output the service principal's credentials; use these in your services and
# applications to authenticate to the container registry.
echo "Service principal ID: $USER_NAME"
echo "Service principal password: $PASSWORD"

Использование существующего субъекта-службы

Чтобы предоставить субъекту-службе доступ к реестру, нужно назначить новую роль субъекту-службе. Как и при создании субъекта-службы, вы, помимо прочего, можете предоставить разрешения на извлечение данных, отправку и извлечение данных, а также разрешения владельца.

В следующем скрипте используется команда az role assignment create, чтобы предоставить разрешения на извлечение субъекту-службе, указанному в переменной SERVICE_PRINCIPAL_ID. Измените значение --role, если нужно предоставить другой уровень доступа.

#!/bin/bash
# Modify for your environment. The ACR_NAME is the name of your Azure Container
# Registry, and the SERVICE_PRINCIPAL_ID is the service principal's 'appId' or
# one of its 'servicePrincipalNames' values.
ACR_NAME=$containerRegistry
SERVICE_PRINCIPAL_ID=$servicePrincipal

# Populate value required for subsequent command args
ACR_REGISTRY_ID=$(az acr show --name $ACR_NAME --query id --output tsv)

# Assign the desired role to the service principal. Modify the '--role' argument
# value as desired:
# acrpull:     pull only
# acrpush:     push and pull
# owner:       push, pull, and assign roles
az role assignment create --assignee $SERVICE_PRINCIPAL_ID --scope $ACR_REGISTRY_ID --role acrpull

Аутентификация с помощью субъекта-службы

Чтобы запустить контейнер в службе "Экземпляры контейнеров Azure", используя субъект-службу, укажите идентификатор субъекта-службы для параметра --registry-username и пароль для параметра --registry-password.

az container create \
    --resource-group myResourceGroup \
    --name mycontainer \
    --image mycontainerregistry.azurecr.io/myimage:v1 \
    --registry-login-server mycontainerregistry.azurecr.io \
    --registry-username <service-principal-ID> \
    --registry-password <service-principal-password>

Примечание.

Рекомендуется выполнять команды в последней версии Azure Cloud Shell. Задайте export MSYS_NO_PATHCONV=1 для запуска локальной среды Bash.

Примеры сценариев

На GitHub можно найти предыдущие примеры сценариев для Azure CLI, а также версии для Azure PowerShell:

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

В следующих статьях приводятся дополнительные сведения о работе с субъектами-службами и реестром контейнеров Azure.