Ograniczanie dostępu do rejestru kontenerów przy użyciu punktu końcowego usługi w sieci wirtualnej platformy Azure

Usługa Azure Virtual Network zapewnia bezpieczną sieć prywatną dla zasobów platformy Azure i zasobów lokalnych. Punkt końcowy usługi umożliwia zabezpieczenie publicznego adresu IP rejestru kontenerów tylko w sieci wirtualnej. Ten punkt końcowy zapewnia optymalną trasę do zasobu za pośrednictwem sieci szkieletowej platformy Azure. Tożsamości sieci wirtualnej i podsieci są również przesyłane z każdym żądaniem.

W tym artykule pokazano, jak skonfigurować punkt końcowy usługi rejestru kontenerów (wersja zapoznawcza) w sieci wirtualnej.

Każdy rejestr obsługuje maksymalnie 100 reguł sieci wirtualnej.

Ważne

Usługa Azure Container Registry obsługuje teraz usługę Azure Private Link, umożliwiając umieszczanie prywatnych punktów końcowych z sieci wirtualnej w rejestrze. Prywatne punkty końcowe są dostępne z sieci wirtualnej przy użyciu prywatnych adresów IP. W większości scenariuszy sieci zaleca się używanie prywatnych punktów końcowych zamiast punktów końcowych usługi. Rejestr kontenerów nie obsługuje włączania zarówno funkcji łącza prywatnego, jak i punktu końcowego usługi skonfigurowanych z sieci wirtualnej. Dlatego zalecamy uruchomienie listy i usunięcie reguł sieci zgodnie z potrzebami.

Konfigurowanie punktu końcowego usługi rejestru jest dostępne w warstwie usługi Rejestru kontenerów Premium . Aby uzyskać informacje o warstwach i limitach usługi rejestru, zobacz Azure Container Registry service tiers (Warstwy usługi Azure Container Registry).

Ograniczenia wersji zapoznawczej

  • Przyszłe opracowywanie punktów końcowych usługi dla usługi Azure Container Registry nie jest obecnie planowane. Zalecamy zamiast tego używanie prywatnych punktów końcowych .
  • Nie można użyć witryny Azure Portal do skonfigurowania punktów końcowych usługi w rejestrze.
  • Jako host można używać tylko klastra usługi Azure Kubernetes Service lub maszyny wirtualnej platformy Azure do uzyskiwania dostępu do rejestru kontenerów przy użyciu punktu końcowego usługi. Inne usługi platformy Azure, w tym Azure Container Instances, nie są obsługiwane.
  • Punkty końcowe usługi dla usługi Azure Container Registry nie są obsługiwane w chmurze Azure US Government ani platformie Microsoft Azure obsługiwanej przez chmurę 21Vianet.

Ważne

Niektóre funkcje mogą być niedostępne lub wymagają większej liczby konfiguracji w rejestrze kontenerów, który ogranicza dostęp do prywatnych punktów końcowych, wybranych podsieci lub adresów IP.

  • Gdy dostęp do sieci publicznej do rejestru jest wyłączony, dostęp do rejestru przez niektóre zaufane usługi , w tym Azure Security Center, wymaga włączenia ustawienia sieci w celu obejścia reguł sieciowych.
  • Po wyłączeniu dostępu do sieci publicznej wystąpienia niektórych usług platformy Azure, w tym usług Azure DevOps Services, nie są obecnie w stanie uzyskać dostępu do rejestru kontenerów.
  • Prywatne punkty końcowe nie są obecnie obsługiwane przez agentów zarządzanych usługi Azure DevOps. Musisz użyć własnego agenta z widokiem sieciowym do prywatnego punktu końcowego.
  • Jeśli rejestr ma zatwierdzony prywatny punkt końcowy, a dostęp do sieci publicznej jest wyłączony, repozytoria i tagi nie mogą być wyświetlane poza siecią wirtualną przy użyciu witryny Azure Portal, interfejsu wiersza polecenia platformy Azure lub innych narzędzi.

Wymagania wstępne

  • Aby użyć kroków interfejsu wiersza polecenia platformy Azure w tym artykule, wymagany jest interfejs wiersza polecenia platformy Azure w wersji 2.0.58 lub nowszej. Jeśli konieczna będzie instalacja lub uaktualnienie, zobacz Instalowanie interfejsu wiersza polecenia platformy Azure.

  • Jeśli jeszcze nie masz rejestru kontenerów, utwórz jeden (wymagana warstwa Premium) i wypchnij przykładowy obraz, taki jak hello-world z usługi Docker Hub. Na przykład użyj witryny Azure Portal lub interfejsu wiersza polecenia platformy Azure, aby utworzyć rejestr.

  • Jeśli chcesz ograniczyć dostęp do rejestru przy użyciu punktu końcowego usługi w innej subskrypcji platformy Azure, zarejestruj dostawcę zasobów dla usługi Azure Container Registry w tej subskrypcji. Przykład:

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

Tworzenie maszyny wirtualnej z obsługą platformy Docker

Do celów testowych użyj maszyny wirtualnej z systemem Ubuntu z obsługą platformy Docker, aby uzyskać dostęp do rejestru kontenerów platformy Azure. Aby użyć uwierzytelniania microsoft Entra do rejestru, zainstaluj również interfejs wiersza polecenia platformy Azure na maszynie wirtualnej. Jeśli masz już maszynę wirtualną platformy Azure, pomiń ten krok tworzenia.

Możesz użyć tej samej grupy zasobów dla maszyny wirtualnej i rejestru kontenerów. Ta konfiguracja upraszcza czyszczenie na końcu, ale nie jest wymagane. Jeśli zdecydujesz się utworzyć oddzielną grupę zasobów dla maszyny wirtualnej i sieci wirtualnej, uruchom polecenie az group create. W poniższym przykładzie przyjęto założenie, że ustawiono zmienne środowiskowe dla nazwy grupy zasobów i lokalizacji rejestru:

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

Teraz wdróż domyślną maszynę wirtualną z systemem Ubuntu Azure za pomocą polecenia az vm create. Poniższy przykład tworzy maszynę wirtualną o nazwie myDockerVM.

VM_NAME=myDockerVM

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

Utworzenie maszyny wirtualnej może potrwać kilka minut. Po zakończeniu wykonywania polecenia zanotuj publicIpAddress wartość wyświetlaną przez interfejs wiersza polecenia platformy Azure. Użyj tego adresu, aby nawiązać połączenia SSH z maszyną wirtualną.

Instalowanie platformy Docker na maszynie wirtualnej

Po uruchomieniu maszyny wirtualnej utwórz połączenie SSH z maszyną wirtualną. Zastąp ciąg publicIpAddress publicznym adresem IP maszyny wirtualnej.

ssh azureuser@publicIpAddress

Uruchom następujące polecenia, aby zainstalować platformę Docker na maszynie wirtualnej z systemem Ubuntu:

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

Po zakończeniu instalacji uruchom następujące polecenie, aby sprawdzić, czy platforma Docker działa prawidłowo na maszynie wirtualnej:

sudo docker run -it hello-world

Dane wyjściowe:

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

Instalowanie interfejsu wiersza polecenia platformy Azure

Wykonaj kroki opisane w artykule Instalowanie interfejsu wiersza polecenia platformy Azure przy użyciu narzędzia apt , aby zainstalować interfejs wiersza polecenia platformy Azure na maszynie wirtualnej z systemem Ubuntu. Przykład:

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

Zamknij połączenie SSH.

Konfigurowanie dostępu sieciowego dla rejestru

W tej sekcji skonfiguruj rejestr kontenerów, aby zezwolić na dostęp z podsieci w sieci wirtualnej platformy Azure. Kroki są udostępniane przy użyciu interfejsu wiersza polecenia platformy Azure.

Dodawanie punktu końcowego usługi do podsieci

Podczas tworzenia maszyny wirtualnej platforma Azure domyślnie tworzy sieć wirtualną w tej samej grupie zasobów. Nazwa sieci wirtualnej jest oparta na nazwie maszyny wirtualnej. Jeśli na przykład nadasz maszynie wirtualnej nazwę myDockerVM, domyślną nazwą sieci wirtualnej jest myDockerVMVNET z podsiecią o nazwie myDockerVMSubnet. Sprawdź to za pomocą polecenia az network vnet list :

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

Dane wyjściowe:

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

Użyj polecenia az network vnet subnet update, aby dodać punkt końcowy usługi Microsoft.ContainerRegistry do podsieci. Zastąp nazwy sieci wirtualnej i podsieci w następującym poleceniu:

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

Użyj polecenia az network vnet subnet show, aby pobrać identyfikator zasobu podsieci. Będzie to konieczne w późniejszym kroku, aby skonfigurować regułę dostępu do sieci.

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

Dane wyjściowe:

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

Zmienianie domyślnego dostępu sieciowego do rejestru

Domyślnie rejestr kontenerów platformy Azure zezwala na połączenia z hostów w dowolnej sieci. Aby ograniczyć dostęp do wybranej sieci, zmień domyślną akcję, aby odmówić dostępu. Zastąp nazwę rejestru następującym poleceniem az acr update :

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

Dodawanie reguły sieciowej do rejestru

Użyj polecenia az acr network-rule add, aby dodać regułę sieciową do rejestru, która umożliwia dostęp z podsieci maszyny wirtualnej. Zastąp nazwę rejestru kontenerów i identyfikator zasobu podsieci w następującym poleceniu:

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

Weryfikowanie dostępu do rejestru

Po odczekaniu kilku minut na zaktualizowanie konfiguracji sprawdź, czy maszyna wirtualna może uzyskać dostęp do rejestru kontenerów. Utwórz połączenie SSH z maszyną wirtualną i uruchom polecenie az acr login , aby zalogować się do rejestru.

az acr login --name mycontainerregistry

Możesz wykonywać operacje rejestru, takie jak uruchamianie docker pull , aby ściągnąć przykładowy obraz z rejestru. Zastąp obraz i wartość tagu odpowiednią dla rejestru, poprzedzoną nazwą serwera logowania rejestru (wszystkie małe litery):

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

Platforma Docker pomyślnie ściąga obraz do maszyny wirtualnej.

W tym przykładzie pokazano, że można uzyskać dostęp do prywatnego rejestru kontenerów za pośrednictwem reguły dostępu do sieci. Jednak nie można uzyskać dostępu do rejestru z hosta logowania, który nie ma skonfigurowanej reguły dostępu do sieci. Jeśli próbujesz zalogować się z innego hosta przy użyciu az acr login polecenia lub docker login polecenia, dane wyjściowe są podobne do następujących:

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

Przywracanie domyślnego dostępu do rejestru

Aby przywrócić rejestr, aby zezwolić na dostęp domyślnie, usuń wszystkie skonfigurowane reguły sieciowe. Następnie ustaw domyślną akcję zezwalania na dostęp.

Usuwanie reguł sieci

Aby wyświetlić listę reguł sieci skonfigurowanych dla rejestru, uruchom następujące polecenie az acr network-rule list :

az acr network-rule list --name mycontainerregistry 

Dla każdej skonfigurowanej reguły uruchom polecenie az acr network-rule remove , aby je usunąć. Przykład:

# 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

Zezwalaj na dostęp

Zastąp nazwę rejestru następującym poleceniem az acr update :

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

Czyszczenie zasobów

Jeśli wszystkie zasoby platformy Azure zostały utworzone w tej samej grupie zasobów i nie są już potrzebne, możesz opcjonalnie usunąć zasoby przy użyciu jednego polecenia az group delete :

az group delete --name myResourceGroup

Następne kroki