PowerShell을 사용하는 가상 네트워크 서비스 엔드포인트로 PaaS 리소스에 대한 네트워크 액세스 제한

가상 네트워크 서비스 엔드포인트를 사용하면 일부 Azure 서비스 리소스에 대한 네트워크 액세스를 가상 네트워크 서브넷으로 제한할 수 있습니다. 리소스에 대한 인터넷 액세스를 제거할 수도 있습니다. 서비스 엔드포인트는 가상 네트워크에서 지원되는 Azure 서비스로의 직접 연결을 제공하므로 가상 네트워크의 프라이빗 주소 공간을 사용하여 Azure 서비스에 액세스할 수 있습니다. 서비스 엔드포인트를 통해 Azure 리소스에 도달하는 트래픽은 항상 Microsoft Azure 백본 네트워크에 유지됩니다. 이 문서에서는 다음 방법을 설명합니다.

  • 하나의 서브넷이 있는 가상 네트워크 만들기
  • 서브넷을 추가하고 서비스 엔드포인트를 사용하도록 설정
  • Azure 리소스를 만들고 서브넷에서만 네트워크 액세스 허용
  • 각 서브넷에 VM(가상 머신) 배포
  • 서브넷에서 리소스에 대한 액세스 확인
  • 서브넷 및 인터넷에서 리소스에 대한 액세스가 거부되는지 확인

Azure 구독이 없는 경우 시작하기 전에 체험 계정을 만듭니다.

Azure Cloud Shell

Azure는 브라우저를 통해 사용할 수 있는 대화형 셸 환경인 Azure Cloud Shell을 호스트합니다. Cloud Shell에서 Bash 또는 PowerShell을 사용하여 Azure 서비스 작업을 수행할 수 있습니다. 로컬 환경에 아무 것도 설치할 필요 없이 Azure Cloud Shell의 미리 설치된 명령을 사용하여 이 문서의 코드를 실행할 수 있습니다.

Azure Cloud Shell을 시작하려면 다음을 수행합니다.

옵션 예제/링크
코드 또는 명령 블록의 오른쪽 상단에서 시도를 선택합니다. 시도를 선택해도 코드 또는 명령이 Cloud Shell에 자동으로 복사되지 않습니다. Screenshot that shows an example of Try It for Azure Cloud Shell.
https://shell.azure.com으로 이동하거나 Cloud Shell 시작 단추를 선택하여 브라우저에서 Cloud Shell을 엽니다. Button to launch Azure Cloud Shell.
Azure Portal의 오른쪽 위에 있는 메뉴 모음에서 Cloud Shell 단추를 선택합니다. Screenshot that shows the Cloud Shell button in the Azure portal

Azure Cloud Shell을 사용하려면:

  1. Cloud Shell을 시작합니다.

  2. 코드 블록(또는 명령 블록)에서 복사 단추를 선택하여 코드 또는 명령을 복사합니다.

  3. Windows 및 Linux에서 Ctrl+Shift+V를 선택하거나 macOS에서 Cmd+Shift+V를 선택하여 코드 또는 명령을 Cloud Shell 세션에 붙여넣습니다.

  4. Enter를 선택하여 코드 또는 명령을 실행합니다.

PowerShell을 로컬로 설치하고 사용하도록 선택하는 경우, 이 문서에는 Azure PowerShell 모듈 버전 1.0.0 이상이 필요합니다. 설치되어 있는 버전을 확인하려면 Get-Module -ListAvailable Az을 실행합니다. 업그레이드해야 하는 경우 Azure PowerShell 모듈 설치를 참조하세요. 또한 PowerShell을 로컬로 실행하는 경우 Connect-AzAccount를 실행하여 Azure와 연결해야 합니다.

가상 네트워크 만들기

가상 네트워크를 만들기 전에 가상 네트워크에 대한 리소스 그룹과 이 아티클에서 만든 다른 모든 리소스를 만들어야 합니다. New-AzResourceGroup을 사용하여 리소스 그룹을 만듭니다. 다음 예제에서는 myResourceGroup이라는 리소스 그룹을 만듭니다.

New-AzResourceGroup -ResourceGroupName myResourceGroup -Location EastUS

New-AzVirtualNetwork를 사용하여 가상 네트워크를 만듭니다. 다음 예제는 주소 접두사 10.0.0.0/16을 사용하는 myVirtualNetwork라는 가상 네트워크를 만듭니다.

$virtualNetwork = New-AzVirtualNetwork `
  -ResourceGroupName myResourceGroup `
  -Location EastUS `
  -Name myVirtualNetwork `
  -AddressPrefix 10.0.0.0/16

New-AzVirtualNetworkSubnetConfig를 사용하여 서브넷 구성을 만듭니다. 다음 예제에서는 Public이라는 서브넷에 대한 서브넷 구성을 만듭니다.

$subnetConfigPublic = Add-AzVirtualNetworkSubnetConfig `
  -Name Public `
  -AddressPrefix 10.0.0.0/24 `
  -VirtualNetwork $virtualNetwork

Set-AzVirtualNetwork를 사용하여 가상 네트워크에 서브넷 구성을 작성해 가상 네트워크에 서브넷을 만듭니다.

$virtualNetwork | Set-AzVirtualNetwork

서비스 엔드포인트 사용

서비스 엔드포인트를 지원하는 서비스에 대해서만 서비스 엔드포인트를 사용하도록 설정할 수 있습니다. Get-AzVirtualNetworkAvailableEndpointService를 사용하여 Azure 위치에서 사용할 수 있는 서비스 엔드포인트 사용 서비스를 확인합니다. 다음 예제에서는 eastus 지역에서 사용할 수 있는 서비스 엔드포인트 지원 서비스 목록을 반환합니다. 반환되는 서비스 목록은 시간이 지나면서 서비스 엔드포인트를 사용할 수 있는 Azure 서비스가 증가함에 따라 확장됩니다.

Get-AzVirtualNetworkAvailableEndpointService -Location eastus | Select Name

가상 네트워크에 추가 서브넷을 만듭니다. 이 예제에서는 Private라는 서브넷이 Microsoft.Storage에 대한 서비스 엔드포인트로 생성됩니다.

$subnetConfigPrivate = Add-AzVirtualNetworkSubnetConfig `
  -Name Private `
  -AddressPrefix 10.0.1.0/24 `
  -VirtualNetwork $virtualNetwork `
  -ServiceEndpoint Microsoft.Storage

$virtualNetwork | Set-AzVirtualNetwork

서브넷에 대한 네트워크 액세스 제한

New-AzNetworkSecurityRuleConfig를 사용하여 네트워크 보안 그룹 보안 규칙을 만듭니다. 다음 규칙을 사용하면 Azure Storage 서비스에 지정된 공용 IP 주소에 대한 아웃바운드 액세스가 허용됩니다.

$rule1 = New-AzNetworkSecurityRuleConfig `
  -Name Allow-Storage-All `
  -Access Allow `
  -DestinationAddressPrefix Storage `
  -DestinationPortRange * `
  -Direction Outbound `
  -Priority 100 `
  -Protocol * `
  -SourceAddressPrefix VirtualNetwork `
  -SourcePortRange *

다음 규칙은 모든 공용 IP 주소에 대한 액세스를 거부합니다. 우선 순위가 더 높은 이전 규칙이 이 규칙을 재정의하여 Azure Storage의 공용 IP 주소에 대한 액세스를 허용합니다.

$rule2 = New-AzNetworkSecurityRuleConfig `
  -Name Deny-Internet-All `
  -Access Deny `
  -DestinationAddressPrefix Internet `
  -DestinationPortRange * `
  -Direction Outbound `
  -Priority 110 `
  -Protocol * `
  -SourceAddressPrefix VirtualNetwork `
  -SourcePortRange *

다음 규칙을 사용하면 어디에서나 서브넷에 대한 RDP(원격 데스크톱 프로토콜) 트래픽 인바운드가 허용됩니다. 서브넷에 대한 원격 데스크톱 연결이 허용되므로 이후 단계에서 리소스에 대한 네트워크 액세스를 확인할 수 있습니다.

$rule3 = New-AzNetworkSecurityRuleConfig `
  -Name Allow-RDP-All `
  -Access Allow `
  -DestinationAddressPrefix VirtualNetwork `
  -DestinationPortRange 3389 `
  -Direction Inbound `
  -Priority 120 `
  -Protocol * `
  -SourceAddressPrefix * `
  -SourcePortRange *

New-AzNetworkSecurityGroup을 사용하여 네트워크 보안 그룹을 만듭니다. 다음 예제에서는 myNsgPrivate라는 네트워크 보안 그룹을 만듭니다.

$nsg = New-AzNetworkSecurityGroup `
  -ResourceGroupName myResourceGroup `
  -Location EastUS `
  -Name myNsgPrivate `
  -SecurityRules $rule1,$rule2,$rule3

네트워크 보안 그룹을 프라이빗 서브넷으로 Set-AzVirtualNetworkSubnetConfig을 사용해 연결한 다음 서브넷 구성을 가상 네트워크에 작성합니다. 다음 예제에서는 myNsgPrivate 네트워크 보안 그룹을 프라이빗 서브넷에 연결합니다.

Set-AzVirtualNetworkSubnetConfig `
  -VirtualNetwork $VirtualNetwork `
  -Name Private `
  -AddressPrefix 10.0.1.0/24 `
  -ServiceEndpoint Microsoft.Storage `
  -NetworkSecurityGroup $nsg

$virtualNetwork | Set-AzVirtualNetwork

리소스에 대한 네트워크 액세스 제한

서비스 엔드포인트에 사용할 수 있는 Azure 서비스를 통해 만든 리소스에 대한 네트워크 액세스를 제한하는 데 필요한 단계는 서비스에 따라 다릅니다. 각 서비스에 대한 특정 단계는 개별 서비스의 설명서를 참조하세요. 이 문서의 나머지 부분에는 Azure Storage 계정에 대한 네트워크 액세스를 제한하는 단계가 예제로 포함되어 있습니다.

저장소 계정 만들기

New-AzStorageAccount를 사용하여 Azure 스토리지 계정을 만듭니다. <replace-with-your-unique-storage-account-name>을 모든 Azure 위치에서 고유한 이름으로 바꿉니다. 이름은 3~24자 사이여야 하고 숫자와 소문자만 사용할 수 있습니다.

$storageAcctName = '<replace-with-your-unique-storage-account-name>'

New-AzStorageAccount `
  -Location EastUS `
  -Name $storageAcctName `
  -ResourceGroupName myResourceGroup `
  -SkuName Standard_LRS `
  -Kind StorageV2

스토리지 계정이 만들어진 후 Get-AzStorageAccountKey를 사용하여 스토리지 계정의 키를 변수로 검색합니다.

$storageAcctKey = (Get-AzStorageAccountKey `
  -ResourceGroupName myResourceGroup `
  -AccountName $storageAcctName).Value[0]

이 키는 이후 단계에서 파일 공유를 만드는 데 사용됩니다. $storageAcctKey를 입력하고 값을 적어 둡니다. 이후 단계에서 파일 공유를 VM의 드라이브에 매핑할 때도 이 값을 수동으로 입력해야 합니다.

스토리지 계정에 파일 공유 만들기

New-AzStorageContext를 사용하여 스토리지 계정 및 키에 대한 컨텍스트를 만듭니다. 이 컨텍스트는 스토리지 계정 이름 및 계정 키를 캡슐화합니다.

$storageContext = New-AzStorageContext $storageAcctName $storageAcctKey

New-AzStorageShare를 사용해 파일 공유를 만듭니다.

$share = New-AzStorageShare my-file-share -Context $storageContext

스토리지 계정에 대한 모든 네트워크 액세스 거부

기본적으로 스토리지 계정은 네트워크에 있는 클라이언트의 네트워크 연결을 허용합니다. 선택한 네트워크에 대한 액세스를 제한하려면 기본 동작을 거부Update-AzStorageAccountNetworkRuleSet를 사용해 변경합니다. 네트워크 액세스가 거부되면 모든 네트워크에서 스토리지 계정에 액세스할 수 없습니다.

Update-AzStorageAccountNetworkRuleSet  `
  -ResourceGroupName "myresourcegroup" `
  -Name $storageAcctName `
  -DefaultAction Deny

서브넷에서 네트워크 액세스 사용

Get-AzVirtualNetwork를 사용하여 생성된 가상 네트워크를 검색한 다음, Get-AzVirtualNetworkSubnetConfig를 사용하여 프라이빗 서브넷 개체를 변수로 검색합니다.

$privateSubnet = Get-AzVirtualNetwork `
  -ResourceGroupName "myResourceGroup" `
  -Name "myVirtualNetwork" `
  | Get-AzVirtualNetworkSubnetConfig `
  -Name "Private"

Add-AzStorageAccountNetworkRule을 사용하여 ‘프라이빗’ 서브넷에서 스토리지 계정에 대한 네트워크 액세스를 허용합니다.

Add-AzStorageAccountNetworkRule `
  -ResourceGroupName "myresourcegroup" `
  -Name $storageAcctName `
  -VirtualNetworkResourceId $privateSubnet.Id

가상 머신 만들기

스토리지 계정에 대한 네트워크 액세스를 테스트하려면 각 서브넷에 VM을 배포합니다.

첫 번째 가상 머신 만들기

퍼블릭 서브넷에 New-AzVM을 사용해 가상 머신을 만듭니다. 다음 명령을 실행하면 자격 증명을 묻는 메시지가 표시됩니다. 입력하는 값은 VM에 대한 사용자 이름과 암호로 구성됩니다. -AsJob 옵션은 백그라운드에서 VM을 만들므로 다음 단계를 계속 진행할 수 있습니다.

New-AzVm `
    -ResourceGroupName "myResourceGroup" `
    -Location "East US" `
    -VirtualNetworkName "myVirtualNetwork" `
    -SubnetName "Public" `
    -Name "myVmPublic" `
    -AsJob

다음 예제 출력과 유사한 출력이 반환됩니다.

Id     Name            PSJobTypeName   State         HasMoreData     Location             Command                  
--     ----            -------------   -----         -----------     --------             -------                  
1      Long Running... AzureLongRun... Running       True            localhost            New-AzVM     

두 번째 가상 머신 만들기

프라이빗 서브넷에 가상 머신을 만듭니다.

New-AzVm `
    -ResourceGroupName "myResourceGroup" `
    -Location "East US" `
    -VirtualNetworkName "myVirtualNetwork" `
    -SubnetName "Private" `
    -Name "myVmPrivate"

Azure가 VM을 만드는 데 몇 분이 걸립니다. Azure가 VM 만들기를 완료하고 PowerShell에 출력을 반환할 때까지 다음 단계로 이동하지 마세요.

스토리지 계정에 대한 액세스 확인

Get-AzPublicIpAddress를 사용하여 VM의 공용 IP 주소를 반환합니다. 다음 예제에서는 myVmPrivate VM의 공용 IP 주소를 반환합니다.

Get-AzPublicIpAddress `
  -Name myVmPrivate `
  -ResourceGroupName myResourceGroup `
  | Select IpAddress

다음 명령에서 <publicIpAddress>을 이전 명령에서 반환된 공용 IP 주소로 바꾸고 다음 명령을 입력합니다.

mstsc /v:<publicIpAddress>

원격 데스크톱 프로토콜(.rdp) 파일이 만들어지고 컴퓨터에 다운로드됩니다. 다운로드한 rdp 파일을 엽니다. 메시지가 표시되면 연결을 선택합니다. VM을 만들 때 지정한 사용자 이름과 암호를 입력합니다. 추가 선택 사항, 다른 계정 사용을 차례로 선택하여 VM을 만들 때 입력한 자격 증명을 지정해야 할 수도 있습니다. 확인을 선택합니다. 로그인 프로세스 중에 인증서 경고가 나타날 수 있습니다. 경고 메시지가 표시되면 또는 계속을 선택하여 연결을 계속합니다.

myVmPrivate VM에서 PowerShell을 사용하여 Azure 파일 공유를 Z 드라이브에 매핑합니다. 뒤에 나오는 명령을 실행하기 전에, <storage-account-key><storage-account-name>스토리지 계정 만들기에서 지정했거나 검색한 값으로 바꿉니다.

$acctKey = ConvertTo-SecureString -String "<storage-account-key>" -AsPlainText -Force
$credential = New-Object System.Management.Automation.PSCredential -ArgumentList "Azure\<storage-account-name>", $acctKey
New-PSDrive -Name Z -PSProvider FileSystem -Root "\\<storage-account-name>.file.core.windows.net\my-file-share" -Credential $credential

PowerShell에서 다음 예제 출력과 비슷한 출력을 반환합니다.

Name           Used (GB)     Free (GB) Provider      Root
----           ---------     --------- --------      ----
Z                                      FileSystem    \\vnt.file.core.windows.net\my-f...

Azure 파일 공유가 Z 드라이브에 매핑되었습니다.

VM에 다른 공용 IP 주소에 대한 아웃바운드 연결이 없는지 확인합니다.

ping bing.com

프라이빗 서브넷과 연결된 네트워크 보안 그룹이 Azure Storage 서비스에 지정된 주소 이외의 공용 IP 주소에 대한 아웃바운드 액세스를 허용하지 않으므로 응답이 수신되지 않습니다.

myVmPrivate VM에 대한 원격 데스크톱 세션을 닫습니다.

스토리지 계정에 대한 액세스가 거부되는지 확인

myVmPublic VM의 공용 IP 주소를 가져옵니다.

Get-AzPublicIpAddress `
  -Name myVmPublic `
  -ResourceGroupName myResourceGroup `
  | Select IpAddress

다음 명령에서 <publicIpAddress>을 이전 명령에서 반환된 공용 IP 주소로 바꾸고 다음 명령을 입력합니다.

mstsc /v:<publicIpAddress>

myVmPublic VM에서 Azure 파일 공유를 Z 드라이브에 매핑하려고 시도합니다. 뒤에 나오는 명령을 실행하기 전에, <storage-account-key><storage-account-name>스토리지 계정 만들기에서 지정했거나 검색한 값으로 바꿉니다.

$acctKey = ConvertTo-SecureString -String "<storage-account-key>" -AsPlainText -Force
$credential = New-Object System.Management.Automation.PSCredential -ArgumentList "Azure\<storage-account-name>", $acctKey
New-PSDrive -Name Z -PSProvider FileSystem -Root "\\<storage-account-name>.file.core.windows.net\my-file-share" -Credential $credential

공유에 대한 액세스가 거부되고 New-PSDrive : Access is denied 오류가 수신됩니다. myVmPublic VM이 Public 서브넷에 배포되었으므로 액세스가 거부되었습니다. Public 서브넷에는 Azure Storage에 사용할 수 있는 서비스 엔드포인트가 없으며 스토리지 계정이 Public 서브넷이 아닌 Private 서브넷의 네트워크 액세스만 허용합니다.

myVmPublic VM에 대한 원격 데스크톱 세션을 닫습니다.

컴퓨터에서 다음 명령을 사용하여 스토리지 계정의 파일 공유를 보려고 시도합니다.

Get-AzStorageFile `
  -ShareName my-file-share `
  -Context $storageContext

액세스가 거부되고 Get-AzStorageFile : 원격 서버가 오류를 반환했습니다:(403) 사용할 수 없음. HTTP 상태 코드: 403 - HTTP 오류 메시지: 이 요청은 이 작업을 수행하도록 허용되지 않았습니다 오류를 수신하게 됩니다. 이는 컴퓨터가 프라이빗 서브넷, MyVirtualNetwork 가상 네트워크에 있지 않기 때문입니다.

리소스 정리

더 이상 필요하지 않은 경우 Remove-AzResourceGroup을 사용하여 리소스 그룹 및 해당 그룹에 포함된 모든 리소스를 제거할 수 있습니다.

Remove-AzResourceGroup -Name myResourceGroup -Force

다음 단계

이 문서에서는 가상 네트워크 서브넷에 대해 서비스 엔드포인트를 사용하도록 설정했습니다. 여러 Azure 서비스로 배포된 리소스에 대해 서비스 엔드포인트를 사용하도록 설정할 수 있음을 배웠습니다. Azure Storage 계정을 만들고 스토리지 계정에 대한 네트워크 액세스를 가상 네트워크 서브넷 내의 리소스로만 제한했습니다. 서비스 엔드포인트에 대한 자세한 내용은 서비스 엔드포인트 개요서브넷 관리를 참조하세요.

계정에 여러 개의 가상 네트워크가 있는 경우, 각 가상 네트워크 내의 리소스가 서로 통신할 수 있도록 두 개의 가상 네트워크를 함께 연결하는 것이 좋습니다. 방법을 알아보려면 가상 네트워크 연결을 참조하세요.