Dela via


Autentisering mellan register i en ACR-uppgift med hjälp av en Azure-hanterad identitet

I en ACR-uppgift kan du aktivera en hanterad identitet för Azure-resurser. Uppgiften kan använda identiteten för att komma åt andra Azure-resurser utan att behöva ange eller hantera autentiseringsuppgifter.

I den här artikeln får du lära dig hur du aktiverar en hanterad identitet i en uppgift för att hämta en avbildning från ett register som skiljer sig från den som användes för att köra uppgiften.

För att skapa Azure-resurserna kräver den här artikeln att du kör Azure CLI version 2.0.68 eller senare. Kör az --version för att hitta versionen. Om du behöver installera eller uppgradera kan du läsa Installera Azure CLI.

Scenarioöversikt

Exempeluppgiften hämtar en basavbildning från ett annat Azure-containerregister för att skapa och push-överföra en programavbildning. Om du vill hämta basavbildningen konfigurerar du uppgiften med en hanterad identitet och tilldelar lämplig behörighet till den.

I det här exemplet visas steg med antingen en användartilldelad eller systemtilldelad hanterad identitet. Ditt val av identitet beror på organisationens behov.

I ett verkligt scenario kan en organisation underhålla en uppsättning basavbildningar som används av alla utvecklingsteam för att skapa sina program. Dessa basavbildningar lagras i ett företagsregister, där varje utvecklingsteam bara har pull-rättigheter.

Förutsättningar

I den här artikeln behöver du två Azure-containerregister:

  • Du använder det första registret för att skapa och köra ACR-uppgifter. I den här artikeln heter registret myregistry.
  • Det andra registret är värd för en basavbildning som används för uppgiften för att skapa en avbildning. I den här artikeln heter det andra registret mybaseregistry.

Ersätt med dina egna registernamn i senare steg.

Om du inte redan har de Azure-containerregister som behövs kan du läsa Snabbstart: Skapa ett privat containerregister med Hjälp av Azure CLI. Du behöver inte skicka avbildningar till registret än.

Förbereda basregister

I demonstrationssyfte kör du som en engångsåtgärd [az acr import][az-acr-import] för att importera en offentlig Node.js avbildning från Docker Hub till ditt basregister. I praktiken kan ett annat team eller en annan process i organisationen underhålla avbildningar i basregistret.

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

Definiera uppgiftssteg i YAML-filen

Stegen för det här exemplet definieras i en YAML-fil. Skapa en fil med namnet helloworldtask.yaml i din lokala arbetskatalog och klistra in följande innehåll. Uppdatera värdet REGISTRY_NAME för i byggsteget med servernamnet för basregistret.

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

Byggsteget Dockerfile-app använder filen i lagringsplatsen Azure-Samples/acr-build-helloworld-node för att skapa en avbildning. Refererar --build-arg till basregistret för att hämta basavbildningen. När avbildningen har skapats skickas den till registret som används för att köra uppgiften.

Alternativ 1: Skapa uppgift med användartilldelad identitet

Stegen i det här avsnittet skapar en uppgift och aktiverar en användartilldelad identitet. Om du vill aktivera en systemtilldelad identitet i stället kan du läsa Alternativ 2: Skapa uppgift med systemtilldelad identitet.

Skapa en användartilldelad identitet

Skapa en identitet med namnet myACRTasksId i din prenumeration med kommandot az identity create . Du kan använda samma resursgrupp som du använde tidigare för att skapa ett containerregister eller en annan.

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

Om du vill konfigurera den användartilldelade identiteten i följande steg använder du kommandot az identity show för att lagra identitetens resurs-ID, huvudnamns-ID och klient-ID i variabler.

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

Skapa uppgift

Skapa uppgiften helloworldtask genom att köra följande az acr task create-kommando. Uppgiften körs utan källkodskontext och kommandot refererar till filen helloworldtask.yaml i arbetskatalogen. Parametern --assign-identity skickar resurs-ID:t för den användartilldelade identiteten.

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

I kommandoutdata identity visar avsnittet identiteten för typen UserAssigned anges i uppgiften:

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

Ge identitetshämtningsbehörigheter till basregistret

I det här avsnittet ger du den hanterade identiteten behörighet att hämta från basregistret mybaseregistry.

Använd kommandot az acr show för att hämta resurs-ID:t för basregistret och lagra det i en variabel:

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

Använd kommandot az role assignment create för att tilldela identiteten acrpull rollen till basregistret. Den här rollen har endast behörighet att hämta avbildningar från registret.

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

Fortsätt till Lägg till autentiseringsuppgifter för målregistret i uppgiften.

Alternativ 2: Skapa uppgift med systemtilldelad identitet

Stegen i det här avsnittet skapar en uppgift och aktiverar en systemtilldelad identitet. Om du vill aktivera en användartilldelad identitet i stället kan du läsa Alternativ 1: Skapa uppgift med användartilldelad identitet.

Skapa uppgift

Skapa uppgiften helloworldtask genom att köra följande az acr task create-kommando. Uppgiften körs utan källkodskontext och kommandot refererar till filen helloworldtask.yaml i arbetskatalogen. Parametern --assign-identity utan värde aktiverar den systemtilldelade identiteten för aktiviteten.

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

I kommandoutdata identity visar avsnittet att en identitet av typen SystemAssigned har angetts i uppgiften. principalId är huvud-ID:t för uppgiftsidentiteten:

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

Använd kommandot az acr task show för att lagra principalId i en variabel som ska användas i senare kommandon. Ersätt namnet på uppgiften och registret i följande kommando:

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

Ge identitetshämtningsbehörigheter till basregistret

I det här avsnittet ger du den hanterade identiteten behörighet att hämta från basregistret mybaseregistry.

Använd kommandot az acr show för att hämta resurs-ID:t för basregistret och lagra det i en variabel:

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

Använd kommandot az role assignment create för att tilldela identiteten acrpull rollen till basregistret. Den här rollen har endast behörighet att hämta avbildningar från registret.

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

Lägga till autentiseringsuppgifter för målregister till uppgift

Använd nu kommandot az acr task credential add för att aktivera uppgiften för att autentisera med basregistret med identitetens autentiseringsuppgifter. Kör kommandot som motsvarar den typ av hanterad identitet som du aktiverade i aktiviteten. Om du har aktiverat en användartilldelad identitet skickar --use-identity du med identitetens klient-ID. Om du har aktiverat en systemtilldelad identitet skickar du --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]

Kör aktiviteten manuellt

Om du vill kontrollera att uppgiften där du har aktiverat en hanterad identitet körs korrekt utlöser du aktiviteten manuellt med kommandot az acr task run .

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

Om aktiviteten körs korrekt liknar utdata:

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

Kör kommandot az acr repository show-tags för att verifiera att avbildningen har skapats och överförts till myregistry:

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

Exempel på utdata>

cf10

Nästa steg