Extern autentisering 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 som har åtkomst till hemligheter som lagras i ett Azure-nyckelvalv.
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 läser Docker Hub-autentiseringsuppgifter som lagras i ett Azure-nyckelvalv. Autentiseringsuppgifterna gäller för ett Docker Hub-konto med skrivbehörighet (push) till en privat Docker Hub-lagringsplats. Om du vill läsa autentiseringsuppgifterna konfigurerar du uppgiften med en hanterad identitet och tilldelar den lämpliga behörigheter. Uppgiften som är associerad med identiteten skapar en avbildning och loggar in på Docker Hub för att skicka avbildningen till den privata lagringsplatsen.
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 ett företag publicera avbildningar till en privat lagringsplats i Docker Hub som en del av en byggprocess.
Förutsättningar
Du behöver ett Azure-containerregister där du kör uppgiften. I den här artikeln heter registret myregistry. Ersätt med ditt eget registernamn i senare steg.
Om du inte redan har ett Azure-containerregister kan du läsa Snabbstart: Skapa ett privat containerregister med Hjälp av Azure CLI. Du behöver inte skicka avbildningar till registret än.
Du behöver också en privat lagringsplats i Docker Hub och ett Docker Hub-konto med behörighet att skriva till lagringsplatsen. I det här exemplet heter den här lagringsplatsen hubuser/hubrepo.
Skapa ett nyckelvalv och lagra hemligheter
Om du behöver det skapar du först en resursgrupp med namnet myResourceGroup på platsen eastus med följande kommando az group create:
az group create --name myResourceGroup --location eastus
Använd kommandot az keyvault create för att skapa ett nyckelvalv. Se till att ange ett unikt nyckelvalvnamn.
az keyvault create --name mykeyvault --resource-group myResourceGroup --location eastus
Lagra nödvändiga Docker Hub-autentiseringsuppgifter i nyckelvalvet med kommandot az keyvault secret set . I dessa kommandon skickas värdena i miljövariabler:
# Store Docker Hub user name
az keyvault secret set \
--name UserName \
--value $USERNAME \
--vault-name mykeyvault
# Store Docker Hub password
az keyvault secret set \
--name Password \
--value $PASSWORD \
--vault-name mykeyvault
I ett verkligt scenario skulle hemligheter sannolikt anges och underhållas i en separat process.
Definiera uppgiftssteg i YAML-filen
Stegen för den här exempeluppgiften definieras i en YAML-fil. Skapa en fil med namnet dockerhubtask.yaml
i en lokal arbetskatalog och klistra in följande innehåll. Ersätt nyckelvalvets namn i filen med namnet på ditt nyckelvalv.
version: v1.1.0
# Replace mykeyvault with the name of your key vault
secrets:
- id: username
keyvault: https://mykeyvault.vault.azure.net/secrets/UserName
- id: password
keyvault: https://mykeyvault.vault.azure.net/secrets/Password
steps:
# Log in to Docker Hub
- cmd: bash echo '{{.Secrets.password}}' | docker login --username '{{.Secrets.username}}' --password-stdin
# Build image
- build: -t {{.Values.PrivateRepo}}:$ID https://github.com/Azure-Samples/acr-tasks.git -f hello-world.dockerfile
# Push image to private repo in Docker Hub
- push:
- {{.Values.PrivateRepo}}:$ID
Uppgiftsstegen gör följande:
- Hantera hemliga autentiseringsuppgifter för att autentisera med Docker Hub.
- Autentisera med Docker Hub genom att skicka hemligheterna
docker login
till kommandot. - Skapa en avbildning med hjälp av en Dockerfile-exempel på lagringsplatsen Azure-Samples/acr-tasks .
- Skicka avbildningen till den privata Docker Hub-lagringsplatsen.
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 dockerhubtask genom att köra följande az acr task create-kommando. Uppgiften körs utan källkodskontext och kommandot refererar till filen dockerhubtask.yaml
i arbetskatalogen. Parametern --assign-identity
skickar resurs-ID:t för den användartilldelade identiteten.
az acr task create \
--name dockerhubtask \
--registry myregistry \
--context /dev/null \
--file dockerhubtask.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"
}
[...]
Bevilja identitetsåtkomst till nyckelvalv
Kör följande az keyvault set-policy-kommando för att ange en åtkomstprincip i nyckelvalvet. I följande exempel kan identiteten läsa hemligheter från nyckelvalvet.
az keyvault set-policy --name mykeyvault \
--resource-group myResourceGroup \
--object-id $principalID \
--secret-permissions get
Kör aktiviteten manuellt.
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 dockerhubtask genom att köra följande az acr task create-kommando. Uppgiften körs utan källkodskontext och kommandot refererar till filen dockerhubtask.yaml
i arbetskatalogen. Parametern --assign-identity
utan värde aktiverar den systemtilldelade identiteten för aktiviteten.
az acr task create \
--name dockerhubtask \
--registry myregistry \
--context /dev/null \
--file dockerhubtask.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)
Bevilja identitetsåtkomst till nyckelvalv
Kör följande az keyvault set-policy-kommando för att ange en åtkomstprincip i nyckelvalvet. I följande exempel kan identiteten läsa hemligheter från nyckelvalvet.
az keyvault set-policy --name mykeyvault \
--resource-group myResourceGroup \
--object-id $principalID \
--secret-permissions get
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 . Parametern --set
används för att skicka det privata lagringsplatsens namn till uppgiften. I det här exemplet är platshållarplatsens lagringsplats namnet hubuser/hubrepo.
az acr task run --name dockerhubtask --registry myregistry --set PrivateRepo=hubuser/hubrepo
När aktiviteten körs visar utdata lyckad autentisering till Docker Hub, och avbildningen har skapats och push-överförts till den privata lagringsplatsen:
Queued a run with ID: cf24
Waiting for an agent...
2019/06/20 18:05:55 Using acb_vol_b1edae11-30de-4f2b-a9c7-7d743e811101 as the home volume
2019/06/20 18:05:58 Creating Docker network: acb_default_network, driver: 'bridge'
2019/06/20 18:05:58 Successfully set up Docker network: acb_default_network
2019/06/20 18:05:58 Setting up Docker configuration...
2019/06/20 18:05:59 Successfully set up Docker configuration
2019/06/20 18:05:59 Logging in to registry: myregistry.azurecr.io
2019/06/20 18:06:00 Successfully logged into myregistry.azurecr.io
2019/06/20 18:06:00 Executing step ID: acb_step_0. Timeout(sec): 600, Working directory: '', Network: 'acb_default_network'
2019/06/20 18:06:00 Launching container with name: acb_step_0
[...]
Login Succeeded
2019/06/20 18:06:02 Successfully executed container: acb_step_0
2019/06/20 18:06:02 Executing step ID: acb_step_1. Timeout(sec): 600, Working directory: '', Network: 'acb_default_network'
2019/06/20 18:06:02 Scanning for dependencies...
2019/06/20 18:06:04 Successfully scanned dependencies
2019/06/20 18:06:04 Launching container with name: acb_step_1
Sending build context to Docker daemon 129kB
[...]
2019/06/20 18:06:07 Successfully pushed image: hubuser/hubrepo:cf24
2019/06/20 18:06:07 Step ID: acb_step_0 marked as successful (elapsed time in seconds: 2.064353)
2019/06/20 18:06:07 Step ID: acb_step_1 marked as successful (elapsed time in seconds: 2.594061)
2019/06/20 18:06:07 Populating digests for step ID: acb_step_1...
2019/06/20 18:06:09 Successfully populated digests for step ID: acb_step_1
2019/06/20 18:06:09 Step ID: acb_step_2 marked as successful (elapsed time in seconds: 2.743923)
2019/06/20 18:06:09 The following dependencies were found:
2019/06/20 18:06:09
- image:
registry: registry.hub.docker.com
repository: hubuser/hubrepo
tag: cf24
digest: sha256:92c7f9c92844bbbb5d0a101b22f7c2a7949e40f8ea90c8b3bc396879d95e899a
runtime-dependency:
registry: registry.hub.docker.com
repository: library/hello-world
tag: latest
digest: sha256:0e11c388b664df8a27a901dce21eb89f11d8292f7fca1b3e3c4321bf7897bffe
git:
git-head-revision: b0ffa6043dd893a4c75644c5fed384c82ebb5f9e
Run ID: cf24 was successful after 15s
Kontrollera att avbildningen har push-överförts genom att söka efter taggen (cf24
i det här exemplet) på den privata Docker Hub-lagringsplatsen.
Nästa steg
- Läs mer om att aktivera en hanterad identitet i en ACR-uppgift.
- Se YAML-referensen för ACR Tasks