Аутентификация в реестре контейнеров Azure с помощью субъектов-служб
Вы можете использовать субъект-службу Microsoft Entra для предоставления принудительной отправки, извлечения или другого доступа к реестру контейнеров. Субъект-служба позволяет предоставлять автоматический доступ к службам и приложениям.
Что такое субъект-служба?
Субъекты-службы идентификатора Microsoft Entra предоставляют доступ к ресурсам Azure в вашей подписке. Их можно считать пользователями, представляющими конкретную службу. Слово "служба" здесь имеет широкое значение и включает любое приложение, службу или платформу, которым нужен доступ к ресурсам. Субъекту-службе можно присвоить права доступа, ограниченные конкретными ресурсами. После этого вам останется лишь настроить применение этого субъекта-службы для доступа к ресурсам из приложения или службы.
В контексте Реестр контейнеров Azure можно создать субъект-службу Microsoft Entra с помощью извлечения, отправки и извлечения или других разрешений для частного реестра в Azure. Полный список см. в статье, посвященной ролям и разрешениям реестра контейнеров Azure.
Почему именно субъект-служба?
Используя субъект-службу Microsoft Entra, вы можете предоставить ограниченный доступ к частному реестру контейнеров. Для каждого приложении и для каждой службы можно создать отдельный субъект-службу и настроить для каждого из них правильные права доступа к реестру. Кроме того, вы сможете в любой момент легко изменить реквизиты или отменить доступ для каждого конкретного субъекта-службы, поскольку его учетные данные применяются только в одном приложении или службе.
Например, для веб-приложения можно настроить субъект-службу только с правами pull
для образа, а для системы разработки — другой субъект-службу с правами доступа push
и pull
. Если в будущем вам придется передать разработку приложения другим сотрудникам, вы сможете просто заменить учетные данные первого субъекта-службы, ничего не изменяя в системе разработки.
Когда следует использовать субъект-службу
Субъект-службы следует очень удобны для предоставления доступа к реестру при работе со сценариями с автоматическим доступом. Это позволяет приложениям, службам и (или) скриптам передавать или получать образы контейнеров в полностью автоматическом режиме или без участия оператора. Например:
Извлечение: развертывание контейнеров из реестра в системы оркестрации, в том числе Kubernetes, DC/OS и Docker Swarm. Вы также можете извлекать из реестров контейнеров связанные службы Azure, такие как Служба приложений, пакетная служба, Service Fabric и другие.
Совет
В некоторых сценариях Kubernetes для извлечения образов из реестра контейнеров Azure рекомендуется использовать субъект-службу. С помощью Службы Azure Kubernetes (AKS) можно также использовать автоматизированный механизм для проверки подлинности в целевом реестре, включив управляемое удостоверение кластера.
- Отправка: создание образов контейнеров и их отправка в решения непрерывной интеграции и развертывания (например, Azure Pipelines или Jenkins).
Для отдельного доступа к реестру, например при ручном извлечении образа контейнера на рабочую станцию разработки, рекомендуется использовать собственное удостоверение Microsoft Entra вместо доступа к реестру (например, az acr login).
Создание субъекта-службы
Чтобы создать субъект-службу с доступом к реестру контейнеров, выполните следующий скрипт в 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
Примеры сценариев
На GitHub можно найти предыдущие примеры сценариев для Azure CLI, а также версии для Azure PowerShell:
Проверка подлинности с помощью субъекта-службы
Создав субъект-службу и предоставив ему доступ к реестру контейнеров, вы сможете настроить его учетные данные для доступа к автономным приложениям и службам или использовать для входа команду docker login
. Используйте следующие значения.
- Имя пользователя — идентификатор приложения субъекта-службы (клиент)
- Password — пароль (секрет клиента) субъекта-службы
Значение имени пользователя имеет формат xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
.
Совет
Можно повторно создать пароль (секрет клиента) субъекта-службы, выполнив команду az ad sp credential reset.
Использование учетных данных со службами Azure
Учетные данные субъекта-службы можно использовать из любой службы Azure, которая может выполнить проверку подлинности в реестре контейнеров Azure. Вы можете использовать учетные данные субъекта-службы вместо учетных данных администратора реестра в различных сценариях.
Использование входа Docker
С помощью субъекта-службы можно запустить docker login
. В примере ниже идентификатор приложения субъекта-службы будет передан в переменной среды $SP_APP_ID
, а пароль — в переменной $SP_PASSWD
. Современные рекомендации по управлению учетными данными Docker см. в справочных материалах по команде docker login.
# Log in to Docker with service principal credentials
docker login myregistry.azurecr.io --username $SP_APP_ID --password $SP_PASSWD
После входа в систему Docker кэширует учетные данные.
Использование с сертификатом
Если вы добавили сертификат в субъект-службу, вы можете войти в Azure CLI с проверкой подлинности на основе сертификатов, а затем использовать команду az acr login для доступа к реестру. Использование сертификата в качестве секрета вместо пароля повышает защиту при работе в интерфейсе командной строки.
При создании субъекта-службы может быть создан самозаверяющий сертификат. Кроме того, можно добавить один или несколько сертификатов в существующий субъект-службу. Например, если вы используете один из скриптов, описанных в этой статье, чтобы создать или обновить субъект-службу с правами на извлечение или отправку образов из реестра, добавьте сертификат с помощью команды az ad sp credential reset.
Чтобы использовать субъект-службу с сертификатом для входа в Azure CLI, сертификат должен быть в формате PEM и включать закрытый ключ. Если ваш сертификат не имеет нужного формата, используйте для его преобразования средство наподобие openssl
. При выполнении команды az login для входа в CLI с помощью субъекта-службы также укажите идентификатор приложения субъекта-службы и идентификатор арендатора Active Directory. В примере ниже эти значения показаны как переменные среды:
az login --service-principal --username $SP_APP_ID --tenant $SP_TENANT_ID --password /path/to/cert/pem/file
Затем запустите команду az acr login для проверки подлинности в реестре:
az acr login --name myregistry
Интерфейс командной строки использует маркер, созданный при выполнении команды az login
, для аутентификации вашего сеанса в реестре.
Создание субъекта-службы для межклиентских сценариев
Субъект-служба также может использоваться в сценариях Azure, требующих извлечения образов из реестра контейнеров в одном идентификаторе Microsoft Entra (клиенте) в службу или приложение в другом. Например, организация может запустить приложение в клиенте A, для которого необходимо извлекать образы из общего реестра контейнеров в клиенте B.
Чтобы создать субъект-службу, которая может выполнять проверку подлинности с помощью реестра контейнеров в межклиентском сценарии, выполните приведенные ниже действия.
- Создайте мультитенантное приложение (субъект-службу) в клиенте A.
- Подготовьте это приложение в клиенте B.
- Предоставьте субъекту-службы разрешения для извлечения образов из реестра в клиенте B.
- Обновите службу или приложение в клиенте A для обеспечения проверки подлинности с помощью нового субъекта-службы.
Пример с инструкциями см. в статье Извлечение образов из реестра контейнеров в кластер AKS в другом клиенте AD.
Возобновление действия субъекта-службы
Субъект-служба создается со сроком действия в один год. Вы можете продлить действие на срок более одного года или указать дату окончания срока действия с помощью команды az ad sp credential reset
.
Следующие шаги
Другие сценарии аутентификации в реестре контейнеров Azure см. в обзоре проверки подлинности.
Пример использования хранилища ключей Azure для сохранения и получения учетных данных субъекта-службы для реестра контейнеров см. в руководстве по созданию и развертыванию образа контейнера с помощью задач ACR.