Udostępnij za pośrednictwem


Konfigurowanie sieciowych grup zabezpieczeń w środowisku lokalnym platformy Azure przy użyciu programu PowerShell

Dotyczy: Azure Local 2311.2 i nowsze; Windows Server 2022, Windows Server 2019, Windows Server 2016

Ten artykuł zawiera instrukcje konfigurowania grup zabezpieczeń sieciowych (NSG) w celu zarządzania przepływem ruchu danych przy użyciu zapory Datacenter dla sieci zdefiniowanej programowo (SDN) w Azure Local 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ń środowiska Windows PowerShell wyeksportowanych z modułu NetworkController . Centrum administracyjne systemu Windows umożliwia również konfigurowanie sieciowych grup zabezpieczeń i zarządzanie nimi.

Dostosuj zaporę datacenter, aby zezwalać na cały ruch

Po wdrożeniu sieci SDN należy przetestować podstawową łączność sieciową w nowym środowisku. W tym celu 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 sieciowy przychodzący i wychodzący.

Źródłowy adres IP Docelowy adres IP Protokół Port źródłowy Port docelowy Kierunek Akcja Priorytet
* * wszystkie * * Przychodzący Zezwól 100
* * wszystkie * * 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 — pozwala na przechodzenie 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 zamień <computer-name> na nazwę komputera, który obsługuje punkt końcowy REST kontrolera sieci.

Enter-PSSession <computer-name>

Następnie uruchom następujący skrypt, aby utworzyć sieciową grupę 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 poleceń programu Windows PowerShell dla kontrolera sieci znajduje się w cmdletach kontrolera sieci.

Ograniczanie ruchu w podsieci przy użyciu 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ń przydaje się do ograniczania możliwości 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 * wszystkie * * Przychodzący Zezwalaj 100
* 192.168.0.1 wszystkie * * Wychodzący Zezwól 101
192.168.0.0/24 * wszystkie * * Przychodzący Zablokowanie 102
* 192.168.0.0/24 wszystkie * * Wychodzący Zablokowanie 103
* * wszystkie * * Przychodzący Zezwalaj 104
* * wszystkie * * Wychodzący Zezwól 105

Sieciowa grupa zabezpieczeń utworzona przez poniższy przykładowy skrypt, zidentyfikowana przez identyfikator zasobu Subnet-192-168-0-0, może być teraz zastosowana do podsieci sieci wirtualnej korzystającej z adresu "192.168.0.0/24". Każdy interfejs sieciowy dołączony do tej podsieci sieci wirtualnej automatycznie ma stosowane 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 warto 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 zastosować 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ą priorytetowo wyższe niż grupy zabezpieczeń sieci wirtualnej podsieci.

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

Napiwek

Istnieje również możliwość dodania sieciowej grupy zabezpieczeń w tym samym czasie, w którym tworzysz interfejs sieciowy.

  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 grupę zabezpieczeń sieciowych, dodaną do interfejsu sieciowego.

    $acl = get-networkcontrolleraccesscontrollist -ConnectionUri $uri -ResourceId "AllowAllACL"
    
  3. Przypisz grupę zabezpieczeń sieciowych 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 grupy zabezpieczeń sieciowych powoduje zastosowanie zestawu reguł domyślnych 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 dla zapory centrum danych rejestruje dowolny przepływ przetwarzany przez reguły zapory SDN. Rejestrowane są wszystkie sieciowe grupy zabezpieczeń, które mają włączone rejestrowanie. 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 przeprowadzanie inspekcji zapory sieciowej na maszynach hostujących. Zaktualizuj zmienne na początku i uruchom to na lokalnym wystąpieniu platformy Azure z wdrożonym Kontrolerem 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 pojawi 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":"a0a0a0a0-bbbb-cccc-dddd-e1e1e1e1e1e1",
            "time":"20180719:L012620622",
            "category":"NetworkSecurityGroupFlowEvent",
            "systemId":"d8b3b697-5355-40e2-84d2-1bf2f0e0dc4a"
            },

Należy pamiętać, że rejestrowanie odbywa się tylko w przypadku reguł z ustawieniem Rejestrowanie 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: