NSG를 사용한 Azure 네트워크의 보안 설정: 단계별 자습서

Azure Network Security Groups 또는 Azure NSG는 하나 이상의 Azure 리소스에서의 네트워크 트래픽을 수신 및 송신 모두 필터링할 수 있게 해줍니다. Azure 리소스에 대한 액세스 차단이 필요한 경우 NSG의 작동 방식을 이해해야 합니다.

이 문서에서는 Azure NSG의 목적과 PowerShell 스크립팅 언어를 사용하여 설정하는 방법을 배우게 됩니다.

사전 요구 사항

  • 대상이 될 Azure 리소스. 이 튜토리얼에서는 Pay-As-You-Go 구독과 Windows Server 2019 Azure 가상 머신을 사용합니다.
  • PowerShell 7+. 이전 버전의 PowerShell도 작동할 수 있지만, 이 튜토리얼은 PowerShell 7.0.1을 사용하여 구성합니다.
  • Azure Az 모듈 PowerShell 모듈

Azure NSG의 이해

Azure NSG는 방화벽과 유사한 역할을 합니다. 방화벽은 수신 및 송신 트래픽에 대해 취할 동작을 정의하는 규칙으로 구성됩니다. 일반적으로 방화벽에는 트래버스할 수 있는 내용과 할 수 없는 내용을 지정하는 기본 규칙이 있습니다. Azure NSG도 유사한 기능을 제공합니다.

전통적인 방화벽과 달리 Azure NSG에는 서비스 태그라는 클라우드 개념도 있습니다. 서비스 태그는 주소 범위를 추상화하여 관리를 쉽게하는 Azure의 방법입니다.

이 중요한 주제 각각을 간단히 다루어 보겠습니다.

규칙 구성을 단순화하기 위해 서비스 태그 사용

클라우드 서비스에서 IP 주소와 범위는 자주 변경될 수 있습니다. 이로 인해 수동으로 정의된 Azure IP 범위 규칙 집합을 유지하는 것이 어려울 수 있습니다. 다행히 Azure는 NSG 규칙이 대상이 될 수 있는 다양한 서비스 태그를 정의합니다.

서비스 태그는 항상 최신 주소 목록을 사용합니다. 서비스 태그는 관리를 쉽게하기 위해 주소 범위 집합에 대한 플레이스홀더를 할당하는 방법입니다.

Azure service tags in the Azure portal

기본 규칙 집합에 주의하세요

Azure NSG를 생성하고 적용할 때, 해당 NSG가 자동으로 적용하는 규칙에 대해 알아야 합니다. 이러한 기본 규칙 집합은 변경할 수 없으며, 내부 및 외부 트래픽에 대해 생성됩니다.

Azure NSG 규칙 집합의 각 규칙에는 우선순위가 있습니다. 우선순위는 작업 순서 또는 다른 규칙을 무시하는 규칙을 지정합니다. 예를 들어, 모든 내부 트래픽을 차단하는 우선순위 65000의 규칙이 있고, 포트 80을 허용하는 우선순위 64999의 규칙을 생성한 경우, Azure NSG는 포트 80을 제외한 모든 트래픽을 차단합니다.

Default Azure NSG rule priorities

기본 규칙 세트는 변경할 수 없지만 위의 예시와 같이 더 높은 우선순위 규칙을 사용하여 재정의할 수 있습니다. 이러한 규칙은 TCP, UDP 및 ICMP와 같은 모든 프로토콜에 적용됩니다.

규칙이 기본 규칙을 덮어쓰려면 숫자가 65500보다 작아야 함을 확인하세요!

Azure NSG를 생성할 때 다양한 기본 규칙이 표시됩니다:

들어오는 규칙

  • AllowVNetInBound – 이 들어오는 규칙에는 가상 네트워크 및 연결된 온프레미스 주소 공간에 정의된 모든 IP 주소 범위가 포함됩니다. 추가로 이 규칙에는 피어링된 가상 네트워크, 가상 네트워크 게이트웨이에 연결된 가상 네트워크, 호스트의 가상 IP 주소 및 사용자 정의 경로에서 사용되는 모든 주소 접두사가 포함됩니다. 이 규칙은 65000 우선순위로 설정됩니다.
  • AllowAzureLoadBalancerInBoundAzureLoadBalancer 서비스 태그는 Azure 건강 상태 프로브가 시작되는 호스트의 가상 IP 주소인 168.63.129.16로 변환됩니다. 실제 트래픽은 이곳을 통과하지 않으며, Azure 로드 밸런싱을 사용하지 않는 경우 이 규칙은 덮어쓸 수 있습니다. 호스트의 가상 IP 주소는 DHCP, DNS, IMDS 및 건강 모니터링과 같은 필수 인프라 서비스를 제공하기 위해 모든 지역에 존재합니다. 이 규칙은 65001 우선순위로 설정됩니다.
  • DenyAllInbound – 매우 마지막 규칙으로 설정되며, 우선순위 65500을 사용하여 명시적으로 허용되지 않은 모든 들어오는 트래픽을 거부합니다.

나가는 규칙

  • AllowVNetOutBound – 이것은 가상 네트워크에 정의된 모든 IP 주소 범위, 온프레미스 주소 공간, 피어링된 가상 네트워크, 가상 네트워크 게이트웨이에 연결된 가상 네트워크, 호스트의 가상 IP 주소 및 사용자 정의 경로에 사용되는 모든 주소 접두사를 포함합니다. 이 규칙은 우선 순위 65000으로 설정됩니다.
  • AllowInternetOutBound – 가상 네트워크 외부 및 공개 인터넷에서 도달 가능한 IP 주소 공간입니다. Azure 소유의 공용 IP 주소 공간 범위가 포함됩니다. 이 규칙은 우선 순위 65001으로 설정됩니다.
  • DenyAllOutBound – 수신 규칙 집합과 마찬가지로, 이 규칙은 가장 마지막 규칙으로 설정되며, 우선 순위 65500을 사용합니다. 이 아웃바운드 규칙은 명시적으로 허용되지 않은 모든 트래픽을 거부합니다.

PowerShell을 사용하여 Azure NSG 빌드

말이 많았으니, PowerShell을 사용하여 Azure NSG를 만들어 봅시다! PowerShell 콘솔에 로그인되어 있는 것으로 가정하고 계속 읽어보세요.

관련 정보: Connect-AzAccount: PowerShell로 Azure에 연결하기

Azure NSG를 PowerShell로 생성하려면 하나의 명령이 필요합니다; New-AzNetworkSecurityGroup. 이 명령을 사용하여 NSG를 만들려면 이름, NSG를 생성할 리소스 그룹 이름 및 위치를 제공하십시오.

아래 코드 예제는 New-AzNetworkSecurityGroup cmdlet을 사용하여 NSG-MyVM이라는 NSG를 eastus Azure 데이터 센터에있는 Articles 리소스 그룹에 생성합니다.

$Params = @{
  'Name'              = 'NSG-MyVM'
  'ResourceGroupName' = 'Articles' 
  'Location'          = 'centralus'
}

$NSG = New-AzNetworkSecurityGroup @Params

PowerShell을 사용하여 Azure NSG 규칙 생성

NSG를 가져오면 기본 규칙 세트로는 충분하지 않습니다. 직접 규칙을 만들어야합니다.

원격 데스크톱 프로토콜에 대한 인바운드 규칙 구성

A common administrative task is the need to create an inbound rule for the Remote Desktop Protocol (RDP). In the tutorial’s example, perhaps it’s going to be applied to a Windows Server Azure VM and you need to access the VM via RDP. In that case, you need to open up port 3389 inbound.

기존 NSG에 새로운 인바운드 규칙을 추가하려면 세 가지 단계가 필요합니다.

  1. 기존 NSG를 검색하기 위해 Get-AzNetworkSecurityGroup 명령을 실행하십시오.
  2. 규칙을 만들기 위해 Add-AzNetworkSecurityRuleConfig 명령을 실행하십시오.
  3. 그 규칙을 NSG에 적용하기 위해 Set-AzNetworkSecurityGroup 명령을 실행하십시오.

아래 코드 예제는 Get-AzNetworkSecurityGroup를 사용하여 기존 NSG를 검색합니다. 그런 다음 Add-AzNetworkSecurityRuleConfig를 사용하여 규칙을 정의하고 Set-AzNetworkSecurityGroup cmdlet을 사용하여 기존 NSG에 적용합니다.

$NSG = Get-AzNetworkSecurityGroup -Name 'NSG-MyVM' -ResourceGroupName 'Articles'

$Params = @{
  'Name'                     = 'allowRDP'
  'NetworkSecurityGroup'     = $NSG
  'Protocol'                 = 'TCP'
  'Direction'                = 'Inbound'
  'Priority'                 = 200
  'SourceAddressPrefix'      = 'my.ip.address'
  'SourcePortRange'          = '*'
  'DestinationAddressPrefix' = '*'
  'DestinationPortRange'     = 3389
  'Access'                   = 'Allow'
}

Add-AzNetworkSecurityRuleConfig @Params | Set-AzNetworkSecurityGroup

우선순위 매개변수는 규칙이 평가되는 시점을 결정하며, 값이 200은 가장 상단에 가까운 값이며, 4096은 가장 낮은 우선순위 규칙입니다.

일반적으로 외부 트래픽은 차단되지 않습니다. 왜냐하면 응용 프로그램이 사용할 수 있는 모든 가능한 포트를 알아내는 것이 어려울 수 있기 때문입니다. 다행히도, 정보 보안 표준에 대한 신뢰할 수 있는 기관인 SANS Institute에서 몇 가지 전문 외부 트래픽 필터링 권장 사항을 찾을 수 있습니다.

SANS의 권장 사항을 구현하기 위해 위에서 제공한 세 가지 단계를 동일하게 사용하지만, 이번에는 여러 포트를 사용하고 Inbound 대신 Outbound 방향으로 규칙을 생성합니다.

  • MS RPC – TCP 및 UDP 포트 135
  • NetBIOS/IP – TCP 및 UDP 포트 137-139
  • SMB/IP – TCP 포트 445
  • Trivial File Transfer Protocol (TFTP) – UDP 포트 69
  • Syslog – UDP 포트 514
  • Simple Network Management Protocol (SNMP) – UDP 포트 161-162

아래 코드는 Get-AzNetworkSecurityGroup cmdlet을 사용하여 기존 NSG 규칙을 검색합니다. Outbound 규칙은 Add-AzNetworkSecurityRuleConfig를 사용하여 정의되며, Set-AzNetworkSecurityGroup cmdlet을 통해 적용됩니다.

$NSG = Get-AzNetworkSecurityGroup -Name 'NSG-MyVM' -ResourceGroupName 'Articles'

$Params = @{
  'Name'                     = 'DenySANSOutBound'
  'NetworkSecurityGroup'     = $NSG
  'Protocol'                 = '*'
  'Direction'                = 'Outbound'
  'Priority'                 = 4000
  'SourceAddressPrefix'      = '*'
  'SourcePortRange'          = '*'
  'DestinationAddressPrefix' = 'Internet'
  'DestinationPortRange'     = @('135', '137','139','445','69','514','161','162')
  'Access'                   = 'Deny'
}

Add-AzNetworkSecurityRuleConfig @Params | Set-AzNetworkSecurityGroup

물론, 제공하는 서비스에 따라 일부 포트는 중요하고 필요할 수 있습니다. 아마도 응용 프로그램에 필요한 것에 따라이 목록을 사용자 정의해야 할 것입니다. 일반적으로 공급 업체에 의해 제공되거나 netstat 같은 오픈 포트를 찾기위한 도구를 사용하여 찾을 수 있습니다.

관련 문서: Netstat 및 PowerShell을 사용하여 포트 찾기

특정 서브넷을 위해 Azure NSG 구성하기

가상 네트워크 공간을 서브넷으로 분할했을 수 있습니다. 더 세분화하려면 NSG를 특정 서브넷에 적용하여 해당 서브넷의 트래픽을 세분화하여 제어할 수 있습니다.

다음 코드 조각은 전체 주소 접두사를 찾고 이에 NSG를 적용하는 방법을 보여줍니다.

# 기존 가상 네트워크 검색
$VNet = Get-AzVirtualNetwork -Name 'Articles-vnet' -ResourceGroupName 'Articles'
# 기존 NSG 검색
$NSG  = Get-AzNetworkSecurityGroup -Name 'NSG-MyVM' -ResourceGroupName 'Articles'

# 배열 표기법을 사용하여 첫 번째 서브넷 및 0 인덱스에 위치한 첫 번째 레코드 선택
$Params = @{
    'VirtualNetwork'       = $VNet
    'Name'                 = ($VNet.Subnets[0]).Name
    'AddressPrefix'        = ($VNet.Subnets[0]).AddressPrefix
    'NetworkSecurityGroup' = $NSG
}

# 업데이트된 구성을 서브넷 구성에 적용한 다음 VNet에 변경 사항 적용
Set-AzVirtualNetworkSubnetConfig @Params
Set-AzVirtualNetwork -VirtualNetwork $VNet

다음으로, 네트워크 인터페이스를 사용하여 NSG를 필요한 것에만 세분화하고 제한하는 방법에 대해 알아보세요.

네트워크 인터페이스에 Azure NSG 적용하기

서브넷이 작동하는 방식과 유사하게 NSG 규칙을 네트워크 인터페이스에 직접 적용할 수 있습니다. 이 세분화 수준은 보통 필요하지 않지만 가상 머신 당 여러 네트워크 인터페이스가 있는 경우 해당 NIC에 필요한 규칙 집합을 적용하는 것이 의미가 있을 수 있습니다.

서브넷 제한과 유사하게 개별 NIC에 규칙을 적용할 수 있습니다. 이 경우 Get-AzNetworkInterface cmdlet을 사용하여 지정된 VM의 특정 NIC를 검색합니다. 이는 이전에 생성한 NSG를 NetworkSecurityGroup 속성으로 설정합니다.

$NSG = Get-AzNetworkSecurityGroup -Name "MyVM-nsg" -ResourceGroupName "Articles"
$NIC = Get-AzNetworkInterface -name "MyVM-vm-nic"
 
$NIC.NetworkSecurityGroup = $NSG
$NIC | Set-AzNetworkInterface

NSG를 통한 트래픽 진단 및 분석은 어떻게 이루어질까요? NSG 플로우 로그와 그 활용 방법에 대해 알아보세요!

NSG 플로우 로그를 사용한 디버깅 및 문제 해결

NSG 생성 및 사용 중에 규칙 오류를 해결하거나 트래픽을 분석하기 위해 추가 디버깅이 필요할 수 있습니다. NSG에서 IP 트래픽 정보를 기록하는 Azure Network Watcher의 기능인 Flow Logs가 있습니다.

Azure Network Watcher가 네트워크 트래픽을 캡처하면 해당 데이터가 Azure Storage 계정에 저장됩니다. PowerShell을 사용하여 Azure NSG 플로우 로그를 구성하여 해당 Azure Storage 계정을 분석하고 문제를 해결하는 데 도움이 되는 정보를 얻을 수 있습니다.

관련: AzCopy 도구 다운로드 및 설치 방법

NSG 플로우 로그 활성화는 PowerShell에서 세 가지 단계로 이루어집니다.

  1. Microsoft.Insights 제공자를 등록합니다.
  2. 데이터를 저장하기 위한 운영 체제 분석 워크스페이스를 생성합니다.
  3. Set-AzNetworkWatcherConfigFlowLog 명령을 사용하여 NSG 흐름 로그를 활성화합니다.

Azure NSG 흐름 로그의 구성을 더욱 간편하게 하기 위해 아래 PowerShell 코드를 사용하면 필요한 다양한 단계를 간소화할 수 있습니다. 이 코드는 특히 운영 체제 분석 워크스페이스를 생성하고 올바른 구독, 워크스페이스 및 NSG와 흐름 로그 구성을 연관시킵니다.

$resourceGroupName = '<some resource group name>'
$NetworkWatcher = Get-AzNetworkWatcher -Name '<some name>' -ResourceGroupName $resourceGroupName
$NSG            = Get-AzNetworkSecurityGroup -Name 'NSG-MyVM' -ResourceGroupName $resourceGroupName
$StorageAccount = Get-AzStorageAccount -ResourceGroupName $resourceGroupName -Name '<storage account name>'
$Subscription   = Get-AzSubscription -SubscriptionName '<your subscription name>'

$Workspace = New-AzOperationalInsightsWorkspace -Location 'centralus' -Name "DefaultWorkspace-$($NSG.Name)-Articles" -Sku 'Standard' -ResourceGroupName $resourceGroupName

$Params = @{
  'NetworkWatcher'         = $NetworkWatcher
  'TargetResourceId'       = $NSG.Id
  'StorageAccountId'       = $StorageAccount.Id
  'EnableFlowLog'          = $True
  'FormatType'             = 'JSON'
  'FormatVersion'          = 2
  'EnableTrafficAnalytics' = $True
  'WorkspaceResourceId'    = $Workspace.ResourceId
  'WorkspaceGUID'          = $Workspace.CustomerId
  'WorkspaceLocation'      = 'centralus'
}

Set-AzNetworkWatcherConfigFlowLog @Params

플로우 로그에는 방화벽 로그에서 일반적으로 포함되는 다양한 속성이 있습니다. 이에는 소스 및 대상 IP, 포트, 프로토콜 및 타임 스탬프와 같은 속성이 포함됩니다. 버전 1과 2 로그에는 플로우 상태 개념이 있는 한 가지 큰 차이가 있습니다. 이는 플로우의 연속 및 종료를 표시하며 트래픽 대역폭 정보도 포함합니다.

다음 단계

Azure NSG는 리소스로의 트래픽을 제한하고 감사하는 강력한 도구입니다. 효과적으로 사용하면 리소스와 인프라를 적절하게 보호할 수 있습니다. NSG 흐름 로그를 통한 감사 기능과 서브넷 또는 네트워크 어댑터에 NSG를 제한하는 기능을 사용하면 필요한 대로 규칙의 범위를 지정하고 모든 트래픽이 예상대로인지 확인할 수 있는 유연성을 갖출 수 있습니다.

Source:
https://adamtheautomator.com/azure-nsg/