分享方式:


使用來自 Azure 容器執行個體的 Azure Container Registry 進行驗證

您可以使用 Microsoft Entra 服務主體,來提供 Azure Container Registry 中私人容器登錄的存取權。

在本文中,您將了解如何建立及設定 Microsoft Entra 服務主體,並使其具備您登錄的提取權限。 然後,您會使用服務主體進行驗證,來啟動 Azure 容器執行個體 (ACI) 中的容器,以從您的私人登錄中提取其映像。

何時使用服務主體

您應該在無周邊案例中從 ACI 使用服務主體進行驗證,例如,在以自動化或其他自動方式建立容器執行個體的應用程式或服務中。

例如,如果您有每晚都會執行的自動化指令碼,並建立一個以工作為基礎的容器執行個體來處理某些資料,它可以使用具有僅提取權限的服務主體來向登錄進行驗證。 您接著可以替換服務主體的認證,或完全撤銷其存取權,而不會影響其他服務和應用程式。

停用登錄管理使用者時,也應使用服務主體。

建立服務主體

若要建立具容器登錄存取權的服務主體,請在 Azure Cloud Shell 或本機的 Azure CLI 安裝中執行下列指令碼。 此指令碼會針對 Bash 殼層加以格式化。

執行指令碼之前,請使用容器登錄的名稱更新 ACR_NAME 變數。 此 SERVICE_PRINCIPAL_NAME 值在 Microsoft Entra 租用戶中必須是唯一的。 如果您收到「'http://acr-service-principal' already exists.」錯誤,請為服務主體指定不同的名稱。

(選擇性) 如果您要授與不同權限,則可以修改 az ad sp create-for-rbac 命令中的 --role 值。 如需角色的完整清單,請參閱 ACR 角色和權限 \(英文\)。

執行指令碼之後,請記下的服務主體的識別碼密碼。 一旦擁有其認證,便可以將您的應用程式和服務設定為以服務主體向您的容器登錄進行驗證。

#!/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"

使用現有的服務主體

若要授與現有服務主體登錄存取權,您必須為服務主體指派新的角色。 如同建立新的服務主體一樣,您可以授與提取、推送和提取,以及擁有者存取權等權限。

以下指令碼使用 az role assignment create 命令,以授與您在 SERVICE_PRINCIPAL_ID 變數中所指定的服務主體提取權限。 如果您要授與不同層級的存取權,請調整 --role 值。

#!/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

使用服務主體進行驗證

若要在 Azure 容器執行個體中使用服務主體來啟動容器,請針對 --registry-username 指定它的識別碼,並針對 --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>

注意

建議您在最新版的 Azure Cloud Shell 中執行命令。 設定 export MSYS_NO_PATHCONV=1 以便執行 on-perm bash 環境。

範例指令碼

您可以找到前述適用於 GitHub 上的 Azure CLI 的範例指令碼,以及適用於 Azure PowerShell 的版本:

下一步

下列文章包含運用服務主體與 ACR 的其他詳細資料: