Azure PowerShell을 사용하여 Azure Firewall 배포 및 구성

아웃바운드 네트워크 액세스 제어는 전체 네트워크 보안 계획에서 중요한 부분입니다. 예를 들어 웹 사이트에 대한 액세스를 제한할 수 있습니다. 또는 액세스 가능한 아웃바운드 IP 주소 및 포트를 제한할 수 있습니다.

Azure 서브넷에서 아웃바운드 네트워크로의 액세스를 제어하는 한 가지 방법은 Azure Firewall입니다. Azure Firewall을 사용하면 다음을 구성할 수 있습니다.

  • 서브넷에서 액세스할 수 있는 FQDN(정규화된 도메인 이름)을 정의하는 애플리케이션 규칙.
  • 원본 주소, 프로토콜, 대상 포트 및 대상 주소를 정의하는 네트워크 규칙.

네트워크 트래픽은 서브넷 기본 게이트웨이처럼 방화벽에 네트워크 트래픽을 라우팅할 경우 구성된 방화벽 규칙에 종속됩니다.

이 문서에서는 배포가 용이하도록 세 개의 서브넷을 사용하여 간소화된 단일 VNet을 만듭니다. 프로덕션 배포의 경우 허브 및 스포크 모델이 권장되며 방화벽은 자체 VNet에 있습니다. 워크로드 서버는 하나 이상의 서브넷이 있는 동일한 지역에서 피어링된 VNet에 있습니다.

  • AzureFirewallSubnet - 방화벽은 이 서브넷에 있습니다.
  • 워크로드-SN - 워크로드 서버는 이 서브넷에 있습니다. 이 서브넷의 네트워크 트래픽은 방화벽을 통해 이동합니다.
  • AzureBastionSubnet - 워크로드 서버에 연결하는 데 사용되는 Azure Bastion에 사용되는 서브넷입니다.

Azure Bastion에 대한 자세한 내용은 Azure Bastion이란?을 참조하세요.

Important

시간당 가격 책정은 아웃바운드 데이터 사용량에 관계없이 Bastion이 배포되는 순간부터 시작됩니다. 자세한 내용은 가격 책정SKU를 참조하세요. 자습서 또는 테스트의 일부로 Bastion을 배포하는 경우 이 리소스 사용을 마친 후 삭제하는 것이 좋습니다.

자습서 네트워크 인프라

이 문서에서는 다음 방법을 설명합니다.

  • 테스트 네트워크 환경 설정
  • 방화벽 배포
  • 기본 경로 만들기
  • www.google.com에 대한 액세스를 허용하도록 애플리케이션 규칙 구성
  • 외부 DNS 서버 액세스를 허용하도록 네트워크 규칙 구성
  • 방화벽 테스트

원하는 경우 Azure Portal을 사용하여 이 절차를 완료할 수 있습니다.

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

필수 조건

이 절차에서는 PowerShell을 로컬로 실행해야 합니다. Azure PowerShell 모듈을 설치해야 합니다. Get-Module -ListAvailable Az을 실행하여 버전을 찾습니다. 업그레이드해야 하는 경우 Azure PowerShell 모듈 설치를 참조하세요. PowerShell 버전을 확인한 후 Connect-AzAccount를 실행하여 Azure와의 연결을 만듭니다.

네트워크 설정

먼저 방화벽 배포에 필요한 리소스를 포함하는 리소스 그룹을 만듭니다. 그런 다음, VNet, 서브넷 및 테스트 서버를 만듭니다.

리소스 그룹 만들기

리소스 그룹에는 배포를 위한 모든 리소스가 포함되어 있습니다.

New-AzResourceGroup -Name Test-FW-RG -Location "East US"

가상 네트워크 및 Azure Bastion 호스트 만들기

이 가상 네트워크에는 세 개의 서브넷이 있습니다.

참고 항목

AzureFirewallSubnet 서브넷의 크기는 /26입니다. 서브넷 크기에 대한 자세한 내용은 Azure Firewall FAQ를 참조하세요.

$Bastionsub = New-AzVirtualNetworkSubnetConfig -Name AzureBastionSubnet -AddressPrefix 10.0.0.0/27
$FWsub = New-AzVirtualNetworkSubnetConfig -Name AzureFirewallSubnet -AddressPrefix 10.0.1.0/26
$Worksub = New-AzVirtualNetworkSubnetConfig -Name Workload-SN -AddressPrefix 10.0.2.0/24

이제 가상 네트워크를 만듭니다.

$testVnet = New-AzVirtualNetwork -Name Test-FW-VN -ResourceGroupName Test-FW-RG `
-Location "East US" -AddressPrefix 10.0.0.0/16 -Subnet $Bastionsub, $FWsub, $Worksub

Azure Bastion 호스트에 대한 공용 IP 주소 만들기

$publicip = New-AzPublicIpAddress -ResourceGroupName Test-FW-RG -Location "East US" `
   -Name Bastion-pip -AllocationMethod static -Sku standard

Azure Bastion 호스트 만들기

New-AzBastion -ResourceGroupName Test-FW-RG -Name Bastion-01 -PublicIpAddress $publicip -VirtualNetwork $testVnet

가상 머신 만들기

이제 워크로드 가상 머신을 만들어 해당 서브넷에 배치합니다. 메시지가 표시되면 가상 머신의 사용자 이름 및 암호를 입력합니다.

워크로드 가상 머신을 만듭니다. 메시지가 표시되면 가상 머신의 사용자 이름 및 암호를 입력합니다.

#Create the NIC
$wsn = Get-AzVirtualNetworkSubnetConfig -Name  Workload-SN -VirtualNetwork $testvnet
$NIC01 = New-AzNetworkInterface -Name Srv-Work -ResourceGroupName Test-FW-RG -Location "East us" -Subnet $wsn

#Define the virtual machine
$SecurePassword = ConvertTo-SecureString "<choose a password>" -AsPlainText -Force
$Credential = New-Object System.Management.Automation.PSCredential ("<choose a user name>", $SecurePassword);
$VirtualMachine = New-AzVMConfig -VMName Srv-Work -VMSize "Standard_DS2"
$VirtualMachine = Set-AzVMOperatingSystem -VM $VirtualMachine -Windows -ComputerName Srv-Work -ProvisionVMAgent -EnableAutoUpdate -Credential $Credential
$VirtualMachine = Add-AzVMNetworkInterface -VM $VirtualMachine -Id $NIC01.Id
$VirtualMachine = Set-AzVMSourceImage -VM $VirtualMachine -PublisherName 'MicrosoftWindowsServer' -Offer 'WindowsServer' -Skus '2019-Datacenter' -Version latest

#Create the virtual machine
New-AzVM -ResourceGroupName Test-FW-RG -Location "East US" -VM $VirtualMachine -Verbose

참고 항목

Azure는 공용 IP 주소가 할당되지 않았거나 내부 기본 Azure Load Balancer의 백 엔드 풀에 있는 VM에 대한 기본 아웃바운드 액세스 IP를 제공합니다. 기본 아웃바운드 액세스 IP 메커니즘은 구성할 수 없는 아웃바운드 IP 주소를 제공합니다.

다음 이벤트 중 하나가 발생하면 기본 아웃바운드 액세스 IP가 사용하지 않도록 설정됩니다.

  • 공용 IP 주소가 VM에 할당됩니다.
  • VM은 아웃바운드 규칙 유무에 관계없이 표준 Load Balancer의 백 엔드 풀에 배치됩니다.
  • Azure NAT Gateway 리소스는 VM의 서브넷에 할당됩니다.

유연한 오케스트레이션 모드에서 가상 머신 확장 집합을 사용하여 만드는 VM에는 기본 아웃바운드 액세스 권한이 없습니다.

Azure의 아웃바운드 연결에 대한 자세한 내용은 Azure의 기본 아웃바운드 액세스아웃바운드 연결에 SNAT(원본 네트워크 주소 변환) 사용을 참조하세요.

방화벽 배포

이제 가상 네트워크에 방화벽을 배포합니다.

# Get a Public IP for the firewall
$FWpip = New-AzPublicIpAddress -Name "fw-pip" -ResourceGroupName Test-FW-RG `
  -Location "East US" -AllocationMethod Static -Sku Standard
# Create the firewall
$Azfw = New-AzFirewall -Name Test-FW01 -ResourceGroupName Test-FW-RG -Location "East US" -VirtualNetwork $testVnet -PublicIpAddress $FWpip

#Save the firewall private IP address for future use

$AzfwPrivateIP = $Azfw.IpConfigurations.privateipaddress
$AzfwPrivateIP

개인 IP 주소를 참고합니다. 기본 경로를 만들 때 나중에 사용할 수 있습니다.

기본 경로 만들기

BGP 경로 전파를 사용하지 않도록 설정하여 테이블을 만듭니다.

$routeTableDG = New-AzRouteTable `
  -Name Firewall-rt-table `
  -ResourceGroupName Test-FW-RG `
  -location "East US" `
  -DisableBgpRoutePropagation

#Create a route
 Add-AzRouteConfig `
  -Name "DG-Route" `
  -RouteTable $routeTableDG `
  -AddressPrefix 0.0.0.0/0 `
  -NextHopType "VirtualAppliance" `
  -NextHopIpAddress $AzfwPrivateIP `
 | Set-AzRouteTable

#Associate the route table to the subnet

Set-AzVirtualNetworkSubnetConfig `
  -VirtualNetwork $testVnet `
  -Name Workload-SN `
  -AddressPrefix 10.0.2.0/24 `
  -RouteTable $routeTableDG | Set-AzVirtualNetwork

애플리케이션 규칙 구성

애플리케이션 규칙은 www.google.com에 대한 아웃 바운드 액세스를 허용합니다.

$AppRule1 = New-AzFirewallApplicationRule -Name Allow-Google -SourceAddress 10.0.2.0/24 `
  -Protocol http, https -TargetFqdn www.google.com

$AppRuleCollection = New-AzFirewallApplicationRuleCollection -Name App-Coll01 `
  -Priority 200 -ActionType Allow -Rule $AppRule1

$Azfw.ApplicationRuleCollections.Add($AppRuleCollection)

Set-AzFirewall -AzureFirewall $Azfw

Azure Firewall은 기본적으로 허용되는 인프라 FQDN에 대한 기본 제공 규칙 컬렉션을 포함합니다. 이러한 FQDN은 플랫폼에 대해 특정적이며 다른 용도로 사용할 수 없습니다. 자세한 내용은 인프라 FQDN을 참조하세요.

네트워크 규칙 구성

네트워크 규칙은 포트 53(DNS)에서 두 IP 주소에 대한 아웃바운드 액세스를 허용합니다.

$NetRule1 = New-AzFirewallNetworkRule -Name "Allow-DNS" -Protocol UDP -SourceAddress 10.0.2.0/24 `
   -DestinationAddress 209.244.0.3,209.244.0.4 -DestinationPort 53

$NetRuleCollection = New-AzFirewallNetworkRuleCollection -Name RCNet01 -Priority 200 `
   -Rule $NetRule1 -ActionType "Allow"

$Azfw.NetworkRuleCollections.Add($NetRuleCollection)

Set-AzFirewall -AzureFirewall $Azfw

Srv-Work 네트워크 인터페이스에 대해 기본 및 보조 DNS 주소 변경

이 절차에서는 테스트 목적으로 서버의 기본 DNS 주소와 보조 DNS 주소를 구성합니다. 일반적인 Azure Firewall 요구 사항이 아닙니다.

$NIC01.DnsSettings.DnsServers.Add("209.244.0.3")
$NIC01.DnsSettings.DnsServers.Add("209.244.0.4")
$NIC01 | Set-AzNetworkInterface

방화벽 테스트

이제 방화벽이 예상대로 작동하는지 테스트합니다.

  1. Bastion을 사용하여 Srv-Work 가상 머신에 연결하고 로그인합니다.

    Bastion을 사용하여 연결합니다.

  2. Srv-Work에서 PowerShell 창을 열고 다음 명령을 실행합니다.

    nslookup www.google.com
    nslookup www.microsoft.com
    

    두 명령 모두 DNS 쿼리가 방화벽을 통과하고 있음을 보여 주는 답변을 반환해야 합니다.

  3. 다음 명령을 실행합니다.

    Invoke-WebRequest -Uri https://www.google.com
    Invoke-WebRequest -Uri https://www.google.com
    
    Invoke-WebRequest -Uri https://www.microsoft.com
    Invoke-WebRequest -Uri https://www.microsoft.com
    

    www.google.com 요청은 성공해야 하고 www.microsoft.com 요청은 실패해야 합니다. 이는 방화벽 규칙이 예상대로 작동하고 있음을 보여 줍니다.

이제 방화벽 규칙이 작동하는지 확인했습니다.

  • 구성된 외부 DNS 서버를 사용하여 DNS 이름을 확인할 수 있습니다.
  • 다른 모든 FQDN이 아닌 허용된 FQDN 하나만 찾아볼 수 있습니다.

리소스 정리

다음 자습서를 위해 방화벽 리소스를 유지하거나 더 이상 필요하지 않은 경우 Test-FW-RG 리소스 그룹을 삭제하여 모든 방화벽 관련 리소스를 삭제할 수 있습니다.

Remove-AzResourceGroup -Name Test-FW-RG

다음 단계