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
설치 후 다음 명령을 실행하여 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 명령을 사용하여 서브넷의 리소스 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 컨테이너 레지스트리는 모든 네트워크의 호스트에서 연결을 허용합니다. 선택한 네트워크에 대한 액세스를 제한하려면 액세스를 거부하도록 기본 작업을 변경합니다. 다음 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으로 성공적으로 끌어올 수 있습니다.
이 예제에서는 네트워크 액세스 규칙을 통해 프라이빗 컨테이너 레지스트리에 액세스할 수 있음을 보여 줍니다. 그러나 네트워크 액세스 규칙이 구성되지 않은 로그인 호스트에서 레지스트리에 액세스할 수 없습니다. 명령 또는 docker login
명령을 사용하여 az acr 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
다음 단계
- 가상 네트워크의 프라이빗 엔드포인트를 사용하여 레지스트리에 대한 액세스를 제한하려면 Azure 컨테이너 레지스트리에 대한 Azure Private Link 구성을 참조 하세요.
- 클라이언트 방화벽 뒤에서 레지스트리 액세스 규칙을 설정해야 하는 경우 방화벽 뒤에 있는 Azure 컨테이너 레지스트리에 액세스하도록 규칙 구성을 참조하세요.