이 문서에서는 Azure Network Watcher NSG 진단을 사용하여 네트워크 보안 그룹및 Azure Virtual Network Manager를 통해 Azure 트래픽에 적용되는 보안 규칙을 확인하고 문제를 해결하는 방법을 알아봅니다. NSG 진단은 적용된 보안 규칙에 따라 트래픽이 허용되거나 거부되는지 확인합니다.
이 문서의 예제에서는 잘못 구성된 네트워크 보안 그룹이 Azure Bastion을 사용하여 가상 머신에 연결하는 것을 방지하는 방법을 보여 줍니다.
필수 조건
활성 구독이 있는 Azure 계정.
체험 계정을 만듭니다.
Azure Cloud Shell 또는 Azure PowerShell.
이 문서의 단계에서는 Azure Cloud Shell에서 Azure PowerShell cmdlet을 대화형으로 실행합니다. Cloud Shell에서 명령을 실행하려면 코드 블록의 오른쪽 위 모서리에서 Cloud Shell을 엽니다.
복사를 선택하여 코드를 복사한 다음, 복사한 코드를 Cloud Shell에 붙여넣어 실행합니다. Azure Portal 내에서 Cloud Shell을 실행할 수도 있습니다.
Azure PowerShell을 로컬로 설치하여 cmdlet을 실행할 수도 있습니다. 이 문서에는 Az PowerShell 모듈이 필요합니다. 자세한 내용은 Azure PowerShell 설치 방법을 참조하세요. 설치되어 있는 버전을 확인하려면 Get-InstalledModule -Name Az
을 실행합니다. PowerShell을 로컬로 실행하는 경우 Connect-AzAccount cmdlet을 사용하여 Azure에 로그인합니다.
활성 구독이 있는 Azure 계정.
체험 계정을 만듭니다.
Azure Cloud Shell 또는 Azure CLI.
이 문서의 단계에서는 Azure Cloud Shell에서 대화형으로 Azure CLI 명령을 실행합니다. Cloud Shell에서 명령을 실행하려면 코드 블록의 오른쪽 위 모서리에서 Cloud Shell을 엽니다.
복사를 선택하여 코드를 복사하고 Cloud Shell에 붙여넣어 실행합니다. Azure Portal 내에서 Cloud Shell을 실행할 수도 있습니다.
Azure CLI를 로컬로 설치하여 명령을 실행할 수도 있습니다. Azure CLI를 로컬로 실행하는 경우 az login 명령을 사용하여 Azure에 로그인합니다.
가상 네트워크 및 Bastion 호스트 만들기
이 섹션에서는 두 개의 서브넷과 Azure Bastion 호스트가 있는 가상 네트워크를 만듭니다. 첫 번째 서브넷은 가상 머신에 사용되고 두 번째 서브넷은 Bastion 호스트에 사용됩니다. 또한 네트워크 보안 그룹을 만들고 첫 번째 서브넷에 적용합니다.
포털 상단에 있는 검색 상자에 가상 네트워크를 입력합니다. 검색 결과에서 가상 네트워크를 선택합니다.
+ 만들기를 선택합니다.
가상 네트워크 만들기의 기본 탭에서 다음 값을 입력하거나 선택합니다.
설정 |
값 |
프로젝트 세부 정보 |
|
구독 |
Azure 구독을 선택합니다. |
리소스 그룹 |
새로 만들기를 선택합니다.
이름에 myResourceGroup을 입력합니다.
확인을 선택합니다. |
인스턴스 세부 정보 |
|
가상 네트워크 이름 |
myVNet을 입력합니다. |
지역 |
(미국) 미국 동부를 선택합니다. |
보안 탭을 선택하거나 페이지 하단에 있는 다음 단추를 선택합니다.
Azure Bastion에서 Azure Bastion 사용을 선택하고 기본값을 적용합니다.
설정 |
값 |
Azure Bastion 호스트 이름 |
myVNet-Bastion입니다. |
Azure Bastion 공용 IP 주소 |
(신규) myVNet-bastion-publicIpAddress. |
IP 주소 탭을 선택하거나 페이지 하단에 있는 다음 단추를 선택합니다.
기본 IP 주소 공간 10.0.0.0/16을 적용하고 연필 아이콘을 선택하여 기본 서브넷을 편집합니다.
서브넷 편집 페이지에서 다음 값을 입력합니다.
설정 |
값 |
서브넷 세부 정보 |
|
이름 |
mySubnet을 입력합니다. |
보안 |
|
네트워크 보안 그룹 |
새로 만들기를 선택합니다.
이름에 mySubnet-nsg를 입력합니다.
확인을 선택합니다. |
검토 + 만들기를 선택합니다.
설정을 검토한 다음, 만들기를 선택합니다.
New-AzResourceGroup을 사용하여 리소스 그룹을 만듭니다. Azure 리소스 그룹은 Azure 리소스가 배포 및 관리되는 논리적 컨테이너입니다.
# Create a resource group.
New-AzResourceGroup -Name 'myResourceGroup' -Location 'eastus'
New-AzNetworkSecurityGroup을 사용하여 기본 네트워크 보안 그룹을 만듭니다.
# Create a network security group.
$networkSecurityGroup = New-AzNetworkSecurityGroup -Name 'mySubnet-nsg' -ResourceGroupName 'myResourceGroup' -Location 'eastus'
New-AzVirtualNetworkSubnetConfig를 사용하여 가상 머신 서브넷과 Bastion 호스트 서브넷에 대한 서브넷 구성을 만듭니다.
# Create subnets configuration.
$firstSubnet = New-AzVirtualNetworkSubnetConfig -Name 'mySubnet' -AddressPrefix '10.0.0.0/24' -NetworkSecurityGroup $networkSecurityGroup
$secondSubnet = New-AzVirtualNetworkSubnetConfig -Name 'AzureBastionSubnet' -AddressPrefix '10.0.1.0/26'
New-AzVirtualNetwork를 사용하여 가상 네트워크를 만듭니다.
# Create a virtual network.
$vnet = New-AzVirtualNetwork -Name 'myVNet' -ResourceGroupName 'myResourceGroup' -Location 'eastus' -AddressPrefix '10.0.0.0/16' -Subnet $firstSubnet, $secondSubnet
New-AzPublicIpAddress를 사용하여 Bastion 호스트에 필요한 공용 IP 주소 리소스를 만듭니다.
# Create a public IP address for Azure Bastion.
New-AzPublicIpAddress -ResourceGroupName 'myResourceGroup' -Name 'myBastionIp' -Location 'eastus' -AllocationMethod 'Static' -Sku 'Standard'
New-AzBastion을 사용하여 Bastion 호스트를 만듭니다.
# Create an Azure Bastion host.
New-AzBastion -ResourceGroupName 'myResourceGroup' -Name 'myVNet-Bastion' -PublicIpAddressRgName 'myResourceGroup' -PublicIpAddressName 'myBastionIp' -VirtualNetwork $vnet
az group create를 사용하여 리소스 그룹을 만듭니다. Azure 리소스 그룹은 Azure 리소스가 배포 및 관리되는 논리적 컨테이너입니다.
# Create a resource group.
az group create --name 'myResourceGroup' --___location 'eastus'
az network nsg create를 사용하여 네트워크 보안 그룹을 만듭니다.
# Create a network security group.
az network nsg create --name 'mySubnet-nsg' --resource-group 'myResourceGroup' --___location 'eastus'
az network vnet create를 사용하여 가상 네트워크를 만듭니다.
az network vnet create --resource-group 'myResourceGroup' --name 'myVNet' --subnet-name 'mySubnet' --subnet-prefixes 10.0.0.0/24 --network-security-group 'mySubnet-nsg'
az network vnet subnet create를 사용하여 Azure Bastion용 서브넷을 만듭니다.
# Create AzureBastionSubnet.
az network vnet subnet create --name 'AzureBastionSubnet' --resource-group 'myResourceGroup' --vnet-name 'myVNet' --address-prefixes '10.0.1.0/26'
az network public-ip create를 사용하여 Bastion 호스트용 공용 IP 주소를 만듭니다.
# Create a public IP address resource.
az network public-ip create --resource-group 'myResourceGroup' --name 'myBastionIp' --sku Standard
az network Bastion create를 사용하여 Bastion 호스트를 만듭니다.
az network bastion create --name 'myVNet-Bastion' --public-ip-address 'myBastionIp' --resource-group 'myResourceGroup' --vnet-name 'myVNet'
중요합니다
시간별 가격 책정은 아웃바운드 데이터 사용량에 관계없이 Bastion 호스트가 배포된 순간부터 시작됩니다. 자세한 내용은 가격 책정을 참조하세요. 사용이 완료되면 이 리소스를 삭제하는 것이 좋습니다.
가상 머신 만들기
이 섹션에서는 가상 머신과 네트워크 인터페이스에 적용된 네트워크 보안 그룹을 만듭니다.
포털 상단의 검색 상자에 가상 머신을 입력합니다. 검색 결과에서 가상 머신을 선택합니다.
만들기를 선택한 다음, Azure 가상 머신을 선택합니다.
가상 머신 만들기의 기본 탭에서 다음 값을 입력하거나 선택합니다.
설정 |
값 |
프로젝트 세부 정보 |
|
구독 |
Azure 구독을 선택합니다. |
리소스 그룹 |
myResourceGroup을 선택합니다. |
인스턴스 세부 정보 |
|
가상 머신 이름 |
myVM을 입력합니다. |
지역 |
(미국) 미국 동부를 선택합니다. |
가용성 옵션 |
인프라 중복이 필요하지 않습니다.를 선택합니다. |
보안 유형 |
표준을 선택합니다. |
이미지 |
Windows Server 2022 Datacenter: Azure Edition - x64 Gen2를 선택합니다. |
크기 |
크기를 선택하거나 기본 설정을 그대로 둡니다. |
관리자 계정 |
|
사용자 이름 |
사용자 이름을 입력합니다. |
암호 |
암호를 입력합니다. |
암호 확인 |
암호를 다시 입력합니다. |
네트워킹 탭을 선택하거나 다음: 디스크, 다음: 네트워킹을 차례로 선택합니다.
[네트워킹] 탭에서 다음 값을 선택합니다.
설정 |
값 |
네트워크 인터페이스 |
|
가상 네트워크 |
myVNet을 선택합니다. |
서브넷 |
기본값을 선택합니다. |
공용 IP |
없음을 선택합니다. |
NIC 네트워크 보안 그룹 추가 |
기본을 선택합니다. |
공용 인바운드 포트 |
없음을 선택합니다. |
검토 + 만들기를 선택합니다.
설정을 검토한 다음, 만들기를 선택합니다.
New-AzNetworkSecurityGroup을 사용하여 기본 네트워크 보안 그룹을 만듭니다.
# Create a default network security group.
New-AzNetworkSecurityGroup -Name 'myVM-nsg' -ResourceGroupName 'myResourceGroup' -Location eastus
New-AzVM을 사용하여 가상 머신을 만듭니다. 메시지가 표시되면 사용자 이름과 암호를 입력합니다.
# Create a virtual machine using the latest Windows Server 2022 image.
New-AzVm -ResourceGroupName 'myResourceGroup' -Name 'myVM' -Location 'eastus' -VirtualNetworkName 'myVNet' -SubnetName 'mySubnet' -SecurityGroupName 'myVM-nsg' -ImageName 'MicrosoftWindowsServer:WindowsServer:2022-Datacenter-azure-edition:latest'
az network nsg create를 사용하여 네트워크 보안 그룹을 만듭니다.
# Create a default network security group.
az network nsg create --name 'myVM-nsg' --resource-group 'myResourceGroup' --___location 'eastus'
az vm create를 사용하여 가상 머신을 만듭니다. 메시지가 표시되면 사용자 이름과 암호를 입력합니다.
# Create a virtual machine using the latest Windows Server 2022 image.
az vm create --resource-group 'myResourceGroup' --name 'myVM' --___location 'eastus' --vnet-name 'myVNet' --subnet 'mySubnet' --public-ip-address '' --nsg 'myVM-nsg' --image 'Win2022AzureEditionCore'
네트워크 보안 그룹에 보안 규칙 추가
이 섹션에서는 myVM의 네트워크 인터페이스와 연결된 네트워크 보안 그룹에 보안 규칙을 추가합니다. 규칙은 가상 네트워크의 인바운드 트래픽을 거부합니다.
포털 맨 위에 있는 검색 상자에 네트워크 보안 그룹을 입력합니다. 검색 결과에서 네트워크 보안 그룹을 선택합니다.
네트워크 보안 그룹 목록에서 myVM-nsg를 선택합니다.
설정 아래에서 인바운드 보안 규칙을 선택합니다.
+ 추가를 선택합니다. 네트워킹 탭에서 다음 값을 입력하거나 선택합니다.
설정 |
값 |
원본 |
서비스 태그를 선택합니다. |
원본 서비스 태그 |
VirtualNetwork를 선택합니다. |
원본 포트 범위 |
*를 입력합니다. |
대상 |
모두를 선택합니다. |
서비스 |
사용자 지정을 선택합니다. |
대상 포트 범위 |
*를 입력합니다. |
프로토콜 |
모두를 선택합니다. |
작업 |
거부를 선택합니다. |
우선 순위 |
1000을 입력합니다. |
이름 |
DenyVnetInBound를 입력합니다. |
추가를 선택합니다.
Add-AzNetworkSecurityRuleConfig를 사용하여 가상 네트워크의 트래픽을 거부하는 보안 규칙을 만듭니다. 그런 다음, Set-AzNetworkSecurityGroup을 사용하여 네트워크 보안 그룹을 새 보안 규칙으로 업데이트합니다.
# Place the network security group configuration into a variable.
$networkSecurityGroup = Get-AzNetworkSecurityGroup -Name 'myVM-nsg' -ResourceGroupName 'myResourceGroup'
# Create a security rule that denies inbound traffic from the virtual network service tag.
Add-AzNetworkSecurityRuleConfig -Name 'DenyVnetInBound' -NetworkSecurityGroup $networkSecurityGroup `
-Access 'Deny' -Protocol '*' -Direction 'Inbound' -Priority '1000' `
-SourceAddressPrefix 'virtualNetwork' -SourcePortRange '*' -DestinationAddressPrefix '*' -DestinationPortRange '*'
# Updates the network security group.
Set-AzNetworkSecurityGroup -NetworkSecurityGroup $networkSecurityGroup
az network nsg rule create를 사용하여 네트워크 보안 그룹에 가상 네트워크의 트래픽을 거부하는 보안 규칙을 추가합니다.
# Add to the network security group a security rule that denies inbound traffic from the virtual network service tag.
az network nsg rule create --name 'DenyVnetInBound' --resource-group 'myResourceGroup' --nsg-name 'myVM-nsg' --priority '1000' \
--access 'Deny' --protocol '*' --direction 'Inbound' --source-address-prefixes 'virtualNetwork' --source-port-ranges '*' \
--destination-address-prefixes '*' --destination-port-ranges '*'
참고 항목
VirtualNetwork 서비스 태그는 가상 네트워크의 주소 공간, 연결된 모든 온-프레미스 주소 공간, 피어링된 가상 네트워크, 가상 네트워크 게이트웨이에 연결된 가상 네트워크, 호스트의 IP 주소 및 사용자 정의 경로에 사용되는주소 접두사를 나타냅니다. 자세한 내용은 서비스 태그를 참조하세요.
가상 머신 트래픽에 적용되는 보안 규칙 확인
NSG 진단을 사용하여 Bastion 서브넷에서 가상 머신으로 시작된 트래픽에 적용되는 보안 규칙을 확인합니다.
포털 상단의 검색 상자에서 Network Watcher를 검색하여 선택합니다.
네트워크 진단 도구에서 NSG 진단을 선택합니다.
NSG 진단 페이지에서 다음 값을 입력하거나 선택합니다.
설정 |
값 |
대상 리소스 |
|
대상 리소스 종류 |
가상 머신을 선택합니다. |
가상 머신 |
myVM 가상 머신을 선택합니다. |
트래픽 세부 정보 |
|
프로토콜 |
TCP를 선택합니다. 다른 사용 가능한 옵션은 Any, UDP 및 ICMP입니다. |
방향 |
인바운드를 선택합니다. 사용 가능한 다른 옵션은 아웃바운드입니다. |
소스 형식 |
IPv4 주소/CIDR을 선택합니다. 사용 가능한 다른 옵션은 서비스 태그입니다. |
IPv4 주소/CIDR |
Bastion 서브넷의 IP 주소 범위인 10.0.1.0/26을 입력합니다. 허용되는 값은 단일 IP 주소, 여러 IP 주소, 단일 IP 접두사, 여러 IP 접두사입니다. |
대상 IP 주소 |
myVM의 IP 주소인 10.0.0.4 기본값을 그대로 둡니다. |
대상 포트 |
*를 입력하여 모든 포트를 포함합니다. |
NSG 진단 실행을 선택하여 테스트를 실행합니다. NSG 진단이 모든 보안 규칙 확인을 완료하면 결과가 표시됩니다.
결과는 Bastion 서브넷의 인바운드 연결에 대해 평가된 세 가지 보안 규칙이 있음을 보여 줍니다.
-
GlobalRules: 이 보안 관리자 규칙은 Azure Virtual Network 관리를 사용하여 가상 네트워크 수준에서 적용됩니다. 규칙은 Bastion 서브넷에서 가상 머신으로의 인바운드 TCP 트래픽을 허용합니다.
-
mySubnet-nsg: 이 네트워크 보안 그룹은 서브넷 수준(가상 머신의 서브넷)에 적용됩니다. 규칙은 Bastion 서브넷에서 가상 머신으로의 인바운드 TCP 트래픽을 허용합니다.
-
myVM-nsg: 이 네트워크 보안 그룹은 NIC(네트워크 인터페이스) 수준에서 적용됩니다. 규칙은 Bastion 서브넷에서 가상 머신으로의 인바운드 TCP 트래픽을 거부합니다.
myVM-nsg의 세부 정보 보기를 선택하여 이 네트워크 보안 그룹에 있는 보안 규칙과 트래픽을 거부하는 규칙에 대한 세부 정보를 확인합니다.
myVM-nsg 네트워크 보안 그룹에서 보안 규칙 DenyVnetInBound는 VirtualNetwork 서비스 태그의 주소 공간에서 가상 머신으로 들어오는 트래픽을 거부합니다. Bastion 호스트는 VirtualNetwork 서비스 태그에 포함된 주소 범위 10.0.1.0/26의 IP 주소를 사용하여 가상 머신에 연결합니다. 따라서 Bastion 호스트의 연결은 DenyVnetInBound 보안 규칙에 의해 거부됩니다.
Invoke-AzNetworkWatcherNetworkConfigurationDiagnostic을 사용하여 NSG 진단 세션을 시작합니다.
# Create a profile for the diagnostic session.
$profile = New-AzNetworkWatcherNetworkConfigurationDiagnosticProfile -Direction Inbound -Protocol Tcp -Source 10.0.1.0/26 -Destination 10.0.0.4 -DestinationPort *
# Place the virtual machine configuration into a variable.
$vm = Get-AzVM -Name 'myVM' -ResourceGroupName 'myResourceGroup'
# Start the the NSG diagnostics session.
Invoke-AzNetworkWatcherNetworkConfigurationDiagnostic -Location 'eastus' -TargetResourceId $vm.Id -Profile $profile | Format-List
다음 예제 출력과 유사한 출력이 반환됩니다.
Results : {Microsoft.Azure.Commands.Network.Models.PSNetworkConfigurationDiagnosticResult}
ResultsText : [
{
"Profile": {
"Direction": "Inbound",
"Protocol": "Tcp",
"Source": "10.0.1.0/26",
"Destination": "10.0.0.4",
"DestinationPort": "*"
},
"NetworkSecurityGroupResult": {
"SecurityRuleAccessResult": "Deny",
"EvaluatedNetworkSecurityGroups": [
{
"NetworkSecurityGroupId": "/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/NetworkAdmin/providers/Microsoft.Network/networkManagers/GlobalRules",
"MatchedRule": {
"RuleName": "VirtualNetwork",
"Action": "Allow"
},
"RulesEvaluationResult": [
{
"Name": "VirtualNetwork",
"ProtocolMatched": true,
"SourceMatched": true,
"SourcePortMatched": true,
"DestinationMatched": true,
"DestinationPortMatched": true
}
]
},
{
"NetworkSecurityGroupId": "/subscriptions/bbbb1b1b-cc2c-dd3d-ee4e-ffffff5f5f5f/resourceGroups/myResourceGroup/providers/Microsoft.Network/networkSecurityGroups/mySubnet-nsg",
"MatchedRule": {
"RuleName": "DefaultRule_AllowVnetInBound",
"Action": "Allow"
},
"RulesEvaluationResult": [
{
"Name": "DefaultRule_AllowVnetInBound",
"ProtocolMatched": true,
"SourceMatched": true,
"SourcePortMatched": true,
"DestinationMatched": true,
"DestinationPortMatched": true
}
]
},
{
"NetworkSecurityGroupId": "/subscriptions/bbbb1b1b-cc2c-dd3d-ee4e-ffffff5f5f5f/resourceGroups/myResourceGroup/providers/Microsoft.Network/networkSecurityGroups/myVM-nsg",
"MatchedRule": {
"RuleName": "UserRule_DenyVnetInBound",
"Action": "Deny"
},
"RulesEvaluationResult": [
{
"Name": "UserRule_DenyVnetInBound",
"ProtocolMatched": true,
"SourceMatched": true,
"SourcePortMatched": true,
"DestinationMatched": true,
"DestinationPortMatched": true
}
]
}
]
}
}
]
결과는 Bastion 서브넷의 인바운드 연결에 대해 평가된 세 가지 보안 규칙이 있음을 보여 줍니다.
-
GlobalRules: 이 보안 관리자 규칙은 Azure Virtual Network 관리를 사용하여 가상 네트워크 수준에서 적용됩니다. 규칙은 Bastion 서브넷에서 가상 머신으로의 인바운드 TCP 트래픽을 허용합니다.
-
mySubnet-nsg: 이 네트워크 보안 그룹은 서브넷 수준(가상 머신의 서브넷)에 적용됩니다. 규칙은 Bastion 서브넷에서 가상 머신으로의 인바운드 TCP 트래픽을 허용합니다.
-
myVM-nsg: 이 네트워크 보안 그룹은 NIC(네트워크 인터페이스) 수준에서 적용됩니다. 규칙은 Bastion 서브넷에서 가상 머신으로의 인바운드 TCP 트래픽을 거부합니다.
myVM-nsg 네트워크 보안 그룹에서 보안 규칙 DenyVnetInBound는 VirtualNetwork 서비스 태그의 주소 공간에서 가상 머신으로 들어오는 트래픽을 거부합니다. Bastion 호스트는 VirtualNetwork 서비스 태그가 포함된 10.0.1.0/26의 IP 주소를 사용하여 가상 머신에 연결합니다. 따라서 Bastion 호스트의 연결은 DenyVnetInBound 보안 규칙에 의해 거부됩니다.
az network watcher run-configuration-diagnostic을 사용하여 NSG 진단 세션을 시작합니다.
# Start the the NSG diagnostics session.
az network watcher run-configuration-diagnostic --resource 'myVM' --resource-group 'myResourceGroup' --resource-type 'virtualMachines' --direction 'Inbound' --protocol 'TCP' --source '10.0.1.0/26' --destination '10.0.0.4' --port '*'
다음 예제 출력과 유사한 출력이 반환됩니다.
{
"results": [
{
"networkSecurityGroupResult": {
"evaluatedNetworkSecurityGroups": [
{
"appliedTo": "/subscriptions/bbbb1b1b-cc2c-dd3d-ee4e-ffffff5f5f5f/resourceGroups/myResourceGroup/providers/Microsoft.Network/virtualNetworks/myVNet",
"matchedRule": {
"action": "Allow",
"ruleName": "VirtualNetwork"
},
"networkSecurityGroupId": "/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/NetworkAdmin/providers/Microsoft.Network/networkManagers/GlobalRules",
"rulesEvaluationResult": [
{
"destinationMatched": true,
"destinationPortMatched": true,
"name": "VirtualNetwork",
"protocolMatched": true,
"sourceMatched": true,
"sourcePortMatched": true
}
]
},
{
"appliedTo": "/subscriptions/bbbb1b1b-cc2c-dd3d-ee4e-ffffff5f5f5f/resourceGroups/myResourceGroup/providers/Microsoft.Network/virtualNetworks/myVNet/subnets/mySubnet",
"matchedRule": {
"action": "Allow",
"ruleName": "DefaultRule_AllowVnetInBound"
},
"networkSecurityGroupId": "/subscriptions/bbbb1b1b-cc2c-dd3d-ee4e-ffffff5f5f5f/resourceGroups/myResourceGroup/providers/Microsoft.Network/networkSecurityGroups/mySubnet-nsg",
"rulesEvaluationResult": [
{
"destinationMatched": true,
"destinationPortMatched": true,
"name": "DefaultRule_AllowVnetInBound",
"protocolMatched": true,
"sourceMatched": true,
"sourcePortMatched": true
}
]
},
{
"appliedTo": "/subscriptions/bbbb1b1b-cc2c-dd3d-ee4e-ffffff5f5f5f/resourceGroups/myResourceGroup/providers/Microsoft.Network/networkInterfaces/myvm36",
"matchedRule": {
"action": "Deny",
"ruleName": "UserRule_DenyVnetInBound"
},
"networkSecurityGroupId": "/subscriptions/bbbb1b1b-cc2c-dd3d-ee4e-ffffff5f5f5f/resourceGroups/myResourceGroup/providers/Microsoft.Network/networkSecurityGroups/myVM-nsg",
"rulesEvaluationResult": [
{
"destinationMatched": true,
"destinationPortMatched": true,
"name": "UserRule_DenyVnetInBound",
"protocolMatched": true,
"sourceMatched": true,
"sourcePortMatched": true
}
]
}
],
"securityRuleAccessResult": "Deny"
},
"profile": {
"destination": "10.0.0.4",
"destinationPort": "*",
"direction": "Inbound",
"protocol": "TCP",
"source": "10.0.1.0/26"
}
}
]
}
결과는 Bastion 서브넷의 인바운드 연결에 대해 평가된 세 가지 보안 규칙이 있음을 보여 줍니다.
-
GlobalRules: 이 보안 관리자 규칙은 Azure Virtual Network 관리를 사용하여 가상 네트워크 수준에서 적용됩니다. 규칙은 Bastion 서브넷에서 가상 머신으로의 인바운드 TCP 트래픽을 허용합니다.
-
mySubnet-nsg: 이 네트워크 보안 그룹은 서브넷 수준(가상 머신의 서브넷)에 적용됩니다. 규칙은 Bastion 서브넷에서 가상 머신으로의 인바운드 TCP 트래픽을 허용합니다.
-
myVM-nsg: 이 네트워크 보안 그룹은 NIC(네트워크 인터페이스) 수준에서 적용됩니다. 규칙은 Bastion 서브넷에서 가상 머신으로의 인바운드 TCP 트래픽을 거부합니다.
myVM-nsg 네트워크 보안 그룹에서 보안 규칙 DenyVnetInBound는 VirtualNetwork 서비스 태그의 주소 공간에서 가상 머신으로 들어오는 트래픽을 거부합니다. Bastion 호스트는 VirtualNetwork 서비스 태그가 포함된 10.0.1.0/26의 IP 주소를 사용하여 가상 머신에 연결합니다. 따라서 Bastion 호스트의 연결은 DenyVnetInBound 보안 규칙에 의해 거부됩니다.
Bastion 서브넷의 트래픽을 허용하는 보안 규칙 추가
Azure Bastion을 사용하여 myVM에 연결하려면 네트워크 보안 그룹에서 Bastion 서브넷의 트래픽을 허용해야 합니다.
10.0.1.0/26의 트래픽을 허용하려면 DenyVnetInBound 규칙보다 우선 순위가 높은(낮은 우선 순위 번호) 보안 규칙을 추가하거나 DenyVnetInBound 규칙을 편집하여 Bastion 서브넷의 트래픽을 허용합니다.
가상 머신에 대한 트래픽을 거부하는 보안 규칙에 대한 세부 정보를 보여 주는 Network Watcher 페이지에서 네트워크 보안 그룹에 보안 규칙을 추가할 수 있습니다.
Network Watcher 내에서 보안 규칙을 추가하려면 + 보안 규칙 추가를 선택한 후, 다음 값을 입력하거나 선택합니다.
설정 |
값 |
원본 |
IP 주소를 선택합니다. |
원본 IP 주소/CIDR 범위 |
Bastion 서브넷의 IP 주소 범위인 10.0.1.0/26을 입력합니다. |
원본 포트 범위 |
*를 입력합니다. |
대상 |
모두를 선택합니다. |
서비스 |
사용자 지정을 선택합니다. |
대상 포트 범위 |
*를 입력합니다. |
프로토콜 |
모두를 선택합니다. |
작업 |
수락을 선택합니다. |
우선 순위 |
DenyVnetInBound 규칙에 사용되는 1000보다 높은 우선 순위인 900을 입력합니다. |
이름 |
AllowBastionConnections를 입력합니다. |
다시 확인을 선택하여 진단 세션을 다시 실행합니다. 이제 진단 세션에 Bastion 서브넷의 트래픽이 허용됨이 표시됩니다.
보안 규칙 AllowBastionConnections는 10.0.1.0/26의 모든 IP 주소에서 가상 머신으로의 트래픽을 허용합니다. Bastion 호스트는 10.0.1.0/26의 IP 주소를 사용하므로 가상 머신에 대한 연결은 AllowBastionConnections 보안 규칙에 따라 허용됩니다.
Add-AzNetworkSecurityRuleConfig를 사용하여 Bastion 서브넷의 트래픽을 허용하는 보안 규칙을 만듭니다. 그런 다음, Set-AzNetworkSecurityGroup을 사용하여 네트워크 보안 그룹을 새 보안 규칙으로 업데이트합니다.
# Place the network security group configuration into a variable.
$networkSecurityGroup = Get-AzNetworkSecurityGroup -Name 'myVM-nsg' -ResourceGroupName 'myResourceGroup'
# Create a security rule.
Add-AzNetworkSecurityRuleConfig -Name 'AllowBastionConnections' -NetworkSecurityGroup $networkSecurityGroup -Priority '900' -Access 'Allow' `
-Protocol '*' -Direction 'Inbound' -SourceAddressPrefix '10.0.1.0/26' -SourcePortRange '*' -DestinationAddressPrefix '*' -DestinationPortRange '*'
# Updates the network security group.
Set-AzNetworkSecurityGroup -NetworkSecurityGroup $networkSecurityGroup
Invoke-AzNetworkWatcherNetworkConfigurationDiagnostic을 사용하여 새 NSG 진단 세션을 통해 다시 확인합니다.
# Create a profile for the diagnostic session.
$profile = New-AzNetworkWatcherNetworkConfigurationDiagnosticProfile -Direction 'Inbound' -Protocol 'Tcp' -Source '10.0.1.0/26' -Destination '10.0.0.4' -DestinationPort '*'
# Place the virtual machine configuration into a variable.
$vm = Get-AzVM -Name 'myVM' -ResourceGroupName 'myResourceGroup'
# Start the diagnostic session.
Invoke-AzNetworkWatcherNetworkConfigurationDiagnostic -Location 'eastus' -TargetResourceId $vm.Id -Profile $profile | Format-List
다음 예제 출력과 유사한 출력이 반환됩니다.
Results : {Microsoft.Azure.Commands.Network.Models.PSNetworkConfigurationDiagnosticResult}
ResultsText : [
{
"Profile": {
"Direction": "Inbound",
"Protocol": "Tcp",
"Source": "10.0.1.0/26",
"Destination": "10.0.0.4",
"DestinationPort": "*"
},
"NetworkSecurityGroupResult": {
"SecurityRuleAccessResult": "Allow",
"EvaluatedNetworkSecurityGroups": [
{
"NetworkSecurityGroupId": "/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/NetworkAdmin/providers/Microsoft.Network/networkManagers/GlobalRules",
"MatchedRule": {
"RuleName": "VirtualNetwork",
"Action": "Allow"
},
"RulesEvaluationResult": [
{
"Name": "VirtualNetwork",
"ProtocolMatched": true,
"SourceMatched": true,
"SourcePortMatched": true,
"DestinationMatched": true,
"DestinationPortMatched": true
}
]
},
{
"NetworkSecurityGroupId": "/subscriptions/bbbb1b1b-cc2c-dd3d-ee4e-ffffff5f5f5f/resourceGroups/myResourceGroup/providers/Microsoft.Network/networkSecurityGroups/mySubnet-nsg",
"MatchedRule": {
"RuleName": "DefaultRule_AllowVnetInBound",
"Action": "Allow"
},
"RulesEvaluationResult": [
{
"Name": "DefaultRule_AllowVnetInBound",
"ProtocolMatched": true,
"SourceMatched": true,
"SourcePortMatched": true,
"DestinationMatched": true,
"DestinationPortMatched": true
}
]
},
{
"NetworkSecurityGroupId": "/subscriptions/bbbb1b1b-cc2c-dd3d-ee4e-ffffff5f5f5f/resourceGroups/myResourceGroup/providers/Microsoft.Network/networkSecurityGroups/myVM-nsg",
"MatchedRule": {
"RuleName": "UserRule_AllowBastionConnections",
"Action": "Allow"
},
"RulesEvaluationResult": [
{
"Name": "UserRule_AllowBastionConnections",
"ProtocolMatched": true,
"SourceMatched": true,
"SourcePortMatched": true,
"DestinationMatched": true,
"DestinationPortMatched": true
}
]
}
]
}
}
]
보안 규칙 AllowBastionConnections는 10.0.1.0/26의 모든 IP 주소에서 가상 머신으로의 트래픽을 허용합니다. Bastion 호스트는 10.0.1.0/26의 IP 주소를 사용하므로 가상 머신에 대한 연결은 AllowBastionConnections 보안 규칙에 따라 허용됩니다.
az network nsg rule create를 사용하여 Bastion 서브넷의 트래픽을 허용하는 보안 규칙을 네트워크 보안 그룹에 추가합니다.
# Add a security rule to the network security group.
az network nsg rule create --name 'AllowBastionConnections' --resource-group 'myResourceGroup' --nsg-name 'myVM-nsg' --priority '900' \
--access 'Allow' --protocol '*' --direction 'Inbound' --source-address-prefixes '10.0.1.0/26' --source-port-ranges '*' \
--destination-address-prefixes '*' --destination-port-ranges '*'
az network watcher run-configuration-diagnostic을 사용하여 새 NSG 진단 세션을 통해 다시 확인합니다.
# Start the the NSG diagnostics session.
az network watcher run-configuration-diagnostic --resource 'myVM' --resource-group 'myResourceGroup' --resource-type 'virtualMachines' --direction 'Inbound' --protocol 'TCP' --source '10.0.1.0/26' --destination '10.0.0.4' --port '*'
다음 예제 출력과 유사한 출력이 반환됩니다.
{
"results": [
{
"networkSecurityGroupResult": {
"evaluatedNetworkSecurityGroups": [
{
"appliedTo": "/subscriptions/bbbb1b1b-cc2c-dd3d-ee4e-ffffff5f5f5f/resourceGroups/myResourceGroup/providers/Microsoft.Network/virtualNetworks/myVNet",
"matchedRule": {
"action": "Allow",
"ruleName": "VirtualNetwork"
},
"networkSecurityGroupId": "/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/NetworkAdmin/providers/Microsoft.Network/networkManagers/GlobalRules",
"rulesEvaluationResult": [
{
"destinationMatched": true,
"destinationPortMatched": true,
"name": "VirtualNetwork",
"protocolMatched": true,
"sourceMatched": true,
"sourcePortMatched": true
}
]
},
{
"appliedTo": "/subscriptions/bbbb1b1b-cc2c-dd3d-ee4e-ffffff5f5f5f/resourceGroups/myResourceGroup/providers/Microsoft.Network/virtualNetworks/myVNet/subnets/mySubnet",
"matchedRule": {
"action": "Allow",
"ruleName": "DefaultRule_AllowVnetInBound"
},
"networkSecurityGroupId": "/subscriptions/bbbb1b1b-cc2c-dd3d-ee4e-ffffff5f5f5f/resourceGroups/myResourceGroup/providers/Microsoft.Network/networkSecurityGroups/mySubnet-nsg",
"rulesEvaluationResult": [
{
"destinationMatched": true,
"destinationPortMatched": true,
"name": "DefaultRule_AllowVnetInBound",
"protocolMatched": true,
"sourceMatched": true,
"sourcePortMatched": true
}
]
},
{
"appliedTo": "/subscriptions/bbbb1b1b-cc2c-dd3d-ee4e-ffffff5f5f5f/resourceGroups/myResourceGroup/providers/Microsoft.Network/networkInterfaces/myvm36",
"matchedRule": {
"action": "Allow",
"ruleName": "UserRule_AllowBastionConnections"
},
"networkSecurityGroupId": "/subscriptions/bbbb1b1b-cc2c-dd3d-ee4e-ffffff5f5f5f/resourceGroups/myResourceGroup/providers/Microsoft.Network/networkSecurityGroups/myVM-nsg",
"rulesEvaluationResult": [
{
"destinationMatched": true,
"destinationPortMatched": true,
"name": "UserRule_AllowBastionConnections",
"protocolMatched": true,
"sourceMatched": true,
"sourcePortMatched": true
}
]
}
],
"securityRuleAccessResult": "Allow"
},
"profile": {
"destination": "10.0.0.4",
"destinationPort": "*",
"direction": "Inbound",
"protocol": "TCP",
"source": "10.0.1.0/26"
}
}
]
}
보안 규칙 AllowBastionConnections는 10.0.1.0/26의 모든 IP 주소에서 가상 머신으로의 트래픽을 허용합니다. Bastion 호스트는 10.0.1.0/26의 IP 주소를 사용하므로 가상 머신에 대한 연결은 AllowBastionConnections 보안 규칙에 따라 허용됩니다.
리소스 정리
더 이상 필요하지 않은 경우 리소스 그룹 및 해당 그룹에 포함된 모든 리소스를 삭제합니다.
포털 맨 위에 있는 검색 상자에 myResourceGroup을 입력합니다. 검색 결과에서 myResourceGroup을 선택합니다.
리소스 그룹 삭제를 선택합니다.
리소스 그룹 삭제에 myResourceGroup을 입력한 다음, 삭제를 선택합니다.
삭제를 선택하여 리소스 그룹 및 리소스 그룹의 모든 리소스의 삭제를 확인합니다.
Remove-AzResourceGroup을 사용하여 리소스 그룹과 그룹에 포함된 모든 리소스를 삭제합니다.
# Delete the resource group and all the resources it contains.
Remove-AzResourceGroup -Name 'myResourceGroup' -Force
az group delete를 사용하여 리소스 그룹 및 그룹에 포함된 모든 리소스를 제거합니다.
# Delete the resource group and all the resources it contains.
az group delete --name 'myResourceGroup' --yes --no-wait
관련 콘텐츠