Azure Virtual Network의 서비스 엔드포인트를 사용하여 컨테이너 레지스트리에 대한 액세스 제한Restrict access to a container registry using a service endpoint in an Azure virtual network

Azure Virtual Network는 Azure 및 온-프레미스 리소스를 위한 안전한 프라이빗 네트워킹 기능을 제공합니다.Azure Virtual Network provides secure, private networking for your Azure and on-premises resources. 서비스 엔드포인트를 사용하면 컨테이너 레지스트리의 공용 IP 주소를 사용자의 가상 네트워크로만 제한하여 보호할 수 있습니다.A service endpoint allows you to secure your container registry's public IP address to only your virtual network. 이 엔드포인트는 Azure 백본 네트워크를 통해 트래픽에 최적의 리소스 경로를 제공합니다.This endpoint gives traffic an optimal route to the resource over the Azure backbone network. 가상 네트워크 및 서브넷의 ID 또한 각 요청과 함께 전송됩니다.The identities of the virtual network and the subnet are also transmitted with each request.

이 문서에서는 가상 네트워크에서 컨테이너 레지스트리 서비스 엔드포인트(미리 보기)를 구성하는 방법을 보여 줍니다.This article shows how to configure a container registry service endpoint (preview) in a virtual network.

중요

Azure Container Registry에서 이제 Azure Private Link를 지원하므로 레지스트리에 가상 네트워크의 프라이빗 엔드포인트를 배치할 수 있습니다.Azure Container Registry now supports Azure Private Link, enabling private endpoints from a virtual network to be placed on a registry. 프라이빗 엔드포인트는 개인 IP 주소를 사용하여 가상 네트워크 안에서 액세스할 수 있습니다.Private endpoints are accessible from within the virtual network, using private IP addresses. 대부분의 네트워크 시나리오에서 서비스 엔드포인트 대신 프라이빗 엔드포인트를 사용하는 것이 좋습니다.We recommend using private endpoints instead of service endpoints in most network scenarios.

레지스트리 서비스 엔드포인트 구성은 프리미엄 컨테이너 레지스트리 서비스 계층에서 가능합니다.Configuring a registry service endpoint is available in the Premium container registry service tier. 레지스트리 서비스 계층 및 제한에 대한 자세한 내용은 Azure Container Registry 서비스 계층을 참조하세요.For information about registry service tiers and limits, see Azure Container Registry service tiers.

미리 보기 제한 사항Preview limitations

  • Azure Container Registry용 서비스 엔드포인트의 향후 개발은 현재는 계획에 없습니다.Future development of service endpoints for Azure Container Registry isn't currently planned. 그 대신 프라이빗 엔드포인트를 사용하는 것이 좋습니다.We recommend using private endpoints instead.
  • Azure Portal를 사용하여 레지스트리에 서비스 엔드포인트를 구성할 수 없습니다.You can't use the Azure portal to configure service endpoints on a registry.
  • Azure Kubernetes Service 클러스터 또는 Azure 가상 머신만 호스트로 사용하여 서비스 엔드포인트를 사용하는 컨테이너 레지스트리에 액세스할 수 있습니다.Only an Azure Kubernetes Service cluster or Azure virtual machine can be used as a host to access a container registry using a service endpoint. Azure Container Instances를 비롯한 다른 Azure 서비스는 지원되지 않습니다.Other Azure services including Azure Container Instances aren't supported.
  • 각 레지스트리는 최대 100개의 네트워크 액세스 규칙을 지원합니다.Each registry supports a maximum of 100 network access rules.
  • Azure Container Registry에 대 한 서비스 끝점은 Azure 미국 정부 클라우드 또는 Azure 중국 클라우드에서 지원 되지 않습니다.Service endpoints for Azure Container Registry aren't supported in the Azure US Government cloud or Azure China cloud.

중요

  • Azure Security Center는 현재 개인 끝점, 선택한 서브넷 또는 IP 주소에 대 한 액세스를 제한 하는 레지스트리에서 이미지 취약성 검사 를 수행할 수 없습니다.Azure Security Center can't currently perform image vulnerability scanning in a registry that restricts access to private endpoints, selected subnets, or IP addresses.
  • Azure DevOps Services, Web Apps 및 Azure Container Instances를 비롯 한 특정 Azure 서비스의 인스턴스도 네트워크 제한 컨테이너 레지스트리에 액세스할 수 없습니다.Instances of certain Azure services including Azure DevOps Services, Web Apps, and Azure Container Instances are also unable to access a network-restricted container registry.

사전 요구 사항Prerequisites

  • 이 문서의 Azure CLI 단계를 사용하려면 Azure CLI 버전 2.0.58 이상이 필요합니다.To use the Azure CLI steps in this article, Azure CLI version 2.0.58 or later is required. 설치 또는 업그레이드해야 하는 경우 Azure CLI 설치를 참조하세요.If you need to install or upgrade, see Install Azure CLI.

  • 컨테이너 레지스트리가 아직 없는 경우, 하나(프리미엄 계층 필요)를 만들고 Docker Hub에서 hello-world와 같은 샘플 이미지를 밀어넣습니다.If you don't already have a container registry, create one (Premium tier required) and push a sample image such as hello-world from Docker Hub. 예를 들어 Azure Portal 또는 Azure CLI를 사용하여 레지스트리를 만듭니다.For example, use the Azure portal or the Azure CLI to create a registry.

  • 다른 Azure 구독에서 서비스 엔드포인트를 사용하여 레지스트리 액세스를 제한하려면 해당 구독에서 Azure Container Registry에 대한 리소스 공급자를 등록합니다.If you want to restrict registry access using a service endpoint in a different Azure subscription, register the resource provider for Azure Container Registry in that subscription. 다음은 그 예입니다.For example:

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

Docker 사용 가상 컴퓨터 만들기Create a Docker-enabled virtual machine

테스트를 위해 Docker 사용 Ubuntu VM을 사용 하 여 Azure container registry에 액세스 합니다.For test purposes, use a Docker-enabled Ubuntu VM to access an Azure container registry. 레지스트리에 대 한 Azure Active Directory 인증을 사용 하려면 VM에 Azure CLI 도 설치 합니다.To use Azure Active Directory authentication to the registry, also install the Azure CLI on the VM. Azure 가상 머신이 이미 있는 경우이 만들기 단계를 건너뜁니다.If you already have an Azure virtual machine, skip this creation step.

가상 머신과 컨테이너 레지스트리에 동일한 리소스 그룹을 사용할 수 있습니다.You may use the same resource group for your virtual machine and your container registry. 이 설정은 종료 시 정리 작업을 단순화 하지만 필요 하지는 않습니다.This setup simplifies clean-up at the end but isn't required. 가상 컴퓨터 및 가상 네트워크에 대 한 별도의 리소스 그룹을 만들도록 선택 하는 경우 az group create를 실행 합니다.If you choose to create a separate resource group for the virtual machine and virtual network, run az group create. 다음 예제에서는 리소스 그룹 이름 및 레지스트리 위치에 대해 환경 변수를 설정 했다고 가정 합니다.The following example assumes you've set environment variables for the resource group name and registry location:

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

이제 az vm create를 사용 하 여 기본 Ubuntu Azure virtual machine을 배포 합니다.Now deploy a default Ubuntu Azure virtual machine with az vm create. 다음 예제에서는 Mydockervm이라는 vm을 만듭니다.The following example creates a VM named myDockerVM.

VM_NAME=myDockerVM

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

VM을 만드는 데 몇 분 정도 걸립니다.It takes a few minutes for the VM to be created. 명령이 완료되면 Azure CLI에 표시된 publicIpAddress를 기록해 둡니다.When the command completes, take note of the publicIpAddress displayed by the Azure CLI. 이 주소를 사용하여 VM에 SSH 연결을 만듭니다.Use this address to make SSH connections to the VM.

VM에 Docker 설치Install Docker on the VM

VM이 실행된 후 VM에 SSH 연결을 만듭니다.After the VM is running, make an SSH connection to the VM. publicIpAddress를 VM의 공용 IP 주소로 바꿉니다.Replace publicIpAddress with the public IP address of your VM.

ssh azureuser@publicIpAddress

다음 명령을 실행 하 여 Ubuntu VM에 Docker를 설치 합니다.Run the following commands to install Docker on the Ubuntu VM:

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

설치 후 다음 명령을 실행하여 VM에서 Docker가 제대로 실행되는지 확인합니다.After installation, run the following command to verify that Docker is running properly on the VM:

sudo docker run -it hello-world

출력:Output:

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

Azure CLI 설치Install the Azure CLI

apt를 사용하여 Azure CLI 설치의 단계를 따라 Ubuntu 가상 머신에 Azure CLI를 설치합니다.Follow the steps in Install Azure CLI with apt to install the Azure CLI on your Ubuntu virtual machine. 예를 들면 다음과 같습니다.For example:

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

SSH 연결을 종료 합니다.Exit the SSH connection.

레지스트리에 대한 네트워크 액세스 구성Configure network access for registry

이 섹션에서는 Azure Virtual Network에서 서브넷으로부터의 액세스를 허용하도록 컨테이너 레지스트리를 구성합니다.In this section, configure your container registry to allow access from a subnet in an Azure virtual network. Azure CLI를 사용 하 여 단계를 제공 합니다.Steps are provided using the Azure CLI.

서브넷에 서비스 엔드포인트 추가Add a service endpoint to a subnet

VM을 만들 때 Azure는 기본적으로 동일한 리소스 그룹에 가상 네트워크를 만듭니다.When you create a VM, Azure by default creates a virtual network in the same resource group. 가상 네트워크의 이름은 가상 머신의 이름을 기반으로 합니다.The name of the virtual network is based on the name of the virtual machine. 예를 들어 가상 머신의 이름을 myDockerVM 으로 지정하는 경우, 기본 가상 네트워크 이름은 myDockerVMVNET 으로 설정되며 서브넷 이름은 myDockerVMSubnet 으로 지정됩니다.For example, if you name your virtual machine myDockerVM , the default virtual network name is myDockerVMVNET , with a subnet named myDockerVMSubnet . Az network vnet list 명령을 사용 하 여이를 확인 합니다.Verify this by using the az network vnet list command:

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

출력:Output:

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

az network vnet subnet update 명령을 사용하여 Microsoft.ContainerRegistry 서비스 엔드포인트를 서브넷에 추가합니다.Use the az network vnet subnet update command to add a Microsoft.ContainerRegistry service endpoint to your subnet. 다음 명령에서 가상 네트워크와 서브넷의 이름을 바꿉니다.Substitute the names of your virtual network and subnet in the following command:

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

az network vnet subnet show 명령을 사용하여 서브넷의 리소스 ID를 검색합니다.Use the az network vnet subnet show command to retrieve the resource ID of the subnet. 나중에 네트워크 액세스 규칙을 필요할 때 이 항목이 필요합니다.You need this in a later step to configure a network access rule.

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

출력:Output:

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

레지스트리에 대한 기본 네트워크 액세스 변경Change default network access to registry

기본적으로 Azure Container Registry는 모든 네트워크에 있는 호스트로부터의 연결을 허용합니다.By default, an Azure container registry allows connections from hosts on any network. 선택한 네트워크로 액세스를 제한하려면 기본 작업을 액세스 거부로 변경합니다.To limit access to a selected network, change the default action to deny access. 다음 az acr update 명령에서 레지스트리 이름을 바꿉니다.Substitute the name of your registry in the following az acr update command:

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

레지스트리에 네트워크 규칙 추가Add network rule to registry

az acr network-rule add 명령을 사용하여 VM 서브넷으로부터의 액세스를 허용하는 네트워크 규칙을 레지스트리에 추가합니다.Use the az acr network-rule add command to add a network rule to your registry that allows access from the VM's subnet. 다음 명령에서 컨테이너 레지스트리 이름과 서브넷 리소스 ID를 바꿉니다.Substitute the container registry's name and the resource ID of the subnet in the following command:

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

레지스트리에 대한 액세스 확인Verify access to the registry

구성이 업데이트되도록 몇 분 정도 기다린 후 VM이 컨테이너 레지스트리에 액세스할 수 있는지 확인합니다.After waiting a few minutes for the configuration to update, verify that the VM can access the container registry. VM에 대한 SSH 연결을 설정하고 az acr login 명령을 실행하여 레지스트리에 로그인합니다.Make an SSH connection to your VM, and run the az acr login command to login to your registry.

az acr login --name mycontainerregistry

docker pull과 같은 레지스트리 작업을 수행하여 레지스트리에서 샘플 이미지를 끌어올 수 있습니다.You can perform registry operations such as run docker pull to pull a sample image from the registry. 레지스트리에 적합한 이미지 및 태그 값으로 바꾸고 레지스트리 로그인 서버 이름(모두 소문자)을 접두사로 사용합니다.Substitute an image and tag value appropriate for your registry, prefixed with the registry login server name (all lowercase):

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

Docker가 이미지를 VM으로 끌어옵니다.Docker successfully pulls the image to the VM.

이 예에서는 네트워크 액세스 규칙을 사용하여 프라이빗 컨테이너 레지스트리에 액세스할 수 있음을 보여 줍니다.This example demonstrates that you can access the private container registry through the network access rule. 그러나 구성된 네트워크 액세스 규칙이 없는 로그인 호스트로부터는 레지스트리에 액세스할 수 없습니다.However, the registry can't be accessed from a login host that doesn't have a network access rule configured. 다른 호스트에서 az acr login 명령 또는 docker login 명령을 사용하여 로그인할 경우 다음과 유사한 내용이 출력됩니다.If you attempt to login from another host using the az acr login command or docker login command, output is similar to the following:

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

기본 레지스트리 액세스 복원Restore default registry access

기본적으로 액세스를 허용하도록 레지스트리를 복원하려면 구성된 모든 네트워크 규칙을 제거합니다.To restore the registry to allow access by default, remove any network rules that are configured. 그런 다음, 기본 작업을 액세스 허용으로 설정합니다.Then set the default action to allow access.

네트워크 규칙 제거Remove network rules

레지스트리에 대해 구성된 네트워크 규칙 목록을 보려면 다음과 같이 az acr network-rule list 명령을 실행합니다.To see a list of network rules configured for your registry, run the following az acr network-rule list command:

az acr network-rule list --name mycontainerregistry 

구성된 각각의 규칙에 대해 az acr network-rule remove 명령을 실행하여 제거합니다.For each rule that is configured, run the az acr network-rule remove command to remove it. 다음은 그 예입니다.For example:

# 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

액세스 허용Allow access

다음 az acr update 명령에서 레지스트리 이름을 바꿉니다.Substitute the name of your registry in the following az acr update command:

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

리소스 정리Clean up resources

동일한 리소스 그룹에서 모든 Azure 리소스를 만들었으며 이 리소스가 더 이상 필요하지 않은 경우, 단일한 az group delete 명령을 사용하여 리소스를 선택적으로 삭제할 수 있습니다.If you created all the Azure resources in the same resource group and no longer need them, you can optionally delete the resources by using a single az group delete command:

az group delete --name myResourceGroup

다음 단계Next steps