Проверка подлинности между реестрами с помощью задачи ACR с использованием удостоверения, управляемого Azure
В задаче ACR можно включить управляемое удостоверение для ресурсов Azure. В задаче это удостоверение будет использоваться для получения доступа к другим ресурсам Azure без необходимости предоставлять учетные данные или управлять ими.
Из этой статьи вы узнаете, как включить управляемое удостоверение в задаче для извлечения образа из реестра, отличающегося от того, который использовался для выполнения задачи.
Для создания ресурсов Azure с помощью инструкций из этой статьи требуется Azure CLI версии 2.0.68 или более поздней версии. Чтобы узнать версию, выполните команду az --version
. Если вам необходимо выполнить установку или обновление, см. статью Установка Azure CLI 2.0.
Обзор сценария
В примере задачи базовый образ извлекается из другого реестра контейнеров в Azure для создания и отправки образа приложения. Чтобы извлечь базовый образ, необходимо настроить задачу с использованием управляемого удостоверения и назначить соответствующие разрешения.
В этом примере описаны шаги, в которых используется управляемое удостоверение, назначаемое системой или пользователем. Выбор удостоверения зависит от требований организации.
В реальной ситуации у организации может быть набор базовых образов, который все команды разработчиков используют для создания приложений. Эти базовые образы хранятся в корпоративном реестре, и у каждой команды разработчиков есть только права на извлечение.
Необходимые компоненты
Для работы с этой статьей вам понадобится два реестра контейнеров Azure:
- Первый реестр используется для создания и выполнения задач ACR. В этой статье ему присвоено имя myregistry.
- Во втором реестре размещается базовый образ, используемый в задаче для создания образа. Имя второго реестра в этой статье — mybaseregistry.
На следующих шагах замените эти значения именами ваших реестров.
Если у вас еще нет необходимых реестров контейнеров Azure, см . краткое руководство. Создание частного реестра контейнеров с помощью Azure CLI. На этом этапе не нужно отправлять образы в реестр.
Подготовка базового реестра
В демонстрационных целях в качестве одноразовой операции выполните команду [az acr import][az-acr-import], чтобы импортировать общедоступный образ Node.js из Docker Hub в базовый реестр. На практике другая команда или процесс в организации могут поддерживать образы в базовом реестре.
az acr import --name mybaseregistry \
--source docker.io/library/node:15-alpine \
--image baseimages/node:15-alpine
Определение шагов задачи в файле YAML
В этом примере шаги для многоэтапной задачи определяются в файле YAML. Создайте файл с именем helloworldtask.yaml
в локальной рабочей папке и вставьте в него следующее содержимое. Измените значение REGISTRY_NAME
на этапе создания, указав имя сервера в базовом реестре.
version: v1.1.0
steps:
# Replace mybaseregistry with the name of your registry containing the base image
- build: -t $Registry/hello-world:$ID https://github.com/Azure-Samples/acr-build-helloworld-node.git#main -f Dockerfile-app --build-arg REGISTRY_NAME=mybaseregistry.azurecr.io
- push: ["$Registry/hello-world:$ID"]
Для создания образа используется файл Dockerfile-app
в репозитории Azure-Samples/acr-build-helloworld-node. --build-arg
ссылается на базовый реестр для извлечения базового образа. Созданный образ отправляется в реестр, используемый для выполнения задачи.
Вариант 1. Создание задачи с удостоверением, назначенным пользователем
В этом разделе описано, как создать задачу и включить удостоверение, назначаемое пользователем. Если вы хотите включить назначаемое системой удостоверение, см . вариант 2. Создание задачи с удостоверением, назначаемого системой.
Создание назначаемого пользователем удостоверения
Создайте в подписке удостоверение с именем myACRTasksId, используя команду az identity create. Вы можете использовать ту же группу ресурсов, которую указали ранее для создания реестра контейнеров, либо другую.
az identity create \
--resource-group myResourceGroup \
--name myACRTasksId
Чтобы настроить назначаемое пользователем удостоверение на следующих шагах, выполните команду az identity show для сохранения идентификаторов ресурса, субъекта и клиента удостоверения в переменных.
# Get resource ID of the user-assigned identity
resourceID=$(az identity show \
--resource-group myResourceGroup \
--name myACRTasksId \
--query id --output tsv)
# Get principal ID of the task's user-assigned identity
principalID=$(az identity show \
--resource-group myResourceGroup \
--name myACRTasksId \
--query principalId --output tsv)
# Get client ID of the user-assigned identity
clientID=$(az identity show \
--resource-group myResourceGroup \
--name myACRTasksId \
--query clientId --output tsv)
Создать задачу
Теперь создайте задачу helloworldtask, выполнив следующую команду az acr task create. Задача выполняется без контекста исходного кода, а команда ссылается на файл helloworldtask.yaml
в рабочей папке. Параметр --assign-identity
передает идентификатор ресурса для удостоверения, назначаемого пользователем.
az acr task create \
--registry myregistry \
--name helloworldtask \
--context /dev/null \
--file helloworldtask.yaml \
--assign-identity $resourceID
В выходных данных команды в разделе identity
показано, что в задаче задано удостоверение типа UserAssigned
:
[...]
"identity": {
"principalId": null,
"tenantId": null,
"type": "UserAssigned",
"userAssignedIdentities": {
"/subscriptions/xxxxxxxx-d12e-4760-9ab6-xxxxxxxxxxxx/resourcegroups/myResourceGroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myACRTasksId": {
"clientId": "xxxxxxxx-f17e-4768-bb4e-xxxxxxxxxxxx",
"principalId": "xxxxxxxx-1335-433d-bb6c-xxxxxxxxxxxx"
}
[...]
Предоставление удостоверению разрешений на извлечение данных из базового реестра
В этом разделе описано, как предоставить управляемому удостоверению разрешения на извлечение данных из базового реестра mybaseregistry.
Используйте команду az acr show, чтобы получить идентификатор ресурса для базового реестра и сохранить его в переменной.
baseregID=$(az acr show --name mybaseregistry --query id --output tsv)
Используйте команду az role assignment create, чтобы назначить удостоверению роль acrpull
для доступа к базовому реестру. Эта роль имеет разрешения только на извлечение образов из реестра.
az role assignment create \
--assignee $principalID \
--scope $baseregID \
--role acrpull
Перейдите к разделу Добавление учетных данных целевого реестра в задачу.
Вариант 2. Создание задачи с помощью удостоверения, назначаемого системой
В этом разделе описано, как создать задачу и включить удостоверение, назначаемое системой. Если вы хотите включить удостоверение, назначаемое пользователем, см . вариант 1. Создание задачи с удостоверением, назначаемое пользователем.
Создать задачу
Теперь создайте задачу helloworldtask, выполнив следующую команду az acr task create. Задача выполняется без контекста исходного кода, а команда ссылается на файл helloworldtask.yaml
в рабочей папке. Параметр --assign-identity
без значений включает удостоверение, назначаемое системой, в задаче.
az acr task create \
--registry myregistry \
--name helloworldtask \
--context /dev/null \
--file helloworldtask.yaml \
--assign-identity
В выходных данных команды в разделе identity
показано, что в задаче задано удостоверение типа SystemAssigned
. principalId
— это идентификатор субъекта для удостоверения задачи.
[...]
"identity": {
"principalId": "xxxxxxxx-2703-42f9-97d0-xxxxxxxxxxxx",
"tenantId": "xxxxxxxx-86f1-41af-91ab-xxxxxxxxxxxx",
"type": "SystemAssigned",
"userAssignedIdentities": null
},
"location": "eastus",
[...]
С помощью команды az acr task show сохраните principalId в переменной, что использовать это значение в следующих командах. Подставьте имя задачи и реестра в следующей команде:
principalID=$(az acr task show \
--name <task_name> --registry <registry_name> \
--query identity.principalId --output tsv)
Предоставление удостоверению разрешений на извлечение данных из базового реестра
В этом разделе описано, как предоставить управляемому удостоверению разрешения на извлечение данных из базового реестра mybaseregistry.
Используйте команду az acr show, чтобы получить идентификатор ресурса для базового реестра и сохранить его в переменной.
baseregID=$(az acr show --name mybaseregistry --query id --output tsv)
Используйте команду az role assignment create, чтобы назначить удостоверению роль acrpull
для доступа к базовому реестру. Эта роль имеет разрешения только на извлечение образов из реестра.
az role assignment create \
--assignee $principalID \
--scope $baseregID \
--role acrpull
Добавление учетных данных целевого реестра в задачу
Теперь с помощью команды az acr task credential add разрешите задачам выполнять проверку подлинности в базовом реестре с использованием учетных данных удостоверения. Выполните команду в соответствии с типом управляемого удостоверения, включенного в задаче. Если вы включили удостоверение, назначаемое пользователем, передайте --use-identity
с идентификатором клиента удостоверения. Если вы включили удостоверение, назначаемое системой, передайте --use-identity [system]
.
# Add credentials for user-assigned identity to the task
az acr task credential add \
--name helloworldtask \
--registry myregistry \
--login-server mybaseregistry.azurecr.io \
--use-identity $clientID
# Add credentials for system-assigned identity to the task
az acr task credential add \
--name helloworldtask \
--registry myregistry \
--login-server mybaseregistry.azurecr.io \
--use-identity [system]
Выполнение задачи вручную
Чтобы проверить, выполняется ли задача, в которой включено управляемое удостоверение, запустите ее вручную с помощью команды az acr task run.
az acr task run \
--name helloworldtask \
--registry myregistry
Если задача выполняется успешно, выходные данные будут выглядеть примерно так:
Queued a run with ID: cf10
Waiting for an agent...
2019/06/14 22:47:32 Using acb_vol_dbfbe232-fd76-4ca3-bd4a-687e84cb4ce2 as the home volume
2019/06/14 22:47:39 Creating Docker network: acb_default_network, driver: 'bridge'
2019/06/14 22:47:40 Successfully set up Docker network: acb_default_network
2019/06/14 22:47:40 Setting up Docker configuration...
2019/06/14 22:47:41 Successfully set up Docker configuration
2019/06/14 22:47:41 Logging in to registry: myregistry.azurecr.io
2019/06/14 22:47:42 Successfully logged into myregistry.azurecr.io
2019/06/14 22:47:42 Logging in to registry: mybaseregistry.azurecr.io
2019/06/14 22:47:43 Successfully logged into mybaseregistry.azurecr.io
2019/06/14 22:47:43 Executing step ID: acb_step_0. Timeout(sec): 600, Working directory: '', Network: 'acb_default_network'
2019/06/14 22:47:43 Scanning for dependencies...
2019/06/14 22:47:45 Successfully scanned dependencies
2019/06/14 22:47:45 Launching container with name: acb_step_0
Sending build context to Docker daemon 25.6kB
Step 1/6 : ARG REGISTRY_NAME
Step 2/6 : FROM ${REGISTRY_NAME}/baseimages/node:15-alpine
15-alpine: Pulling from baseimages/node
[...]
Successfully built 41b49a112663
Successfully tagged myregistry.azurecr.io/hello-world:cf10
2019/06/14 22:47:56 Successfully executed container: acb_step_0
2019/06/14 22:47:56 Executing step ID: acb_step_1. Timeout(sec): 600, Working directory: '', Network: 'acb_default_network'
2019/06/14 22:47:56 Pushing image: myregistry.azurecr.io/hello-world:cf10, attempt 1
The push refers to repository [myregistry.azurecr.io/hello-world]
[...]
2019/06/14 22:48:00 Step ID: acb_step_1 marked as successful (elapsed time in seconds: 2.517011)
2019/06/14 22:48:00 The following dependencies were found:
2019/06/14 22:48:00
- image:
registry: myregistry.azurecr.io
repository: hello-world
tag: cf10
digest: sha256:611cf6e3ae3cb99b23fadcd89fa144e18aa1b1c9171ad4a0da4b62b31b4e38d1
runtime-dependency:
registry: mybaseregistry.azurecr.io
repository: baseimages/node
tag: 15-alpine
digest: sha256:e8e92cffd464fce3be9a3eefd1b65dc9cbe2484da31c11e813a4effc6105c00f
git:
git-head-revision: 0f988779c97fe0bfc7f2f74b88531617f4421643
Run ID: cf10 was successful after 32s
Чтобы убедиться, что образ создан и успешно отправлен в myregistry, выполните команду az acr repository show-tags.
az acr repository show-tags --name myregistry --repository hello-world --output tsv
Пример результата:
cf10
Следующие шаги
- См. сведения о включении управляемого удостоверения в задаче ACR.
- См. статью Справка по задачам Реестра контейнеров Azure: YAML.