Registrierungsübergreifende Authentifizierung in einer ACR-Aufgabe unter Verwendung einer in Azure verwalteten Identität

In einer ACR-Aufgabe können Sie eine verwaltete Identität für Azure-Ressourcen aktivieren. In der Aufgabe kann die Identität für den Zugriff auf weitere Azure-Ressourcen verwendet werden, ohne dass Anmeldeinformationen angegeben oder verwaltet werden müssen.

In diesem Artikel erfahren Sie, wie Sie eine verwaltete Identität in einer Aufgabe aktivieren, um ein Image aus einer Registrierung zu pullen, bei der es sich nicht um die Registrierung handelt, die zum Ausführen der Aufgabe verwendet wird.

Um die in diesem Artikel verwendeten Azure-Ressourcen zu erstellen, müssen Sie mindestens Version 2.0.68 der Azure-Befehlszeilenschnittstelle (Azure CLI) ausführen. Führen Sie az --version aus, um die Version zu ermitteln. Informationen zum Durchführen einer Installation oder eines Upgrades finden Sie bei Bedarf unter Installieren der Azure CLI.

Übersicht über das Szenario

Die Beispielaufgabe pullt ein Basisimage aus einer anderen Azure-Containerregistrierung, um ein Anwendungsimage zu erstellen und zu pushen. Zum Pullen des Basisimages konfigurieren Sie die Aufgabe mit einer verwalteten Identität und weisen ihr entsprechende Berechtigungen zu.

In diesem Beispiel werden die Schritte unter Verwendung einer benutzerseitig zugewiesenen oder einer systemseitig zugewiesenen verwalteten Identität beschrieben. Die Wahl der Identität hängt von den Anforderungen Ihrer Organisation ab.

In der Praxis verfügt eine Organisation unter Umständen über eine Reihe von Basisimages, die von allen Entwicklungsteams für die Anwendungserstellung verwendet werden. Diese Basisimages werden in einer Unternehmensregistrierung gespeichert, und die einzelnen Entwicklungsteams verfügen jeweils nur über Pullberechtigungen.

Voraussetzungen

Für diesen Artikel benötigen Sie zwei Azure-Containerregistrierungen:

  • Sie verwenden die erste Registrierung zum Erstellen und Ausführen von ACR-Aufgaben. In diesem Artikel heißt diese Registrierung myregistry.
  • Die zweite Registrierung hostet ein Basisimage, das für die Aufgabe verwendet wird, um ein Image zu erstellen. In diesem Artikel heißt die zweite Registrierung mybaseregistry.

Ersetzen Sie in den weiteren Schritten diese Namen durch Ihre eigenen Registrierungsnamen.

Wenn Sie nicht bereits die erforderlichen Azure-Containerregistrierungen haben, siehe Schnellstart: Erstellen einer privaten Containerregistrierung mit der Azure CLI. Sie müssen noch keine Images in die Registrierung pushen.

Vorbereiten der Basisregistrierung

Führen Sie zu Demonstrationszwecken einmalig [az acr import][az-acr-import] aus, um ein öffentliches Node.js-Image von Docker Hub in Ihre Basisregistrierung zu importieren. In der Praxis können Images in der Basisregistrierung von einem anderen Team oder Prozess in der Organisation verwaltet werden.

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

Definieren von Aufgabenschritten in einer YAML-Datei

Die Schritte für diese exemplarische Aufgabe mit mehreren Schritten werden in einer YAML-Datei definiert. Erstellen Sie in Ihrem lokalen Arbeitsverzeichnis eine Datei namens helloworldtask.yaml, und fügen Sie Folgendes ein. Aktualisieren Sie im Buildschritt den Wert von REGISTRY_NAME mit dem Servernamen Ihrer Basisregistrierung.

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

Im Buildschritt wird die Datei Dockerfile-app im Repository Azure-Samples/acr-build-helloworld-node verwendet, um ein Image zu erstellen. --build-arg verweist auf die Basisregistrierung, aus der das Basisimage gepullt werden soll. Nach erfolgreicher Erstellung wird das Image an die Registrierung gepusht, die zum Ausführen der Aufgabe verwendet wird.

Option 1: Erstellen einer Aufgabe mit benutzerseitig zugewiesener Identität

Mit den Schritten in diesem Abschnitt wird eine Aufgabe erstellt und eine benutzerseitig zugewiesene Identität aktiviert. Wenn Sie stattdessen eine systemseitig zugewiesene Identität aktivieren möchten, navigieren Sie zu Option 2: Erstellen einer Aufgabe mit systemseitig zugewiesener Identität.

Erstellen einer benutzerseitig zugewiesenen Identität

Erstellen Sie mithilfe des Befehls az identity create eine Identität namens myACRTasksId in Ihrem Abonnement. Sie können entweder dieselbe Ressourcengruppe verwenden, die Sie zuvor zum Erstellen einer Containerregistrierung verwendet haben, oder Sie verwenden eine andere Ressourcengruppe.

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

Um die dem Benutzer zugewiesene Identität in den folgenden Schritten zu konfigurieren, verwenden Sie den Befehl az identity show, um die Ressourcen-ID, die Prinzipal-ID und die Client-ID der Identität in Variablen zu speichern.

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

Erstellen der Aufgabe

Führen Sie den folgenden Befehl vom Typ az acr task create aus, um die Aufgabe helloworldtask zu erstellen. Die Aufgabe läuft ohne Quellcode-Kontext, und der Befehl verweist auf die Datei helloworldtask.yaml im Arbeitsverzeichnis. Der Parameter --assign-identity übergibt die Ressourcen-ID der benutzerseitig zugewiesenen Identität.

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

In der Befehlsausgabe zeigt der Abschnitt identity an, dass die Identität vom Typ UserAssigned in der Aufgabe festgelegt ist:

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

Erteilen von Basisregistrierungs-Pullberechtigungen für die Identität

In diesem Abschnitt werden der verwalteten Identität Berechtigungen zum Pullen von Images aus der Basisregistrierung mybaseregistry erteilt.

Verwenden Sie den Befehl az acr show, um die Ressourcen-ID der Basisregistrierung abzurufen und in einer Variablen zu speichern:

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

Verwenden Sie den Befehl az role assignment create, um der Identität die Rolle acrpull für die Basisregistrierung zuzuweisen. Diese Rolle ist nur zum Pullen von Images aus der Registrierung berechtigt.

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

Fahren Sie fort mit Hinzufügen von Zielregistrierungs-Anmeldeinformationen zur Aufgabe.

Option 2: Erstellen einer Aufgabe mit systemseitig zugewiesener Identität

Mit den Schritten in diesem Abschnitt wird eine Aufgabe erstellt und eine systemseitig zugewiesene Identität aktiviert. Wenn Sie stattdessen eine benutzerseitig zugewiesene Identität aktivieren möchten, navigieren Sie zu Option 1: Erstellen einer Aufgabe mit benutzerseitig zugewiesener Identität.

Erstellen der Aufgabe

Führen Sie den folgenden Befehl vom Typ az acr task create aus, um die Aufgabe helloworldtask zu erstellen. Die Aufgabe läuft ohne Quellcode-Kontext, und der Befehl verweist auf die Datei helloworldtask.yaml im Arbeitsverzeichnis. Der Parameter --assign-identity ohne Wert aktiviert die systemseitig zugewiesene verwaltete Identität für die Aufgabe.

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

In der Befehlsausgabe zeigt der Abschnitt identity an, dass eine Identität vom Typ SystemAssigned in der Aufgabe festgelegt ist. Die principalId ist die Prinzipal-ID der Aufgabenidentität:

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

Verwenden Sie den Befehl az acr task show, um die PrinzipalId in einer Variablen zu speichern und in späteren Befehlen zu verwenden. Ersetzen Sie im folgenden Befehl den Namen Ihres Tasks und Ihrer Registrierung:

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

Erteilen von Basisregistrierungs-Pullberechtigungen für die Identität

In diesem Abschnitt werden der verwalteten Identität Berechtigungen zum Pullen von Images aus der Basisregistrierung mybaseregistry erteilt.

Verwenden Sie den Befehl az acr show, um die Ressourcen-ID der Basisregistrierung abzurufen und in einer Variablen zu speichern:

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

Verwenden Sie den Befehl az role assignment create, um der Identität die Rolle acrpull für die Basisregistrierung zuzuweisen. Diese Rolle ist nur zum Pullen von Images aus der Registrierung berechtigt.

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

Hinzufügen von Zielregistrierungs-Anmeldeinformationen zur Aufgabe

Verwenden Sie nun den Befehl az acr task credential add, um der Aufgabe zu ermöglichen, sich mithilfe der Anmeldeinformationen der Identität bei der Basisregistrierung zu authentifizieren. Führen Sie den passenden Befehl für die Art der verwalteten Identität aus, die Sie in der Aufgabe aktiviert haben. Wenn Sie eine benutzerseitig zugewiesene Identität aktiviert haben, übergeben Sie --use-identity mit der Client-ID der Identität. Wenn Sie eine systemseitig zugewiesene Identität aktiviert haben, übergeben Sie --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]

Manuelles Ausführen der Aufgabe

Um zu überprüfen, ob die Aufgabe, in der Sie eine verwaltete Identität aktiviert haben, erfolgreich ausgeführt wird, führen Sie die Aufgabe manuell mit dem Befehl az acr task run aus.

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

Bei erfolgreicher Ausführung sieht die Ausgabe in etwa wie folgt aus:

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

Führen Sie den Befehl az acr repository show-tags aus, um sich zu vergewissern, dass das erstellte Image erfolgreich an myregistry gepusht wurde:

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

Beispielausgabe:

cf10

Nächste Schritte

  • Weitere Informationen zum Aktivieren einer verwalteten Identität in einer ACR-Aufgabe finden Sie hier.
  • Die YAML-Referenz für ACR Tasks finden Sie hier.