Konfigurowanie sieciowych grup zabezpieczeń w środowisku lokalnym platformy Azure przy użyciu programu PowerShell
Dotyczy: Azure Local, 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 Local przy użyciu programu 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.
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. 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 | Zezwalaj | 100 |
* | * | wszystkie | * | * | Wychodzący | Zezwalaj | 110 |
W tym przykładzie utworzysz sieciową grupę zabezpieczeń z dwiema regułami:
- AllowAll_Inbound — umożliwia przekazywanie całego ruchu sieciowego do interfejsu sieciowego, w którym skonfigurowano tę sieciową grupę zabezpieczeń.
- 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 <computer-name>
ciąg nazwą komputera, który ma punkt końcowy 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 poleceń programu Windows PowerShell dla kontrolera sieci znajduje się w poleceniach cmdlet 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 | Zezwalaj | 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 | Zezwalaj | 105 |
Sieciowa grupa zabezpieczeń utworzona przez poniższy przykładowy skrypt, zidentyfikowana przez podsieć identyfikatora 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 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.
Pobierz lub utwórz interfejs sieciowy, do którego zostanie dodana sieciowa grupa zabezpieczeń.
$nic = get-networkcontrollernetworkinterface -ConnectionUri $uri -ResourceId "MyVM_Ethernet1"
Pobierz lub utwórz sieciowa grupa zabezpieczeń, którą dodasz do interfejsu sieciowego.
$acl = get-networkcontrolleraccesscontrollist -ConnectionUri $uri -ResourceId "AllowAllACL"
Przypisz sieciowa grupa zabezpieczeń do właściwości AccessControlList interfejsu sieciowego.
$nic.properties.ipconfigurations[0].properties.AccessControlList = $acl
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.
Pobierz interfejs sieciowy, z którego usuniesz sieciowa grupa zabezpieczeń.
$nic = get-networkcontrollernetworkinterface -ConnectionUri $uri -ResourceId "MyVM_Ethernet1"
Przypisz $null do właściwości AccessControlList obiektu ipConfiguration.
$nic.properties.ipconfigurations[0].properties.AccessControlList = $null
Dodaj obiekt interfejsu sieciowego w kontrolerze sieci.
new-networkcontrollernetworkinterface -ConnectionUri $uri -Properties $nic.properties -ResourceId $nic.resourceid
Inspekcja zapory
Funkcja inspekcji zapory zapory zapory 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 na maszynach hostów. Zaktualizuj zmienne na początku i uruchom je w wystąpieniu lokalnym platformy Azure 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 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 ustawione na wartość 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:
- Omówienie zapory centrum danych.
- Omówienie kontrolera sieci.
- SDN w systemach Azure Local i Windows Server.