共用方式為


使用 Azure 受控識別向 Azure 容器登錄進行驗證

使用 Azure 資源的受控識別 從另一個 Azure 資源向 Azure 容器登錄進行驗證,不需提供或管理登錄認證。 例如,在 Linux VM 上設定使用者指派或系統指派的受控識別來存取容器登錄中的容器映像,就像使用公用登錄一樣容易。 或者,設定 Azure Kubernetes Service 叢集,以使用其受控識別從用於 Pod 部署的 Azure Container Registry 提取容器映像。

您可以從本文了解受控識別,以及如何:

  • 在 Azure VM 中啟用使用者指派或系統指派的身分識別
  • 授與 Azure 容器登錄的身分識別存取權
  • 使用受控識別存取登錄及提取容器映像

若要建立 Azure,本文需要您執行 Azure CLI 2.0.55 版或更新版本。 執行 az --version 以尋找版本。 如果您需要安裝或升級,請參閱安裝 Azure CLI

若要設定容器登錄並將容器映像推送至登錄,您也必須在本機安裝 Docker。 Docker 提供可輕鬆在任何 macOSWindowsLinux 系統上設定 Docker 的套件。

為什麼要使用受控識別?

如果您不熟悉適用於 Azure 資源的受控識別功能,請參閱此概觀

以受控識別設定選取的 Azure 資源後,請為此受控識別提供對另一項資源的存取權,就像任何安全性主體一樣。 例如,指派一個角色給受控識別,該角色可具備 Azure 中私人登錄的提取、推送和提取,或其他權限。 (如需登錄角色的完整清單,請參閱 Azure Container Registry 角色和權限。)您可以提供對一或多個資源的身分識別存取權。

然後使用身分識別向任何支援 Microsoft Entra 驗證的服務 (部分機器翻譯) 進行驗證,不需要任何您程式碼中的認證。 請依據您的案例選擇如何使用受控識別進行驗證。 若要使用身分識別從虛擬機器存取 Azure 容器登錄,可以使用 Azure Resource Manager 驗證。

建立容器登錄

如果您還沒有 Azure 容器登錄,請建立登錄並將範例容器映像推送至該登錄。 請參閱快速入門:使用 Azure CLI 建立私人容器登錄來取得步驟。

本文假設您的登錄中已儲存 aci-helloworld:v1 容器映像。 範例中使用名為 myContainerRegistry 的登錄。 請在稍後的步驟中以您自己的登錄和映像名稱取代。

建立啟用 Docker 的 VM

建立啟用 Docker 的 Ubuntu 虛擬機器。 您也需要在虛擬機器上安裝 Azure CLI。 如果您已經有 Azure 虛擬機器,請略過此步驟以建立虛擬機器。

使用 az vm create 部署預設 Ubuntu Azure 虛擬機器。 下列範例會在名為 myResourceGroup 的現有資源群組中建立名為 myDockerVM 的 VM:

az vm create \
    --resource-group myResourceGroup \
    --name myDockerVM \
    --image Ubuntu2204 \
    --admin-username azureuser \
    --generate-ssh-keys

系統需要花幾分鐘的時間來建立 VM。 命令完成之後,請記下 Azure CLI 所顯示的 publicIpAddress。 請使用此位址與 VM 建立 SSH 連線。

在 VM 上安裝 Docker

若要在虛擬機器上執行 Docker 容器,您必須安裝 Docker。 本節提供在 Ubuntu VM 上安裝 Docker 的步驟,確保您的 VM 已準備好從 Azure Container Registry 提取和執行容器映像。

在 VM 執行之後,與 VM 建立 SSH 連線。 以您 VM 的公用 IP 位址取代 publicIpAddress

ssh azureuser@publicIpAddress

執行下列命令以在該 VM 上安裝 Docker:

sudo apt update
sudo apt install docker.io -y

安裝之後,執行下列命令確認 Docker 在 VM 上正常執行:

sudo docker run -it mcr.microsoft.com/hello-world
Hello from Docker!
This message shows that your installation appears to be working correctly.
[...]

安裝 Azure CLI

請遵循使用 apt 安裝 Azure CLI 中的步驟在您的 Ubuntu 虛擬機器上安裝 Azure CLI。 對於本文,請確定您安裝的是 2.0.55 版或更新版本。

結束 SSH 工作階段。

範例 1:使用使用者指派的身分識別進行存取

建立身分識別

使用 az identity create 命令,在您的訂用帳戶中建立身分識別。 您可以使用先前用來建立容器登錄或虛擬機器的同一個資源群組,或使用其他資源群組。

az identity create --resource-group myResourceGroup --name myACRId

若要在接下來的步驟中設定身分識別,請使用 az identity show 命令,以將身分識別的資源識別碼與服務主體識別碼儲存在變數中。

# Get resource ID of the user-assigned identity
userID=$(az identity show --resource-group myResourceGroup --name myACRId --query id --output tsv)

# Get service principal ID of the user-assigned identity
spID=$(az identity show --resource-group myResourceGroup --name myACRId --query principalId --output tsv)

因為您稍後在從虛擬機器登入 CLI 的步驟中需要身分識別識別碼,因此請顯示值:

echo $userID

識別碼的格式為:

/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxx/resourcegroups/myResourceGroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myACRId

使用身分識別設定 VM

下列 az vm identity assign 命令會使用使用者指派的身分識別設定您的 Docker VM:

az vm identity assign --resource-group myResourceGroup --name myDockerVM --identities $userID

授與容器登錄的身分識別存取權

現在請設定身分識別以存取容器登錄。 首先,使用 az acr show 命令取得登錄的資源識別碼:

resourceID=$(az acr show --resource-group myResourceGroup --name myContainerRegistry --query id --output tsv)

使用 az role assignment create 命令將 AcrPull 角色指派給身分識別。 此角色提供對登錄的 提取權限。 若要提供提取和推送權限,請指派 AcrPush 角色。

az role assignment create --assignee $spID --scope $resourceID --role acrpull

使用身分識別存取登錄

透過 SSH 連線到使用身分識別設定的 Docker 虛擬機器。 使用 VM 上安裝的 Azure CLI 執行下列 Azure CLI 命令。

首先,使用您在 VM 上設定的身分識別透過 az login 向 Azure CLI 驗證。 對於 <userID>,請取代為您在上一個步驟中擷取的身分識別的識別碼。

az login --identity --username <userID>

使用 az acr login 向登錄驗證。 使用此命令時,CLI 會使用您執行 az login 時建立的 Active Directory 權杖順暢地向容器登錄驗證您的工作階段。 (根據 VM 設定,您可能需要使用 sudo 執行此命令與 docker 命令。)

az acr login --name myContainerRegistry

您應該會看見 Login succeeded 訊息。 接著可以執行 docker 命令,不需要提供認證。 例如,執行 docker pull 以提取 aci-helloworld:v1 映像,指定您登錄的登入伺服器名稱。 登入伺服器名稱包含您的容器登錄名稱 (全部小寫),後面接著 .azurecr.io - 例如 mycontainerregistry.azurecr.io

docker pull mycontainerregistry.azurecr.io/aci-helloworld:v1

使用系統受控身分識別設定 VM

系統指派的受控識別是 Azure 的一項功能,可讓您的虛擬機器在 Azure Active Directory 中自動管理其自己的身分識別。 本節說明如何使用系統指派的身分識別來設定 VM,安全地存取您的 Azure Container Registry。

使用系統受控身分識別設定 VM

下列 az vm identity assign 命令會使用系統指派的身分識別設定您的 Docker VM:

az vm identity assign --resource-group myResourceGroup --name myDockerVM

使用 az vm show 命令將變數設定為 VM 身分識別 principalId (服務主體識別碼) 的值,以在稍後的步驟中使用。

spID=$(az vm show --resource-group myResourceGroup --name myDockerVM --query identity.principalId --out tsv)

授與容器登錄的身分識別存取權

現在請設定身分識別以存取容器登錄。 首先,使用 az acr show 命令取得登錄的資源識別碼:

resourceID=$(az acr show --resource-group myResourceGroup --name myContainerRegistry --query id --output tsv)

使用 az role assignment create 命令將 AcrPull 角色指派給身分識別。 此角色提供對登錄的 提取權限。 若要提供提取和推送權限,請指派 AcrPush 角色。

az role assignment create --assignee $spID --scope $resourceID --role acrpull

使用身分識別存取登錄

透過 SSH 連線到使用身分識別設定的 Docker 虛擬機器。 使用 VM 上安裝的 Azure CLI 執行下列 Azure CLI 命令。

首先,使用 VM 上系統指派的身分識別透過 az login 向 Azure CLI 驗證。

az login --identity

使用 az acr login 向登錄驗證。 使用此命令時,CLI 會使用您執行 az login 時建立的 Active Directory 權杖順暢地向容器登錄驗證您的工作階段。 (根據 VM 設定,您可能需要使用 sudo 執行此命令與 docker 命令。)

az acr login --name myContainerRegistry

您應該會看見 Login succeeded 訊息。 接著可以執行 docker 命令,不需要提供認證。 例如,執行 docker pull 以提取 aci-helloworld:v1 映像,指定您登錄的登入伺服器名稱。 登入伺服器名稱包含您的容器登錄名稱 (全部小寫),後面接著 .azurecr.io - 例如 mycontainerregistry.azurecr.io

docker pull mycontainerregistry.azurecr.io/aci-helloworld:v1

下一步

您已在本文中了解搭配 Azure 容器登錄使用受控識別的方式以及如何:

  • 在 Azure VM 中啟用使用者指派或系統指派的身分識別
  • 授與 Azure 容器登錄的身分識別存取權
  • 使用受控識別存取登錄及提取容器映像