Ověřování napříč registry v úloze ACR s využitím spravované identity Azure

V úloze ACR můžete povolit spravovanou identitu pro prostředky Azure. Úloha může identitu použít pro přístup k dalším prostředkům Azure, aniž by potřebovala zadávat nebo spravovat přihlašovací údaje.

V tomto článku se dozvíte, jak povolit spravované identitě v úloze načtení image z registru, který se liší od registru použitého ke spuštění úlohy.

K vytvoření prostředků Azure tento článek vyžaduje, abyste spustili Azure CLI verze 2.0.68 nebo novější. Verzi zjistíte spuštěním příkazu az --version. Pokud potřebujete instalaci nebo upgrade, přečtěte si téma Instalace Azure CLI.

Přehled scénáře

Ukázková úloha načítá základní image z jiného registru kontejneru Azure, aby se sestavily a nasdílely image aplikace. Pokud chcete získat základní image, nakonfigurujete úlohu se spravovanou identitou a přiřadíte jí příslušná oprávnění.

Tento příklad ukazuje postup použití spravované identity přiřazené uživatelem nebo systémem. Vaše volba identity závisí na potřebách vaší organizace.

V reálném scénáři může organizace udržovat sadu základních imagí, které používají všechny vývojové týmy k vytváření svých aplikací. Tyto základní image jsou uložené v podnikovém registru, přičemž každý vývojový tým má pouze práva pro vyžádání obsahu.

Požadavky

Pro účely tohoto článku potřebujete dva registry kontejnerů Azure:

  • První registr použijete k vytvoření a spuštění úloh ACR. V tomto článku má tento registr název myregistry.
  • Druhý registr je hostitelem základní image, která se používá pro úlohu sestavení image. V tomto článku má druhý registr název mybaseregistry.

V pozdějších krocích nahraďte vlastními názvy registru.

Pokud ještě nemáte potřebné registry kontejnerů Azure, projděte si téma Rychlý start: Vytvoření privátního registru kontejnerů pomocí Azure CLI. Image do registru ještě nemusíte nasdílovat.

Příprava základního registru

Pro demonstrační účely jako jednorázovou operaci spusťte příkaz [az acr import][az-acr-import], který importuje image veřejného Node.js z Docker Hub do základního registru. V praxi může image v základním registru udržovat jiný tým nebo proces v organizaci.

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

Definování kroků úkolu v souboru YAML

Kroky pro tuto ukázkovou vícekrokovou úlohu jsou definovány v souboru YAML. V místním pracovním adresáři vytvořte soubor s názvem helloworldtask.yaml a vložte následující obsah. Aktualizujte hodnotu REGISTRY_NAME v kroku sestavení názvem serveru základního registru.

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 sestavení používá Dockerfile-app k sestavení image soubor v úložišti Azure-Samples/acr-build-helloworld-node . Odkazuje --build-arg na základní registr pro vyžádání základní image. Po úspěšném sestavení se image nasdílí do registru, který slouží ke spuštění úlohy.

Možnost 1: Vytvoření úlohy s identitou přiřazenou uživatelem

Kroky v této části vytvoří úlohu a povolí identitu přiřazenou uživatelem. Pokud místo toho chcete povolit identitu přiřazenou systémem, podívejte se na možnost 2: Vytvoření úlohy s identitou přiřazenou systémem.

Vytvoření identity přiřazené uživatelem

Ve svém předplatném vytvořte identitu myACRTasksId pomocí příkazu az identity create . Můžete použít stejnou skupinu prostředků, kterou jste použili dříve k vytvoření registru kontejneru, nebo jinou.

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

Pokud chcete nakonfigurovat identitu přiřazenou uživatelem v následujících krocích, pomocí příkazu az identity show uložte ID prostředku identity, ID objektu zabezpečení a ID klienta do proměnných.

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

Vytvořit úlohu

Vytvořte úlohu helloworldtask spuštěním následujícího příkazu az acr task create . Úloha běží bez kontextu zdrojového kódu a příkaz odkazuje na soubor helloworldtask.yaml v pracovním adresáři. Parametr --assign-identity předá ID prostředku identity přiřazené uživatelem.

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

Ve výstupu identity příkazu oddíl ukazuje, že je v úloze nastavená identita typu 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"
      }
[...]

Udělení oprávnění k vyžádání identity k základnímu registru

V této části udělte spravované identitě oprávnění k vyžádání ze základního registru mybaseregistry.

Pomocí příkazu az acr show získejte ID prostředku základního registru a uložte ho do proměnné:

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

Pomocí příkazu az role assignment create přiřaďte identitě acrpull roli k základnímu registru. Tato role má oprávnění pouze k načítání imagí z registru.

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

Přejděte k části Přidání přihlašovacích údajů cílového registru k úloze.

Možnost 2: Vytvoření úlohy s identitou přiřazenou systémem

Kroky v této části vytvoří úlohu a povolí identitu přiřazenou systémem. Pokud místo toho chcete povolit identitu přiřazenou uživatelem, podívejte se na možnost 1: Vytvoření úlohy s identitou přiřazenou uživatelem.

Vytvořit úlohu

Vytvořte úlohu helloworldtask spuštěním následujícího příkazu az acr task create . Úloha běží bez kontextu zdrojového kódu a příkaz odkazuje na soubor helloworldtask.yaml v pracovním adresáři. Parametr --assign-identity bez hodnoty umožňuje v úloze identitu přiřazenou systémem.

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

Ve výstupu identity příkazu oddíl ukazuje, že je v úloze nastavená identita typu SystemAssigned . Je principalId ID objektu zabezpečení identity úlohy:

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

Pomocí příkazu az acr task show uložte principalId do proměnné, abyste ho mohli použít v pozdějších příkazech. V následujícím příkazu nahraďte název úlohy a registru:

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

Udělení oprávnění k vyžádání identity k základnímu registru

V této části udělte spravované identitě oprávnění k vyžádání ze základního registru mybaseregistry.

Pomocí příkazu az acr show získejte ID prostředku základního registru a uložte ho do proměnné:

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

Pomocí příkazu az role assignment create přiřaďte identitě acrpull roli k základnímu registru. Tato role má oprávnění pouze k načítání imagí z registru.

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

Přidání přihlašovacích údajů cílového registru k úloze

Teď pomocí příkazu az acr task credential add povolte, aby se úloha ověřila v základním registru pomocí přihlašovacích údajů identity. Spusťte příkaz odpovídající typu spravované identity, kterou jste v úloze povolili. Pokud jste povolili identitu přiřazenou uživatelem, předejte --use-identity id klienta identity. Pokud jste povolili identitu přiřazenou systémem, předejte --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]

Ruční spuštění úlohy

Pokud chcete ověřit, jestli se úloha, ve které jste povolili spravovanou identitu, úspěšně spustila, aktivujte ji ručně pomocí příkazu az acr task run .

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

Pokud se úloha úspěšně spustí, výstup bude vypadat přibližně takto:

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

Spuštěním příkazu az acr repository show-tags ověřte, že se image vytvořila a úspěšně odeslala do myregistry:

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

Příklad výstupu:

cf10

Další kroky