使用 Azure 虛擬網路中的服務端點來限制對容器登錄的存取

Azure 虛擬網路會為 Azure 資源和內部部署資源提供安全的私人網路。 服務端點可讓您將容器登錄的公用 IP 位址侷限在您的虛擬網路內。 此端點會透過 Azure 骨幹網路,為流量提供前往資源的最佳路由。 虛擬網路和子網路的身分識別也會按照每個要求傳輸。

本文說明如何在虛擬網路中設定容器登錄服務端點 (預覽)。

每個登錄最多支援 100 個虛擬網路規則。

重要

Azure Container Registry 現在支援 Azure Private Link,可讓虛擬網路中的私人端點放在登錄上。 您可以使用私人 IP 位址,從虛擬網路內部存取私人端點。 在大部分的網路案例中,建議您使用私人端點而非服務端點。 容器登錄不支援啟用從虛擬網路設定的私人連結和服務端點功能。 因此,建議您執行清單,並視需要移除網路規則

您可以在進階容器登錄服務層級中設定登錄服務端點。 如需登錄服務層級和限制的相關資訊,請參閱 Azure Container Registry 服務層級

預覽限制

  • 目前並未規劃要在日後開發 Azure Container Registry 的服務端點。 建議您改為使用私用端點
  • 您無法使用 Azure 入口網站在登錄上設定服務端點。
  • 只有 Azure Kubernetes Service 叢集或 Azure 虛擬機器 可作為主機以使用服務端點來存取容器登錄。 不支援包括 Azure 容器執行個體在內的其他 Azure 服務。
  • Azure US Government 雲端或由 21Vianet 雲端營運的 Microsoft Azure 中不支援 Azure Container Registry 的服務端點。

重要

某些功能可能無法使用,或在容器登錄中需要進行更多設定,以限制對私人端點、選取的子網路或 IP 位址的存取。

  • 停用登錄的公用網路存取時,某些信任服務 (部分機器翻譯) 的登錄存取權 (包括Azure 資訊安全中心) 需要啟用網路設定才能略過網路規則。
  • 公用網路存取停用後,某些 Azure 服務的執行個體,包括 Azure DevOps Services 目前無法存取容器登錄。
  • Azure DevOps 受控代理程式目前不支援私人端點。 您必須使用對私人端點具有網路可見性的自我裝載式代理程式。
  • 如果登錄具有已核准的私人端點,且公用網路存取已停用,則無法使用 Azure 入口網站、Azure CLI 或其他工具來將存放庫和標籤列在虛擬網路外部。

必要條件

  • 若要使用本文中的 Azure CLI 步驟,您必須使用 Azure CLI 2.0.58 版或更新版本。 如果您需要安裝或升級,請參閱安裝 Azure CLI

  • 如果您還沒有容器登錄,請建立一個 (需要進階層級),然後推送範例映像,例如 Docker Hub 中的 hello-world。 例如,使用 Azure 入口網站Azure CLI 來建立登錄。

  • 若要使用不同 Azure 訂用帳戶中的服務端點來限制登錄存取,請在該訂用帳戶中註冊 Azure Container Registry 的資源提供者。 例如:

    az account set --subscription <Name or ID of subscription of virtual network>
    
    az provider register --namespace Microsoft.ContainerRegistry
    

建立啟用 Docker 的虛擬機器

為了測試目的,請使用已啟用 Docker 的 Ubuntu VM 來存取 Azure 容器登錄。 若要對登錄使用 Microsoft Entra 驗證,請在 VM 上安裝 Azure CLI。 如果您已有 Azure 虛擬機器,請略過此建立步驟。

您可以針對虛擬機器和容器登錄使用相同的資源群組。 此設定可簡化結尾的清理作業,但並非必要。 如果您選擇為虛擬機器和虛擬網路建立個別的資源群組,請執行 az group create。 下列範例假設您已為資源群組名稱和登錄位置設定環境變數:

az group create --name $RESOURCE_GROUP --location $REGISTRY_LOCATION

現在使用 az vm create 部署一個預設 Ubuntu Azure 虛擬機器。 下列範例會建立名為 myDockerVM 的 VM。

VM_NAME=myDockerVM

az vm create \
  --resource-group $RESOURCE_GROUP \
  --name $VM_NAME \
  --image Ubuntu2204 \
  --admin-username azureuser \
  --generate-ssh-keys

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

在 VM 上安裝 Docker

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

ssh azureuser@publicIpAddress

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

sudo apt-get update
sudo apt install docker.io -y

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

sudo docker run -it hello-world

輸出:

Hello from Docker!
This message shows that your installation appears to be working correctly.
[...]

安裝 Azure CLI

請遵循使用 apt 安裝 Azure CLI 中的步驟在您的 Ubuntu 虛擬機器上安裝 Azure CLI。 例如:

curl -sL https://aka.ms/InstallAzureCLIDeb | sudo bash

結束 SSH 連線。

設定登錄的網路存取

在本節中,請將容器登錄設定為允許從 Azure 虛擬網路中的子網路進行存取。 步驟是使用 Azure CLI 提供。

將服務端點新增至子網路

當您建立 VM 時,Azure 預設會在相同的資源群組中建立虛擬網路。 虛擬網路的名稱是以虛擬機器的名稱為基礎。 例如,如果您將虛擬機器命名為 myDockerVM,預設的虛擬網路名稱會是 myDockerVMVNET,子網路名為 myDockerVMSubnet。 使用 az network vnet list 命令來驗證此情況:

az network vnet list \
  --resource-group myResourceGroup \
  --query "[].{Name: name, Subnet: subnets[0].name}"

輸出:

[
  {
    "Name": "myDockerVMVNET",
    "Subnet": "myDockerVMSubnet"
  }
]

使用 az network vnet subnet update 命令將 Microsoft.ContainerRegistry 服務端點新增至您的子網路。 在下列命令中,替換為您的虛擬網路和子網路的名稱:

az network vnet subnet update \
  --name myDockerVMSubnet \
  --vnet-name myDockerVMVNET \
  --resource-group myResourceGroup \
  --service-endpoints Microsoft.ContainerRegistry

使用 az network vnet subnet show 命令來擷取子網路的資源識別碼。 稍後的步驟需要用到此識別碼來設定網路存取規則。

az network vnet subnet show \
  --name myDockerVMSubnet \
  --vnet-name myDockerVMVNET \
  --resource-group myResourceGroup \
  --query "id"
  --output tsv

輸出:

/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/myResourceGroup/providers/Microsoft.Network/virtualNetworks/myDockerVMVNET/subnets/myDockerVMSubnet

變更登錄的預設網路存取

根據預設,Azure 容器登錄允許從任何網路上的主機進行連線。 若要限制對所選網路的存取,請將預設動作變更為拒絕存取。 在下列 az acr update 命令中,以您的登錄名稱取代名稱:

az acr update --name myContainerRegistry --default-action Deny

將網路規則新增至登錄

使用 az acr network-rule add 命令,在登錄中新增可允許從 VM 子網路進行存取的網路規則。 在下列命令中,替換容器登錄的名稱和子網路的資源識別碼:

az acr network-rule add \
  --name mycontainerregistry \
  --subnet <subnet-resource-id>

確認對登錄的存取

等候幾分鐘讓設定更新之後,請確認 VM 可以存取容器登錄。 對 VM 建立 SSH 連線,並執行 az acr login 命令以登入您的登錄。

az acr login --name mycontainerregistry

您可以執行登錄作業 (例如執行 docker pull),以從登錄中提取範例映像。 替換為適用於您登錄的映像和標籤值,並在前面加上登錄登入伺服器名稱 (全部為小寫):

docker pull mycontainerregistry.azurecr.io/hello-world:v1

Docker 已成功將映像提取到 VM。

這個範例會示範您可以透過網路存取規則來存取私人容器登錄。 不過,無法從未設定網路存取規則的登入主機來存取登錄。 如果您嘗試使用 az acr login 命令或 docker login 命令從另一部主機登入,則輸出如下所示:

Error response from daemon: login attempt to https://xxxxxxx.azurecr.io/v2/ failed with status: 403 Forbidden

還原預設的登錄存取

若要將登錄還原為預設允許存取,請移除任何已設定的網路規則。 然後將預設動作設定為允許存取。

移除網路規則

若要查看已為登錄設定的網路規則清單,請執行下列 az acr network-rule list 命令:

az acr network-rule list --name mycontainerregistry 

針對已設定的每個規則,執行 az acr network-rule remove 命令將其移除。 例如:

# Remove a rule that allows access for a subnet. Substitute the subnet resource ID.

az acr network-rule remove \
  --name mycontainerregistry \
  --subnet /subscriptions/ \
  xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/myResourceGroup/providers/Microsoft.Network/virtualNetworks/myDockerVMVNET/subnets/myDockerVMSubnet

允許存取

在下列 az acr update 命令中,以您的登錄名稱取代名稱:

az acr update --name myContainerRegistry --default-action Allow

清除資源

如果您已在相同的資源群組中建立所有 Azure 資源,但不再需要這些資源,您可以使用單一 az group delete 命令,選擇性地刪除資源:

az group delete --name myResourceGroup

下一步