Uwierzytelnianie usługi Azure Container Registry za pomocą jednostek usługi

Możesz użyć jednostki usługi Microsoft Entra, aby zapewnić wypychanie, ściąganie lub inny dostęp do rejestru kontenerów. Za pomocą jednostki usługi można zapewnić dostęp do "bezgłowych" usług i aplikacji.

Co to jest jednostka usługi?

Jednostki usługi Microsoft Entra ID zapewniają dostęp do zasobów platformy Azure w ramach subskrypcji. Jednostkę usługi można traktować jako tożsamość użytkownika dla usługi, gdzie "usługa" to dowolna aplikacja, usługa lub platforma, która musi uzyskiwać dostęp do zasobów. Jednostkę usługi można skonfigurować z prawami dostępu określonymi tylko dla określonych zasobów. Następnie skonfiguruj aplikację lub usługę tak, aby korzystała z poświadczeń jednostki usługi w celu uzyskania dostępu do tych zasobów.

W kontekście usługi Azure Container Registry możesz utworzyć jednostkę usługi Microsoft Entra z uprawnieniami ściągania, wypychania i ściągania lub innych uprawnień do rejestru prywatnego na platformie Azure. Aby uzyskać pełną listę, zobacz Role i uprawnienia usługi Azure Container Registry.

Dlaczego warto używać jednostki usługi?

Korzystając z jednostki usługi Microsoft Entra, możesz zapewnić dostęp w zakresie do prywatnego rejestru kontenerów. Utwórz różne jednostki usługi dla każdej aplikacji lub usług, z których każda ma dostosowane prawa dostępu do rejestru. Ponadto, ponieważ można uniknąć udostępniania poświadczeń między usługami i aplikacjami, można obracać poświadczenia lub odwoływać dostęp tylko dla jednostki usługi (a tym samym wybranej aplikacji).

Na przykład skonfiguruj aplikację internetową tak, aby korzystała z jednostki usługi, która zapewnia jej dostęp tylko do obrazu pull , podczas gdy system kompilacji używa jednostki usługi, która zapewnia jej push zarówno dostęp, jak i pull . Jeśli programowanie aplikacji zmienia się ręcznie, możesz obrócić swoje poświadczenia jednostki usługi bez wpływu na system kompilacji.

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

Należy użyć jednostki usługi, aby zapewnić dostęp do rejestru w scenariuszach bezgłowych. Oznacza to, że aplikacja, usługa lub skrypt, który musi wypychać lub ściągać obrazy kontenerów w zautomatyzowany lub w inny sposób nienadzorowany. Na przykład:

  • Ściąganie: wdrażanie kontenerów z rejestru w systemach aranżacji, w tym Kubernetes, DC/OS i Docker Swarm. Możesz również ściągnąć z rejestrów kontenerów do powiązanych usług platformy Azure, takich jak App Service, Batch, Service Fabric i inne.

    Napiwek

    Jednostka usługi jest zalecana w kilku scenariuszach platformy Kubernetes w celu ściągania obrazów z rejestru kontenerów platformy Azure. Za pomocą usługi Azure Kubernetes Service (AKS) można również użyć zautomatyzowanego mechanizmu do uwierzytelniania w rejestrze docelowym, włączając tożsamość zarządzaną klastra.

    • Wypychanie: twórz obrazy kontenerów i wypychaj je do rejestru przy użyciu rozwiązań ciągłej integracji i wdrażania, takich jak Azure Pipelines lub Jenkins.

W przypadku indywidualnego dostępu do rejestru, takiego jak ręczne ściąganie obrazu kontenera na stację roboczą deweloperów, zalecamy użycie własnej tożsamości entra firmy Microsoft w celu uzyskania dostępu do rejestru (na przykład za pomocą polecenia az acr login).

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

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:

Uwierzytelnianie za pomocą jednostki usługi

Po uzyskaniu jednostki usługi, której udzielono dostępu do rejestru kontenerów, możesz skonfigurować jego poświadczenia pod kątem dostępu do "bezgłowych" usług i aplikacji lub wprowadzić je za pomocą docker login polecenia . Użyj następujących wartości:

  • Nazwa użytkownika — identyfikator aplikacji (klienta) jednostki usługi
  • Hasło — hasło jednostki usługi (klucz tajny klienta)

Wartość nazwa użytkownika ma format xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx.

Napiwek

Hasło (klucz tajny klienta) jednostki usługi można wygenerować ponownie, uruchamiając polecenie az ad sp credential reset .

Używanie poświadczeń z usługami platformy Azure

Możesz użyć poświadczeń jednostki usługi z dowolnej usługi platformy Azure, która uwierzytelnia się w rejestrze kontenerów platformy Azure. Użyj poświadczeń jednostki usługi zamiast poświadczeń administratora rejestru w różnych scenariuszach.

Używanie z logowaniem docker

Można uruchomić docker login przy użyciu jednostki usługi. W poniższym przykładzie identyfikator aplikacji jednostki usługi jest przekazywany w zmiennej środowiskowej $SP_APP_ID, a hasło w zmiennej $SP_PASSWD. Aby zapoznać się z zalecanymi rozwiązaniami dotyczącymi zarządzania poświadczeniami platformy Docker, zobacz dokumentację poleceń logowania platformy Docker.

# Log in to Docker with service principal credentials
docker login myregistry.azurecr.io --username $SP_APP_ID --password $SP_PASSWD

Po zalogowaniu platforma Docker buforuje poświadczenia.

Używanie z certyfikatem

Jeśli do jednostki usługi dodano certyfikat, możesz zalogować się do interfejsu wiersza polecenia platformy Azure przy użyciu uwierzytelniania opartego na certyfikatach, a następnie użyć polecenia az acr login , aby uzyskać dostęp do rejestru. Używanie certyfikatu jako wpisu tajnego zamiast hasła zapewnia dodatkowe zabezpieczenia podczas korzystania z interfejsu wiersza polecenia.

Certyfikat z podpisem własnym można utworzyć podczas tworzenia jednostki usługi. Możesz też dodać co najmniej jeden certyfikat do istniejącej jednostki usługi. Jeśli na przykład użyjesz jednego ze skryptów w tym artykule, aby utworzyć lub zaktualizować jednostkę usługi z uprawnieniami do ściągania lub wypychania obrazów z rejestru, dodaj certyfikat przy użyciu polecenia az ad sp credential reset .

Aby użyć jednostki usługi z certyfikatem w celu zalogowania się do interfejsu wiersza polecenia platformy Azure, certyfikat musi być w formacie PEM i dołączyć klucz prywatny. Jeśli certyfikat nie jest w wymaganym formacie, użyj narzędzia takiego jak openssl przekonwertować go. Po uruchomieniu polecenia az login w celu zalogowania się do interfejsu wiersza polecenia przy użyciu jednostki usługi podaj również identyfikator aplikacji jednostki usługi i identyfikator dzierżawy usługi Active Directory. Poniższy przykład przedstawia te wartości jako zmienne środowiskowe:

az login --service-principal --username $SP_APP_ID --tenant $SP_TENANT_ID  --password /path/to/cert/pem/file

Następnie uruchom polecenie az acr login , aby uwierzytelnić się w rejestrze:

az acr login --name myregistry

Interfejs wiersza polecenia używa tokenu utworzonego podczas uruchamiania az login w celu uwierzytelnienia sesji w rejestrze.

Tworzenie jednostki usługi dla scenariuszy między dzierżawami

Jednostka usługi może być również używana w scenariuszach platformy Azure, które wymagają ściągania obrazów z rejestru kontenerów w jednym identyfikatorze entra firmy Microsoft (dzierżawie) do usługi lub aplikacji w innej. Na przykład organizacja może uruchomić aplikację w dzierżawie A, która musi ściągnąć obraz z udostępnionego rejestru kontenerów w dzierżawie B.

Aby utworzyć jednostkę usługi, która może uwierzytelniać się w rejestrze kontenerów w scenariuszu między dzierżawami:

  • Tworzenie wielodostępnej aplikacji (jednostki usługi) w dzierżawie A
  • Aprowizuj aplikację w dzierżawie B
  • Udzielanie uprawnień jednostki usługi w celu ściągnięcia z rejestru w dzierżawie B
  • Aktualizowanie usługi lub aplikacji w dzierżawie A w celu uwierzytelnienia przy użyciu nowej jednostki usługi

Aby uzyskać przykładowe kroki, zobacz Ściąganie obrazów z rejestru kontenerów do klastra usługi AKS w innej dzierżawie usługi AD.

Odnawianie jednostki usługi

Jednostka usługi jest tworzona z roczną ważnością. Możesz rozszerzyć ważność dalej niż jeden rok lub podać wybraną datę wygaśnięcia za pomocą az ad sp credential reset polecenia .

Następne kroki