Configurar grupos de segurança de rede com o PowerShell

Aplica-se a: Azure Stack HCI, versões 23H2 e 22H2; Windows Server 2022, Windows Server 2019 Windows Server 2016

Este artigo fornece instruções para configurar NSGs (grupos de segurança de rede) para gerenciar o fluxo de tráfego de dados usando o SDN (Firewall do Datacenter para Rede Definida por Software) no Azure Stack HCI usando Windows PowerShell. Habilite e configure o Firewall do Datacenter criando grupos de segurança de rede que são aplicados a uma sub-rede ou a um adaptador de rede. Os scripts de exemplo neste artigo usam comandos Windows PowerShell exportados do módulo NetworkController. Você também pode usar Windows Admin Center para configurar e gerenciar grupos de segurança de rede.

Configurar o Firewall do Datacenter para permitir todo o tráfego

Depois de implantar o SDN, você deve testar a conectividade de rede básica em seu novo ambiente. Para fazer isso, crie uma regra para o Firewall do Datacenter que permita todo o tráfego de rede, sem restrições.

Use as entradas na tabela a seguir para criar um conjunto de regras que permitem todo o tráfego de rede de entrada e saída.

IP de origem IP de destino Protocolo Porta de origem Porta de destino Direção Ação Prioridade
* * Tudo * * Entrada Allow 100
* * Tudo * * Saída Allow 110

Neste exemplo, você cria um grupo de segurança de rede com duas regras:

  1. AllowAll_Inbound – permite que todo o tráfego de rede passe para o adaptador de rede em que esse grupo de segurança de rede está configurado.
  2. AllowAllOutbound – permite que todo o tráfego passe para fora do adaptador de rede. Esse grupo de segurança de rede, identificado pela ID do recurso "AllowAll-1" agora está pronto para ser usado em sub-redes virtuais e interfaces de rede.

Primeiro, conecte-se a um dos nós de cluster abrindo uma sessão do PowerShell:

Enter-PSSession <server-name>

Em seguida, execute o seguinte script para criar o grupo de segurança de rede:

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

Observação

A referência de comando Windows PowerShell para o Controlador de Rede está nos cmdlets do Controlador de Rede.

Usar grupos de segurança de rede para limitar o tráfego em uma sub-rede

Neste exemplo, você cria um grupo de segurança de rede que impede que máquinas virtuais (VMs) na sub-rede 192.168.0.0/24 se comuniquem entre si. Esse tipo de grupo de segurança de rede é útil para limitar a capacidade de um invasor se espalhar lateralmente dentro da sub-rede, ao mesmo tempo em que permite que as VMs recebam solicitações de fora da sub-rede e se comuniquem com outros serviços em outras sub-redes.

IP de origem IP de destino Protocolo Porta de origem Porta de destino Direção Ação Prioridade
192.168.0.1 * Tudo * * Entrada Allow 100
* 192.168.0.1 Tudo * * Saída Allow 101
192.168.0.0/24 * Tudo * * Entrada Bloquear 102
* 192.168.0.0/24 Tudo * * Saída Bloquear 103
* * Tudo * * Entrada Allow 104
* * Tudo * * Saída Allow 105

O grupo de segurança de rede criado pelo script de exemplo abaixo, identificado pela sub-rede de ID do recurso sub-rede-192-168-0-0, agora pode ser aplicado a uma sub-rede de rede virtual que usa o endereço de sub-rede "192.168.0.0/24". Qualquer adaptador de rede anexado a essa sub-rede de rede virtual obtém automaticamente as regras de grupo de segurança de rede acima aplicadas.

Veja a seguir um exemplo de script para criar esse grupo de segurança de rede usando a API REST do Controlador de Rede:

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

Adicionar um grupo de segurança de rede a um adaptador de rede

Depois de criar um grupo de segurança de rede e atribuí-lo a uma sub-rede virtual, convém substituir esse grupo de segurança de rede padrão na sub-rede virtual por um grupo de segurança de rede específico para um adaptador de rede individual. A partir do Windows Server 2019 Datacenter, você pode aplicar grupos de segurança de rede específicos diretamente a interfaces de rede anexadas a redes lógicas SDN, além de redes virtuais SDN. Se você tiver grupos de segurança de rede definidos na sub-rede virtual conectada ao adaptador de rede, ambos os grupos de segurança de rede serão aplicados e os grupos de segurança de rede do adaptador de rede serão priorizados acima dos grupos de segurança de rede de sub-rede virtual.

Neste exemplo, demonstramos como adicionar um grupo de segurança de rede a uma rede virtual.

Dica

Também é possível adicionar um grupo de segurança de rede ao mesmo tempo em que você cria o adaptador de rede.

  1. Obtenha ou crie o adaptador de rede ao qual você adicionará o grupo de segurança de rede.

    $nic = get-networkcontrollernetworkinterface -ConnectionUri $uri -ResourceId "MyVM_Ethernet1"
    
  2. Obtenha ou crie o grupo de segurança de rede que você adicionará ao adaptador de rede.

    $acl = get-networkcontrolleraccesscontrollist -ConnectionUri $uri -ResourceId "AllowAllACL"
    
  3. Atribua o grupo de segurança de rede à propriedade AccessControlList do adaptador de rede.

     $nic.properties.ipconfigurations[0].properties.AccessControlList = $acl
    
  4. Adicione o adaptador de rede ao Controlador de Rede.

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

Remover um grupo de segurança de rede de um adaptador de rede

Neste exemplo, mostramos como remover um grupo de segurança de rede de um adaptador de rede. A remoção de um grupo de segurança de rede aplica o conjunto padrão de regras ao adaptador de rede. O conjunto padrão de regras permite todo o tráfego de saída, mas bloqueia todo o tráfego de entrada. Se você quiser permitir todo o tráfego de entrada, deverá seguir o exemplo anterior para adicionar um grupo de segurança de rede que permita todo o tráfego de entrada e de saída.

  1. Obtenha o adaptador de rede do qual você removerá o grupo de segurança de rede.

    $nic = get-networkcontrollernetworkinterface -ConnectionUri $uri -ResourceId "MyVM_Ethernet1"
    
  2. Atribua $null à propriedade AccessControlList do ipConfiguration.

    $nic.properties.ipconfigurations[0].properties.AccessControlList = $null
    
  3. Adicione o objeto de interface de rede no Controlador de Rede.

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

Auditoria de firewall

O recurso de auditoria de firewall para o Firewall do Datacenter registra qualquer fluxo processado pelas regras de firewall do SDN. Todos os grupos de segurança de rede que têm o registro em log habilitado são registrados. Os arquivos de log devem estar em uma sintaxe consistente com os logs de fluxo de Observador de Rede do Azure. Esses logs podem ser usados para diagnóstico ou arquivados para análise posterior.

Aqui está um exemplo de script para habilitar a auditoria de firewall nos servidores host. Atualize as variáveis no início e execute-as em um cluster do Azure Stack HCI com o Controlador de Rede implantado:

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

Depois de habilitado, um novo arquivo aparece no diretório especificado em cada host cerca de uma vez por hora. Você deve processar periodicamente esses arquivos e removê-los dos hosts. O arquivo atual tem comprimento zero e fica bloqueado até ser liberado na marca da próxima hora:

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

Esses arquivos contêm uma sequência de eventos de fluxo, por exemplo:

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

Observe que o registro em log ocorre apenas para regras que têm o log definido como Habilitado, por exemplo:

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

Próximas etapas

Para obter informações relacionadas. consulte: