Partilhar via


Configurar grupos de segurança de rede no Azure Stack HCI 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 grupos de segurança de rede (NSGs) para gerir o fluxo de tráfego de dados com a Firewall do Datacenter para Redes Definidas pelo Software (SDN) no Azure Stack HCI com Windows PowerShell. Pode ativar e configurar a Firewall do Datacenter ao criar grupos de segurança de rede que são aplicados a uma sub-rede ou a uma interface de rede.

Os scripts de exemplo neste artigo utilizam Windows PowerShell comandos exportados do módulo NetworkController. Também pode utilizar Windows Admin Center para configurar e gerir grupos de segurança de rede.

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

Depois de implementar o SDN, deve testar a conectividade de rede básica no seu novo ambiente. Para tal, crie uma regra para a Firewall do Datacenter que permita todo o tráfego de rede, sem restrições.

Utilize as entradas na tabela seguinte 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
* * Todos * * Entrada Permitir 100
* * Todos * * Saída Permitir 110

Neste exemplo, vai criar um grupo de segurança de rede com duas regras:

  1. AllowAll_Inbound – permite que todo o tráfego de rede passe para a interface de rede onde este grupo de segurança de rede está configurado.
  2. AllowAllOutbound – permite que todo o tráfego passe para fora da interface de rede. Este grupo de segurança de rede, identificado pelo ID de recurso "AllowAll-1" está agora pronto para ser utilizado em sub-redes virtuais e interfaces de rede.

Pode executar este comando a partir de qualquer computador que tenha acesso ao ponto final REST do Controlador de Rede. Primeiro, abra uma sessão do PowerShell. Neste exemplo, utilize o cmdlet Enter-PSSession e substitua <computer-name> pelo nome do computador que tem o ponto final REST do Controlador de Rede.

Enter-PSSession <computer-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>

Nota

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

Utilizar grupos de segurança de rede para limitar o tráfego numa sub-rede

Neste exemplo, vai criar um grupo de segurança de rede que impede que as máquinas virtuais (VMs) na sub-rede 192.168.0.0/24 comuniquem entre si. Este tipo de grupo de segurança de rede é útil para limitar a capacidade de um atacante se espalhar lateralmente na sub-rede, ao mesmo tempo que permite que as VMs recebam pedidos externos à sub-rede e comuniquem com outros serviços noutras sub-redes.

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

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

Segue-se um script de exemplo para criar este grupo de segurança de rede com 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 uma interface de rede

Depois de criar um grupo de segurança de rede e atribuí-lo a uma sub-rede virtual, poderá querer substituir esse grupo de segurança de rede predefinido na sub-rede virtual com um grupo de segurança de rede específico para uma interface de rede individual. A partir do Windows Server 2019 Datacenter, 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 tiver grupos de segurança de rede definidos na sub-rede virtual ligada à interface de rede, ambos os grupos de segurança de rede são aplicados e os grupos de segurança de rede da interface de rede sã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 que cria a interface de rede.

  1. Obtenha ou crie a interface de rede à qual irá 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 irá adicionar à interface de rede.

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

     $nic.properties.ipconfigurations[0].properties.AccessControlList = $acl
    
  4. Adicione a interface de rede no Controlador de Rede.

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

Remover um grupo de segurança de rede de uma interface de rede

Neste exemplo, mostramos-lhe como remover um grupo de segurança de rede de uma interface de rede. A remoção de um grupo de segurança de rede aplica o conjunto predefinido de regras à interface de rede. O conjunto predefinido de regras permite todo o tráfego de saída, mas bloqueia todo o tráfego de entrada. Se quiser permitir todo o tráfego de entrada, tem de 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 a interface de rede a partir da qual irá remover o grupo de segurança de rede.

    $nic = get-networkcontrollernetworkinterface -ConnectionUri $uri -ResourceId "MyVM_Ethernet1"
    
  2. Atribua $null à propriedade AccessControlList da 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 da firewall

A capacidade de auditoria da firewall para a Firewall do Datacenter regista qualquer fluxo processado pelas regras de firewall do SDN. Todos os grupos de segurança de rede com o registo ativado são registados. Os ficheiros de registo têm de estar numa sintaxe consistente com os registos de fluxo do Azure Observador de Rede. Estes registos podem ser utilizados para diagnósticos ou arquivados para análise posterior.

Segue-se um script de exemplo para ativar a auditoria da firewall nos servidores anfitriões. Atualize as variáveis no início e execute-as num cluster do Azure Stack HCI com o Controlador de Rede implementado:

$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 ativado, é apresentado um novo ficheiro no diretório especificado em cada anfitrião cerca de uma vez por hora. Deve processar periodicamente estes ficheiros e removê-los dos anfitriões. O ficheiro atual tem zero comprimento e está bloqueado até ser descarregado na marca de hora seguinte:

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

Estes ficheiros 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"
            },

Tenha em atenção que o registo ocorre apenas para regras que têm o Registo definido como Ativado, 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
                                       }
                                   ]
                   }
}

Passos seguintes

Para obter informações relacionadas, consulte: