자습서: 가상 네트워크 통합을 사용하여 Azure App Service에서 백 엔드 통신 격리

이 문서에서는 백 엔드 서비스에 대한 안전한 네트워크 격리 통신을 사용하여 App Service 앱을 구성합니다. 사용되는 예제 시나리오는 자습서: Key Vault를 사용하 App Service에서 보안 인식 서비스 연결에 있습니다. 완료되면 Azure 가상 네트워크를 통해 Key Vault 및 Foundry 도구 모두에 액세스하는 App Service 앱이 있습니다. 다른 트래픽은 해당 백 엔드 리소스에 액세스할 수 없습니다. 모든 트래픽은 가상 네트워크 통합 및 프라이빗 엔드포인트를 통해 가상 네트워크 내에서 격리됩니다.

다중 테넌트 서비스에서 App Service 앱에서 다른 Azure 서비스로의 아웃바운드 네트워크 트래픽은 다른 앱 또는 다른 구독과 동일한 환경을 공유합니다. 트래픽 자체를 암호화할 수 있지만 특정 시나리오에서는 다른 네트워크 트래픽에서 백 엔드 통신을 격리하여 추가 수준의 보안이 필요할 수 있습니다. 이러한 시나리오는 일반적으로 높은 수준의 전문 지식을 갖춘 대기업에서 액세스할 수 있지만 App Service는 가상 네트워크 통합을 통해 도달 범위 내에 배치합니다.

시나리오 아키텍처를 보여 주는 다이어그램.

이 아키텍처에서는 다음을 수행합니다.

  • 백 엔드 서비스에 대한 공용 트래픽이 차단됩니다.
  • App Service의 아웃바운드 트래픽은 가상 네트워크로 라우팅되며 백 엔드 서비스에 연결할 수 있습니다.
  • App Service는 프라이빗 DNS 영역을 통해 백 엔드 서비스에 대한 DNS 확인을 수행할 수 있습니다.

학습할 내용:

  • App Service 가상 네트워크 통합을 위한 가상 네트워크 및 서브넷 만들기
  • 프라이빗 DNS 영역 만들기
  • 프라이빗 엔드포인트 만들기
  • App Service에서 가상 네트워크 통합 구성

필수 조건

가상 네트워크 및 서브넷 만들기

  1. 가상 네트워크를 만듭니다. 가상 네트워크 이름을< 고유한 이름으로 대체>합니다.

    # Save the virtual network name as a variable for convenience
    vnetName=<virtual-network-name>
    
    az network vnet create --resource-group $groupName --location $region --name $vnetName --address-prefixes 10.0.0.0/16
    
  2. App Service 가상 네트워크 통합을 위한 서브넷을 만듭니다.

    az network vnet subnet create --resource-group $groupName --vnet-name $vnetName --name vnet-integration-subnet --address-prefixes 10.0.0.0/24 --delegations Microsoft.Web/serverfarms --private-endpoint-network-policies Enabled
    

    App Service의 경우 가상 네트워크 통합 서브넷에 최소한 CIDR 블록 /26 이 있는 것이 좋습니다. ( 가상 네트워크 통합 서브넷 요구 사항을 참조하세요.) /24 이면 충분합니다. --delegations Microsoft.Web/serverfarms는 서브넷이 App Service 가상 네트워크 통합을 위해 위임되도록 지정합니다.

  3. 프라이빗 엔드포인트에 대한 다른 서브넷을 만듭니다.

    az network vnet subnet create --resource-group $groupName --vnet-name $vnetName --name private-endpoint-subnet --address-prefixes 10.0.1.0/24 --private-endpoint-network-policies Disabled
    

    프라이빗 엔드포인트 서브넷의 경우 프라이빗 엔드포인트 네트워크 정책을 사용하지 않도록 설정해야 합니다.

프라이빗 DNS 영역 만들기

Key Vault 및 Foundry Tools 리소스는 프라이빗 엔드포인트 뒤에 위치하므로 프라이빗 DNS 영역을 정의해야 합니다. 이러한 영역은 프라이빗 엔드포인트에 대한 DNS 레코드를 호스트하고 클라이언트가 이름으로 백 엔드 서비스를 찾을 수 있도록 하는 데 사용됩니다.

  1. 두 개의 프라이빗 DNS 영역을 만듭니다. 하나는 Foundry Tools 리소스용이고 다른 하나는 키 자격 증명 모음용입니다.

    az network private-dns zone create --resource-group $groupName --name privatelink.cognitiveservices.azure.com
    az network private-dns zone create --resource-group $groupName --name privatelink.vaultcore.azure.net
    

    이러한 설정에 대한 자세한 내용은 Azure 프라이빗 엔드포인트 DNS 구성을 참조하세요

  2. 프라이빗 DNS 영역을 가상 네트워크에 연결합니다.

    az network private-dns link vnet create --resource-group $groupName --name cognitiveservices-zonelink --zone-name privatelink.cognitiveservices.azure.com --virtual-network $vnetName --registration-enabled False
    az network private-dns link vnet create --resource-group $groupName --name vaultcore-zonelink --zone-name privatelink.vaultcore.azure.net --virtual-network $vnetName --registration-enabled False
    

프라이빗 엔드포인트 만들기

  1. 가상 네트워크의 프라이빗 엔드포인트 서브넷에서 Foundry Tools 리소스에 대한 프라이빗 엔드포인트를 만듭니다.

    # Get Foundry Tools resource ID
    csResourceId=$(az cognitiveservices account show --resource-group $groupName --name $csResourceName --query id --output tsv)
    
    az network private-endpoint create --resource-group $groupName --name securecstext-pe --location $region --connection-name securecstext-pc --private-connection-resource-id $csResourceId --group-id account --vnet-name $vnetName --subnet private-endpoint-subnet
    
  2. Foundry Tools 프라이빗 엔드포인트에 대한 DNS 영역 그룹을 만듭니다. DNS 영역 그룹은 프라이빗 DNS 영역과 프라이빗 엔드포인트 간의 링크입니다. 이 링크를 사용하면 프라이빗 엔드포인트에 대한 업데이트가 있을 때 프라이빗 DNS 영역을 자동으로 업데이트할 수 있습니다.

    az network private-endpoint dns-zone-group create --resource-group $groupName --endpoint-name securecstext-pe --name securecstext-zg --private-dns-zone privatelink.cognitiveservices.azure.com --zone-name privatelink.cognitiveservices.azure.com
    
  3. Foundry 도구 리소스에 대한 공용 트래픽을 차단합니다.

    az rest --uri $csResourceId?api-version=2024-10-01 --method PATCH --body '{"properties":{"publicNetworkAccess":"Disabled"}}' --headers 'Content-Type=application/json'
    
    # Repeat the following command until the output is "Succeeded"
    az cognitiveservices account show --resource-group $groupName --name $csResourceName --query properties.provisioningState
    

    비고

    변경 사항의 프로비저닝 상태가 "Succeeded"인지 확인합니다. 그런 다음 샘플 앱에서 동작 변경을 관찰할 수 있습니다. 여전히 앱을 로드할 수 있지만 검색 단추를 선택하려고 하면 오류가 발생합니다 HTTP 500 . 앱은 공유 네트워킹을 통해 Foundry Tools 리소스에 대한 연결을 끊습니다.

  4. 키 볼트에 대해 이전 단계를 반복하세요.

    # Create a private endpoint for the key vault
    vaultResourceId=$(az keyvault show --name $vaultName --query id --output tsv)
    az network private-endpoint create --resource-group $groupName --name securekeyvault-pe --location $region --connection-name securekeyvault-pc --private-connection-resource-id $vaultResourceId --group-id vault --vnet-name $vnetName --subnet private-endpoint-subnet
    # Create a DNS zone group for the endpoint
    az network private-endpoint dns-zone-group create --resource-group $groupName --endpoint-name securekeyvault-pe --name securekeyvault-zg --private-dns-zone privatelink.vaultcore.azure.net --zone-name privatelink.vaultcore.azure.net
    # Block public traffic to the key vault
    az keyvault update --name $vaultName --default-action Deny
    
  5. 앱 설정을 재설정하여 앱 내의 키 볼트 참조를 즉시 다시 불러오도록 하세요. (자세한 내용은 회전을 참조 하세요.)

    az webapp config appsettings set --resource-group $groupName --name $appName --settings CS_ACCOUNT_NAME="@Microsoft.KeyVault(SecretUri=$csResourceKVUri)" CS_ACCOUNT_KEY="@Microsoft.KeyVault(SecretUri=$csKeyKVUri)"
    

    비고

    다시 샘플 앱에서 동작 변경을 관찰할 수 있습니다. 더 이상 키 자격 증명 모음 참조에 액세스할 수 없기 때문에 앱을 더 이상 로드할 수 없습니다. 앱이 공유 네트워크를 통해 키 저장소와의 연결을 잃었습니다.

두 프라이빗 엔드포인트는 사용자가 만든 가상 네트워크 내의 클라이언트만 액세스할 수 있습니다. Azure Portal의 Secrets 페이지에서는 키 볼트에 저장된 시크릿에 접근할 수조차 없습니다. Portal이 공용 인터넷을 통해 시크릿에 접근하기 때문입니다. ( 잠긴 리소스 관리를 참조하세요.)

앱에서 가상 네트워크 통합 구성

  1. 지원되는 가격 책정 계층으로 앱을 확장합니다. ( Azure 가상 네트워크와 앱 통합을 참조하세요.)

    az appservice plan update --name $planName --resource-group $groupName --sku S1
    
  2. 인바운드 요청에 대해 HTTPS를 적용합니다. (이 단계는 현재 시나리오와 관련이 없지만 중요합니다.)

    az webapp update --resource-group $groupName --name $appName --https-only
    
  3. 앱에서 가상 네트워크 통합을 사용하도록 설정합니다.

    az webapp vnet-integration add --resource-group $groupName --name $appName --vnet $vnetName --subnet vnet-integration-subnet
    

    가상 네트워크 통합을 통해 아웃바운드 트래픽이 가상 네트워크로 직접 흐를 수 있습니다. 기본적으로 RFC-1918에 정의된 로컬 IP 트래픽만 프라이빗 엔드포인트에 필요한 가상 네트워크로 라우팅됩니다. 모든 트래픽을 가상 네트워크로 라우팅하는 방법에 대한 자세한 내용은 가상 네트워크 통합 라우팅 관리를 참조하세요. 가상 네트워크를 통해 인터넷 트래픽을 라우팅하려는 경우(예: Azure NAT 게이트웨이 또는 Azure Firewall)를 통해 모든 트래픽을 라우팅할 수도 있습니다.

  4. 브라우저에서 이동하여 <app-name>.azurewebsites.net 통합이 적용되기를 기다립니다. HTTP 500 오류가 발생하면 몇 분 정도 기다렸다가 다시 시도하세요. 페이지가 정상적으로 로드되고 감지 결과가 표시된다면, 키 볼트 참조를 사용하여 Foundry Tools 엔드포인트에 연결되고 있는 것입니다.

    비고

    오랫동안 HTTP 500 오류가 계속 발생한다면, 키 볼트 참조를 다시 강제 불러오는 것이 도움이 될 수 있습니다:

    az webapp config appsettings set --resource-group $groupName --name $appName --settings CS_ACCOUNT_NAME="@Microsoft.KeyVault(SecretUri=$csResourceKVUri)" CS_ACCOUNT_KEY="@Microsoft.KeyVault(SecretUri=$csKeyKVUri)"
    

잠긴 리소스 관리

시나리오에 따라 Azure Portal, Azure CLI 또는 Azure PowerShell(예: Key Vault)을 통해 프라이빗 엔드포인트로 보호되는 리소스를 관리하지 못할 수 있습니다. 이러한 도구는 모두 공용 인터넷을 통해 리소스에 액세스하기 위해 REST API 호출을 수행하고 구성에 의해 차단됩니다. 다음은 잠긴 리소스에 액세스하기 위한 몇 가지 옵션입니다.

  • Key Vault의 경우 로컬 머신의 공용 IP를 추가하여 프라이빗 엔드포인트로 보호되는 비밀을 보거나 업데이트합니다.
  • 온-프레미스 네트워크가 VPN Gateway 또는 Azure ExpressRoute를 통해 Azure 가상 네트워크로 확장되는 경우 온-프레미스 네트워크에서 직접 프라이빗 엔드포인트 보호 리소스를 관리할 수 있습니다.
  • 가상 네트워크의 점프 서버 에서 프라이빗 엔드포인트로 보호되는 리소스를 관리합니다.
  • 가상 네트워크에 Cloud Shell 배포합니다.

자원을 정리하세요

이전 단계에서는 리소스 그룹에 Azure 리소스를 만들었습니다. 나중에 이러한 리소스가 필요하지 않은 경우 Cloud Shell 다음 명령을 실행하여 리소스 그룹을 삭제합니다.

az group delete --name $groupName

이 명령을 실행하는 데 1분 정도 걸릴 수 있습니다.

다음 단계: