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.
Sommaire
- I. Rappel sur les profils du Pare-feu
- II. Les commandes PowerShell dédiées au Pare-feu
- III. Le pare-feu est-il actif ?
- IV. Activer ou désactiver le pare-feu sur un profil
- V. Les groupes de règles prédéfinies
- VI. Créer sa propre règle dans le Pare-feu
- VII. Activer ou désactiver une règle de pare-feu existante
- VIII. Supprimer une règle existante
- IX. Conclusion
I. Rappel sur les profils du Pare-feu
Windows intègre trois profils différents pour son pare-feu, les voici :
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.
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 :
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.
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).
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
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 ! 🙂
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.
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