Externe verificatie in een ACR-taak met behulp van een door Azure beheerde identiteit
In een ACR-taak kunt u een beheerde identiteit inschakelen voor Azure-resources. De taak kan de identiteit gebruiken om toegang te krijgen tot andere Azure-resources, zonder referenties op te geven of te beheren.
In dit artikel leert u hoe u een beheerde identiteit inschakelt in een taak die toegang heeft tot geheimen die zijn opgeslagen in een Azure-sleutelkluis.
Als u de Azure-resources wilt maken, moet u voor dit artikel azure CLI versie 2.0.68 of hoger uitvoeren. Voer az --version
uit om de versie te bekijken. Als u Azure CLI 2.0 wilt installeren of upgraden, raadpleegt u Azure CLI 2.0 installeren.
Overzicht van scenario
Met de voorbeeldtaak worden Docker Hub-referenties gelezen die zijn opgeslagen in een Azure-sleutelkluis. De referenties zijn voor een Docker Hub-account met schrijfmachtigingen (push) voor een privé-Docker Hub-opslagplaats. Als u de referenties wilt lezen, configureert u de taak met een beheerde identiteit en wijst u de juiste machtigingen eraan toe. De taak die is gekoppeld aan de identiteit bouwt een installatiekopieën en meldt zich aan bij Docker Hub om de installatiekopieën naar de privéopslagplaats te pushen.
In dit voorbeeld ziet u stappen met behulp van een door de gebruiker toegewezen of door het systeem toegewezen beheerde identiteit. Uw keuze voor identiteit is afhankelijk van de behoeften van uw organisatie.
In een praktijkscenario kan een bedrijf installatiekopieën publiceren naar een privéopslagplaats in Docker Hub als onderdeel van een buildproces.
Vereisten
U hebt een Azure-containerregister nodig waarin u de taak uitvoert. In dit artikel heeft dit register de naam myregistry. Vervang in latere stappen door uw eigen registernaam.
Als u nog geen Azure-containerregister hebt, raadpleegt u quickstart: Een privécontainerregister maken met behulp van de Azure CLI. U hoeft nog geen installatiekopieën naar het register te pushen.
U hebt ook een privéopslagplaats nodig in Docker Hub en een Docker Hub-account met machtigingen om naar de opslagplaats te schrijven. In dit voorbeeld heeft deze opslagplaats de naam hubuser/hubrepo.
Een sleutelkluis maken en geheimen opslaan
Als dat nodig is, maakt u eerst een resourcegroep met de naam myResourceGroup in de locatie eastus met de volgende opdracht az group create :
az group create --name myResourceGroup --location eastus
Gebruik de opdracht az keyvault create om een sleutelkluis te maken. Zorg ervoor dat u een unieke sleutelkluisnaam opgeeft.
az keyvault create --name mykeyvault --resource-group myResourceGroup --location eastus
Sla de vereiste Docker Hub-referenties op in de sleutelkluis met behulp van de opdracht az keyvault secret set . In deze opdrachten worden de waarden doorgegeven in omgevingsvariabelen:
# 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
In een praktijkscenario worden geheimen waarschijnlijk in een afzonderlijk proces ingesteld en onderhouden.
Taakstappen definiëren in YAML-bestand
De stappen voor deze voorbeeldtaak worden gedefinieerd in een YAML-bestand. Maak een bestand met de naam dockerhubtask.yaml
in een lokale werkmap en plak de volgende inhoud. Vervang de naam van de sleutelkluis in het bestand door de naam van uw sleutelkluis.
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
De taakstappen doen het volgende:
- Geheime referenties beheren voor verificatie met Docker Hub.
- Verifieer met Docker Hub door de geheimen door te geven aan de
docker login
opdracht. - Bouw een installatiekopieën met behulp van een Dockerfile-voorbeeld in de opslagplaats Azure-Samples/acr-tasks .
- Push de installatiekopieën naar de persoonlijke Docker Hub-opslagplaats.
Optie 1: Taak maken met door de gebruiker toegewezen identiteit
Met de stappen in deze sectie maakt u een taak en schakelt u een door de gebruiker toegewezen identiteit in. Als u in plaats daarvan een door het systeem toegewezen identiteit wilt inschakelen, raadpleegt u Optie 2: Taak maken met door het systeem toegewezen identiteit.
Een door de gebruiker toegewezen identiteit maken
Maak een identiteit met de naam myACRTasksId in uw abonnement met behulp van de opdracht az identity create . U kunt dezelfde resourcegroep gebruiken die u eerder hebt gebruikt om een containerregister of een ander register te maken.
az identity create \
--resource-group myResourceGroup \
--name myACRTasksId
Als u de door de gebruiker toegewezen identiteit in de volgende stappen wilt configureren, gebruikt u de opdracht az identity show om de resource-id, principal-id en client-id van de identiteit op te slaan in variabelen.
# 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)
Taak aanmaken
Maak de taak dockerhubtask door de volgende opdracht az acr task create uit te voeren. De taak wordt uitgevoerd zonder broncodecontext en de opdracht verwijst naar het bestand dockerhubtask.yaml
in de werkmap. De --assign-identity
parameter geeft de resource-id van de door de gebruiker toegewezen identiteit door.
az acr task create \
--name dockerhubtask \
--registry myregistry \
--context /dev/null \
--file dockerhubtask.yaml \
--assign-identity $resourceID
In de uitvoer van de opdracht wordt in de identity
sectie de identiteit van het type UserAssigned
weergegeven in de taak:
[...]
"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"
}
[...]
Identiteit toegang verlenen tot key vault
Voer de volgende opdracht az keyvault set-policy uit om een toegangsbeleid in te stellen voor de sleutelkluis. In het volgende voorbeeld kan de identiteit geheimen lezen uit de sleutelkluis.
az keyvault set-policy --name mykeyvault \
--resource-group myResourceGroup \
--object-id $principalID \
--secret-permissions get
Ga verder met het handmatig uitvoeren van de taak.
Optie 2: Taak maken met door het systeem toegewezen identiteit
Met de stappen in deze sectie maakt u een taak en schakelt u een door het systeem toegewezen identiteit in. Als u in plaats daarvan een door de gebruiker toegewezen identiteit wilt inschakelen, raadpleegt u Optie 1: Taak maken met door de gebruiker toegewezen identiteit.
Taak aanmaken
Maak de taak dockerhubtask door de volgende opdracht az acr task create uit te voeren. De taak wordt uitgevoerd zonder broncodecontext en de opdracht verwijst naar het bestand dockerhubtask.yaml
in de werkmap. Met --assign-identity
de parameter zonder waarde kan de door het systeem toegewezen identiteit voor de taak worden ingeschakeld.
az acr task create \
--name dockerhubtask \
--registry myregistry \
--context /dev/null \
--file dockerhubtask.yaml \
--assign-identity
In de uitvoer van de opdracht wordt in de identity
sectie een identiteit van het type SystemAssigned
weergegeven die in de taak is ingesteld. Dit principalId
is de principal-id van de taakidentiteit:
[...]
"identity": {
"principalId": "xxxxxxxx-2703-42f9-97d0-xxxxxxxxxxxx",
"tenantId": "xxxxxxxx-86f1-41af-91ab-xxxxxxxxxxxx",
"type": "SystemAssigned",
"userAssignedIdentities": null
},
"location": "eastus",
[...]
Gebruik de opdracht az acr task show om de principalId op te slaan in een variabele, om in latere opdrachten te gebruiken. Vervang de naam van uw taak en het register in de volgende opdracht:
principalID=$(az acr task show \
--name <task_name> --registry <registry_name> \
--query identity.principalId --output tsv)
Identiteit toegang verlenen tot key vault
Voer de volgende opdracht az keyvault set-policy uit om een toegangsbeleid in te stellen voor de sleutelkluis. In het volgende voorbeeld kan de identiteit geheimen lezen uit de sleutelkluis.
az keyvault set-policy --name mykeyvault \
--resource-group myResourceGroup \
--object-id $principalID \
--secret-permissions get
De taak handmatig uitvoeren
Als u wilt controleren of de taak waarin u een beheerde identiteit hebt ingeschakeld, correct wordt uitgevoerd, activeert u de taak handmatig met de opdracht az acr task run . De --set
parameter wordt gebruikt om de naam van de privéopslagplaats door te geven aan de taak. In dit voorbeeld is de naam van de tijdelijke aanduiding voor de opslagplaats hubuser/hubrepo.
az acr task run --name dockerhubtask --registry myregistry --set PrivateRepo=hubuser/hubrepo
Wanneer de taak wordt uitgevoerd, wordt in de uitvoer een geslaagde verificatie voor Docker Hub weergegeven en wordt de installatiekopie met succes naar de privéopslagplaats gepusht:
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
Als u wilt controleren of de installatiekopieën zijn gepusht, controleert u op de tag (cf24
in dit voorbeeld) in de privé-Docker Hub-opslagplaats.
Volgende stappen
- Meer informatie over het inschakelen van een beheerde identiteit in een ACR-taak.
- Zie de YAML-verwijzing voor ACR-taken