자습서: 네트워크 보안 그룹을 사용하여 네트워크 트래픽 필터링
이 문서의 내용
네트워크 보안 그룹을 사용하여 Azure Virtual Network의 Azure 리소스에서 들어오고 나가는 인바운드 및 아웃바운드 네트워크 트래픽을 필터링할 수 있습니다.
네트워크 보안 그룹에는 IP 주소, 포트, 프로토콜에 따라 네트워크 트래픽을 필터링하는 보안 규칙이 포함됩니다. 네트워크 보안 그룹이 서브넷과 연결되면 해당 서브넷에 배포된 리소스에 보안 규칙이 적용됩니다.
이 자습서에서는 다음을 하는 방법을 알아볼 수 있습니다.
네트워크 보안 그룹 및 보안 규칙 만들기
애플리케이션 보안 그룹 만들기
가상 네트워크 만들기 및 서브넷에 네트워크 보안 그룹 연결
가상 머신을 배포하고 해당 네트워크 인터페이스를 애플리케이션 보안 그룹에 연결합니다.
필수 조건
Azure Cloud Shell
Azure는 브라우저를 통해 사용할 수 있는 대화형 셸 환경인 Azure Cloud Shell을 호스트합니다. Cloud Shell에서 Bash 또는 PowerShell을 사용하여 Azure 서비스 작업을 수행할 수 있습니다. 로컬 환경에 아무 것도 설치할 필요 없이 Azure Cloud Shell의 미리 설치된 명령을 사용하여 이 문서의 코드를 실행할 수 있습니다.
Azure Cloud Shell을 시작하려면 다음을 수행합니다.
옵션
예제/링크
코드 또는 명령 블록의 오른쪽 상단에서 시도 를 선택합니다. 시도 를 선택해도 코드 또는 명령이 Cloud Shell에 자동으로 복사되지 않습니다.
https://shell.azure.com 으로 이동하거나 Cloud Shell 시작 단추를 선택하여 브라우저에서 Cloud Shell을 엽니다.
Azure Portal 의 오른쪽 위에 있는 메뉴 모음에서 Cloud Shell 단추를 선택합니다.
Azure Cloud Shell을 사용하려면:
Cloud Shell을 시작합니다.
코드 블록(또는 명령 블록)에서 복사 단추를 선택하여 코드 또는 명령을 복사합니다.
Windows 및 Linux에서 Ctrl +Shift +V 를 선택하거나 macOS에서 Cmd +Shift +V 를 선택하여 코드 또는 명령을 Cloud Shell 세션에 붙여넣습니다.
Enter 를 선택하여 코드 또는 명령을 실행합니다.
PowerShell을 로컬로 설치하고 사용하도록 선택하는 경우, 이 문서에는 Azure PowerShell 모듈 버전 1.0.0 이상이 필요합니다. 설치되어 있는 버전을 확인하려면 Get-Module -ListAvailable Az
을 실행합니다. 업그레이드해야 하는 경우 Azure PowerShell 모듈 설치 를 참조하세요. 또한 PowerShell을 로컬로 실행하는 경우 Connect-AzAccount
를 실행하여 Azure와 연결해야 합니다.
Azure를 구독 하고 있지 않다면 시작하기 전에 Azure 체험 계정 을 만듭니다.
이 문서에는 Azure CLI 버전 2.0.28 이상이 필요합니다. Azure Cloud Shell을 사용하는 경우 최신 버전이 이미 설치되어 있습니다.
다음 절차에 따라 리소스 서브넷이 있는 가상 네트워크를 만듭니다.
포털에서 가상 네트워크 를 검색하여 선택합니다.
가상 네트워크 페이지에서 + 만들기 를 선택합니다.
가상 네트워크 만들기 의 기본 사항 탭에서 다음 정보를 입력하거나 선택합니다.
설정
값
프로젝트 세부 정보
Subscription
구독을 선택합니다.
Resource group
새로 만들기 를 선택합니다. 이름 에 Enter test-rg 를 입력합니다. 확인 을 선택합니다.
인스턴스 세부 정보
Name
vnet-1 을 입력합니다.
지역
미국 동부 2 를 선택합니다.
다음 을 선택하여 보안 탭으로 이동합니다.
다음 을 선택하여 IP 주소 탭으로 이동합니다.
서브넷 아래 주소 공간 상자에서 기본 서브넷을 선택합니다.
서브넷 편집 창에서 다음 정보를 입력하거나 선택합니다.
설정
값
서브넷 세부 정보
서브넷 템플릿
기본값을 기본값 으로 둡니다.
속성
subnet-1 을 입력합니다.
시작 주소
기본값인 10.0.0.0 을 그대로 둡니다.
서브넷 크기
기본값인 /24(256개 주소) 를 그대로 둡니다.
저장 을 선택합니다.
화면 하단에서 검토 + 만들기 를 선택합니다. 유효성 검사를 통과하면 만들기 를 선택합니다.
먼저 New-AzResourceGroup 으로 이 문서에서 만든 모든 리소스에 대한 리소스 그룹을 만듭니다. 다음 예제에서는 westus2 위치에 리소스 그룹을 만듭니다.
$rg = @{
ResourceGroupName = "test-rg"
Location = "westus2"
}
New-AzResourceGroup @rg
New-AzVirtualNetwork 를 사용하여 가상 네트워크를 만듭니다. 다음 예제에서는 가상 vnet-1 을 만듭니다.
$vnet = @{
ResourceGroupName = "test-rg"
Location = "westus2"
Name = "vnet-1"
AddressPrefix = "10.0.0.0/16"
}
$virtualNetwork = New-AzVirtualNetwork @vnet
New-AzVirtualNetworkSubnetConfig 를 통해 서브넷 구성을 만든 다음 Set-AzVirtualNetwork 를 통해 가상 네트워크에 서브넷 구성을 기록합니다. 다음 예제에서는 subnet-1 이라는 서브넷을 가상 네트워크에 추가하고 nsg-1 네트워크 보안 그룹을 연결합니다.
$subnet = @{
Name = "subnet-1"
VirtualNetwork = $virtualNetwork
AddressPrefix = "10.0.0.0/24"
}
Add-AzVirtualNetworkSubnetConfig @subnet
$virtualNetwork | Set-AzVirtualNetwork
먼저 az group create 로 이 문서에서 만든 모든 리소스에 대한 리소스 그룹을 만듭니다. 다음 예제에서는 westus2 위치에 리소스 그룹을 만듭니다.
az group create \
--name test-rg \
--location westus2
az network vnet create 를 사용하여 가상 네트워크를 만듭니다. 다음 예제에서는 가상 vnet-1 을 만듭니다.
az network vnet create \
--name vnet-1 \
--resource-group test-rg \
--address-prefixes 10.0.0.0/16
az network vnet subnet create 를 사용하여 가상 네트워크에 서브넷을 추가합니다. 다음 예제에서는 subnet-1 이라는 서브넷을 가상 네트워크에 추가하고 nsg-1 네트워크 보안 그룹을 연결합니다.
az network vnet subnet create \
--vnet-name vnet-1 \
--resource-group test-rg \
--name subnet-1 \
--address-prefix 10.0.0.0/24
애플리케이션 보안 그룹 만들기
ASG(애플리케이션 보안 그룹) 를 사용하면 웹 서버와 같은 유사한 기능을 갖는 서버를 함께 그룹화할 수 있습니다.
포털 위쪽의 검색 상자에서 애플리케이션 보안 그룹 을 입력합니다. 검색 결과에서 애플리케이션 보안 그룹 을 선택합니다.
+ 만들기 를 선택합니다.
애플리케이션 보안 그룹 만들기 의 기본 탭에서 다음 정보를 입력하거나 선택합니다.
설정
값
프로젝트 세부 정보
Subscription
구독을 선택합니다.
Resource group
test-rg 를 선택합니다.
인스턴스 세부 정보
이름
asg-web 을 입력합니다.
지역
미국 동부 2 를 선택합니다.
검토 + 만들기 를 선택합니다.
+ 만들기 를 선택합니다.
다음 값을 지정하여 이전 단계를 반복합니다.
설정
값
프로젝트 세부 정보
Subscription
구독을 선택합니다.
Resource group
test-rg 를 선택합니다.
인스턴스 세부 정보
이름
asg-mgmt 를 입력합니다.
지역
미국 동부 2 를 선택합니다.
검토 + 만들기 를 선택합니다.
만들기 를 선택합니다.
New-AzApplicationSecurityGroup 으로 애플리케이션 보안 그룹을 만듭니다. 애플리케이션 보안 그룹을 사용하면 유사한 포트 필터링 요구 사항을 갖는 서버를 그룹화할 수 있습니다. 다음 예제에서는 두 애플리케이션 보안 그룹을 만듭니다.
$web = @{
ResourceGroupName = "test-rg"
Name = "asg-web"
Location = "westus2"
}
$webAsg = New-AzApplicationSecurityGroup @web
$mgmt = @{
ResourceGroupName = "test-rg"
Name = "asg-mgmt"
Location = "westus2"
}
$mgmtAsg = New-AzApplicationSecurityGroup @mgmt
az network asg create 로 애플리케이션 보안 그룹을 만듭니다. 애플리케이션 보안 그룹을 사용하면 유사한 포트 필터링 요구 사항을 갖는 서버를 그룹화할 수 있습니다. 다음 예제에서는 두 애플리케이션 보안 그룹을 만듭니다.
az network asg create \
--resource-group test-rg \
--name asg-web \
--location westus2
az network asg create \
--resource-group test-rg \
--name asg-mgmt \
--location westus2
네트워크 보안 그룹 만들기
NSG(네트워크 보안 그룹) 는 가상 네트워크의 네트워크 트래픽을 보호합니다.
포털 맨 위에 있는 검색 상자에 네트워크 보안 그룹 를 입력합니다. 검색 결과에서 네트워크 보안 그룹 을 선택합니다.
참고 항목
네트워크 보안 그룹 의 검색 결과에 네트워크 보안 그룹(클래식) 이 표시될 수 있습니다. 네트워크 보안 그룹을 선택합니다.
+ 만들기 를 선택합니다.
네트워크 보안 그룹 만들기 의 기본 탭에서 다음 정보를 입력하거나 선택합니다.
설정
값
프로젝트 세부 정보
Subscription
구독을 선택합니다.
Resource group
test-rg 를 선택합니다.
인스턴스 세부 정보
이름
nsg-1 을 입력합니다.
위치
미국 동부 2 를 선택합니다.
검토 + 만들기 를 선택합니다.
만들기 를 선택합니다.
New-AzNetworkSecurityGroup 을 사용하여 네트워크 보안 그룹을 만듭니다. 다음 예제에서는 nsg-1 이라는 네트워크 보안 그룹을 만듭니다.
$nsgParams = @{
ResourceGroupName = "test-rg"
Location = "westus2"
Name = "nsg-1"
}
$nsg = New-AzNetworkSecurityGroup @nsgParams
az network nsg create 를 사용하여 네트워크 보안 그룹을 만듭니다. 다음 예제에서는 nsg-1 이라는 네트워크 보안 그룹을 만듭니다.
# Create a network security group
az network nsg create \
--resource-group test-rg \
--name nsg-1
서브넷에 네트워크 보안 그룹 연결
이 섹션에서는 네트워크 보안 그룹을 이전에 만든 가상 네트워크의 서브넷과 연결합니다.
포털 맨 위에 있는 검색 상자에 네트워크 보안 그룹 를 입력합니다. 검색 결과에서 네트워크 보안 그룹 을 선택합니다.
nsg-1 을 선택합니다.
nsg-1 의 설정 섹션에서 서브넷 을 선택합니다.
서브넷 페이지에서 + 연결 을 선택합니다.
서브넷 연결 에서 가상 네트워크 에 대해 vnet-1(test-rg) 을 선택합니다.
서브넷 에 대해 subnet-1 을 선택한 다음, 확인 을 선택합니다.
Get-AzVirtualNetwork 를 사용하여 가상 네트워크 개체를 검색한 다음 Set-AzVirtualNetworkSubnetConfig 를 사용하여 네트워크 보안 그룹을 서브넷과 연결합니다. 다음 예제에서는 가상 네트워크 개체를 검색하고 서브넷 구성을 업데이트하여 네트워크 보안 그룹을 연결합니다.
# Retrieve the virtual network
$vnet = Get-AzVirtualNetwork -Name "vnet-1" -ResourceGroupName "test-rg"
# Update the subnet configuration to associate the network security group
$subnetConfigParams = @{
VirtualNetwork = $vnet
Name = "subnet-1"
AddressPrefix = $vnet.Subnets[0].AddressPrefix
NetworkSecurityGroup = Get-AzNetworkSecurityGroup -Name "nsg-1" -ResourceGroupName "test-rg"
}
Set-AzVirtualNetworkSubnetConfig @subnetConfigParams
# Update the virtual network with the new subnet configuration
$vnet | Set-AzVirtualNetwork
네트워크 보안 그룹을 서브넷과 연결하려면 az network vnet subnet update 를 사용합니다. 다음 예제에서는 nsg-1 네트워크 보안 그룹을 subnet-1 서브넷과 연결합니다.
az network vnet subnet update \
--resource-group test-rg \
--vnet-name vnet-1 \
--name subnet-1 \
--network-security-group nsg-1
보안 규칙 만들기
nsg-1 의 설정 섹션에서 인바운드 보안 규칙 을 선택합니다.
인바운드 보안 규칙 페이지에서 + 추가 를 선택합니다.
asg-web 애플리케이션 보안 그룹에 포트 80 및 443을 허용하는 보안 규칙을 만듭니다. 인바운드 보안 규칙 추가 페이지에서 다음 정보를 입력하거나 선택합니다.
설정
값
원본
모두 (기본값)를 그대로 둡니다.
원본 포트 범위
(*) 의 기본값을 그대로 둡니다.
대상
애플리케이션 보안 그룹 을 선택합니다.
대상 애플리케이션 보안 그룹
asg-web 을 선택합니다.
서비스
사용자 지정 (기본값)을 그대로 둡니다.
대상 포트 범위
80,443 을 입력합니다.
프로토콜
TCP 를 선택합니다.
작업
허용 (기본값)을 그대로 둡니다.
우선 순위
100 (기본값)을 그대로 둡니다.
이름
allow-web-all 을 입력합니다.
추가 를 선택합니다.
다음 정보를 사용하여 이전 단계를 완료합니다.
설정
값
원본
모두 (기본값)를 그대로 둡니다.
원본 포트 범위
(*) 의 기본값을 그대로 둡니다.
대상
애플리케이션 보안 그룹 을 선택합니다.
대상 애플리케이션 보안 그룹
asg-mgmt 를 선택합니다.
서비스
RDP 를 선택합니다.
작업
허용 (기본값)을 그대로 둡니다.
우선 순위
110 (기본값)을 그대로 둡니다.
이름
allow-rdp-all 을 입력합니다.
추가 를 선택합니다.
주의
이 문서에서 RDP(3389 포트)는 asg-mgmt 애플리케이션 보안 그룹에 할당된 VM에 대한 인터넷에 노출됩니다.
프로덕션 환경에서는 3389 포트를 인터넷에 공개하는 대신 VPN, 개인 네트워크 연결 또는 Azure Bastion을 통해 관리하려는 Azure 리소스에 연결하는 것이 좋습니다.
Azure Bastion에 대한 자세한 내용은 Azure Bastion이란? 을 참조하세요.
New-AzNetworkSecurityRuleConfig 로 보안 규칙을 만듭니다. 다음 예제에서는 80 및 443 포트를 통해 인터넷에서 asg-web 애플리케이션 보안 그룹으로 가는 트래픽을 허용하는 규칙을 만듭니다.
$webAsgParams = @{
Name = "asg-web"
ResourceGroupName = "test-rg"
}
$webAsg = Get-AzApplicationSecurityGroup @webAsgParams
$webRuleParams = @{
Name = "Allow-Web-All"
Access = "Allow"
Protocol = "Tcp"
Direction = "Inbound"
Priority = 100
SourceAddressPrefix = "Internet"
SourcePortRange = "*"
DestinationApplicationSecurityGroupId = $webAsg.id
DestinationPortRange = 80,443
}
$webRule = New-AzNetworkSecurityRuleConfig @webRuleParams
다음 예제에서는 3389 포트를 통해 인터넷에서 asg-mgmt 애플리케이션 보안 그룹으로 가는 트래픽을 허용하는 규칙을 만듭니다.
$mgmtAsgParams = @{
Name = "asg-mgmt"
ResourceGroupName = "test-rg"
}
$mgmtAsg = Get-AzApplicationSecurityGroup @mgmtAsgParams
$mgmtRuleParams = @{
Name = "Allow-RDP-All"
Access = "Allow"
Protocol = "Tcp"
Direction = "Inbound"
Priority = 110
SourceAddressPrefix = "Internet"
SourcePortRange = "*"
DestinationApplicationSecurityGroupId = $mgmtAsg.id
DestinationPortRange = 3389
}
$mgmtRule = New-AzNetworkSecurityRuleConfig @mgmtRuleParams
Get-AzNetworkSecurityGroup 을 사용하여 기존 네트워크 보안 그룹을 검색한 다음 +=
연산자를 통해 새 규칙을 추가합니다. 마지막으로 Set-AzNetworkSecurityGroup 을 사용하여 네트워크 보안 그룹을 업데이트합니다.
# Retrieve the existing network security group
$nsg = Get-AzNetworkSecurityGroup -Name "nsg-1" -ResourceGroupName "test-rg"
# Add the new rules to the security group
$nsg.SecurityRules += $webRule
$nsg.SecurityRules += $mgmtRule
# Update the network security group with the new rules
Set-AzNetworkSecurityGroup -NetworkSecurityGroup $nsg
주의
이 문서에서 RDP(3389 포트)는 asg-mgmt 애플리케이션 보안 그룹에 할당된 VM에 대한 인터넷에 노출됩니다.
프로덕션 환경에서는 3389 포트를 인터넷에 공개하는 대신 VPN, 개인 네트워크 연결 또는 Azure Bastion을 통해 관리하려는 Azure 리소스에 연결하는 것이 좋습니다.
Azure Bastion에 대한 자세한 내용은 Azure Bastion이란? 을 참조하세요.
az network nsg rule create 를 사용하여 보안 규칙을 만듭니다. 다음 예제에서는 80 및 443 포트를 통해 인터넷에서 asg-web 애플리케이션 보안 그룹으로 가는 트래픽을 허용하는 규칙을 만듭니다.
az network nsg rule create \
--resource-group test-rg \
--nsg-name nsg-1 \
--name Allow-Web-All \
--access Allow \
--protocol Tcp \
--direction Inbound \
--priority 100 \
--source-address-prefix Internet \
--source-port-range "*" \
--destination-asgs "asg-web" \
--destination-port-range 80 443
다음 예제에서는 22 포트를 통해 인터넷에서 asg-mgmt 애플리케이션 보안 그룹으로 가는 트래픽을 허용하는 규칙을 만듭니다.
az network nsg rule create \
--resource-group test-rg \
--nsg-name nsg-1 \
--name Allow-SSH-All \
--access Allow \
--protocol Tcp \
--direction Inbound \
--priority 110 \
--source-address-prefix Internet \
--source-port-range "*" \
--destination-asgs "asg-mgmt" \
--destination-port-range 22
주의
이 문서에서 SSH(22 포트)는 asg-mgmt 애플리케이션 보안 그룹에 할당된 VM에 대한 인터넷에 노출됩니다.
프로덕션 환경에서는 22 포트를 인터넷에 공개하는 대신 VPN, 개인 네트워크 연결 또는 Azure Bastion을 통해 관리하려는 Azure 리소스에 연결하는 것이 좋습니다.
Azure Bastion에 대한 자세한 내용은 Azure Bastion이란? 을 참조하세요.
가상 머신 만들기
가상 네트워크에 두 개의 VM(가상 머신)을 만듭니다.
포털에서 가상 머신 을 검색하여 선택합니다.
가상 머신 에서 + 만들기 를 선택한 다음, +Azure 가상 머신 을 선택합니다.
가상 머신 만들기 의 기본 탭에서 다음 정보를 입력하거나 선택합니다.
설정
값
프로젝트 세부 정보
Subscription
구독을 선택합니다.
Resource group
test-rg 를 선택합니다.
인스턴스 세부 정보
가상 머신 이름
vm-web 을 입력합니다.
지역
(미국) 미국 동부 2 를 선택합니다.
가용성 옵션
기본값인 인프라 중복 필요 없음 을 그대로 둡니다.
보안 유형
표준 을 선택합니다.
이미지
Windows Server 2022 Datacenter - x64 Gen2 를 선택합니다.
Azure Spot 인스턴스
기본값을 선택하지 않은 상태로 둡니다.
크기
크기를 선택합니다.
관리자 계정
사용자 이름
사용자 이름을 입력합니다.
암호
암호를 입력합니다.
암호 확인
암호를 다시 입력합니다.
인바운드 포트 규칙
인바운드 포트 선택
없음 을 선택합니다.
다음: 디스크 를 선택하고 다음: 네트워킹 을 선택합니다.
네트워킹 탭에서 다음 정보를 입력하거나 선택합니다.
설정
값
네트워크 인터페이스
가상 네트워크
vnet-1 을 선택합니다.
서브넷
subnet-1(10.0.0.0/24) 을 선택합니다.
공용 IP
새 공용 IP(기본값)를 그대로 둡니다.
NIC 네트워크 보안 그룹 추가
없음 을 선택합니다.
검토 + 만들기 탭을 선택하거나, 페이지 아래쪽에서 파란색 검토 + 만들기 단추를 선택합니다.
만들기 를 실행합니다. VM을 배포하는 데 몇 분 정도 걸릴 수 있습니다.
이전 단계를 반복하여 vm-mgmt 라는 두 번째 가상 머신을 만듭니다.
VM을 만들기 전에 Get-AzVirtualNetwork 를 사용하여 서브넷이 있는 가상 네트워크 개체를 검색합니다.
$virtualNetworkParams = @{
Name = "vnet-1"
ResourceGroupName = "test-rg"
}
$virtualNetwork = Get-AzVirtualNetwork @virtualNetworkParams
New-AzPublicIpAddress 를 사용하여 각 VM에 대한 공용 IP 주소를 만듭니다.
$publicIpWebParams = @{
AllocationMethod = "Static"
ResourceGroupName = "test-rg"
Location = "westus2"
Name = "public-ip-vm-web"
}
$publicIpWeb = New-AzPublicIpAddress @publicIpWebParams
$publicIpMgmtParams = @{
AllocationMethod = "Static"
ResourceGroupName = "test-rg"
Location = "westus2"
Name = "public-ip-vm-mgmt"
}
$publicIpMgmt = New-AzPublicIpAddress @publicIpMgmtParams
New-AzNetworkInterface 를 통해 두 네트워크 인터페이스를 만들고 공용 IP 주소를 네트워크 인터페이스에 할당합니다. 다음 예제에서는 네트워크 인터페이스를 만들고 public-ip-vm-web 공용 IP 주소를 연결합니다.
$webNicParams = @{
Location = "westus2"
Name = "vm-web-nic"
ResourceGroupName = "test-rg"
SubnetId = $virtualNetwork.Subnets[0].Id
PublicIpAddressId = $publicIpWeb.Id
}
$webNic = New-AzNetworkInterface @webNicParams
다음 예제에서는 네트워크 인터페이스를 만들고 public-ip-vm-mgmt 공용 IP 주소를 연결합니다.
$mgmtNicParams = @{
Location = "westus2"
Name = "vm-mgmt-nic"
ResourceGroupName = "test-rg"
SubnetId = $virtualNetwork.Subnets[0].Id
PublicIpAddressId = $publicIpMgmt.Id
}
$mgmtNic = New-AzNetworkInterface @mgmtNicParams
이후 단계에서 트래픽 필터링의 유효성을 검사할 수 있도록 가상 네트워크에 두 VM을 만듭니다.
New-AzVMConfig 로 VM 구성을 만든 다음 New-AzVM 으로 VM을 만듭니다. 다음 예제에서는 웹 서버 역할을 수행하는 VM을 만듭니다. -AsJob
옵션은 다음 단계를 계속하기 위해 백그라운드에서 VM을 만듭니다.
# Create user object
$cred = Get-Credential -Message "Enter a username and password for the virtual machine."
$webVmConfigParams = @{
VMName = "vm-web"
VMSize = "Standard_DS1_V2"
}
$vmOSParams = @{
ComputerName = "vm-web"
Credential = $cred
}
$vmImageParams = @{
PublisherName = "MicrosoftWindowsServer"
Offer = "WindowsServer"
Skus = "2022-Datacenter"
Version = "latest"
}
$webVmConfig = New-AzVMConfig @webVmConfigParams | Set-AzVMOperatingSystem -Windows @vmOSParams | Set-AzVMSourceImage @vmImageParams | Add-AzVMNetworkInterface -Id $webNic.Id
$webVmParams = @{
ResourceGroupName = "test-rg"
Location = "westus2"
VM = $webVmConfig
}
New-AzVM @webVmParams -AsJob
관리 서버 역할을 하는 VM을 만듭니다.
# Create user object
$cred = Get-Credential -Message "Enter a username and password for the virtual machine."
$webVmConfigParams = @{
VMName = "vm-mgmt"
VMSize = "Standard_DS1_V2"
}
$vmOSParams = @{
ComputerName = "vm-mgmt"
Credential = $cred
}
$vmImageParams = @{
PublisherName = "MicrosoftWindowsServer"
Offer = "WindowsServer"
Skus = "2022-Datacenter"
Version = "latest"
}
$mgmtVmConfig = New-AzVMConfig @webVmConfigParams | Set-AzVMOperatingSystem -Windows @vmOSParams | Set-AzVMSourceImage @vmImageParams | Add-AzVMNetworkInterface -Id $mgmtNic.Id
$mgmtVmParams = @{
ResourceGroupName = "test-rg"
Location = "westus2"
VM = $mgmtVmConfig
}
New-AzVM @mgmtVmParams
가상 머신을 만드는 데 몇 분 정도 걸립니다. Azure에서 VM 만들기가 완료될 때까지 다음 단계를 진행하지 않습니다.
이후 단계에서 트래픽 필터링의 유효성을 검사할 수 있도록 가상 네트워크에 두 VM을 만듭니다.
az vm create 로 VM을 만듭니다. 다음 예제에서는 웹 서버 역할을 수행하는 VM을 만듭니다. Azure에서 VM을 만들 때 만든 네트워크 인터페이스에 대해 Azure가 기본 네트워크 보안 그룹을 만들지 않도록 하기 위해 --nsg ""
옵션을 지정합니다. 이 명령을 사용하면 VM의 암호를 만들라는 메시지가 표시됩니다. SSH 키는 이 문서의 이후 단계를 용이하게 하기 위해 이 예제에서 사용되지 않습니다. 프로덕션 환경에서 보안을 위해 SSH 키를 사용합니다.
az vm create \
--resource-group test-rg \
--name vm-web \
--image Ubuntu2204 \
--vnet-name vnet-1 \
--subnet subnet-1 \
--nsg "" \
--admin-username azureuser \
--authentication-type password \
--assign-identity
VM을 만드는 데 몇 분이 걸립니다. VM을 만들면 다음 예제 출력과 유사한 출력이 반환됩니다.
{
"fqdns": "",
"id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/test-rg/providers/Microsoft.Compute/virtualMachines/vm-web",
"location": "westus2",
"macAddress": "00-0D-3A-23-9A-49",
"powerState": "VM running",
"privateIpAddress": "10.0.0.4",
"publicIpAddress": "203.0.113.24",
"resourceGroup": "test-rg"
}
az vm create 로 VM을 만듭니다. 다음 예제에서는 관리 서버 역할을 수행하는 VM을 만듭니다.
다음 예제에서는 VM을 만들고 사용자 계정을 추가합니다. --generate-ssh-keys
매개 변수는 CLI가 ~/.ssh
에서 사용 가능한 ssh 키를 찾도록 합니다. 만약 하나가 발견되면 그 키가 사용됩니다. 그렇지 않은 경우, 하나가 생성되어 ~/.ssh
에 저장됩니다. 마지막으로 최신 Ubuntu 22.04
이미지를 배포합니다.
az vm create \
--resource-group test-rg \
--name vm-mgmt \
--image Ubuntu2204 \
--vnet-name vnet-1 \
--subnet subnet-1 \
--nsg "" \
--admin-username azureuser \
--generate-ssh-keys \
--assign-identity
VM을 만드는 데 몇 분이 걸립니다. Azure에서 VM 만들기가 완료될 때까지 다음 단계를 진행하지 않습니다.
네트워크 인터페이스를 ASG에 연결
VM을 만들 때 Azure는 각 VM에 대한 네트워크 인터페이스를 만들고 VM에 연결했습니다.
이전에 생성한 애플리케이션 보안 그룹 중 하나에 각 VM의 네트워크 인터페이스를 추가합니다.
포털 맨 위에 있는 검색 상자에 가상 머신 을 입력합니다. 검색 결과에서 가상 머신 을 선택한 다음 vm-web 을 선택합니다.
vm-web 의 네트워킹 섹션에서 애플리케이션 보안 그룹 을 선택합니다.
애플리케이션 보안 그룹 추가 를 선택한 다음 애플리케이션 보안 그룹 추가 탭에서 asg-web 을 선택합니다. 마지막으로 추가 를 선택합니다.
애플리케이션 보안 그룹 추가 탭에서 asg-mgmt 를 선택하여 vm-mgmt 에 대해 이전 단계를 반복합니다.
Get-AzNetworkInterface 를 사용하여 가상 머신의 네트워크 인터페이스를 검색한 다음 Get-AzApplicationSecurityGroup 을 사용하여 애플리케이션 보안 그룹을 검색 합니다. 마지막으로 Set-AzNetworkInterface 를 사용하여 애플리케이션 보안 그룹을 네트워크 인터페이스와 연결합니다. 다음 예제에서는 asg-web 애플리케이션 보안 그룹을 vm-web-nic 네트워크 인터페이스와 연결합니다.
$params1 = @{
Name = "vm-web-nic"
ResourceGroupName = "test-rg"
}
$nic = Get-AzNetworkInterface @params1
$params2 = @{
Name = "asg-web"
ResourceGroupName = "test-rg"
}
$asg = Get-AzApplicationSecurityGroup @params2
$nic.IpConfigurations[0].ApplicationSecurityGroups = @($asg)
$params3 = @{
NetworkInterface = $nic
}
Set-AzNetworkInterface @params3
이 명령을 반복하여 asg-mgmt 애플리케이션 보안 그룹을 vm-mgmt-nic 네트워크 인터페이스와 연결합니다.
$params1 = @{
Name = "vm-mgmt-nic"
ResourceGroupName = "test-rg"
}
$nic = Get-AzNetworkInterface @params1
$params2 = @{
Name = "asg-mgmt"
ResourceGroupName = "test-rg"
}
$asg = Get-AzApplicationSecurityGroup @params2
$nic.IpConfigurations[0].ApplicationSecurityGroups = @($asg)
$params3 = @{
NetworkInterface = $nic
}
Set-AzNetworkInterface @params3
az network nic update 를 사용하여 네트워크 인터페이스를 애플리케이션 보안 그룹과 연결합니다. 다음 예제에서는 asg-web 애플리케이션 보안 그룹을 vm-web-nic 네트워크 인터페이스와 연결합니다.
# Retrieve the network interface name associated with the virtual machine
nic_name=$(az vm show --resource-group test-rg --name vm-web --query 'networkProfile.networkInterfaces[0].id' -o tsv | xargs basename)
# Associate the application security group with the network interface
az network nic ip-config update \
--name ipconfigvm-web \
--nic-name $nic_name \
--resource-group test-rg \
--application-security-groups asg-web
이 명령을 반복하여 asg-mgmt 애플리케이션 보안 그룹을 vm-mgmt-nic 네트워크 인터페이스와 연결합니다.
# Retrieve the network interface name associated with the virtual machine
nic_name=$(az vm show --resource-group test-rg --name vm-mgmt --query 'networkProfile.networkInterfaces[0].id' -o tsv | xargs basename)
# Associate the application security group with the network interface
az network nic ip-config update \
--name ipconfigvm-mgmt \
--nic-name $nic_name \
--resource-group test-rg \
--application-security-groups asg-mgmt
트래픽 필터 테스트
포털 맨 위에 있는 검색 상자에 가상 머신 을 입력합니다. 검색 결과에서 가상 머신 을 선택합니다.
vm-mgmt 를 선택합니다.
개요 페이지에서 연결 단추를 선택한 다음 네이티브 RDP 를 선택합니다.
RDP 파일 다운로드 를 선택합니다.
다운로드한 rdp 파일을 열고 연결 을 선택합니다. VM을 만들 때 지정한 사용자 이름과 암호를 입력합니다.
확인 을 선택합니다.
연결 프로세스 중에 인증서 경고를 받을 수 있습니다. 경고 메시지가 표시되면 예 또는 계속 을 선택하여 연결을 계속합니다.
인터넷에서 asg-mgmt 애플리케이션 보안 그룹으로의 인바운드 트래픽이 포트 3389를 통해 허용되기 때문에 연결이 성공합니다.
vm-mgmt 에 대한 네트워크 인터페이스가 asg-mgmt 애플리케이션 보안 그룹과 연결되어 연결을 허용합니다.
vm-mgmt 에서 PowerShell 세션을 엽니다. 다음을 사용하여 vm-web 에 연결합니다.
mstsc /v:vm-web
기본적으로 동일한 네트워크의 가상 머신에서 모든 포트를 통해 서로 통신할 수 있으므로 vm-mgmt 에서 vm-web 으로의 RDP 연결이 성공합니다.
인터넷에서 vm-web 가상 머신으로의 RDP 연결을 만들 수 없습니다. asg-web 에 대한 보안 규칙은 인터넷에서 3389 포트로의 인바운드 연결을 차단합니다. 인터넷에서 모든 리소스로의 인바운드 트래픽은 기본적으로 거부됩니다.
Microsoft IIS를 vm-web 가상 머신에 설치하려면 vm-web 가상 머신의 PowerShell 세션에서 다음 명령을 입력합니다.
Install-WindowsFeature -name Web-Server -IncludeManagementTools
IIS 설치가 완료되면 vm-web 가상 머신의 연결을 끊습니다. 그러면 vm-mgmt 가상 머신 원격 데스크톱 연결이 종료됩니다.
vm-mgmt VM과의 연결을 끊습니다.
포털 검색 상자에서 vm-web 을 검색합니다.
vm-web 의 개요 페이지에서 VM의 공용 IP 주소 를 확인합니다. 다음 예에 표시된 주소는 203.0.113.103입니다. 주소가 다릅니다.
인터넷에서 vm-web 웹 서버에 액세스할 수 있는지 확인하기 위해 컴퓨터에서 인터넷 브라우저를 열고 http://<public-ip-address-from-previous-step>
(으)로 이동합니다.
IIS 기본 페이지가 표시됩니다. 인터넷에서 asg-web 애플리케이션 보안 그룹으로의 인바운드 트래픽이 포트 80을 통해 허용되기 때문입니다.
vm-web 에 연결된 네트워크 인터페이스가 asg-web 애플리케이션 보안 그룹과 연결되어 연결을 허용합니다.
Get-AzPublicIpAddress 를 사용하여 VM의 공용 IP 주소를 반환합니다. 다음 예제에서는 vm-mgmt VM의 공용 IP 주소를 반환합니다.
$params = @{
Name = "public-ip-vm-mgmt"
ResourceGroupName = "test-rg"
}
$publicIP = Get-AzPublicIpAddress @params | Select IpAddress
다음 명령을 사용하여 로컬 컴퓨터에서 vm-mgmt VM과의 원격 데스크톱 세션을 만듭니다.
mstsc /v:$publicIP
VM을 만들 때 지정한 사용자 이름과 암호를 입력(VM을 만들 때 입력한 자격 증명을 지정하기 위해 다른 옵션 선택 을 선택한 다음, 다른 계정 사용 을 선택해야 할 수도 있음)한 다음, 확인 을 선택합니다. 로그인 프로세스 중에 인증서 경고가 나타날 수 있습니다. 예 를 선택하여 연결을 진행합니다.
연결에 성공합니다. 3389 포트는 인터넷에서 asg-mgmt 애플리케이션 보안 그룹으로의 인바운드가 허용됩니다. vm-mgmt VM에 연결된 네트워크 인터페이스가 이 그룹에 있습니다.
다음 명령을 사용하여 PowerShell에서 vm-mgmt VM으로부터의 vm-web VM에 대한 원격 데스크톱 연결을 만듭니다.
mstsc /v:vm-web
각 네트워크 보안 그룹의 기본 보안 규칙에서 가상 네트워크 내 모든 IP 주소 간에 모든 포트를 경유한 트래픽을 허용하기 때문에 연결이 성공합니다. asg-web 에 대한 보안 규칙에서는 인터넷으로부터의 3389 포트 인바운드 트래픽을 허용하지 않으므로 인터넷으로부터 vm-web VM에 대한 원격 데스크톱 연결을 만들 수 없습니다.
다음 명령을 사용하여 PowerShell에서 vm-web VM에 Microsoft IIS를 설치합니다.
Install-WindowsFeature -name Web-Server -IncludeManagementTools
IIS 설치가 완료된 후 vm-web VM 연결을 끊으면 vm-mgmt VM 원격 데스크톱 연결이 종료됩니다. IIS 시작 화면을 보려면 인터넷 브라우저를 열고 http://vm-web.으로 이동합니다.
vm-mgmt VM과의 연결을 끊습니다.
컴퓨터에서 다음 PowerShell 명령을 입력하여 vm-web 서버의 공용 IP 주소를 검색합니다.
$params = @{
Name = "public-ip-vm-web"
ResourceGroupName = "test-rg"
}
Get-AzPublicIpAddress @params | Select IpAddress
Azure 외부에서 vm-web 웹 서버에 액세스할 수 있는지 확인하기 위해 컴퓨터에서 인터넷 브라우저를 열고 http://<public-ip-address-from-previous-step>
(으)로 이동합니다. 연결에 성공합니다. 80 포트는 인터넷에서 asg-web 애플리케이션 보안 그룹으로의 인바운드가 허용됩니다. vm-web VM에 연결된 네트워크 인터페이스가 이 그룹에 있습니다.
원하는 SSH 클라이언트를 사용하여 이전에 만든 VM에 연결합니다. 예를 들어 Linux용 Windows 하위 시스템 과 같은 명령줄 인터페이스에서 다음 명령을 사용하여 vm-mgmt VM으로 SSH 세션을 만들 수 있습니다. Microsoft Entra ID 자격 증명을 사용하여 가상 머신에 로그인하거나 VM을 만드는 데 사용한 SSH 키를 사용할 수 있습니다. 다음 예제에서는 SSH 키를 사용하여 관리 VM에 로그인한 다음, 암호를 사용하여 관리 VM에서 웹 VM에 로그인합니다.
Linux VM에 SSH를 연결하고 Microsoft Entra ID로 로그인하는 방법에 대한 자세한 내용은 Microsoft Entra ID 및 OpenSSH를 사용하여 Azure에서 Linux 가상 머신에 로그인 을 참조하세요.
SSH를 위해 VM의 IP 주소 저장
다음 명령을 실행하여 VM의 IP 주소를 환경 변수로 저장합니다.
export IP_ADDRESS=$(az vm show --show-details --resource-group test-rg --name vm-mgmt --query publicIps --output tsv)
ssh -o StrictHostKeyChecking=no azureuser@$IP_ADDRESS
vm-mgmt VM에 연결된 네트워크 인터페이스가 인터넷에서 22 포트 인바운드를 허용하는 asg-mgmt 애플리케이션 보안 그룹에 있으므로 연결에 성공합니다.
vm-mgmt VM에서 vm-web VM으로 SSH를 연결하려면 다음 명령을 사용합니다.
ssh -o StrictHostKeyChecking=no azureuser@vm-web
각 네트워크 보안 그룹의 기본 보안 규칙에서 가상 네트워크 내 모든 IP 주소 간에 모든 포트를 경유한 트래픽을 허용하기 때문에 연결이 성공합니다. asg-web 에 대한 보안 규칙에서는 인터넷으로부터의 22 포트 인바운드 트래픽을 허용하지 않으므로 인터넷으로부터 vm-web VM에 대한 SSH가 불가능합니다.
다음 명령을 사용하여 vm-web VM에 nginx 웹 서버를 설치합니다.
# Update package source
sudo apt-get -y update
# Install NGINX
sudo apt-get -y install nginx
기본 보안 규칙에서는 인터넷에 대한 모든 아웃바운드 트래픽을 허용하므로 vm-web VM은 nginx를 검색하기 위해 인터넷에 아웃바운드로 연결할 수 있습니다. vm-web SSH 세션을 종료합니다. 그러면 vm-mgmt VM의 username@vm-mgmt:~$
프롬프트에 남게 됩니다. vm-web VM에서 nginx 시작 화면을 검색하기 위해 다음 명령을 입력합니다.
curl vm-web
vm-mgmt VM에서 로그아웃합니다. Azure 외부에서 vm-web 웹 서버에 액세스할 수 있는지 확인하기 위해 자신의 컴퓨터에서 curl <publicIpAddress>
을(를) 입력합니다. vm-web VM에 연결된 네트워크 인터페이스가 있는 asg-web 애플리케이션 보안 그룹이 인터넷에서 80 포트 인바운드를 허용하므로 연결에 성공합니다.
만든 리소스 사용을 마치면 리소스 그룹과 해당 리소스를 모두 삭제할 수 있습니다.
Azure Portal에서 리소스 그룹 을 검색하고 선택합니다.
리소스 그룹 페이지에서 test-rg 리소스 그룹을 선택합니다.
test-rg 페이지에서 리소스 그룹 삭제 를 선택합니다.
삭제 확인을 위한 리소스 그룹 이름 입력 에 test-rg 를 입력한 다음 삭제 를 선택합니다.
더 이상 필요하지 않은 경우 Remove-AzResourceGroup 을 사용하여 리소스 그룹 및 해당 그룹에 포함된 모든 리소스를 제거할 수 있습니다.
$params = @{
Name = "test-rg"
Force = $true
}
Remove-AzResourceGroup @params
더 이상 필요하지 않은 경우 az group delete 를 사용하여 리소스 그룹 및 그룹에 포함된 모든 리소스를 제거합니다.
az group delete \
--name test-rg \
--yes \
--no-wait
다음 단계
이 자습서에서는 다음을 수행합니다.
네트워크 보안 그룹을 만들어 가상 네트워크 서브넷에 연결했습니다.
웹 및 관리를 위한 애플리케이션 보안 그룹을 만들었습니다.
두 개의 가상 머신을 만들고 해당 네트워크 인터페이스를 애플리케이션 보안 그룹과 연결했습니다.
애플리케이션 보안 그룹 네트워크 필터링을 테스트했습니다.
네트워크 보안 그룹에 대한 자세한 내용은 네트워크 보안 그룹 개요 및 네트워크 보안 그룹 관리 를 참조하세요.
기본적으로 Azure는 서브넷 간에 트래픽을 라우팅합니다. 그 대신 방화벽 역할을 하는 VM 등을 통해 서브넷 간에 트래픽을 라우팅하도록 선택할 수 있습니다.
경로 테이블을 만드는 방법을 알아보려면 다음 자습서를 진행하세요.