Uwierzytelnianie za pomocą usługi Azure Container Registry z usługi Azure Container Instances

Możesz użyć jednostki usługi Entra firmy Microsoft, aby zapewnić dostęp do prywatnych rejestrów kontenerów w usłudze Azure Container Registry.

Z tego artykułu dowiesz się, jak utworzyć i skonfigurować jednostkę usługi Microsoft Entra z uprawnieniami ściągnięcia do rejestru. Następnie uruchomisz kontener w usłudze Azure Container Instances (ACI), który ściąga jego obraz z rejestru prywatnego przy użyciu jednostki usługi do uwierzytelniania.

Kiedy należy używać jednostki usługi

Należy użyć jednostki usługi do uwierzytelniania z usługi ACI w scenariuszach bez użycia głowy, takich jak aplikacje lub usługi, które tworzą wystąpienia kontenerów w sposób zautomatyzowany lub w inny sposób nienadzorowany.

Jeśli na przykład masz zautomatyzowany skrypt, który działa w nocy i tworzy wystąpienie kontenera opartego na zadaniach do przetwarzania niektórych danych, może użyć jednostki usługi z uprawnieniami tylko do ściągania w celu uwierzytelniania w rejestrze. Następnie można obrócić poświadczenia jednostki usługi lub całkowicie odwołać jej dostęp bez wpływu na inne usługi i aplikacje.

Jednostki usługi powinny być również używane, gdy administrator rejestru jest wyłączony.

Tworzenie jednostki usługi

Aby utworzyć jednostkę usługi z dostępem do rejestru kontenerów, uruchom następujący skrypt w usłudze Azure Cloud Shell lub lokalnej instalacji interfejsu wiersza polecenia platformy Azure. Skrypt jest sformatowany dla powłoki Bash.

Przed uruchomieniem skryptu zaktualizuj zmienną ACR_NAME przy użyciu nazwy rejestru kontenerów. Wartość musi być unikatowa SERVICE_PRINCIPAL_NAME w dzierżawie firmy Microsoft Entra. Jeśli zostanie wyświetlony błąd "'http://acr-service-principal' already exists.", określ inną nazwę jednostki usługi.

Opcjonalnie możesz zmodyfikować --role wartość w poleceniu az ad sp create-for-rbac , jeśli chcesz udzielić różnych uprawnień. Aby uzyskać pełną listę ról, zobacz Role i uprawnienia usługi ACR.

Po uruchomieniu skryptu zanotuj identyfikator i hasło jednostki usługi. Po utworzeniu poświadczeń można skonfigurować aplikacje i usługi w celu uwierzytelniania w rejestrze kontenerów jako jednostki usługi.

#!/bin/bash
# This script requires Azure CLI version 2.25.0 or later. Check version with `az --version`.

# Modify for your environment.
# ACR_NAME: The name of your Azure Container Registry
# SERVICE_PRINCIPAL_NAME: Must be unique within your AD tenant
ACR_NAME=$containerRegistry
SERVICE_PRINCIPAL_NAME=$servicePrincipal

# Obtain the full registry ID
ACR_REGISTRY_ID=$(az acr show --name $ACR_NAME --query "id" --output tsv)
# echo $registryId

# Create the service principal with rights scoped to the registry.
# Default permissions are for docker pull access. Modify the '--role'
# argument value as desired:
# acrpull:     pull only
# acrpush:     push and pull
# owner:       push, pull, and assign roles
PASSWORD=$(az ad sp create-for-rbac --name $SERVICE_PRINCIPAL_NAME --scopes $ACR_REGISTRY_ID --role acrpull --query "password" --output tsv)
USER_NAME=$(az ad sp list --display-name $SERVICE_PRINCIPAL_NAME --query "[].appId" --output tsv)

# Output the service principal's credentials; use these in your services and
# applications to authenticate to the container registry.
echo "Service principal ID: $USER_NAME"
echo "Service principal password: $PASSWORD"

Korzystanie z istniejącej jednostki usługi

Aby udzielić dostępu rejestru do istniejącej jednostki usługi, musisz przypisać nową rolę do jednostki usługi. Podobnie jak w przypadku tworzenia nowej jednostki usługi, możesz udzielić między innymi dostępu do ściągania, wypychania i ściągania oraz właściciela.

Poniższy skrypt używa polecenia az role assignment create , aby udzielić uprawnień ściągnięcia do jednostki usługi określonej w zmiennej SERVICE_PRINCIPAL_ID . Dostosuj wartość, --role jeśli chcesz przyznać inny poziom dostępu.

#!/bin/bash
# Modify for your environment. The ACR_NAME is the name of your Azure Container
# Registry, and the SERVICE_PRINCIPAL_ID is the service principal's 'appId' or
# one of its 'servicePrincipalNames' values.
ACR_NAME=$containerRegistry
SERVICE_PRINCIPAL_ID=$servicePrincipal

# Populate value required for subsequent command args
ACR_REGISTRY_ID=$(az acr show --name $ACR_NAME --query id --output tsv)

# Assign the desired role to the service principal. Modify the '--role' argument
# value as desired:
# acrpull:     pull only
# acrpush:     push and pull
# owner:       push, pull, and assign roles
az role assignment create --assignee $SERVICE_PRINCIPAL_ID --scope $ACR_REGISTRY_ID --role acrpull

Uwierzytelnianie przy użyciu jednostki usługi

Aby uruchomić kontener w usłudze Azure Container Instances przy użyciu jednostki usługi, określ jego identyfikator i --registry-usernamehasło dla elementu --registry-password.

az container create \
    --resource-group myResourceGroup \
    --name mycontainer \
    --image mycontainerregistry.azurecr.io/myimage:v1 \
    --registry-login-server mycontainerregistry.azurecr.io \
    --registry-username <service-principal-ID> \
    --registry-password <service-principal-password>

Uwaga

Zalecamy uruchomienie poleceń w najnowszej wersji usługi Azure Cloud Shell. Ustaw export MSYS_NO_PATHCONV=1 dla uruchamiania lokalnego środowiska powłoki bash.

Przykładowe skrypty

Powyższe przykładowe skrypty dla interfejsu wiersza polecenia platformy Azure można znaleźć w witrynie GitHub, a także wersje programu Azure PowerShell:

Następne kroki

Następujące artykuły zawierają dodatkowe szczegóły dotyczące pracy z jednostkami usługi i usługą ACR: