Verbinding maken privé naar een Azure-containerregister met behulp van Azure Private Link

Beperk de toegang tot een register door privé-IP-adressen van een virtueel netwerk toe te wijzen aan de registereindpunten en Azure Private Link te gebruiken. Netwerkverkeer tussen de clients in het virtuele netwerk en de privé-eindpunten van het register doorkruist het virtuele netwerk en een privékoppeling op het Microsoft-backbonenetwerk, waardoor blootstelling van het openbare internet wordt geëlimineerd. Private Link maakt ook toegang tot privéregisters mogelijk vanuit on-premises via persoonlijke Azure ExpressRoute-peering of een VPN-gateway.

U kunt DNS-instellingen configureren voor de privé-eindpunten van het register, zodat de instellingen worden omgezet in het toegewezen privé-IP-adres van het register. Met DNS-configuratie kunnen clients en services in het netwerk toegang blijven krijgen tot het register op de volledig gekwalificeerde domeinnaam van het register, zoals myregistry.azurecr.io.

In dit artikel wordt beschreven hoe u een privé-eindpunt voor uw register configureert met behulp van de Azure Portal (aanbevolen) of de Azure CLI. Deze functie is beschikbaar in de servicelaag Premium containerregister. Zie Azure Container Registry lagen voor informatie over registerservicelagen en -limieten.

Belangrijk

Sommige functionaliteit is mogelijk niet beschikbaar of vereist meer configuratie in een containerregister waarmee de toegang tot privé-eindpunten, geselecteerde subnetten of IP-adressen wordt beperkt.

  • Wanneer openbare netwerktoegang tot een register is uitgeschakeld, moet voor registertoegang door bepaalde vertrouwde services, waaronder Azure Security Center, een netwerkinstelling inschakelen om de netwerkregels te omzeilen.
  • Exemplaren van bepaalde Azure-services, waaronder Azure DevOps Services, hebben momenteel geen toegang tot het containerregister.
  • Als het register een goedgekeurd privé-eindpunt heeft en openbare netwerktoegang is uitgeschakeld, kunnen opslagplaatsen en tags niet buiten het virtuele netwerk worden vermeld met behulp van de Azure Portal, Azure CLI of andere hulpprogramma's.

Notitie

Vanaf oktober 2021 staan nieuwe containerregisters maximaal 200 privé-eindpunten toe. Registers die eerder zijn gemaakt, staan maximaal 10 privé-eindpunten toe. Gebruik de opdracht az acr show-usage om de limiet voor uw register te bekijken.

Vereisten

  • Een virtueel netwerk en subnet waarin het privé-eindpunt moet worden ingesteld. Maak indien nodig een nieuw virtueel netwerk en subnet.
  • Voor het testen is het raadzaam om een VIRTUELE machine in het virtuele netwerk in te stellen. Zie Een virtuele Docker-machine maken met Docker voor meer informatie over het maken van een virtuele testmachine voor toegang tot uw register.
  • Als u de Azure CLI-stappen in dit artikel wilt gebruiken, wordt Azure CLI versie 2.6.0 of hoger aanbevolen. Zie Azure CLI installeren als u de CLI wilt installeren of een upgrade wilt uitvoeren. Of voer deze uit in Azure Cloud Shell.
  • Als u nog geen containerregister hebt, maakt u er een (Premium laag vereist) en importeert u een openbare voorbeeldinstallatiekopieën, zoals mcr.microsoft.com/hello-world van Microsoft Container Registry. Gebruik bijvoorbeeld de Azure Portal of de Azure CLI om een register te maken.

Containerregisterresourceprovider registreren

Als u registertoegang wilt configureren met behulp van een privékoppeling in een ander Azure-abonnement of een andere tenant, moet u de resourceprovider registreren voor Azure Container Registry in dat abonnement. Gebruik de Azure Portal, Azure CLI of andere hulpprogramma's.

Voorbeeld:

az account set --subscription <Name or ID of subscription of private link>

az provider register --namespace Microsoft.ContainerRegistry

Stel een privé-eindpunt in wanneer u een register maakt of voeg een privé-eindpunt toe aan een bestaand register.

Een privé-eindpunt maken - nieuw register

  1. Wanneer u een register maakt in de portal, selecteert u op het tabblad Basisbeginselen in de SKUPremium.

  2. Selecteer het tabblad Netwerken.

  3. Selecteer privé-eindpunt>+ Toevoegen in de netwerkverbinding.

  4. Voer de volgende gegevens in of selecteer deze:

    Instelling Waarde
    Abonnement Selecteer uw abonnement.
    Resourcegroep Voer de naam van een bestaande groep in of maak een nieuwe.
    Naam Voer een unieke naam in.
    Registersubresource Register selecteren
    Netwerken
    Virtueel netwerk Selecteer het virtuele netwerk voor het privé-eindpunt. Voorbeeld: myDockerVMVNET.
    Subnet Selecteer het subnet voor het privé-eindpunt. Voorbeeld: myDockerVMSubnet.
    Privé-DNS-integratie
    Integreren met privé-DNS-zone Selecteer Ja.
    Privé-DNS-zone Selecteer (nieuw) privatelink.azurecr.io
  5. Configureer de overige registerinstellingen en selecteer Controleren en maken.

Create registry with private endpoint

Uw privékoppeling is nu geconfigureerd en gereed voor gebruik.

Een privé-eindpunt maken - bestaand register

  1. Navigeer in de portal naar uw containerregister.

  2. Selecteer Netwerken onder Instellingen.

  3. Selecteer + Privé-eindpunt op het tabblad Privé-eindpunten. Add private endpoint to registry

  4. Voer op het tabblad Basisbeginselen de volgende gegevens in of selecteer deze:

    Instelling Waarde
    Projectgegevens
    Abonnement Selecteer uw abonnement.
    Resourcegroep Voer de naam van een bestaande groep in of maak een nieuwe.
    Exemplaardetails
    Naam Voer een naam in.
    Region Selecteer een regio.
  5. Selecteer Volgende: Resource.

  6. Voer de volgende gegevens in of selecteer deze:

    Instelling Waarde
    Verbindingsmethode Selecteer voor dit voorbeeld Verbinding maken naar een Azure-resource in mijn directory.
    Abonnement Selecteer uw abonnement.
    Resourcetype Selecteer Microsoft.ContainerRegistry/registers.
    Resource Selecteer de naam van het register
    Subresource van doel Register selecteren
  7. Selecteer Volgende: Configuratie.

  8. Voer de gegevens in of selecteer deze:

    Instelling Waarde
    Netwerken
    Virtueel netwerk Selecteer het virtuele netwerk voor het privé-eindpunt
    Subnet Selecteer het subnet voor het privé-eindpunt
    Privé-DNS-integratie
    Integreren met privé-DNS-zone Selecteer Ja.
    Privé-DNS-zone Selecteer (nieuw) privatelink.azurecr.io
  9. Selecteer Controleren + maken. De pagina Beoordelen en maken wordt weergegeven, waar uw configuratie wordt gevalideerd in Azure.

  10. Als u het bericht Validatie geslaagd ziet, selecteert u Maken.

Eindpuntconfiguratie bevestigen

Nadat het privé-eindpunt is gemaakt, worden DNS-instellingen in de privézone weergegeven met de instellingen voor privé-eindpunten in de portal:

  1. Navigeer in de portal naar uw containerregister en selecteer Instellingen > Netwerken.
  2. Selecteer op het tabblad Privé-eindpunten het privé-eindpunt dat u hebt gemaakt.
  3. Selecteer DE DNS-configuratie.
  4. Controleer de koppelingsinstellingen en aangepaste DNS-instellingen.

Endpoint DNS settings in portal

Privé-eindpunt instellen - CLI

In de Azure CLI-voorbeelden in dit artikel worden de volgende omgevingsvariabelen gebruikt. U hebt de namen van een bestaand containerregister, virtueel netwerk en subnet nodig om een privé-eindpunt in te stellen. Vervang waarden die geschikt zijn voor uw omgeving. Alle voorbeelden zijn opgemaakt voor de Bash-shell:

REGISTRY_NAME=<container-registry-name>
REGISTRY_LOCATION=<container-registry-location> # Azure region such as westeurope where registry created
RESOURCE_GROUP=<resource-group-name> # Resource group for your existing virtual network and subnet
NETWORK_NAME=<virtual-network-name>
SUBNET_NAME=<subnet-name>

Netwerkbeleid uitschakelen in subnet

Schakel netwerkbeleid uit , zoals netwerkbeveiligingsgroepen in het subnet voor het privé-eindpunt. Werk uw subnetconfiguratie bij met az network vnet subnet update:

az network vnet subnet update \
 --name $SUBNET_NAME \
 --vnet-name $NETWORK_NAME \
 --resource-group $RESOURCE_GROUP \
 --disable-private-endpoint-network-policies

Privé-DNS-zone configureren

Maak een privé-Azure DNS-zone voor het privé-Azure-containerregisterdomein. In latere stappen maakt u DNS-records voor uw registerdomein in deze DNS-zone. Zie DNS-configuratieopties verderop in dit artikel voor meer informatie.

Als u een privézone wilt gebruiken om de standaard-DNS-resolutie voor uw Azure-containerregister te overschrijven, moet de zone de naam privatelink.azurecr.io hebben. Voer de volgende opdracht az network private-dns zone create uit om de privézone te maken:

az network private-dns zone create \
  --resource-group $RESOURCE_GROUP \
  --name "privatelink.azurecr.io"

Voer az network private-dns link vnet create uit om uw privézone te koppelen aan het virtuele netwerk. In dit voorbeeld wordt een koppeling met de naam myDNSLink gemaakt.

az network private-dns link vnet create \
  --resource-group $RESOURCE_GROUP \
  --zone-name "privatelink.azurecr.io" \
  --name MyDNSLink \
  --virtual-network $NETWORK_NAME \
  --registration-enabled false

Een privéregister-eindpunt maken

Maak in deze sectie het privé-eindpunt van het register in het virtuele netwerk. Haal eerst de resource-id van uw register op:

REGISTRY_ID=$(az acr show --name $REGISTRY_NAME \
  --query 'id' --output tsv)

Voer de opdracht az network private-endpoint create uit om het privé-eindpunt van het register te maken.

In het volgende voorbeeld wordt het eindpunt myPrivateEndpoint en de serviceverbinding myConnection gemaakt. Als u een containerregisterresource voor het eindpunt wilt opgeven, geeft u --group-ids registryhet volgende door:

az network private-endpoint create \
    --name myPrivateEndpoint \
    --resource-group $RESOURCE_GROUP \
    --vnet-name $NETWORK_NAME \
    --subnet $SUBNET_NAME \
    --private-connection-resource-id $REGISTRY_ID \
    --group-ids registry \
    --connection-name myConnection

IP-configuratie van eindpunt ophalen

Als u DNS-records wilt configureren, haalt u de IP-configuratie van het privé-eindpunt op. Gekoppeld aan de netwerkinterface van het privé-eindpunt in dit voorbeeld zijn twee privé-IP-adressen voor het containerregister: één voor het register zelf en een voor het gegevenseindpunt van het register. Als uw register geo-gerepliceerd is, wordt er een extra IP-adres gekoppeld aan elke replica.

Voer eerst az network private-endpoint show uit om een query uit te voeren op het privé-eindpunt voor de netwerkinterface-id:

NETWORK_INTERFACE_ID=$(az network private-endpoint show \
  --name myPrivateEndpoint \
  --resource-group $RESOURCE_GROUP \
  --query 'networkInterfaces[0].id' \
  --output tsv)

De volgende az network nic show opdrachten ophalen de privé IP-adressen en FQDN's voor het containerregister en het gegevenseindpunt van het register:

REGISTRY_PRIVATE_IP=$(az network nic show \
  --ids $NETWORK_INTERFACE_ID \
  --query "ipConfigurations[?privateLinkConnectionProperties.requiredMemberName=='registry'].privateIpAddress" \
  --output tsv)

DATA_ENDPOINT_PRIVATE_IP=$(az network nic show \
  --ids $NETWORK_INTERFACE_ID \
  --query "ipConfigurations[?privateLinkConnectionProperties.requiredMemberName=='registry_data_$REGISTRY_LOCATION'].privateIpAddress" \
  --output tsv)

# An FQDN is associated with each IP address in the IP configurations

REGISTRY_FQDN=$(az network nic show \
  --ids $NETWORK_INTERFACE_ID \
  --query "ipConfigurations[?privateLinkConnectionProperties.requiredMemberName=='registry'].privateLinkConnectionProperties.fqdns" \
  --output tsv)

DATA_ENDPOINT_FQDN=$(az network nic show \
  --ids $NETWORK_INTERFACE_ID \
  --query "ipConfigurations[?privateLinkConnectionProperties.requiredMemberName=='registry_data_$REGISTRY_LOCATION'].privateLinkConnectionProperties.fqdns" \
  --output tsv)

Aanvullende eindpunten voor geo-replica's

Als uw register geo-gerepliceerd is, voert u een query uit op het extra gegevenseindpunt voor elke registerreplica. Bijvoorbeeld in de regio Eastus :

REPLICA_LOCATION=eastus
GEO_REPLICA_DATA_ENDPOINT_PRIVATE_IP=$(az network nic show \
  --ids $NETWORK_INTERFACE_ID \
  --query "ipConfigurations[?privateLinkConnectionProperties.requiredMemberName=='registry_data_$REPLICA_LOCATION'].privateIpAddress" \
  --output tsv) 

GEO_REPLICA_DATA_ENDPOINT_FQDN=$(az network nic show \
  --ids $NETWORK_INTERFACE_ID \
  --query "ipConfigurations[?privateLinkConnectionProperties.requiredMemberName=='registry_data_$REPLICA_LOCATION'].privateLinkConnectionProperties.fqdns" \
  --output tsv)

DNS-records maken in de privézone

Met de volgende opdrachten maakt u DNS-records in de privézone voor het registereindpunt en het bijbehorende gegevenseindpunt. Als u bijvoorbeeld een register hebt met de naam myregistry in de regio Westeurope , zijn myregistry.azurecr.io de eindpuntnamen en myregistry.westeurope.data.azurecr.io.

Voer eerst az network private-dns record-set a create to create empty A-record sets for the registry endpoint and data endpoint:

az network private-dns record-set a create \
  --name $REGISTRY_NAME \
  --zone-name privatelink.azurecr.io \
  --resource-group $RESOURCE_GROUP

# Specify registry region in data endpoint name
az network private-dns record-set a create \
  --name ${REGISTRY_NAME}.${REGISTRY_LOCATION}.data \
  --zone-name privatelink.azurecr.io \
  --resource-group $RESOURCE_GROUP

Voer de opdracht az network private-dns record-set a add-record uit om de A-records voor het registereindpunt en het gegevenseindpunt te maken:

az network private-dns record-set a add-record \
  --record-set-name $REGISTRY_NAME \
  --zone-name privatelink.azurecr.io \
  --resource-group $RESOURCE_GROUP \
  --ipv4-address $REGISTRY_PRIVATE_IP

# Specify registry region in data endpoint name
az network private-dns record-set a add-record \
  --record-set-name ${REGISTRY_NAME}.${REGISTRY_LOCATION}.data \
  --zone-name privatelink.azurecr.io \
  --resource-group $RESOURCE_GROUP \
  --ipv4-address $DATA_ENDPOINT_PRIVATE_IP

Aanvullende records voor geo-replica's

Als uw register geo-gerepliceerd is, maakt u aanvullende DNS-instellingen voor elke replica. Als u doorgaat met het voorbeeld in de regio Eastus , gaat u als volgt te werk:

az network private-dns record-set a create \
  --name ${REGISTRY_NAME}.${REPLICA_LOCATION}.data \
  --zone-name privatelink.azurecr.io \
  --resource-group $RESOURCE_GROUP

az network private-dns record-set a add-record \
  --record-set-name ${REGISTRY_NAME}.${REPLICA_LOCATION}.data \
  --zone-name privatelink.azurecr.io \
  --resource-group $RESOURCE_GROUP \
  --ipv4-address $GEO_REPLICA_DATA_ENDPOINT_PRIVATE_IP

De private link is nu geconfigureerd en gereed voor gebruik.

Openbare toegang uitschakelen

Schakel voor veel scenario's registertoegang uit vanuit openbare netwerken. Deze configuratie voorkomt dat clients buiten het virtuele netwerk de registereindpunten bereiken.

Openbare toegang uitschakelen - portal

  1. Navigeer in de portal naar uw containerregister en selecteer Instellingen > Netwerken.
  2. Selecteer Uitgeschakeld op het tabblad Openbare toegang, in Openbare netwerktoegang toestaan. Selecteer vervolgens Opslaan.

Openbare toegang uitschakelen - CLI

Notitie

Als de openbare toegang is uitgeschakeld, werken de az acr build opdrachten niet meer.

Als u openbare toegang wilt uitschakelen met behulp van de Azure CLI, voert u az acr update uit en stelt u deze in --public-network-enabledfalse.

az acr update --name $REGISTRY_NAME --public-network-enabled false

Voer het az acr build uit met een privé-eindpunt en een privéregister

Houd rekening met de volgende opties om de az acr build bewerking succesvol uit te voeren.

Notitie

Zodra u hier openbare netwerktoegang uitschakelt, az acr build werken opdrachten niet meer.

  1. Wijs een toegewezen agentpool toe.
  2. Als de agentgroep niet beschikbaar is in de regio, voegt u de regionale Azure Container Registry ServiceTag IPv4 toe aan de firewalltoegangsregels.
  3. Maak een ACR-taak met een beheerde identiteit en schakel vertrouwde services in voor toegang tot beperkte ACR-netwerken.

Controleer of de resources in het subnet van het privé-eindpunt verbinding maken met uw register via een privé-IP-adres en de juiste integratie van de privé-DNS-zone hebben.

Als u de private link-verbinding wilt valideren, maakt u verbinding met de virtuele machine die u hebt ingesteld in het virtuele netwerk.

Voer een hulpprogramma uit, zoals nslookup of dig om het IP-adres van uw register op te zoeken via de privékoppeling. Bijvoorbeeld:

dig $REGISTRY_NAME.azurecr.io

Voorbeelduitvoer toont het IP-adres van het register in de adresruimte van het subnet:

[...]
; <<>> DiG 9.11.3-1ubuntu1.13-Ubuntu <<>> myregistry.azurecr.io
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 52155
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 65494
;; QUESTION SECTION:
;myregistry.azurecr.io.         IN      A

;; ANSWER SECTION:
myregistry.azurecr.io.  1783    IN      CNAME   myregistry.privatelink.azurecr.io.
myregistry.privatelink.azurecr.io. 10 IN A      10.0.0.7

[...]

Vergelijk dit resultaat met het openbare IP-adres in dig de uitvoer voor hetzelfde register via een openbaar eindpunt:

[...]
;; ANSWER SECTION:
myregistry.azurecr.io.	2881	IN	CNAME	myregistry.privatelink.azurecr.io.
myregistry.privatelink.azurecr.io. 2881	IN CNAME xxxx.xx.azcr.io.
xxxx.xx.azcr.io.	300	IN	CNAME	xxxx-xxx-reg.trafficmanager.net.
xxxx-xxx-reg.trafficmanager.net. 300 IN	CNAME	xxxx.westeurope.cloudapp.azure.com.
xxxx.westeurope.cloudapp.azure.com. 10	IN A 20.45.122.144

[...]

Controleer ook of u registerbewerkingen kunt uitvoeren vanaf de virtuele machine in het netwerk. Maak een SSH-verbinding met uw virtuele machine en voer az acr login uit om u aan te melden bij uw register. Afhankelijk van uw VM-configuratie moet u mogelijk de volgende opdrachten vooraf laten gaan met sudo.

az acr login --name $REGISTRY_NAME

Voer registerbewerkingen uit, zoals docker pull het ophalen van een voorbeeldinstallatiekopie uit het register. Vervang door hello-world:v1 een installatiekopieën en tag die geschikt is voor uw register, voorafgegaan door de naam van de aanmeldingsserver van het register (in kleine letters):

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

Docker haalt de installatiekopie naar de VM.

Privé-eindpuntverbindingen beheren

Beheer de privé-eindpuntverbindingen van een register met behulp van de Azure Portal of met behulp van opdrachten in de opdrachtgroep az acr private-endpoint-connection. Bewerkingen omvatten goedkeuren, verwijderen, weergeven, weigeren of details van de privé-eindpuntverbindingen van een register.

Als u bijvoorbeeld de privé-eindpuntverbindingen van een register wilt weergeven, voert u de opdracht az acr private-endpoint-connection list uit. Bijvoorbeeld:

az acr private-endpoint-connection list \
  --registry-name $REGISTRY_NAME 

Wanneer u een privé-eindpuntverbinding instelt met behulp van de stappen in dit artikel, accepteert het register automatisch verbindingen van clients en services met Azure RBAC-machtigingen voor het register. U kunt het eindpunt zo instellen dat handmatige goedkeuring van verbindingen is vereist. Zie Een privé-eindpuntverbinding beheren voor informatie over het goedkeuren en afwijzen van privé-eindpuntverbindingen.

Belangrijk

Als u momenteel een privé-eindpunt uit een register verwijdert, moet u mogelijk ook de koppeling van het virtuele netwerk naar de privézone verwijderen. Als de koppeling niet wordt verwijderd, ziet u mogelijk een fout die lijkt op unresolvable host.

OPTIES voor DNS-configuratie

Het privé-eindpunt in dit voorbeeld is geïntegreerd met een privé-DNS-zone die is gekoppeld aan een eenvoudig virtueel netwerk. Deze installatie maakt rechtstreeks gebruik van de door Azure geleverde DNS-service om de openbare FQDN van het register op te lossen naar de privé-IP-adressen in het virtuele netwerk.

Private Link ondersteunt aanvullende DNS-configuratiescenario's die gebruikmaken van de privézone, inclusief met aangepaste DNS-oplossingen. U hebt bijvoorbeeld een aangepaste DNS-oplossing geïmplementeerd in het virtuele netwerk of on-premises in een netwerk dat u met behulp van een VPN-gateway of Azure ExpressRoute verbindt met het virtuele netwerk.

Als u de openbare FQDN van het register wilt omzetten in het privé-IP-adres in deze scenario's, moet u een doorstuurserver op serverniveau configureren naar de Azure DNS-service (168.63.129.16). De exacte configuratieopties en -stappen zijn afhankelijk van uw bestaande netwerken en DNS. Zie dns-configuratie van Azure Private Endpoint voor voorbeelden.

Belangrijk

Als u voor hoge beschikbaarheid privé-eindpunten in verschillende regio's hebt gemaakt, wordt u aangeraden een afzonderlijke resourcegroep in elke regio te gebruiken en het virtuele netwerk en de bijbehorende privé-DNS-zone erin te plaatsen. Deze configuratie voorkomt ook onvoorspelbare DNS-resolutie die wordt veroorzaakt door het delen van dezelfde privé-DNS-zone.

DNS-records handmatig configureren

Voor sommige scenario's moet u mogelijk handmatig DNS-records configureren in een privézone in plaats van de door Azure geleverde privézone te gebruiken. Zorg ervoor dat u records maakt voor elk van de volgende eindpunten: het registereindpunt, het gegevenseindpunt van het register en het gegevenseindpunt voor elke extra regionale replica. Als alle records niet zijn geconfigureerd, is het register mogelijk onbereikbaar.

Belangrijk

Als u later een nieuwe replica toevoegt, moet u handmatig een nieuwe DNS-record toevoegen voor het gegevenseindpunt in die regio. Als u bijvoorbeeld een replica van myregistry maakt op de locatie northeurope, voegt u een record toe voor myregistry.northeurope.data.azurecr.io.

De FQDN's en privé-IP-adressen die u nodig hebt om DNS-records te maken, zijn gekoppeld aan de netwerkinterface van het privé-eindpunt. U kunt deze informatie verkrijgen met behulp van de Azure Portal of Azure CLI.

Nadat u DNS-records hebt gemaakt, moet u ervoor zorgen dat de FQDN's van het register correct worden omgezet in hun respectieve privé-IP-adressen.

Resources opschonen

Als u uw resources in de portal wilt opschonen, gaat u naar uw resourcegroep. Zodra de resourcegroep is geladen, klikt u op Resourcegroep verwijderen om de resourcegroep en de daar opgeslagen resources te verwijderen.

Als u alle Azure-resources in dezelfde resourcegroep hebt gemaakt en deze niet meer nodig hebt, kunt u de resources desgewenst verwijderen met behulp van één az group delete-opdracht :

az group delete --name $RESOURCE_GROUP

Volgende stappen