PowerShell을 사용하여 Azure Stack HCI에서 네트워크 보안 그룹 구성

적용 대상: Azure Stack HCI, 버전 23H2 및 22H2; Windows Server 2022, Windows Server 2019, Windows Server 2016

이 문서에서는 Windows PowerShell 사용하여 Azure Stack HCI에서 SDN(소프트웨어 정의 네트워킹)용 데이터 센터 방화벽을 사용하여 데이터 트래픽 흐름을 관리하도록 NSG(네트워크 보안 그룹)를 구성하는 지침을 제공합니다. 서브넷 또는 네트워크 인터페이스에 적용되는 네트워크 보안 그룹을 만들어 데이터 센터 방화벽을 사용하도록 설정하고 구성합니다.

이 문서의 예제 스크립트는 NetworkController 모듈에서 내보낸 Windows PowerShell 명령을 사용합니다. Windows Admin Center 사용하여 네트워크 보안 그룹을 구성하고 관리할 수도 있습니다.

모든 트래픽을 허용하도록 데이터 센터 방화벽 구성

SDN을 배포한 후에는 새 환경에서 기본 네트워크 연결을 테스트해야 합니다. 이렇게 하려면 제한 없이 모든 네트워크 트래픽을 허용하는 데이터 센터 방화벽에 대한 규칙을 만듭니다.

다음 표의 항목을 사용하여 모든 인바운드 및 아웃바운드 네트워크 트래픽을 허용하는 규칙 집합을 만듭니다.

원본 IP 대상 IP 프로토콜 원본 포트 대상 포트 Direction 작업 우선 순위
* * 모두 * * 인바운드 허용 100
* * 모두 * * 아웃바운드 허용 110

이 예제에서는 두 가지 규칙을 사용하여 네트워크 보안 그룹을 만듭니다.

  1. AllowAll_Inbound - 모든 네트워크 트래픽이 이 네트워크 보안 그룹이 구성된 네트워크 인터페이스로 전달되도록 허용합니다.
  2. AllowAllOutbound - 모든 트래픽이 네트워크 인터페이스에서 전달되도록 허용합니다. 리소스 ID "AllowAll-1"로 식별된 이 네트워크 보안 그룹은 이제 가상 서브넷 및 네트워크 인터페이스에서 사용할 준비가 되었습니다.

네트워크 컨트롤러 REST 엔드포인트에 대한 액세스 권한이 있는 모든 컴퓨터에서 이 명령을 실행할 수 있습니다. 먼저 PowerShell 세션을 엽니다. 이 예제에서는 Enter-PSSession cmdlet을 사용하고 을 네트워크 컨트롤러 REST 엔드포인트가 있는 컴퓨터의 이름으로 바꿉 <computer-name> 니다.

Enter-PSSession <computer-name>

그런 다음, 다음 스크립트를 실행하여 네트워크 보안 그룹을 만듭니다.

$ruleproperties = new-object Microsoft.Windows.NetworkController.AclRuleProperties
$ruleproperties.Protocol = "All"
$ruleproperties.SourcePortRange = "0-65535"
$ruleproperties.DestinationPortRange = "0-65535"
$ruleproperties.Action = "Allow"
$ruleproperties.SourceAddressPrefix = "*"
$ruleproperties.DestinationAddressPrefix = "*"
$ruleproperties.Priority = "100"
$ruleproperties.Type = "Inbound"
$ruleproperties.Logging = "Enabled"
$aclrule1 = new-object Microsoft.Windows.NetworkController.AclRule
$aclrule1.Properties = $ruleproperties
$aclrule1.ResourceId = "AllowAll_Inbound"
$ruleproperties = new-object Microsoft.Windows.NetworkController.AclRuleProperties
$ruleproperties.Protocol = "All"
$ruleproperties.SourcePortRange = "0-65535"
$ruleproperties.DestinationPortRange = "0-65535"
$ruleproperties.Action = "Allow"
$ruleproperties.SourceAddressPrefix = "*"
$ruleproperties.DestinationAddressPrefix = "*"
$ruleproperties.Priority = "110"
$ruleproperties.Type = "Outbound"
$ruleproperties.Logging = "Enabled"
$aclrule2 = new-object Microsoft.Windows.NetworkController.AclRule
$aclrule2.Properties = $ruleproperties
$aclrule2.ResourceId = "AllowAll_Outbound"
$acllistproperties = new-object Microsoft.Windows.NetworkController.AccessControlListProperties
$acllistproperties.AclRules = @($aclrule1, $aclrule2)
New-NetworkControllerAccessControlList -ResourceId "AllowAll" -Properties $acllistproperties -ConnectionUri <NC REST FQDN>

참고

네트워크 컨트롤러에 대한 Windows PowerShell 명령 참조는 네트워크 컨트롤러 cmdlet에 있습니다.

네트워크 보안 그룹을 사용하여 서브넷의 트래픽 제한

이 예제에서는 192.168.0.0/24 서브넷 내의 VM(가상 머신)이 서로 통신하지 못하도록 하는 네트워크 보안 그룹을 만듭니다. 이 유형의 네트워크 보안 그룹은 공격자가 서브넷 내에서 횡적으로 분산되는 기능을 제한하는 동시에 VM이 서브넷 외부에서 요청을 수신하고 다른 서브넷의 다른 서비스와 통신할 수 있도록 하는 데 유용합니다.

원본 IP 대상 IP 프로토콜 원본 포트 대상 포트 Direction 작업 우선 순위
192.168.0.1 * 모두 * * 인바운드 허용 100
* 192.168.0.1 모두 * * 아웃바운드 허용 101
192.168.0.0/24 * 모두 * * 인바운드 블록 102
* 192.168.0.0/24 모두 * * 아웃바운드 차단 103
* * 모두 * * 인바운드 허용 104
* * 모두 * * 아웃바운드 허용 105

리소스 ID 서브넷-192-168-0-0으로 식별되는 아래 예제 스크립트로 만든 네트워크 보안 그룹은 이제 "192.168.0.0/24" 서브넷 주소를 사용하는 가상 네트워크 서브넷에 적용할 수 있습니다. 해당 가상 네트워크 서브넷에 연결된 모든 네트워크 인터페이스는 위의 네트워크 보안 그룹 규칙이 자동으로 적용됩니다.

다음은 네트워크 컨트롤러 REST API를 사용하여 이 네트워크 보안 그룹을 만드는 예제 스크립트입니다.

import-module networkcontroller
$ncURI = "https://mync.contoso.local"
$aclrules = @()

$ruleproperties = new-object Microsoft.Windows.NetworkController.AclRuleProperties
$ruleproperties.Protocol = "All"
$ruleproperties.SourcePortRange = "0-65535"
$ruleproperties.DestinationPortRange = "0-65535"
$ruleproperties.Action = "Allow"
$ruleproperties.SourceAddressPrefix = "192.168.0.1"
$ruleproperties.DestinationAddressPrefix = "*"
$ruleproperties.Priority = "100"
$ruleproperties.Type = "Inbound"
$ruleproperties.Logging = "Enabled"

$aclrule = new-object Microsoft.Windows.NetworkController.AclRule
$aclrule.Properties = $ruleproperties
$aclrule.ResourceId = "AllowRouter_Inbound"
$aclrules += $aclrule

$ruleproperties = new-object Microsoft.Windows.NetworkController.AclRuleProperties
$ruleproperties.Protocol = "All"
$ruleproperties.SourcePortRange = "0-65535"
$ruleproperties.DestinationPortRange = "0-65535"
$ruleproperties.Action = "Allow"
$ruleproperties.SourceAddressPrefix = "*"
$ruleproperties.DestinationAddressPrefix = "192.168.0.1"
$ruleproperties.Priority = "101"
$ruleproperties.Type = "Outbound"
$ruleproperties.Logging = "Enabled"

$aclrule = new-object Microsoft.Windows.NetworkController.AclRule
$aclrule.Properties = $ruleproperties
$aclrule.ResourceId = "AllowRouter_Outbound"
$aclrules += $aclrule

$ruleproperties = new-object Microsoft.Windows.NetworkController.AclRuleProperties
$ruleproperties.Protocol = "All"
$ruleproperties.SourcePortRange = "0-65535"
$ruleproperties.DestinationPortRange = "0-65535"
$ruleproperties.Action = "Deny"
$ruleproperties.SourceAddressPrefix = "192.168.0.0/24"
$ruleproperties.DestinationAddressPrefix = "*"
$ruleproperties.Priority = "102"
$ruleproperties.Type = "Inbound"
$ruleproperties.Logging = "Enabled"

$aclrule = new-object Microsoft.Windows.NetworkController.AclRule
$aclrule.Properties = $ruleproperties
$aclrule.ResourceId = "DenySubnet_Inbound"
$aclrules += $aclrule

$ruleproperties = new-object Microsoft.Windows.NetworkController.AclRuleProperties
$ruleproperties.Protocol = "All"
$ruleproperties.SourcePortRange = "0-65535"
$ruleproperties.DestinationPortRange = "0-65535"
$ruleproperties.Action = "Deny"
$ruleproperties.SourceAddressPrefix = "*"
$ruleproperties.DestinationAddressPrefix = "192.168.0.0/24"
$ruleproperties.Priority = "103"
$ruleproperties.Type = "Outbound"
$ruleproperties.Logging = "Enabled"

$aclrule = new-object Microsoft.Windows.NetworkController.AclRule
$aclrule.Properties = $ruleproperties
$aclrule.ResourceId = "DenySubnet_Outbound"

$ruleproperties = new-object Microsoft.Windows.NetworkController.AclRuleProperties
$ruleproperties.Protocol = "All"
$ruleproperties.SourcePortRange = "0-65535"
$ruleproperties.DestinationPortRange = "0-65535"
$ruleproperties.Action = "Allow"
$ruleproperties.SourceAddressPrefix = "*"
$ruleproperties.DestinationAddressPrefix = "*"
$ruleproperties.Priority = "104"
$ruleproperties.Type = "Inbound"
$ruleproperties.Logging = "Enabled"

$aclrule = new-object Microsoft.Windows.NetworkController.AclRule
$aclrule.Properties = $ruleproperties
$aclrule.ResourceId = "AllowAll_Inbound"
$aclrules += $aclrule

$ruleproperties = new-object Microsoft.Windows.NetworkController.AclRuleProperties
$ruleproperties.Protocol = "All"
$ruleproperties.SourcePortRange = "0-65535"
$ruleproperties.DestinationPortRange = "0-65535"
$ruleproperties.Action = "Allow"
$ruleproperties.SourceAddressPrefix = "*"
$ruleproperties.DestinationAddressPrefix = "*"
$ruleproperties.Priority = "105"
$ruleproperties.Type = "Outbound"
$ruleproperties.Logging = "Enabled"

$aclrule = new-object Microsoft.Windows.NetworkController.AclRule
$aclrule.Properties = $ruleproperties
$aclrule.ResourceId = "AllowAll_Outbound"
$aclrules += $aclrule

$acllistproperties = new-object Microsoft.Windows.NetworkController.AccessControlListProperties
$acllistproperties.AclRules = $aclrules

New-NetworkControllerAccessControlList -ResourceId "Subnet-192-168-0-0" -Properties $acllistproperties -ConnectionUri $ncURI

네트워크 인터페이스에 네트워크 보안 그룹 추가

네트워크 보안 그룹을 만들고 가상 서브넷에 할당한 후에는 개별 네트워크 인터페이스에 대한 특정 네트워크 보안 그룹을 사용하여 가상 서브넷의 기본 네트워크 보안 그룹을 재정의할 수 있습니다. Windows Server 2019 Datacenter부터 SDN 가상 네트워크 외에도 SDN 논리 네트워크에 연결된 네트워크 인터페이스에 직접 특정 네트워크 보안 그룹을 적용할 수 있습니다. 네트워크 인터페이스에 연결된 가상 서브넷에 네트워크 보안 그룹이 설정된 경우 두 네트워크 보안 그룹이 모두 적용되고 네트워크 인터페이스 네트워크 보안 그룹이 가상 서브넷 네트워크 보안 그룹보다 우선 순위가 지정됩니다.

이 예제에서는 가상 네트워크에 네트워크 보안 그룹을 추가하는 방법을 보여 줍니다.

네트워크 인터페이스를 만드는 동시에 네트워크 보안 그룹을 추가할 수도 있습니다.

  1. 네트워크 보안 그룹을 추가할 네트워크 인터페이스를 얻거나 만듭니다.

    $nic = get-networkcontrollernetworkinterface -ConnectionUri $uri -ResourceId "MyVM_Ethernet1"
    
  2. 네트워크 인터페이스에 추가할 네트워크 보안 그룹을 얻거나 만듭니다.

    $acl = get-networkcontrolleraccesscontrollist -ConnectionUri $uri -ResourceId "AllowAllACL"
    
  3. 네트워크 인터페이스의 AccessControlList 속성에 네트워크 보안 그룹을 할당합니다.

     $nic.properties.ipconfigurations[0].properties.AccessControlList = $acl
    
  4. 네트워크 컨트롤러에 네트워크 인터페이스를 추가합니다.

    new-networkcontrollernetworkinterface -ConnectionUri $uri -Properties $nic.properties -ResourceId $nic.resourceid
    

네트워크 인터페이스에서 네트워크 보안 그룹 제거

이 예제에서는 네트워크 인터페이스에서 네트워크 보안 그룹을 제거하는 방법을 보여 드립니다. 네트워크 보안 그룹을 제거하면 네트워크 인터페이스에 기본 규칙 집합이 적용됩니다. 기본 규칙 집합은 모든 아웃바운드 트래픽을 허용하지만 모든 인바운드 트래픽을 차단합니다. 모든 인바운드 트래픽을 허용하려면 이전 예제 에 따라 모든 인바운드 및 모든 아웃바운드 트래픽을 허용하는 네트워크 보안 그룹을 추가해야 합니다.

  1. 네트워크 보안 그룹을 제거할 네트워크 인터페이스를 가져옵니다.

    $nic = get-networkcontrollernetworkinterface -ConnectionUri $uri -ResourceId "MyVM_Ethernet1"
    
  2. ipConfiguration의 AccessControlList 속성에 $null 할당합니다.

    $nic.properties.ipconfigurations[0].properties.AccessControlList = $null
    
  3. 네트워크 컨트롤러에 네트워크 인터페이스 개체를 추가합니다.

    new-networkcontrollernetworkinterface -ConnectionUri $uri -Properties $nic.properties -ResourceId $nic.resourceid
    

방화벽 감사

Datacenter Firewall에 대한 방화벽 감사 기능은 SDN 방화벽 규칙에 의해 처리된 모든 흐름을 기록합니다. 로깅을 사용하도록 설정된 모든 네트워크 보안 그룹이 기록됩니다. 로그 파일은 Azure Network Watcher 흐름 로그와 일치하는 구문에 있어야 합니다. 이러한 로그는 진단 사용하거나 이후 분석을 위해 보관할 수 있습니다.

호스트 서버에서 방화벽 감사를 사용하도록 설정하는 샘플 스크립트는 다음과 같습니다. 처음에 변수를 업데이트하고 네트워크 컨트롤러 가 배포된 Azure Stack HCI 클러스터에서 실행합니다.

$logpath = "C:\test\log1"
$servers = @("sa18n22-2", "sa18n22-3", "sa18n22-4")
$uri = "https://sa18n22sdn.sa18.nttest.microsoft.com"

# Create log directories on the hosts
invoke-command -Computername $servers  {
    param(
        $Path
    )
    mkdir $path    -force
} -argumentlist $LogPath

# Set firewall auditing settings on Network Controller
$AuditProperties = new-object Microsoft.Windows.NetworkController.AuditingSettingsProperties
$AuditProperties.OutputDirectory = $logpath
set-networkcontrollerauditingsettingsconfiguration -connectionuri $uri -properties $AuditProperties -force  | out-null

# Enable logging on each server
$servers = get-networkcontrollerserver -connectionuri $uri
foreach ($s in $servers) {
    $s.properties.AuditingEnabled = @("Firewall")
    new-networkcontrollerserver -connectionuri $uri -resourceid $s.resourceid -properties $s.properties -force | out-null
}

사용하도록 설정하면 새 파일이 각 호스트의 지정된 디렉터리에 시간당 한 번 정도 표시됩니다. 이러한 파일을 주기적으로 처리하고 호스트에서 제거해야 합니다. 현재 파일의 길이는 0이며 다음 시간 표시에서 플러시될 때까지 잠깁니다.

PS C:\test\log1> dir

    Directory: C:\test\log1

Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----        7/19/2018   6:28 AM          17055 SdnFirewallAuditing.d8b3b697-5355-40e2-84d2-1bf2f0e0dc4a.20180719TL122803093.json
-a----        7/19/2018   7:28 AM           7880 SdnFirewallAuditing.d8b3b697-5355-40e2-84d2-1bf2f0e0dc4a.20180719TL132803173.json
-a----        7/19/2018   8:28 AM           7867 SdnFirewallAuditing.d8b3b697-5355-40e2-84d2-1bf2f0e0dc4a.20180719TL142803264.json
-a----        7/19/2018   9:28 AM          10949 SdnFirewallAuditing.d8b3b697-5355-40e2-84d2-1bf2f0e0dc4a.20180719TL152803360.json
-a----        7/19/2018   9:28 AM              0 SdnFirewallAuditing.d8b3b697-5355-40e2-84d2-1bf2f0e0dc4a.20180719TL162803464.json

이러한 파일에는 다음과 같은 흐름 이벤트 시퀀스가 포함되어 있습니다.

{
    "records": [
        {
            "properties":{
                "Version":"1.0",
                "flows":[
                    {
                        "flows":[
                            {
                                "flowTuples":["1531963580,192.122.0.22,192.122.255.255,138,138,U,I,A"],
                                "portId":"9",
                                "portName":"7290436D-0422-498A-8EB8-C6CF5115DACE"
                            }
                        ],
                        "rule":"Allow_Inbound"
                    }
                ]
            },
            "operationName":"NetworkSecurityGroupFlowEvents",
            "resourceId":"394f647d-2ed0-4c31-87c5-389b8c0c8132",
            "time":"20180719:L012620622",
            "category":"NetworkSecurityGroupFlowEvent",
            "systemId":"d8b3b697-5355-40e2-84d2-1bf2f0e0dc4a"
            },

로깅은 로 이 사용으로 설정된 규칙에 대해서만 수행 됩니다. 예를 들면 다음과 같습니다.

{
    "Tags":  null,
    "ResourceRef":  "/accessControlLists/AllowAll",
    "InstanceId":  "4a63e1a5-3264-4986-9a59-4e77a8b107fa",
    "Etag":  "W/\"1535a780-0fc8-4bba-a15a-093ecac9b88b\"",
    "ResourceMetadata":  null,
    "ResourceId":  "AllowAll",
    "Properties":  {
                       "ConfigurationState":  null,
                       "ProvisioningState":  "Succeeded",
                       "AclRules":  [
                                        {
                                            "ResourceMetadata":  null,
                                            "ResourceRef":  "/accessControlLists/AllowAll/aclRules/AllowAll_Inbound",
                                            "InstanceId":  "ba8710a8-0f01-422b-9038-d1f2390645d7",
                                            "Etag":  "W/\"1535a780-0fc8-4bba-a15a-093ecac9b88b\"",
                                            "ResourceId":  "AllowAll_Inbound",
                                            "Properties":  {
                                                               "Protocol":  "All",
                                                               "SourcePortRange":  "0-65535",
                                                               "DestinationPortRange":  "0-65535",
                                                               "Action":  "Allow",
                                                               "SourceAddressPrefix":  "*",
                                                               "DestinationAddressPrefix":  "*",
                                                               "Priority":  "101",
                                                               "Description":  null,
                                                               "Type":  "Inbound",
                                                               "Logging":  "Enabled",
                                                               "ProvisioningState":  "Succeeded"
                                                           }
                                        },
                                        {
                                            "ResourceMetadata":  null,
                                            "ResourceRef":  "/accessControlLists/AllowAll/aclRules/AllowAll_Outbound",
                                            "InstanceId":  "068264c6-2186-4dbc-bbe7-f504c6f47fa8",
                                            "Etag":  "W/\"1535a780-0fc8-4bba-a15a-093ecac9b88b\"",
                                            "ResourceId":  "AllowAll_Outbound",
                                            "Properties":  {
                                                               "Protocol":  "All",
                                                               "SourcePortRange":  "0-65535",
                                                               "DestinationPortRange":  "0-65535",
                                                               "Action":  "Allow",
                                                               "SourceAddressPrefix":  "*",
                                                               "DestinationAddressPrefix":  "*",
                                                               "Priority":  "110",
                                                               "Description":  null,
                                                               "Type":  "Outbound",
                                                               "Logging":  "Enabled",
                                                               "ProvisioningState":  "Succeeded"
                                                           }
                                        }
                                    ],
                       "IpConfigurations":  [

                                            ],
                       "Subnets":  [
                                       {
                                           "ResourceMetadata":  null,
                                           "ResourceRef":  "/virtualNetworks/10_0_1_0/subnets/Subnet1",
                                           "InstanceId":  "00000000-0000-0000-0000-000000000000",
                                           "Etag":  null,
                                           "ResourceId":  null,
                                           "Properties":  null
                                       }
                                   ]
                   }
}

다음 단계

관련 정보는 다음을 참조하세요.