Présentation de firewalld et de la commande firewall-cmd sous Linux
Objectif
Apprenez les concepts de base de firewalld et comment interagir avec celui-ci à l’aide de l’utilitaire firewall-cmd
Exigences
- Autorisations root
Difficulté
FACILE
Conventions
- # – nécessite que les commandes Linux données soient exécutées avec les privilèges root, soit
directement en tant qu’utilisateur root, soit en utilisant la commandesudo - $ – nécessite que des commandes Linux données soient exécutées en tant qu’utilisateur régulier non privilégié
Introduction
Un pare-feu basé sur des zones
Firewalld est un pare-feu zonal : chaque zone peut être configurée pour accepter ou refuser certains services ou ports, et donc avec un niveau de sécurité différent. Les zones peuvent être associées à une ou plusieurs interfaces réseau. Habituellement, firewalld est livré avec un ensemble de zones préconfigurées : pour lister ces zones, et plus généralement pour interagir avec le pare-feu, nous allons utiliser l’utilitaire firewall-cmd. Je tourne sur un système Fedora 27, vérifions quelles sont les zones disponibles :
firewall-cmd --get-zones
FedoraServer FedoraWorkstation block dmz drop external home internal public trusted work
Comme vous pouvez le voir, la commande ci-dessus renvoie une liste de toutes les interfaces disponibles dans mon système. Leur nom est assez révélateur de leur objectif, mais nous devons savoir quels services et ports sont disponibles par leur intermédiaire : la règle générale par défaut est que chaque service ou port est refusé. Chaque interface est ensuite configurée avec quelques exceptions, en fonction des services qui doivent être autorisés. Si nous voulons avoir une liste de tous les services associés à une zone, nous pouvons exécuter firewall-cmd avec l’option --get-services. Si une zone n’est pas explicitement passée à la commande, la zone par défaut sera interrogée :
firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: ens5f5
sources:
services: ssh mdns dhcpv6-client
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
La commande renvoyait un résumé de l’état de la zone (dans ce cas, l’état par défaut, « public »). Entre autres choses, vous pouvez voir clairement quelles interfaces réseau sont associées à cette zone (ens5f5 dans ce cas) et quels services y sont autorisés (ssh, mdns, dhcpv6-client). Si nous voulons récupérer des informations sur une zone spécifique, qui n’est pas par défaut, nous devons passer le nom de la zone en argument à l’option --zone. Par exemple, pour récupérer des informations sur la zone externe, nous exécuterions :
firewall-cmd --zone=external --list-all
external
target: default
icmp-block-inversion: no
interfaces:
sources:
services: ssh
ports:
protocols:
masquerade: yes
forward-ports:
source-ports:
icmp-blocks:
rich rules:
Manipulation de zones
Comme dit précédemment, lors de l’utilisation de l’outil firewall-cmd, si aucune zone n’est spécifiée, la zone par défaut est référencée. Nous pouvons vouloir changer la zone par défaut. Supposons par exemple que nous voulions définir la zone externe par défaut :
firewall-cmd --set-default=externalC’est très facile, n’est-ce pas ? Voyons maintenant comment nous pouvons ajouter ou supprimer des services ou des ports à une zone spécifique. Tout d’abord, les services sont un ensemble préconfiguré de ports associés à un protocole spécifique. Par exemple : le service ssh inclura le port TCP 22, tandis que le service samba comprendra l’ensemble des ports 139 et 445 TCP et 137 et 138 UDP. En utilisant les services, nous pouvons éviter d’avoir à nous souvenir de ports spécifiques à chaque fois. Supposons que nous voulions ajouter le service samba à la zone externe, tout ce que nous ferions serait de :
firwall-cmd --zone=external --add-service=samba
success
Le démon firewalld a répondu avec succès, ce qui signifie que l’exécution a réussi. Pour le vérifier, vérifions les services de zone :
sudo firewall-cmd --zone=external --list-services
ssh samba
Comme vous pouvez le voir, nous avons utilisé l’option --list-services à cet effet. Le résultat de la commande signifie clairement que le service samba a été ajouté à la zone. Cependant, les modifications apportées de cette manière sont temporaires et ne survivront pas à un redémarrage du démon firewalld. Vérifions-le. Tout d’abord, nous rechargeons le service :
# firewall-cmd --reloadEnsuite, nous vérifions à nouveau les services autorisés dans la zone externe :
firewall-cmd --zone=external --list-services
ssh
Comme vous pouvez le voir, le seul service autorisé dans la zone externe est ssh. Pour apporter une modification persistante à une zone, nous devons utiliser l’option --permanent :
# firewall-cmd --permanent --zone=external --add-service=sambaLes modifications permanentes devront être rechargées par le pare-feu pour être efficaces.
Si nous voulons faire l’opération inverse, et ainsi supprimer un service d’une zone, nous exécuterions :
# firewall-cmd --permanent --zone=external --remove-service=sambaLa syntaxe est très intuitive et n’a pas besoin d’être expliquée davantage. Mais que se passe-t-il si nous voulons ajouter un port spécifique à la place d’un service ? La syntaxe changerait légèrement :
# firewall-cmd --permanent --zone=external --add-port=139/tcpPour vérifier que le port a été ajouté à la zone :
firewall-cmd --zone=external --list-ports
139/tcp
L’opération a été couronnée de succès. De la même manière, pour supprimer un port, nous ferions :
firewall-cmd --permanent --zone=external --remove-port=139/tcpCréation d’une zone personnalisée
Jusqu’à présent, nous ne voyions que comment modifier des zones existantes. Il est également possible d’en créer de nouveaux, et c’est tout aussi facile. Supposons que nous voulions créer une zone personnalisée appelée linuxconfig :
firewall-cmd --permanent --new-zone=linuxconfigUne nouvelle zone vide a été créée : par défaut, aucun service ou port n’y est autorisé. Il est également possible de créer une zone en chargeant un fichier de configuration :
firewall-cmd --permanent --new-zone-from-file=file --name=linuxconfigOù file est le chemin d’accès au fichier contenant la définition de zone. Notez que lors de la création ou de la suppression d’une zone, l’option --permanent est obligatoire : une erreur sera générée si elle n’est pas fournie.
Associer une zone à une interface
La création d’une zone n’est que la première étape : il faut maintenant l’associer à une interface réseau. Supposons que nous voulions utiliser notre nouvelle zone créée, en l’associant à l’interface ethernet ens5f5 : voici la commande qui nous a permis d’accomplir la tâche :
firewall-cmd --permanent --zone=linuxconfig --add-interface=ens5f5Si nous interrogeons la zone pour les interfaces qui lui sont attribuées, nous devrions voir :
firewall-cmd --zone=linuxconfig --list-interfaces
ens5f5
Supprimer l’interface de la zone est aussi simple que :
firewall-cmd --remove-interface=ens5f5 --zone=linuxconfigDes règles riches
Dans certaines situations, nous pouvons avoir besoin de créer une règle plus complexe, et de ne pas nous contenter d’autoriser certains ports ou services dans une zone. Par exemple, nous pouvons vouloir créer une règle pour bloquer un certain type de trafic provenant d’une machine spécifique. C’est à cela que servent les règles riches. Une règle se compose essentiellement de deux parties : dans la première, nous spécifions les conditions qui doivent être remplies pour que la règle soit appliquée, et dans la seconde, l’action à exécuter : accepter, abandonner ou rejeter.
Disons que nous voulons bloquer le trafic de la machine avec l’ip 192.168.0.37 dans le réseau local : voici comment nous composerions notre règle :
firewall-cmd --zone=linuxconfig --add-rich-rule="rule \
family="ipv4" \
source address=192.168.0.37 \
service name=ssh \
reject \
Pour ajouter une règle enrichie, nous avons utilisé l’option --add-rich-rule, en décrivant la règle comme son argument. La règle commence par le mot-clé de la règle. Avec family, nous avons spécifié que la règle s’applique uniquement aux paquets ipv4 : si ce mot-clé n’est pas fourni, la règle est appliquée à la fois à ipv4 et à ipv6. Nous avons ensuite fourni l’adresse source que les paquets doivent avoir pour que la règle soit déclenchée avec l’adresse source. Avec service, nous avons spécifié le type de service pour la règle, dans ce cas ssh. Enfin, nous avons fourni l’action à exécuter si un paquet correspond à la règle, dans ce cas reject. Si nous essayons maintenant d’établir une connexion ssh à partir de la machine avec l’adresse IP 192.168.0.37, nous obtenons :
ssh 192.168.0.35
ssh: connect to host 192.168.0.35 port 22: Connection refused
Celle ci-dessus est très simple, mais une règle peut devenir très complexe. Vous devez consulter la documentation de firewalld pour voir toute la gamme de paramètres et d’options disponibles.
Le mode panique
Le mode panique est un mode qui ne doit être utilisé que dans des situations où il y a des problèmes vraiment graves avec l’environnement réseau. Lorsque ce mode est actif, toutes les connexions existantes sont ignorées et tous les paquets entrants et sortants sont supprimés. Il peut être activé en exécutant :
firewall-cmd --panic-onPour sortir du mode panique, la commande est la suivante :
firewall-cmd --panic-offIl est même possible d’interroger l’état du mode panique, en exécutant :
firewall-cmd --query-panicCes options ne sont valides qu’au moment de l’exécution et ne peuvent pas être utilisées avec --permanent.
