Configuración de grupos de seguridad de red en Azure Stack HCI con PowerShell

Se aplica a: Azure Stack HCI, versiones 23H2 y 22H2; Windows Server 2022, Windows Server 2019, Windows Server 2016

En este artículo se proporcionan instrucciones para configurar grupos de seguridad de red (NSG) para administrar el flujo de tráfico de datos mediante Datacenter Firewall para redes definidas por software (SDN) en Azure Stack HCI mediante Windows PowerShell. Para habilitar y configurar El firewall del centro de datos, cree grupos de seguridad de red que se apliquen a una subred o a una interfaz de red.

Los scripts de ejemplo de este artículo usan Windows PowerShell comandos exportados desde el módulo NetworkController. También puede usar Windows Admin Center para configurar y administrar grupos de seguridad de red.

Configuración del firewall del centro de datos para permitir todo el tráfico

Una vez que implemente SDN, debe probar la conectividad de red básica en el nuevo entorno. Para ello, cree una regla para el firewall del centro de datos que permita todo el tráfico de red, sin restricciones.

Use las entradas de la tabla siguiente para crear un conjunto de reglas que permitan todo el tráfico de red entrante y saliente.

IP de origen IP de destino Protocolo Puerto de origen Puerto de destino Dirección Acción Priority
* * All * * Entrada Allow 100
* * All * * Salida Allow 110

En este ejemplo, creará un grupo de seguridad de red con dos reglas:

  1. AllowAll_Inbound : permite que todo el tráfico de red pase a la interfaz de red donde está configurado este grupo de seguridad de red.
  2. AllowAllOutbound: permite que todo el tráfico pase fuera de la interfaz de red. Este grupo de seguridad de red, identificado por el identificador de recurso "AllowAll-1" ya está listo para usarse en subredes virtuales e interfaces de red.

Puede ejecutar este comando desde cualquier equipo que tenga acceso al punto de conexión REST de controladora de red. En primer lugar, abra una sesión de PowerShell. En este ejemplo, use el cmdlet Enter-PSSession y reemplace <computer-name> por el nombre del equipo que tiene el punto de conexión REST de controladora de red.

Enter-PSSession <computer-name>

A continuación, ejecute el siguiente script para crear el grupo de seguridad de red:

$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

La referencia del comando Windows PowerShell para controladora de red se encuentra en los cmdlets de controladora de red.

Uso de grupos de seguridad de red para limitar el tráfico en una subred

En este ejemplo, creará un grupo de seguridad de red que impide que las máquinas virtuales (VM) dentro de la subred 192.168.0.0/24 se comuniquen entre sí. Este tipo de grupo de seguridad de red es útil para limitar la capacidad de un atacante de distribuir lateralmente dentro de la subred, a la vez que permite que las máquinas virtuales reciban solicitudes desde fuera de la subred y se comuniquen con otros servicios en otras subredes.

IP de origen IP de destino Protocolo Puerto de origen Puerto de destino Dirección Acción Priority
192.168.0.1 * All * * Entrada Allow 100
* 192.168.0.1 All * * Salida Allow 101
192.168.0.0/24 * All * * Entrada Block 102
* 192.168.0.0/24 All * * Salida Block 103
* * All * * Entrada Allow 104
* * All * * Salida Allow 105

El grupo de seguridad de red creado por el script de ejemplo siguiente, identificado por la subred de identificador de recurso Subnet-192-168-0-0, ahora se puede aplicar a una subred de red virtual que use la dirección de subred "192.168.0.0/24". Cualquier interfaz de red conectada a esa subred de red virtual obtiene automáticamente las reglas de grupo de seguridad de red anteriores aplicadas.

A continuación se muestra un script de ejemplo para crear este grupo de seguridad de red mediante la API REST de controladora de red:

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

Adición de un grupo de seguridad de red a una interfaz de red

Una vez que haya creado un grupo de seguridad de red y lo haya asignado a una subred virtual, es posible que desee invalidar ese grupo de seguridad de red predeterminado en la subred virtual con un grupo de seguridad de red específico para una interfaz de red individual. A partir de Windows Server 2019 Datacenter, puede aplicar grupos de seguridad de red específicos directamente a interfaces de red conectadas a redes lógicas SDN, además de redes virtuales sdN. Si tiene grupos de seguridad de red establecidos en la subred virtual conectada a la interfaz de red, se aplican ambos grupos de seguridad de red y se priorizan los grupos de seguridad de red de la interfaz de red por encima de los grupos de seguridad de red de subred virtual.

En este ejemplo, se muestra cómo agregar un grupo de seguridad de red a una red virtual.

Sugerencia

También es posible agregar un grupo de seguridad de red al mismo tiempo que se crea la interfaz de red.

  1. Obtenga o cree la interfaz de red a la que agregará el grupo de seguridad de red.

    $nic = get-networkcontrollernetworkinterface -ConnectionUri $uri -ResourceId "MyVM_Ethernet1"
    
  2. Obtenga o cree el grupo de seguridad de red que agregará a la interfaz de red.

    $acl = get-networkcontrolleraccesscontrollist -ConnectionUri $uri -ResourceId "AllowAllACL"
    
  3. Asigne el grupo de seguridad de red a la propiedad AccessControlList de la interfaz de red.

     $nic.properties.ipconfigurations[0].properties.AccessControlList = $acl
    
  4. Agregue la interfaz de red en la Controladora de red.

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

Eliminación de un grupo de seguridad de red de una interfaz de red

En este ejemplo, se muestra cómo quitar un grupo de seguridad de red de una interfaz de red. Al quitar un grupo de seguridad de red, se aplica el conjunto predeterminado de reglas a la interfaz de red. El conjunto predeterminado de reglas permite todo el tráfico saliente, pero bloquea el entrante. Si desea permitir todo el tráfico entrante, debe seguir el ejemplo anterior para agregar un grupo de seguridad de red que permita todo el tráfico entrante y saliente.

  1. Obtenga la interfaz de red de la que quitará el grupo de seguridad de red.

    $nic = get-networkcontrollernetworkinterface -ConnectionUri $uri -ResourceId "MyVM_Ethernet1"
    
  2. Asigne $null a la propiedad AccessControlList de ipConfiguration.

    $nic.properties.ipconfigurations[0].properties.AccessControlList = $null
    
  3. Agregue el objeto de la interfaz de red en la Controladora de red.

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

Auditoría de firewall

La funcionalidad de auditoría de firewall para datacenter Firewall registra cualquier flujo procesado por las reglas de firewall de SDN. Se registran todos los grupos de seguridad de red que tienen habilitado el registro. Los archivos de registro deben estar en una sintaxis coherente con los registros de flujo de Azure Network Watcher. Estos registros se pueden usar para realizar diagnósticos o archivar para su posterior análisis.

Este es un script de ejemplo para habilitar la auditoría de firewall en los servidores host. Actualice las variables del principio y ejecútelo en un clúster de Azure Stack HCI con la Controladora de red implementada:

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

Una vez habilitado, aparece un nuevo archivo en el directorio especificado de cada host aproximadamente una vez por hora. Debe procesar periódicamente estos archivos y quitarlos de los hosts. El archivo actual tiene una longitud igual a cero y se bloquea hasta que se vacía en la marca de hora siguiente:

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

Estos archivos contienen una secuencia de eventos de flujo; por ejemplo:

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

Tenga en cuenta que el registro solo tiene lugar para las reglas que tienen el valor Logging definido como Enabled; por ejemplo:

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

Pasos siguientes

Para obtener información relacionada, consulte: