Configurare i gruppi di sicurezza di rete in Azure Stack HCI con PowerShell

Si applica a: Azure Stack HCI, versioni 23H2 e 22H2; Windows Server 2022, Windows Server 2019, Windows Server 2016

Questo articolo fornisce istruzioni per la configurazione dei gruppi di sicurezza di rete (NSG) per gestire il flusso del traffico di dati usando il firewall del data center per la rete SDN (Software Defined Networking) in Azure Stack HCI usando Windows PowerShell. È possibile abilitare e configurare Il firewall del data center creando gruppi di sicurezza di rete che vengono applicati a una subnet o a un'interfaccia di rete.

Gli script di esempio in questo articolo usano i comandi Windows PowerShell esportati dal modulo NetworkController. È anche possibile usare Windows Admin Center per configurare e gestire i gruppi di sicurezza di rete.

Configurare il firewall del data center per consentire tutto il traffico

Dopo aver distribuito SDN, è necessario testare la connettività di rete di base nel nuovo ambiente. A tale scopo, creare una regola per Il firewall del data center che consenta tutto il traffico di rete, senza restrizioni.

Usare le voci nella tabella seguente per creare un set di regole che consentano tutto il traffico di rete in ingresso e in uscita.

IP di origine IP di destinazione Protocollo Porta di origine Porta di destinazione Direzione Azione Priorità
* * Tutti * * In ingresso Allow 100
* * Tutti * * In uscita Allow 110

In questo esempio viene creato un gruppo di sicurezza di rete con due regole:

  1. AllowAll_Inbound : consente a tutto il traffico di rete di passare all'interfaccia di rete in cui è configurato questo gruppo di sicurezza di rete.
  2. AllowAllOutbound : consente a tutto il traffico di passare dall'interfaccia di rete. Questo gruppo di sicurezza di rete, identificato dall'ID risorsa "AllowAll-1" è ora pronto per essere usato nelle subnet virtuali e nelle interfacce di rete.

È possibile eseguire questo comando da qualsiasi computer che abbia accesso all'endpoint REST del controller di rete. Aprire prima di tutto una sessione di PowerShell. In questo esempio usare il cmdlet Enter-PSSession e sostituire <computer-name> con il nome del computer con l'endpoint REST del controller di rete.

Enter-PSSession <computer-name>

Eseguire quindi lo script seguente per creare il gruppo di sicurezza di rete:

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

Nota

Il riferimento al comando Windows PowerShell per Controller di rete si trova nei cmdlet del controller di rete.

Usare i gruppi di sicurezza di rete per limitare il traffico in una subnet

In questo esempio si crea un gruppo di sicurezza di rete che impedisce alle macchine virtuali all'interno della subnet 192.168.0.0/24 di comunicare tra loro. Questo tipo di gruppo di sicurezza di rete è utile per limitare la capacità di un utente malintenzionato di estendersi successivamente all'interno della subnet, consentendo comunque alle macchine virtuali di ricevere richieste dall'esterno della subnet e di comunicare con altri servizi in altre subnet.

IP di origine IP di destinazione Protocollo Porta di origine Porta di destinazione Direzione Azione Priorità
192.168.0.1 * Tutti * * In ingresso Allow 100
* 192.168.0.1 Tutti * * In uscita Allow 101
192.168.0.0/24 * Tutti * * In ingresso Blocca 102
* 192.168.0.0/24 Tutti * * In uscita Blocca 103
* * Tutti * * In ingresso Allow 104
* * Tutti * * In uscita Allow 105

Il gruppo di sicurezza di rete creato dallo script di esempio seguente, identificato dall'ID risorsa Subnet-192-168-0-0, può ora essere applicato a una subnet di rete virtuale che usa l'indirizzo della subnet "192.168.0.0/24". Qualsiasi interfaccia di rete collegata a tale subnet di rete virtuale ottiene automaticamente le regole del gruppo di sicurezza di rete precedenti applicate.

Di seguito è riportato uno script di esempio per creare questo gruppo di sicurezza di rete usando l'API REST del controller di rete:

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

Aggiungere un gruppo di sicurezza di rete a un'interfaccia di rete

Dopo aver creato un gruppo di sicurezza di rete e averlo assegnato a una subnet virtuale, è possibile eseguire l'override di tale gruppo di sicurezza di rete predefinito nella subnet virtuale con un gruppo di sicurezza di rete specifico per una singola interfaccia di rete. A partire da Windows Server 2019 Datacenter, è possibile applicare gruppi di sicurezza di rete specifici direttamente alle interfacce di rete collegate alle reti logiche SDN, oltre alle reti virtuali SDN. Se sono impostati gruppi di sicurezza di rete nella subnet virtuale connessa all'interfaccia di rete, vengono applicati entrambi i gruppi di sicurezza di rete e i gruppi di sicurezza di rete dell'interfaccia di rete sono classificati in ordine di priorità sopra i gruppi di sicurezza di rete della subnet virtuale.

In questo esempio viene illustrato come aggiungere un gruppo di sicurezza di rete a una rete virtuale.

Suggerimento

È anche possibile aggiungere un gruppo di sicurezza di rete contemporaneamente alla creazione dell'interfaccia di rete.

  1. Ottenere o creare l'interfaccia di rete a cui si aggiungerà il gruppo di sicurezza di rete.

    $nic = get-networkcontrollernetworkinterface -ConnectionUri $uri -ResourceId "MyVM_Ethernet1"
    
  2. Ottenere o creare il gruppo di sicurezza di rete che verrà aggiunto all'interfaccia di rete.

    $acl = get-networkcontrolleraccesscontrollist -ConnectionUri $uri -ResourceId "AllowAllACL"
    
  3. Assegnare il gruppo di sicurezza di rete alla proprietà AccessControlList dell'interfaccia di rete.

     $nic.properties.ipconfigurations[0].properties.AccessControlList = $acl
    
  4. Aggiungere l'interfaccia di rete in Controller di rete.

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

Rimuovere un gruppo di sicurezza di rete da un'interfaccia di rete

In questo esempio viene illustrato come rimuovere un gruppo di sicurezza di rete da un'interfaccia di rete. La rimozione di un gruppo di sicurezza di rete applica il set predefinito di regole all'interfaccia di rete. Il set predefinito di regole consente tutto il traffico in uscita, ma blocca tutto il traffico in ingresso. Se si vuole consentire tutto il traffico in ingresso, è necessario seguire l'esempio precedente per aggiungere un gruppo di sicurezza di rete che consenta tutto il traffico in ingresso e tutto il traffico in uscita.

  1. Ottenere l'interfaccia di rete da cui si rimuoverà il gruppo di sicurezza di rete.

    $nic = get-networkcontrollernetworkinterface -ConnectionUri $uri -ResourceId "MyVM_Ethernet1"
    
  2. Assegnare $null alla proprietà AccessControlList di ipConfiguration.

    $nic.properties.ipconfigurations[0].properties.AccessControlList = $null
    
  3. Aggiungere l'oggetto interfaccia di rete in Controller di rete.

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

Controllo del firewall

La funzionalità di controllo del firewall per il firewall datacenter registra qualsiasi flusso elaborato dalle regole del firewall SDN. Tutti i gruppi di sicurezza di rete che hanno abilitato la registrazione vengono registrati. I file di log devono trovarsi in una sintassi coerente con i log del flusso di Azure Network Watcher. Questi log possono essere usati per la diagnostica o l'archiviazione per un'analisi successiva.

Ecco uno script di esempio per abilitare il controllo del firewall nei server host. Aggiornare le variabili all'inizio ed eseguire questa operazione in un cluster Azure Stack HCI con il controller di rete distribuito:

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

Dopo aver abilitato, un nuovo file viene visualizzato nella directory specificata in ogni host circa una volta all'ora. È consigliabile elaborare periodicamente questi file e rimuoverli dagli host. Il file corrente ha lunghezza zero e viene bloccato fino a quando non viene scaricato al segno dell'ora successiva:

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

Questi file contengono una sequenza di eventi di flusso, ad esempio:

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

Nota, la registrazione viene eseguita solo per le regole che dispongono di Registrazione impostata su Abilitato, ad esempio:

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

Passaggi successivi

Per informazioni correlate, vedere: