Configurer des groupes de sécurité réseau sur votre instance Azure Stack HCI avec PowerShell

S’applique à : Azure Stack HCI, versions 23H2 et 22H2 ; Windows Server 2022, Windows Server 2019, Windows Server 2016

Cet article fournit des instructions pour configurer des groupes de sécurité réseau (NSG) afin de gérer le flux de trafic de données à l’aide du pare-feu du centre de données pour la mise en réseau à définition logicielle (SDN) dans Azure Stack HCI à l’aide de Windows PowerShell. Vous activez et configurez le pare-feu du centre de données en créant des groupes de sécurité réseau qui sont appliqués à un sous-réseau ou à une interface réseau.

Les exemples de scripts de cet article utilisent Windows PowerShell commandes exportées à partir du module NetworkController. Vous pouvez également utiliser Windows Admin Center pour configurer et gérer des groupes de sécurité réseau.

Configurer le Pare-feu Datacenter de manière à autoriser tout le trafic

Une fois que vous avez déployé la mise en réseau SDN, vous devez tester la connectivité réseau de base dans votre nouvel environnement. Pour ce faire, créez une règle pour le Pare-feu Datacenter qui autorise tout le trafic réseau, sans restriction.

Utilisez les entrées du tableau suivant pour créer un ensemble de règles qui autorisent tout le trafic réseau entrant et sortant.

IP Source IP de destination Protocol Port source Port de destination Sens Action Priority
* * Tous * * Trafic entrant Allow 100
* * Tous * * Règle de trafic sortant Allow 110

Dans cet exemple, vous créez un groupe de sécurité réseau avec deux règles :

  1. AllowAll_Inbound : autorise tout le trafic réseau à passer dans l’interface réseau où ce groupe de sécurité réseau est configuré.
  2. AllowAllOutbound : permet à tout le trafic de sortir de l'interface réseau. Ce groupe de sécurité réseau, identifié par l’ID de ressource « AllowAll-1 », est maintenant prêt à être utilisé dans les sous-réseaux virtuels et les interfaces réseau.

Vous pouvez exécuter cette commande à partir de n’importe quel ordinateur ayant accès au point de terminaison REST du contrôleur de réseau. Tout d’abord, ouvrez une session PowerShell. Dans cet exemple, utilisez l’applet de commande Enter-PSSession et remplacez par <computer-name> le nom de l’ordinateur qui a le point de terminaison REST du contrôleur de réseau.

Enter-PSSession <computer-name>

Ensuite, exécutez le script suivant pour créer le groupe de sécurité réseau :

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

Notes

La référence de commande Windows PowerShell pour le contrôleur de réseau se trouve dans les applets de commande du contrôleur de réseau.

Utiliser des groupes de sécurité réseau pour limiter le trafic sur un sous-réseau

Dans cet exemple, vous créez un groupe de sécurité réseau qui empêche les machines virtuelles au sein du sous-réseau 192.168.0.0/24 de communiquer entre elles. Ce type de groupe de sécurité réseau est utile pour limiter la capacité d’un attaquant à se propager latéralement au sein du sous-réseau, tout en permettant aux machines virtuelles de recevoir des demandes provenant de l’extérieur du sous-réseau et de communiquer avec d’autres services sur d’autres sous-réseaux.

IP Source IP de destination Protocol Port source Port de destination Sens Action Priority
192.168.0.1 * Tous * * Trafic entrant Allow 100
* 192.168.0.1 Tous * * Règle de trafic sortant Allow 101
192.168.0.0/24 * Tous * * Trafic entrant Block 102
* 192.168.0.0/24 Tous * * Règle de trafic sortant Block 103
* * Tous * * Trafic entrant Allow 104
* * Tous * * Règle de trafic sortant Allow 105

Le groupe de sécurité réseau créé par l’exemple de script ci-dessous, identifié par l’ID de ressource Subnet-192-168-0-0, peut désormais être appliqué à un sous-réseau de réseau virtuel qui utilise l’adresse de sous-réseau « 192.168.0.0/24 ». Toute interface réseau attachée à ce sous-réseau de réseau virtuel obtient automatiquement les règles de groupe de sécurité réseau ci-dessus appliquées.

Voici un exemple de script pour créer ce groupe de sécurité réseau à l’aide de l’API REST du contrôleur de réseau :

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

Ajouter un groupe de sécurité réseau à une interface réseau

Une fois que vous avez créé un groupe de sécurité réseau et l’avez affecté à un sous-réseau virtuel, vous pouvez remplacer ce groupe de sécurité réseau par défaut sur le sous-réseau virtuel par un groupe de sécurité réseau spécifique pour une interface réseau individuelle. À partir de Windows Server 2019 Datacenter, vous pouvez appliquer des groupes de sécurité réseau spécifiques directement aux interfaces réseau attachées à des réseaux logiques SDN, en plus des réseaux virtuels SDN. Si vous avez défini des groupes de sécurité réseau sur le sous-réseau virtuel connecté à l’interface réseau, les deux groupes de sécurité réseau sont appliqués et les groupes de sécurité réseau d’interface réseau sont prioritaires au-dessus des groupes de sécurité réseau de sous-réseau virtuel.

Dans cet exemple, nous montrons comment ajouter un groupe de sécurité réseau à un réseau virtuel.

Conseil

Il est également possible d’ajouter un groupe de sécurité réseau en même temps que vous créez l’interface réseau.

  1. Obtenez ou créez l’interface réseau à laquelle vous allez ajouter le groupe de sécurité réseau.

    $nic = get-networkcontrollernetworkinterface -ConnectionUri $uri -ResourceId "MyVM_Ethernet1"
    
  2. Obtenez ou créez le groupe de sécurité réseau que vous allez ajouter à l’interface réseau.

    $acl = get-networkcontrolleraccesscontrollist -ConnectionUri $uri -ResourceId "AllowAllACL"
    
  3. Affectez le groupe de sécurité réseau à la propriété AccessControlList de l’interface réseau.

     $nic.properties.ipconfigurations[0].properties.AccessControlList = $acl
    
  4. Ajoutez l'interface réseau dans le Contrôleur de réseau.

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

Supprimer un groupe de sécurité réseau d’une interface réseau

Dans cet exemple, nous vous montrons comment supprimer un groupe de sécurité réseau d’une interface réseau. La suppression d’un groupe de sécurité réseau applique l’ensemble de règles par défaut à l’interface réseau. L'ensemble de règles par défaut autorise tout le trafic sortant, mais bloque tout le trafic entrant. Si vous souhaitez autoriser tout le trafic entrant, vous devez suivre l’exemple précédent pour ajouter un groupe de sécurité réseau qui autorise tout le trafic entrant et sortant.

  1. Obtenez l’interface réseau à partir de laquelle vous allez supprimer le groupe de sécurité réseau.

    $nic = get-networkcontrollernetworkinterface -ConnectionUri $uri -ResourceId "MyVM_Ethernet1"
    
  2. Attribuez $null à la propriété AccessControlList d'ipConfiguration.

    $nic.properties.ipconfigurations[0].properties.AccessControlList = $null
    
  3. Ajoutez l'objet d'interface réseau dans le Contrôleur de réseau.

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

Audit du pare-feu

La fonctionnalité d’audit du pare-feu du centre de données enregistre tout flux traité par les règles de pare-feu SDN. Tous les groupes de sécurité réseau dont la journalisation est activée sont enregistrés. La syntaxe des fichiers journaux doit être cohérente avec celle des journaux de flux Azure Network Watcher. Ces journaux peuvent être utilisés à des fins de diagnostic ou archivés en vue d'une analyse ultérieure.

Voici un exemple de script pour activer l’audit du pare-feu sur les serveurs hôtes. Commencez par mettre les variables à jour, puis exécutez le script sur un cluster Azure Stack HCI sur lequel le Contrôleur de réseau est déployé :

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

Une fois activé, un nouveau fichier apparaît dans le répertoire spécifié de chaque hôte environ une fois par heure. Vous devez régulièrement traiter ces fichiers et les supprimer des hôtes. La longueur du fichier actuel est nulle et il est verrouillé jusqu'à ce qu'il soit vidé à l'heure suivante :

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

Ces fichiers contiennent une séquence d'événements de flux, par exemple :

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

Notez que la journalisation s'applique uniquement aux règles pour lesquelles le paramètre Journalisation est défini sur Activée, par exemple :

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

Étapes suivantes

Pour plus d’informations, consultez :