Azure Virtual Network의 서비스 엔드포인트를 사용하여 컨테이너 레지스트리에 대한 액세스 제한

Azure Virtual Network는 Azure 및 온-프레미스 리소스를 위한 안전한 프라이빗 네트워킹 기능을 제공합니다. 서비스 엔드포인트를 사용하면 컨테이너 레지스트리의 공용 IP 주소를 사용자의 가상 네트워크로만 제한하여 보호할 수 있습니다. 이 엔드포인트는 Azure 백본 네트워크를 통해 트래픽에 최적의 리소스 경로를 제공합니다. 가상 네트워크 및 서브넷의 ID 또한 각 요청과 함께 전송됩니다.

이 문서에서는 가상 네트워크에서 컨테이너 레지스트리 서비스 엔드포인트(미리 보기)를 구성하는 방법을 보여 줍니다.

각 레지스트리는 최대 100개의 가상 네트워크 규칙을 지원합니다.

Important

Azure Container Registry에서 이제 Azure Private Link를 지원하므로 레지스트리에 가상 네트워크의 프라이빗 엔드포인트를 배치할 수 있습니다. 프라이빗 엔드포인트는 개인 IP 주소를 사용하여 가상 네트워크 안에서 액세스할 수 있습니다. 대부분의 네트워크 시나리오에서 서비스 엔드포인트 대신 프라이빗 엔드포인트를 사용하는 것이 좋습니다. 컨테이너 레지스트리는 가상 네트워크에서 구성된 프라이빗 링크 및 서비스 엔드포인트 기능을 모두 사용하도록 설정하는 것을 지원하지 않습니다. 따라서 필요에 따라 목록을 실행하고 네트워크 규칙을 제거하는 것이 좋습니다.

레지스트리 서비스 엔드포인트 구성은 프리미엄 컨테이너 레지스트리 서비스 계층에서 가능합니다. 레지스트리 서비스 계층 및 제한에 대한 내용은 Azure Container Registry 서비스 계층을 참조하세요.

미리 보기 제한 사항

  • Azure Container Registry용 서비스 엔드포인트의 향후 개발은 현재는 계획에 없습니다. 그 대신 프라이빗 엔드포인트를 사용하는 것이 좋습니다.
  • Azure Portal를 사용하여 레지스트리에 서비스 엔드포인트를 구성할 수 없습니다.
  • Azure Kubernetes Service 클러스터 또는 Azure 가상 머신만 호스트로 사용하여 서비스 엔드포인트를 사용하는 컨테이너 레지스트리에 액세스할 수 있습니다. Azure Container Instances를 비롯한 다른 Azure 서비스는 지원되지 않습니다.
  • Azure 미국 정부 클라우드 또는 21Vianet에서 운영하는 Microsoft Azure에서는 Azure Container Registry에 대한 서비스 엔드포인트가 지원되지 않습니다.

Important

일부 기능을 사용할 수 없거나 컨테이너 레지스트리에서 개인 엔드포인트, 선택한 서브넷 또는 IP 주소로 액세스를 제한하는 추가 구성이 필요합니다.

  • 레지스트리에 대한 퍼블릭 네트워크 액세스를 사용하지 않도록 설정한 경우 Azure Security Center를 포함하는 신뢰할 수 있는 특정 서비스의 레지스트리 액세스 권한에 따라 네트워크 규칙을 무시하도록 네트워크 설정을 지정해야 합니다.
  • 공용 네트워크 액세스를 사용하지 않으면, 현재 Azure DevOps Services를 비롯한 특정 Azure 서비스의 인스턴스에서 컨테이너 레지스트리에 액세스할 수 없습니다.
  • 프라이빗 엔드포인트는 현재 Azure DevOps 관리 에이전트에서 지원되지 않습니다. 프라이빗 엔드포인트에 대한 네트워크 가시적인 연결이 있는 자체 호스팅 에이전트를 사용해야 합니다.
  • 레지스트리에 승인된 프라이빗 엔드포인트가 있고 퍼블릭 네트워크 액세스를 사용하지 않도록 설정한 경우 Azure Portal, Azure CLI 또는 기타 도구를 사용하여 가상 네트워크 외부의 리포지토리 및 태그를 나열할 수 없습니다.

필수 조건

  • 이 문서의 Azure CLI 단계를 사용하려면 Azure CLI 버전 2.0.58 이상이 필요합니다. 설치 또는 업그레이드해야 하는 경우 Azure CLI 설치를 참조하세요.

  • 컨테이너 레지스트리가 아직 없는 경우, 하나(프리미엄 계층 필요)를 만들고 Docker Hub에서 hello-world와 같은 샘플 이미지를 밀어넣습니다. 예를 들어 Azure Portal 또는 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 연결을 만듭니다. publicIpAddress를 VM의 공용 IP 주소로 바꿉니다.

ssh azureuser@publicIpAddress

다음 명령을 실행하여 Ubuntu VM에 Docker를 설치합니다.

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

설치 후 다음 명령을 실행하여 VM에서 Docker가 제대로 실행되는지 확인합니다.

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 Virtual Network에서 서브넷으로부터의 액세스를 허용하도록 컨테이너 레지스트리를 구성합니다. 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 명령을 사용하여 서브넷의 리소스 ID를 검색합니다. 나중에 네트워크 액세스 규칙을 필요할 때 이 항목이 필요합니다.

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 Container Registry는 모든 네트워크에 있는 호스트로부터의 연결을 허용합니다. 선택한 네트워크로 액세스를 제한하려면 기본 작업을 액세스 거부로 변경합니다. 다음 az acr update 명령에서 레지스트리 이름을 바꿉니다.

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

레지스트리에 네트워크 규칙 추가

az acr network-rule add 명령을 사용하여 VM 서브넷으로부터의 액세스를 허용하는 네트워크 규칙을 레지스트리에 추가합니다. 다음 명령에서 컨테이너 레지스트리 이름과 서브넷 리소스 ID를 바꿉니다.

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

다음 단계