Gérer le pare-feu Windows en PowerShell

Depuis Windows Server 2012 et Windows 8, Microsoft a intégré à PowerShell des commandes qui permettent de gérer le Pare-feu Windows. À terme, l'objectif de ces commandes c'est de remplacer les commandes « netsh firewall » et « netsh advfirewall » même si aujourd'hui, sous Windows Server 2022, ces commandes sont toujours disponibles. En ce qui nous concerne, nous allons utiliser exclusivement PowerShell pour configurer le pare-feu de notre serveur Windows.

Les commandes évoquées dans ce chapitre fonctionnent sur les différentes versions de Windows Server depuis Windows Server 2012.

I. Rappel sur les profils du Pare-feu

Windows intègre trois profils différents pour son pare-feu, les voici :

cours-windows-core-21

L’avantage de ces profils, c’est qu’il est possible de créer des règles qui s’appliquent spécifiquement à certains profils, les profils quant à eux s’appliquent directement sur la connexion réseau correspondante.

Par exemple, on peut avoir un niveau de protection maximal lorsque l’on se connecte à un réseau « Public » et autoriser les connexions Bureau à distance sur sa machine lorsque l’on se trouve sur un réseau « Domaine ». Ce réseau pouvant être considéré de confiance.

Avec ce système de profils, le pare-feu de Windows est flexible et permet de gérer différents niveaux de sécurité. Ceci permet d’imaginer divers scénarios de protection.

Dans le cadre de ce cours, la connectivité du serveur est de type « Réseau avec domaine » puisqu’il est intégré au sein du domaine « it-connect.local » et qu’il est connecté sur ce réseau.

II. Les commandes PowerShell dédiées au Pare-feu

Rapidement avant de commencer à manipuler, voici un résumé des commandes PowerShell disponible pour le Pare-feu. Sur le Microsoft Docs, il y a une aide en ligne sur chaque commande du module PowerShell "NetSecurity".

Avec la commande suivante, vous pouvez lister l'ensemble des cmdlets du module NetSecurity :

Get-Command -Module NetSecurity

III. Le pare-feu est-il actif ?

Pour se mettre dans l’ambiance, on va simplement vérifier si le pare-feu est actif ou inactif sur les différents profils.

Pour cela, on utilise la commande « Get-NetFirewallProfile » et pour avoir une vue synthétique, on affichera seulement les valeurs des propriétés « Name » et « Enabled ». Voici la commande :

Get-NetFirewallProfile | ft Name,Enabled

On remarque que le pare-feu Windows est actif sur l’ensemble des profils, ce qui est un comportement normal puisqu’il est actif par défaut sous Windows.

Le pare-feu est-il actif ?
Le pare-feu est-il actif ?

IV. Activer ou désactiver le pare-feu sur un profil

Il est à noter que c’est déconseillé de désactiver le pare-feu, il vaut mieux faire l’effort de le configurer pour laisser passer les flux que l’on souhaite. Par exemple, pour autoriser le ping ou une connexion Bureau à distance. Cependant, lors d’une phase test, de debug ou tout simplement de façon temporaire, c'est acceptable et parfois bien utile.

Dans les commandes PowerShell, il faudra préciser le profil sur lequel s’applique la commande, voici les valeurs à utiliser pour chacun des profils :

- Réseaux avec domaine : Domain
- Réseaux privés : Private
- Réseaux publics ou invités : Public
- Tous les profils : *

Pour désactiver le pare-feu sur tous les profils, on utilise la commande suivante :

Set-NetFirewallProfile -Profile Domain,Public,Private -Enabled False

Bien sûr, on peut activer le pare-feu (ou le désactiver) sur un seul profil :

Set-NetFirewallProfile -Profile Public -Enabled true

Vérifiez par vous-même que le Pare-feu est bien désactivé sur tous les profils avec la commande que l’on a vu juste avant.

Plutôt que de devoir saisir les trois noms de profils lorsque l’on souhaite cibler tous les profils, indiquez plutôt un astérisque « * », ce sera plus simple. On essaie cela immédiatement en réactivant le Pare-feu sur tous les profils :

Set-NetFirewallProfile -Profile * -Enabled True

Voici une copie d’écran qui résume les opérations que l’on vient d’effectuer :

Activer ou désactiver le pare-feu avec Set-NetFirewallProfile
Activer ou désactiver le pare-feu avec Set-NetFirewallProfile

V. Les groupes de règles prédéfinies

Pour simplifier le travail des administrateurs systèmes, Windows intègre un ensemble de groupes comprenant des règles prédéfinies. Ainsi, si l’on décide d’autoriser le groupe « Bureau à distance » cela implique la création d’une règle qui autorisera le trafic TCP sur le port 3389, cela évite à l’administrateur de rechercher lui-même les ports correspondant à un service particulier. Pratique, vous ne trouvez pas ?

Bien entendu, dans des cas plus spécifiques et des applications tierces, il faudra passer par la création de règles manuelles.

Pour lister les groupes de règles prédéfinies disponibles, saisissez la suite de commandes suivantes :

$rules=Get-NetFirewallRule
$DisplayGroups=foreach ($rule in $rules){$rule.displaygroup}
$DisplayGroups | Select-Object -Unique

On récupère les informations d’un « Get-NetFirewallRule » et on affiche une seule fois chaque groupe de règles différent.

Lister les groupes de règles prédéfinies - Get-NetFirewallRule
Lister les groupes de règles prédéfinies - Get-NetFirewallRule

Windows gère bien ces groupes et il active ces règles prédéfinies selon l’état d’un service. Par exemple, si l’on active le Bureau à distance, il activera automatiquement les règles correspondantes pour que l’on puisse se connecter en RDP à son serveur. Si ce n’est pas le cas, il faudra effectuer l’opération manuellement.

Lorsque l’on créera une règle dans le Pare-feu, basée sur un groupe, on utilisera ce type de commande (exemple pour autoriser le Bureau à distance sur le profil domaine) :

New-NetFirewallRule -DisplayName "Autoriser le Bureau à distance (RDP)" -Group "Bureau à distance" -Profile Domain -Enabled True -Action Allow

C’est par l’intermédiaire de l’option « -Group » que l’on indiquera le groupe de règles que l’on souhaite utiliser (reprenez le nom affiché lors du listing, rappelez-vous ce que l’on a fait précédemment).

Créer une règle avec New-NetFirewallRule
Créer une règle avec New-NetFirewallRule

VI. Créer sa propre règle dans le Pare-feu

Maintenant, nous allons voir comment créer une règle personnalisée dans le Pare-feu Windows. L’objectif sera d’autoriser les connexions à destination du port 22, en TCP, pour permettre les connexions à distance via SSH (même si le serveur SSH n'est pas actif sur notre serveur), à destination de l’IP « 192.168.100.13 » du serveur, sur le profil domaine.

New-NetFirewallRule -Name "SSH" -DisplayName "Autoriser SSH (Port 22)" -Profile Domain -Enabled True -Protocol TCP -LocalPort 22 -Action Allow -LocalAddress 192.168.100.13
Créer une règle de pare-feu personnalisée avec PowerShell
Créer une règle de pare-feu personnalisée avec PowerShell

Voici un descriptif sur les paramètres utilisés :

Nom du paramètre Utilisation
DisplayName Nom d’affichage de la règle
Name Nom de la règle, doit être unique, s’il n’est pas précisé, un identifiant est généré (voir copie écran ci-dessus)
Profile Profil(s) sur le(s)quel(s) s’applique cette règle
Enabled Activer (true) ou désactiver (false) la règle
Protocol Spécifier TCP ou UDP, ceci est obligatoire si l’on souhaite préciser un port spécifique
LocalPort Port local visé (par le client)
Action Autoriser (allow) ou bloquer (block)
LocalAddress Spécifier l’adresse IP locale sur laquelle la règle s’applique, utile si le serveur dispose de plusieurs cartes réseaux (plusieurs adresses IP)

De nombreux autres paramètres sont également disponibles et peuvent être utilisés pour des règles encore plus fines (et complexes), ce qui n'est pas étonnant, car sur l'interface graphique il y a beaucoup de paramètres lorsque l'on crée une règle. Voici les principaux :

Nom du paramètre Utilisation
PolicyStore Indiquer dans quel magasin de règles on souhaite ajouter la règle (par défaut : PersistentStore). Soit PersistentStore pour ajouter la règle dans le magasin des règles statiques, soit ActiveStore qui correspond aux règles appliquées actuellement et qui représente la somme des règles provenant de GPOs et celles du PersistentStore.
GPOSession Charger une GPO pour récupérer les règles à créer.
Platform Spécifier la version de Windows concernée par la règle
Direction Spécifier si la règle s'applique sur le trafic entrant (inbound) ou le trafic sortant (outbound)
RemoteAddress Adresse IP distante sur laquelle s'applique la règle, peut être intéressant pour autoriser l'accès pour une adresse IP précise (et inversement)
Program Appliquer la règle sur une application spécifique, par exemple, l'accès sur le port 80 à destination du serveur web apache, pour ne pas autoriser la connexion en 80 sur une autre application.
Service Le même principe que pour les programmes, mais applicable à un service.

Retrouvez le détail de tous ces paramètres sur la page suivante : New-NetFirewallRule

VII. Activer ou désactiver une règle de pare-feu existante

Précédemment, nous avons créé une règle nommée « SSH » et qui permet d’accéder en SSH sur notre serveur. Désormais, on souhaite désactiver cette règle, car finalement on préfère l’utilisation du Bureau à distance (et oui, ça arrive à tout le monde d'être indécis...). On va seulement la désactiver et non la supprimer pour ne pas avoir à la recréer ultérieurement si besoin.

Le commandlet « Set-NetFirewallRule » permet de modifier une règle existante. Pour passer une règle sur l’état désactivé, voici ce que l’on utilisera comme commande :

Set-NetFirewallRule -Name SSH -Enabled false

Il suffit de spécifier le nom de la règle (Name) et de passer le statut Enabled sur false. Pour vérifier que la règle est bien désactivée, on va tout simplement récupérer la valeur du champ « Enabled » pour la règle « SSH », comme ceci :

(Get-NetFirewallRule -Name SSH).Enabled

La commande doit retourner « False », si c’est bien le cas, je vous félicite ! 🙂

Exemple de désactivation d'une règle de pare-feu avec PowerShell
Exemple de désactivation d'une règle de pare-feu avec PowerShell

VIII. Supprimer une règle existante

Le temps passe et j’aimerais faire du tri dans mes règles de Pare-feu. Je remarque qu’il y a une règle nommée « SSHH », qui est désactivée et que je n’utilise pas depuis longtemps, je décide de la supprimer.

Pour réaliser une suppression, on s’appuie sur le commandlet « Remove-NetFirewallFilter » suivi du nom de la règle à supprimer :

Remove-NetFirewallRule -Name SSH

On peut vérifier que la règle est bien supprimée en la recherchant dans les règles, comme ceci :

Get-NetFirewallRule -Name SSH

« Oups » ! PowerShell nous retourne un message d’erreur, mais rassurez-vous c’est normal, car la règle n’existe plus, vous avez bien fait votre travail.

Supprimer une règle avec Remove-NetFirewallRule
Supprimer une règle avec Remove-NetFirewallRule

IX. Conclusion

Au sein de ce chapitre, nous avons vu comment gérer et configurer le Pare-feu Windows, avec PowerShell, ce qui vous permettra de sécuriser votre serveur au niveau des flux entrants et des flux sortants autorisés. Pensez à consulter la documentation Microsoft pour obtenir de l’aide sur l’utilisation des paramètres spécifiques et des commandes que nous n’avons pas vues dans ce chapitre (cela serait beaucoup trop conséquent, et pas assez synthétique).

Dans le cadre d’une situation en entreprise, vous pouvez créer un script d’autoconfiguration du Pare-feu contenant directement toutes les règles à créer. Il suffira de l’exécuter sur le serveur. Par ailleurs, vous pouvez passer par les stratégies de groupe.

Rendez-vous sur Microsoft Docs pour découvrir toutes les commandes : NetSecurity

Partagez cet article Partager sur Twitter Partager sur Facebook Partager sur Linkedin Partager sur Google+ Envoyer par mail

Florian Burnel

Ingénieur système et réseau, cofondateur d'IT-Connect et Microsoft MVP "Cloud and Datacenter Management". Je souhaite partager mon expérience et mes découvertes au travers de mes articles. Généraliste avec une attirance particulière pour les solutions Microsoft et le scripting. Bonne lecture.

florian has 3474 posts and counting.See all posts by florian