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


Аутентификация между реестрами с помощью задачи 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/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourcegroups/myResourceGroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myACRTasksId": {
        "clientId": "00001111-aaaa-2222-bbbb-3333cccc4444",
        "principalId": "aaaaaaaa-bbbb-cccc-1111-222222222222"
      }
[...]

Предоставьте полномочия на извлечение идентификатора из основного реестра.

В этом разделе описано, как предоставить управляемому удостоверению разрешения на извлечение данных из базового реестра mybaseregistry.

Используйте команду az acr show, чтобы получить идентификатор ресурса для базового реестра и сохранить его в переменной.

baseregID=$(az acr show --name mybaseregistry --query id --output tsv)

Используйте команду az role assignment create, чтобы назначить правильную роль удостоверению в базовом реестре. Это назначение роли предоставляет разрешения только на извлечение образов из реестра.

Правильная роль, используемая в назначении ролей, зависит от того, включен ли реестр ABAC или нет.

ROLE="Container Registry Repository Reader" # For ABAC-enabled registries. For non-ABAC registries, use AcrPull.
az role assignment create \
  --assignee $principalID \
  --scope $baseregID \
  --role "$ROLE"

Перейдите к разделу Добавление в задачу учетных данных целевого реестра.

Опция 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": "aaaaaaaa-bbbb-cccc-1111-222222222222",
    "tenantId": "aaaabbbb-0000-cccc-1111-dddd2222eeee",
    "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, чтобы назначить правильную роль удостоверению в базовом реестре. Это назначение роли предоставляет разрешения только на извлечение образов из реестра.

Правильная роль, используемая в назначении ролей, зависит от того, включен ли реестр ABAC или нет.

ROLE="Container Registry Repository Reader" # For ABAC-enabled registries. For non-ABAC registries, use AcrPull.
az role assignment create \
  --assignee $principalID \
  --scope $baseregID \
  --role "$ROLE"

Добавьте учетные данные целевого реестра в задачу

Теперь с помощью команды az acr task credential add разрешите задачам выполнять проверку подлинности в базовом реестре с использованием учетных данных удостоверения. Выполните команду в соответствии с типом управляемого удостоверения, активированного в рамках задачи. Если вы включили пользовательскую идентичность, передайте --use-identity с ID клиента этой идентичности. Если вы включили удостоверение, назначаемое системой, передайте --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

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