Konfigurowanie sieciowych grup zabezpieczeń w usłudze Azure Stack HCI przy użyciu programu PowerShell

Dotyczy: Azure Stack HCI, wersje 23H2 i 22H2; Windows Server 2022, Windows Server 2019, Windows Server 2016

Ten artykuł zawiera instrukcje dotyczące konfigurowania sieciowych grup zabezpieczeń w celu zarządzania przepływem ruchu danych przy użyciu zapory centrum danych dla sieci zdefiniowanej programowo (SDN) w usłudze Azure Stack HCI przy użyciu Windows PowerShell. Zaporę centrum danych można włączyć i skonfigurować, tworząc sieciowe grupy zabezpieczeń, które są stosowane do podsieci lub interfejsu sieciowego.

Przykładowe skrypty w tym artykule używają poleceń Windows PowerShell wyeksportowanych z modułu NetworkController. Można również użyć Windows Admin Center do konfigurowania sieciowych grup zabezpieczeń i zarządzania nimi.

Konfigurowanie zapory centrum danych w celu zezwalania na cały ruch

Po wdrożeniu sieci SDN należy przetestować podstawową łączność sieciową w nowym środowisku. Aby to osiągnąć, utwórz regułę zapory centrum danych, która zezwala na cały ruch sieciowy bez ograniczeń.

Użyj wpisów w poniższej tabeli, aby utworzyć zestaw reguł, które zezwalają na cały ruch przychodzący i wychodzący.

Źródłowy adres IP Docelowy adres IP Protokół Port źródłowy Port docelowy Kierunek Akcja Priorytet
* * Wszystko * * Przychodzący Zezwalaj 100
* * Wszystko * * Wychodzący Zezwalaj 110

W tym przykładzie utworzysz sieciową grupę zabezpieczeń z dwiema regułami:

  1. AllowAll_Inbound — umożliwia przekazywanie całego ruchu sieciowego do interfejsu sieciowego, w którym skonfigurowano tę sieciową grupę zabezpieczeń.
  2. AllowAllOutbound — umożliwia przekazywanie całego ruchu z interfejsu sieciowego. Ta sieciowa grupa zabezpieczeń zidentyfikowana przez identyfikator zasobu "AllowAll-1" jest teraz gotowa do użycia w podsieciach wirtualnych i interfejsach sieciowych.

To polecenie można uruchomić z dowolnego komputera, który ma dostęp do punktu końcowego REST kontrolera sieci. Najpierw otwórz sesję programu PowerShell. W tym przykładzie użyj polecenia cmdlet Enter-PSSession i zastąp ciąg <computer-name> nazwą komputera z punktem końcowym REST kontrolera sieci.

Enter-PSSession <computer-name>

Następnie uruchom następujący skrypt, aby utworzyć sieciowa grupa zabezpieczeń:

$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>

Uwaga

Dokumentacja polecenia Windows PowerShell dla kontrolera sieci znajduje się w poleceniach cmdlet kontrolera sieci.

Ograniczanie ruchu w podsieci za pomocą sieciowych grup zabezpieczeń

W tym przykładzie utworzysz sieciową grupę zabezpieczeń, która uniemożliwia komunikację między maszynami wirtualnymi w podsieci 192.168.0.0/24. Ten typ sieciowej grupy zabezpieczeń jest przydatny w celu ograniczenia możliwości późniejszego rozprzestrzeniania się osoby atakującej w podsieci, jednocześnie umożliwiając maszynom wirtualnym odbieranie żądań spoza podsieci i komunikowanie się z innymi usługami w innych podsieciach.

Źródłowy adres IP Docelowy adres IP Protokół Port źródłowy Port docelowy Kierunek Akcja Priorytet
192.168.0.1 * Wszystko * * Przychodzący Zezwalaj 100
* 192.168.0.1 Wszystko * * Wychodzący Zezwalaj 101
192.168.0.0/24 * Wszystko * * Przychodzący Zablokowanie 102
* 192.168.0.0/24 Wszystko * * Wychodzący Zablokowanie 103
* * Wszystko * * Przychodzący Zezwalaj 104
* * Wszystko * * Wychodzący Zezwalaj 105

Sieciowa grupa zabezpieczeń utworzona przez poniższy przykładowy skrypt zidentyfikowany przez podsieć podsieci zasobu Subnet-192-168-0-0 można teraz zastosować do podsieci sieci wirtualnej używającej adresu podsieci "192.168.0.0/24". Każdy interfejs sieciowy dołączony do tej podsieci sieci wirtualnej automatycznie pobiera zastosowane powyższe reguły sieciowej grupy zabezpieczeń.

Poniżej przedstawiono przykładowy skrypt umożliwiający utworzenie tej sieciowej grupy zabezpieczeń przy użyciu interfejsu API REST kontrolera sieci:

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

Dodawanie sieciowej grupy zabezpieczeń do interfejsu sieciowego

Po utworzeniu sieciowej grupy zabezpieczeń i przypisaniu jej do podsieci wirtualnej możesz zastąpić domyślną sieciową grupę zabezpieczeń w podsieci wirtualnej z określoną sieciową grupą zabezpieczeń dla pojedynczego interfejsu sieciowego. Począwszy od systemu Windows Server 2019 Datacenter, można stosować określone sieciowe grupy zabezpieczeń bezpośrednio do interfejsów sieciowych dołączonych do sieci logicznych SDN, oprócz sieci wirtualnych SDN. Jeśli masz sieciowe grupy zabezpieczeń ustawione w podsieci wirtualnej połączonej z interfejsem sieciowym, stosowane są obie sieciowe grupy zabezpieczeń, a sieciowe grupy zabezpieczeń interfejsu sieciowego są priorytetowe powyżej sieciowych grup zabezpieczeń podsieci wirtualnej.

W tym przykładzie pokazano, jak dodać sieciową grupę zabezpieczeń do sieci wirtualnej.

Porada

Istnieje również możliwość dodania sieciowej grupy zabezpieczeń jednocześnie utworzonej przez użytkownika interfejsu sieciowego.

  1. Pobierz lub utwórz interfejs sieciowy, do którego zostanie dodana sieciowa grupa zabezpieczeń.

    $nic = get-networkcontrollernetworkinterface -ConnectionUri $uri -ResourceId "MyVM_Ethernet1"
    
  2. Pobierz lub utwórz sieciową grupę zabezpieczeń, którą dodasz do interfejsu sieciowego.

    $acl = get-networkcontrolleraccesscontrollist -ConnectionUri $uri -ResourceId "AllowAllACL"
    
  3. Przypisz sieciową grupę zabezpieczeń do właściwości AccessControlList interfejsu sieciowego.

     $nic.properties.ipconfigurations[0].properties.AccessControlList = $acl
    
  4. Dodaj interfejs sieciowy w kontrolerze sieci.

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

Usuwanie sieciowej grupy zabezpieczeń z interfejsu sieciowego

W tym przykładzie pokazano, jak usunąć sieciową grupę zabezpieczeń z interfejsu sieciowego. Usunięcie sieciowej grupy zabezpieczeń stosuje domyślny zestaw reguł do interfejsu sieciowego. Domyślny zestaw reguł zezwala na cały ruch wychodzący, ale blokuje cały ruch przychodzący. Jeśli chcesz zezwolić na cały ruch przychodzący, musisz postępować zgodnie z poprzednim przykładem , aby dodać sieciową grupę zabezpieczeń, która zezwala na cały ruch przychodzący i cały ruch wychodzący.

  1. Pobierz interfejs sieciowy, z którego usuniesz sieciową grupę zabezpieczeń.

    $nic = get-networkcontrollernetworkinterface -ConnectionUri $uri -ResourceId "MyVM_Ethernet1"
    
  2. Przypisz $null do właściwości AccessControlList obiektu ipConfiguration.

    $nic.properties.ipconfigurations[0].properties.AccessControlList = $null
    
  3. Dodaj obiekt interfejsu sieciowego w kontrolerze sieci.

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

Inspekcja zapory

Funkcja inspekcji zapory dla zapory centrum danych rejestruje dowolny przepływ przetwarzany przez reguły zapory SDN. Rejestrowane są wszystkie sieciowe grupy zabezpieczeń z włączonym rejestrowaniem. Pliki dziennika muszą być w składni zgodnej z dziennikami przepływu usługi Azure Network Watcher. Te dzienniki mogą służyć do diagnostyki lub archiwizowania na potrzeby późniejszej analizy.

Oto przykładowy skrypt umożliwiający inspekcję zapory na serwerach hosta. Zaktualizuj zmienne na początku i uruchom je w klastrze rozwiązania Azure Stack HCI przy użyciu wdrożonego kontrolera sieci :

$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
}

Po włączeniu nowego pliku pojawia się w określonym katalogu na każdym hoście około raz na godzinę. Należy okresowo przetwarzać te pliki i usuwać je z hostów. Bieżący plik ma zerową długość i jest zablokowany do momentu opróżnienia następnego znacznika godziny:

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

Te pliki zawierają sekwencję zdarzeń przepływu, na przykład:

{
    "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"
            },

Należy pamiętać, że rejestrowanie odbywa się tylko w przypadku reguł, które mają ustawienie Rejestrowanie ustawione na Włączone, na przykład:

{
    "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
                                       }
                                   ]
                   }
}

Następne kroki

Aby uzyskać powiązane informacje, zobacz: