Uwierzytelnianie między rejestrami w zadaniu usługi ACR przy użyciu tożsamości zarządzanej przez platformę Azure

W zadaniu usługi ACR można włączyć tożsamość zarządzaną dla zasobów platformy Azure. Zadanie może używać tożsamości do uzyskiwania dostępu do innych zasobów platformy Azure bez konieczności podawania poświadczeń ani zarządzania nimi.

Z tego artykułu dowiesz się, jak włączyć tożsamość zarządzaną w zadaniu w celu ściągnięcia obrazu z rejestru innego niż ta, która była używana do uruchamiania zadania.

Aby utworzyć zasoby platformy Azure, ten artykuł wymaga uruchomienia interfejsu wiersza polecenia platformy Azure w wersji 2.0.68 lub nowszej. Uruchom polecenie az --version, aby dowiedzieć się, jaka wersja jest używana. Jeśli konieczna będzie instalacja lub uaktualnienie, zobacz Instalowanie interfejsu wiersza polecenia platformy Azure.

Omówienie scenariusza

Przykładowe zadanie ściąga obraz podstawowy z innego rejestru kontenerów platformy Azure w celu skompilowania i wypchnięcia obrazu aplikacji. Aby ściągnąć obraz podstawowy, należy skonfigurować zadanie przy użyciu tożsamości zarządzanej i przypisać do niego odpowiednie uprawnienia.

W tym przykładzie przedstawiono kroki przy użyciu tożsamości zarządzanej przypisanej przez użytkownika lub przypisanej przez system. Wybór tożsamości zależy od potrzeb organizacji.

W rzeczywistym scenariuszu organizacja może obsługiwać zestaw obrazów podstawowych używanych przez wszystkie zespoły programistyczne do tworzenia aplikacji. Te obrazy podstawowe są przechowywane w rejestrze firmowym, a każdy zespół deweloperów ma tylko prawa ściągnięcia.

Wymagania wstępne

W tym artykule potrzebne są dwa rejestry kontenerów platformy Azure:

  • Pierwszy rejestr służy do tworzenia i wykonywania zadań usługi ACR. W tym artykule rejestr nosi nazwę myregistry.
  • Drugi rejestr hostuje obraz podstawowy używany do utworzenia obrazu. W tym artykule drugi rejestr nosi nazwę mybaseregistry.

Zastąp ciąg własnymi nazwami rejestru w kolejnych krokach.

Jeśli nie masz jeszcze wymaganych rejestrów kontenerów platformy Azure, zobacz Szybki start: tworzenie prywatnego rejestru kontenerów przy użyciu interfejsu wiersza polecenia platformy Azure. Nie musisz jeszcze wypychać obrazów do rejestru.

Przygotowywanie rejestru podstawowego

W celach demonstracyjnych uruchom polecenie [az acr import][az-acr-import], aby zaimportować publiczny obraz Node.js z Docker Hub do rejestru podstawowego. W praktyce inny zespół lub proces w organizacji może obsługiwać obrazy w rejestrze podstawowym.

az acr import --name mybaseregistry \
  --source docker.io/library/node:15-alpine \
  --image baseimages/node:15-alpine 

Definiowanie kroków zadania w pliku YAML

Kroki tego przykładowego zadania wieloetapowego są definiowane w pliku YAML. Utwórz plik o nazwie helloworldtask.yaml w lokalnym katalogu roboczym i wklej następującą zawartość. Zaktualizuj wartość w REGISTRY_NAME kroku kompilacji przy użyciu nazwy serwera rejestru podstawowego.

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"]

Krok kompilacji Dockerfile-app używa pliku w repozytorium Azure-Samples/acr-build-helloworld-node do utworzenia obrazu. Odwołanie --build-arg do rejestru podstawowego w celu ściągnięcia obrazu podstawowego. Po pomyślnym skompilowania obraz jest wypychany do rejestru używanego do uruchomienia zadania.

Opcja 1. Tworzenie zadania z tożsamością przypisaną przez użytkownika

Kroki opisane w tej sekcji umożliwiają utworzenie zadania i włączenie tożsamości przypisanej przez użytkownika. Jeśli zamiast tego chcesz włączyć tożsamość przypisaną przez system, zobacz Opcja 2: Tworzenie zadania z tożsamością przypisaną przez system.

Tworzenie tożsamości przypisanej przez użytkownika

Utwórz tożsamość o nazwie myACRTasksId w subskrypcji przy użyciu polecenia az identity create . Możesz użyć tej samej grupy zasobów, która była wcześniej używana do utworzenia rejestru kontenerów lub innej.

az identity create \
  --resource-group myResourceGroup \
  --name myACRTasksId

Aby skonfigurować tożsamość przypisaną przez użytkownika w poniższych krokach, użyj polecenia az identity show , aby zapisać identyfikator zasobu tożsamości, identyfikator podmiotu zabezpieczeń i identyfikator klienta w zmiennych.

# 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)

Tworzenie zadania

Utwórz zadanie helloworldtask , wykonując następujące polecenie az acr task create . Zadanie jest uruchamiane bez kontekstu kodu źródłowego, a polecenie odwołuje się do pliku helloworldtask.yaml w katalogu roboczym. Parametr --assign-identity przekazuje identyfikator zasobu tożsamości przypisanej przez użytkownika.

az acr task create \
  --registry myregistry \
  --name helloworldtask \
  --context /dev/null \
  --file helloworldtask.yaml \
  --assign-identity $resourceID

W danych wyjściowych identity polecenia w sekcji przedstawiono tożsamość typu UserAssigned ustawioną w zadaniu:

[...]
"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"
      }
[...]

Nadawanie tożsamości uprawnień ściągnięcia do rejestru podstawowego

W tej sekcji nadaj tożsamości zarządzanej uprawnienia do ściągania z rejestru podstawowego mybaseregistry.

Użyj polecenia az acr show , aby pobrać identyfikator zasobu rejestru podstawowego i zapisać go w zmiennej:

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

Użyj polecenia az role assignment create , aby przypisać tożsamość acrpull roli do rejestru podstawowego. Ta rola ma uprawnienia tylko do ściągania obrazów z rejestru.

az role assignment create \
  --assignee $principalID \
  --scope $baseregID \
  --role acrpull

Przejdź do zadania Dodawanie poświadczeń rejestru docelowego.

Opcja 2. Tworzenie zadania z tożsamością przypisaną przez system

Kroki opisane w tej sekcji umożliwiają utworzenie zadania i włączenie tożsamości przypisanej przez system. Jeśli zamiast tego chcesz włączyć tożsamość przypisaną przez użytkownika, zobacz Opcja 1: Tworzenie zadania z tożsamością przypisaną przez użytkownika.

Tworzenie zadania

Utwórz zadanie helloworldtask , wykonując następujące polecenie az acr task create . Zadanie jest uruchamiane bez kontekstu kodu źródłowego, a polecenie odwołuje się do pliku helloworldtask.yaml w katalogu roboczym. Parametr --assign-identity bez wartości włącza tożsamość przypisaną przez system w zadaniu.

az acr task create \
  --registry myregistry \
  --name helloworldtask \
  --context /dev/null \
  --file helloworldtask.yaml \
  --assign-identity 

W danych wyjściowych identity polecenia sekcja pokazuje tożsamość typu SystemAssigned jest ustawiona w zadaniu. Jest principalId to identyfikator podmiotu zabezpieczeń tożsamości zadania:

[...]
  "identity": {
    "principalId": "xxxxxxxx-2703-42f9-97d0-xxxxxxxxxxxx",
    "tenantId": "xxxxxxxx-86f1-41af-91ab-xxxxxxxxxxxx",
    "type": "SystemAssigned",
    "userAssignedIdentities": null
  },
  "location": "eastus",
[...]

Użyj polecenia az acr task show , aby przechowywać identyfikator principalId w zmiennej, aby użyć ich w późniejszych poleceniach. Zastąp nazwę zadania i rejestru następującym poleceniem:

principalID=$(az acr task show \
  --name <task_name> --registry <registry_name> \
  --query identity.principalId --output tsv)

Nadawanie tożsamości uprawnień ściągnięcia do rejestru podstawowego

W tej sekcji nadaj tożsamości zarządzanej uprawnienia do ściągania z rejestru podstawowego mybaseregistry.

Użyj polecenia az acr show , aby pobrać identyfikator zasobu rejestru podstawowego i zapisać go w zmiennej:

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

Użyj polecenia az role assignment create , aby przypisać tożsamość acrpull roli do rejestru podstawowego. Ta rola ma uprawnienia tylko do ściągania obrazów z rejestru.

az role assignment create \
  --assignee $principalID \
  --scope $baseregID \
  --role acrpull

Dodawanie poświadczeń rejestru docelowego do zadania

Teraz użyj polecenia az acr task credential add , aby umożliwić zadanie uwierzytelniania w rejestrze podstawowym przy użyciu poświadczeń tożsamości. Uruchom polecenie odpowiadające typowi tożsamości zarządzanej włączonej w zadaniu. Jeśli włączono tożsamość przypisaną przez użytkownika, przekaż --use-identity identyfikator klienta tożsamości. Jeśli włączono tożsamość przypisaną przez system, przekaż polecenie --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]

Ręczne uruchamianie zadania

Aby sprawdzić, czy zadanie, w którym włączono tożsamość zarządzaną, zostanie pomyślnie uruchomione, ręcznie wyzwól zadanie za pomocą polecenia az acr task run .

az acr task run \
  --name helloworldtask \
  --registry myregistry

Jeśli zadanie zostanie pomyślnie uruchomione, dane wyjściowe będą podobne do następujących:

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

Uruchom polecenie az acr repository show-tags , aby sprawdzić, czy obraz został skompilowany i pomyślnie wypchnięty do bazy danych myregistry:

az acr repository show-tags --name myregistry --repository hello-world --output tsv

Przykładowe dane wyjściowe:

cf10

Następne kroki