Comment configurer un pare-feu à l’aide de FirewallD sur CentOS 7

introduction

Firewalld est une solution de gestion de pare-feu disponible pour de nombreuses distributions Linux. Elle constitue une interface pour le système de filtrage de paquets iptables fourni par le noyau Linux. Dans ce guide, nous expliquerons comment configurer un pare-feu pour votre serveur et vous montrerons les bases de la gestion du pare-feu avec l'outil d'administration defirewall-cmd (si vous préférez utiliseriptables avec CentOS, suivez this guide).

[.note] #Note: Il est possible que vous utilisiez une version plus récente de firewalld que celle disponible au moment de la rédaction de cet article, ou que votre serveur ait été configuré légèrement différemment de l'exemple de serveur utilisé tout au long ce guide. Ainsi, le comportement de certaines des commandes expliquées dans ce guide peut varier en fonction de votre configuration spécifique.
#

Concepts de base dans Firewalld

Avant de commencer à parler de la façon d'utiliser réellement l'utilitairefirewall-cmd pour gérer la configuration de votre pare-feu, nous devons nous familiariser avec quelques concepts de base que l'outil introduit.

Zones

Le démonfirewalld gère des groupes de règles à l'aide d'entités appelées «zones». Les zones sont essentiellement des ensembles de règles qui dictent le trafic à autoriser en fonction du niveau de confiance que vous avez dans les réseaux auxquels votre ordinateur est connecté. Une zone est affectée aux interfaces réseau pour déterminer le comportement que le pare-feu doit autoriser.

Ce type de flexibilité est une bonne méthode pour modifier les règles en fonction de votre environnement pour les ordinateurs susceptibles de passer fréquemment d’un réseau à l’autre (tels que les ordinateurs portables). Vous pouvez avoir mis en place des règles strictes interdisant la majorité du trafic lorsque vous travaillez sur un réseau WiFi public, tout en autorisant des restrictions plus souples lors de la connexion à votre réseau domestique. Pour un serveur, ces zones ne sont pas aussi importantes immédiatement car l'environnement réseau change rarement, voire jamais.

Quelle que soit la dynamique de votre environnement réseau, il est toujours utile de se familiariser avec l'idée générale derrière chacune des zones prédéfinies pourfirewalld. Dans l'ordre deleast trusted àmost trusted, les zones prédéfinies à l'intérieur defirewalld sont:

  • drop: le niveau de confiance le plus bas. Toutes les connexions entrantes sont abandonnées sans réponse et seules les connexions sortantes sont possibles.

  • block: similaire à ce qui précède, mais au lieu de simplement abandonner les connexions, les requêtes entrantes sont rejetées avec un messageicmp-host-prohibited ouicmp6-adm-prohibited.

  • public: représente les réseaux publics non approuvés. Vous ne faites pas confiance aux autres ordinateurs, mais vous autorisez certaines connexions entrantes au cas par cas.

  • external: réseaux externes dans le cas où vous utilisez le pare-feu comme passerelle. Il est configuré pour le masquage NAT afin que votre réseau interne reste privé mais accessible.

  • internal: l'autre côté de la zone externe, utilisé pour la partie interne d'une passerelle. Les ordinateurs sont assez fiables et certains services supplémentaires sont disponibles.

  • dmz: Utilisé pour les ordinateurs situés dans une DMZ (ordinateurs isolés qui n'auront pas accès au reste de votre réseau). Seules certaines connexions entrantes sont autorisées.

  • work: utilisé pour les machines de travail. Faites confiance à la plupart des ordinateurs du réseau. Quelques services supplémentaires pourraient être autorisés.

  • home: un environnement domestique. Cela implique généralement que vous faites confiance à la plupart des autres ordinateurs et qu’un peu plus de services seront acceptés.

  • trusted: faites confiance à toutes les machines du réseau. La plus ouverte des options disponibles doit être utilisée avec parcimonie.

Pour utiliser le pare-feu, nous pouvons créer des règles et modifier les propriétés de nos zones, puis affecter nos interfaces réseau aux zones les plus appropriées.

Permanence de la règle

Dans firewalld, les règles peuvent être désignées comme permanentes ou immédiates. Si une règle est ajoutée ou modifiée, le comportement du pare-feu en cours d'exécution est modifié par défaut. Au prochain démarrage, les anciennes règles seront annulées.

La plupart des opérationsfirewall-cmd peuvent utiliser l'indicateur--permanent pour indiquer que le pare-feu non éphémère doit être ciblé. Cela affectera le jeu de règles rechargé au démarrage. Cette séparation signifie que vous pouvez tester les règles dans votre instance de pare-feu active, puis recharger en cas de problème. Vous pouvez également utiliser l'indicateur--permanent pour créer un ensemble complet de règles au fil du temps qui seront toutes appliquées en même temps lorsque la commande de rechargement est émise.

Installer et activer votre pare-feu pour qu'il démarre au démarrage

firewalld est installé par défaut sur certaines distributions Linux, y compris de nombreuses images de CentOS 7. Cependant, vous devrez peut-être installer vous-même firewall:

sudo yum install firewalld

Après avoir installéfirewalld, vous pouvez activer le service et redémarrer votre serveur. N'oubliez pas que l'activation de firewalld entraînera le démarrage du service au démarrage. Il est recommandé de créer vos règles de pare-feu et de les tester avant de configurer ce comportement afin d'éviter des problèmes potentiels.

sudo systemctl enable firewalld
sudo reboot

Lorsque le serveur redémarre, votre pare-feu doit être activé, vos interfaces réseau doivent être placées dans les zones que vous avez configurées (ou revenir à la zone configurée par défaut), et toute règle associée à la ou aux zones sera appliquée aux zones associées. interfaces.

Nous pouvons vérifier que le service est en cours d'exécution et accessible en tapant:

sudo firewall-cmd --state
outputrunning

Cela indique que notre pare-feu est opérationnel avec la configuration par défaut.

Familiarisation avec les règles actuelles du pare-feu

Avant de commencer à apporter des modifications, nous devons nous familiariser avec l'environnement par défaut et les règles fournies par le démon.

Explorer les valeurs par défaut

Nous pouvons voir quelle zone est actuellement sélectionnée par défaut en tapant:

firewall-cmd --get-default-zone
outputpublic

Puisque nous n'avons donné àfirewalld aucune commande pour s'écarter de la zone par défaut, et qu'aucune de nos interfaces n'est configurée pour se lier à une autre zone, cette zone sera également la seule zone «active» (la zone qui contrôle le trafic pour nos interfaces). Nous pouvons vérifier cela en tapant:

firewall-cmd --get-active-zones
outputpublic
  interfaces: eth0 eth1

Ici, nous pouvons voir que notre exemple de serveur a deux interfaces réseau contrôlées par le pare-feu (eth0 eteth1). Ils sont tous deux en cours de gestion selon les règles définies pour la zone publique.

Comment savons-nous quelles règles sont associées à la zone publique? Nous pouvons imprimer la configuration de la zone par défaut en tapant:

sudo firewall-cmd --list-all
outputpublic (default, active)
  target: default
  icmp-block-inversion: no
  interfaces: eth0 eth1
  sources:
  services: ssh dhcpv6-client
  ports:
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

Nous pouvons dire à partir de la sortie que cette zone est à la fois la zone par défaut et active et que les interfaceseth0 eteth1 sont associées à cette zone (nous savions déjà tout cela lors de nos précédentes enquêtes). Cependant, nous pouvons également constater que cette zone autorise les opérations normales associées à un client DHCP (pour l'attribution d'adresse IP) et à SSH (pour l'administration à distance).

Explorer des zones alternatives

Nous avons maintenant une bonne idée de la configuration de la zone par défaut et de la zone active. Nous pouvons également trouver des informations sur d'autres zones.

Pour obtenir une liste des zones disponibles, tapez:

firewall-cmd --get-zones
outputblock dmz drop external home internal public trusted work

Nous pouvons voir la configuration spécifique associée à une zone en incluant le paramètre--zone= dans notre commande--list-all:

sudo firewall-cmd --zone=home --list-all
outputhome
  interfaces:
  sources:
  services: dhcpv6-client ipp-client mdns samba-client ssh
  ports:
  masquerade: no
  forward-ports:
  icmp-blocks:
  rich rules:

Vous pouvez générer toutes les définitions de zone à l'aide de l'option--list-all-zones. Vous voudrez probablement diriger la sortie dans un pager pour une visualisation plus facile:

sudo firewall-cmd --list-all-zones | less

Sélection de zones pour vos interfaces

Sauf si vous avez configuré vos interfaces réseau autrement, chaque interface sera placée dans la zone par défaut lors du démarrage du pare-feu.

Changer la zone d'une interface

Vous pouvez effectuer la transition d'une interface entre des zones au cours d'une session en utilisant le paramètre--zone= en combinaison avec le paramètre--change-interface=. Comme pour toutes les commandes qui modifient le pare-feu, vous devrez utilisersudo.

Par exemple, nous pouvons faire la transition de notre interfaceeth0 vers la zone «home» en tapant ceci:

sudo firewall-cmd --zone=home --change-interface=eth0
outputsuccess

Note

[.note] # Chaque fois que vous effectuez la transition d'une interface vers une nouvelle zone, sachez que vous modifiez probablement les services qui seront opérationnels. Par exemple, ici, nous passons à la zone «home», où SSH est disponible. Cela signifie que notre connexion ne doit pas chuter. Certaines autres zones n'ont pas SSH activé par défaut et si votre connexion est interrompue lors de l'utilisation de l'une de ces zones, vous risquez de ne pas pouvoir vous reconnecter.
#

Nous pouvons vérifier que cela a réussi en demandant à nouveau les zones actives:

firewall-cmd --get-active-zones
outputhome
  interfaces: eth0
public
  interfaces: eth1

Ajuster la zone par défaut

Si toutes les interfaces peuvent être gérées au mieux par une seule zone, il est probablement plus simple de sélectionner la meilleure zone par défaut, puis de l’utiliser pour votre configuration.

Vous pouvez modifier la zone par défaut avec le paramètre--set-default-zone=. Ceci changera immédiatement toute interface qui était tombée sur la valeur par défaut vers la nouvelle zone:

sudo firewall-cmd --set-default-zone=home
outputsuccess

Définir des règles pour vos applications

La méthode de base pour définir les exceptions de pare-feu pour les services que vous souhaitez rendre disponibles est simple. Nous allons passer en revue l’idée de base ici.

Ajouter un service à vos zones

La méthode la plus simple consiste à ajouter les services ou les ports dont vous avez besoin aux zones que vous utilisez. Encore une fois, vous pouvez obtenir une liste des services disponibles avec l'option--get-services:

firewall-cmd --get-services
outputRH-Satellite-6 amanda-client amanda-k5-client bacula bacula-client bitcoin bitcoin-rpc bitcoin-testnet bitcoin-testnet-rpc ceph ceph-mon cfengine condor-collector ctdb dhcp dhcpv6 dhcpv6-client dns docker-registry dropbox-lansync elasticsearch freeipa-ldap freeipa-ldaps freeipa-replication freeipa-trust ftp ganglia-client ganglia-master high-availability http https imap imaps ipp ipp-client ipsec iscsi-target kadmin kerberos kibana klogin kpasswd kshell ldap ldaps libvirt libvirt-tls managesieve mdns mosh mountd ms-wbt mssql mysql nfs nrpe ntp openvpn ovirt-imageio ovirt-storageconsole ovirt-vmconsole pmcd pmproxy pmwebapi pmwebapis pop3 pop3s postgresql privoxy proxy-dhcp ptp pulseaudio puppetmaster quassel radius rpc-bind rsh rsyncd samba samba-client sane sip sips smtp smtp-submission smtps snmp snmptrap spideroak-lansync squid ssh synergy syslog syslog-tls telnet tftp tftp-client tinc tor-socks transmission-client vdsm vnc-server wbem-https xmpp-bosh xmpp-client xmpp-local xmpp-server

Note

[.Remarque]##

Vous pouvez obtenir plus de détails sur chacun de ces services en regardant leur fichier.xml associé dans le répertoire/usr/lib/firewalld/services. Par exemple, le service SSH est défini comme ceci:

/usr/lib/firewalld/services/ssh.xml



  SSH
  Secure Shell (SSH) is a protocol for logging into and executing commands on remote machines. It provides secure encrypted communications. If you plan on accessing your machine remotely via SSH over a firewalled interface, enable this option. You need the openssh-server package installed for this option to be useful.
  
 +
You can enable a service for a zone using the `+--add-service=+` parameter. The operation will target the default zone or whatever zone is specified by the `+--zone=+` parameter. By default, this will only adjust the current firewall session. You can adjust the permanent firewall configuration by including the `+--permanent+` flag.

Par exemple, si nous exploitons un serveur Web servant du trafic HTTP conventionnel, nous pouvons autoriser ce trafic pour les interfaces de notre zone «publique» pour cette session en tapant:

sudo firewall-cmd --zone=public --add-service=http

Vous pouvez omettre les--zone= si vous souhaitez modifier la zone par défaut. Nous pouvons vérifier que l'opération a réussi en utilisant les opérations--list-all ou--list-services:

sudo firewall-cmd --zone=public --list-services
outputdhcpv6-client http ssh

Une fois que vous avez vérifié que tout fonctionne comme il se doit, vous souhaiterez probablement modifier les règles de pare-feu permanentes afin que votre service soit toujours disponible après un redémarrage. Nous pouvons rendre notre changement de zone «publique» permanent en tapant:

sudo firewall-cmd --zone=public --permanent --add-service=http
outputsuccess

Vous pouvez vérifier que cela a réussi en ajoutant l'indicateur--permanent à l'opération--list-services. Vous devez utilisersudo pour toutes les opérations--permanent:

sudo firewall-cmd --zone=public --permanent --list-services
outputdhcpv6-client http ssh

Votre zone «publique» autorisera désormais le trafic Web HTTP sur le port 80. Si votre serveur Web est configuré pour utiliser SSL / TLS, vous souhaiterez également ajouter le servicehttps. Nous pouvons ajouter cela à la session en cours et au jeu de règles permanent en tapant:

sudo firewall-cmd --zone=public --add-service=https
sudo firewall-cmd --zone=public --permanent --add-service=https

Que se passe-t-il si aucun service approprié n'est disponible?

Les services de pare-feu inclus dans l'installation de firewalld représentent la plupart des exigences les plus courantes pour les applications auxquelles vous pouvez autoriser l'accès. Cependant, il y aura probablement des scénarios où ces services ne répondent pas à vos besoins.

Dans cette situation, vous avez deux options.

Ouvrir un port pour vos zones

Le moyen le plus simple d’ajouter une prise en charge pour votre application spécifique consiste à ouvrir les ports qu’elle utilise dans la ou les zones appropriées. C’est aussi simple que de spécifier le port ou la plage de ports et le protocole associé aux ports à ouvrir.

Par exemple, si notre application fonctionne sur le port 5000 et utilise TCP, nous pourrions l'ajouter à la zone «publique» pour cette session en utilisant le paramètre--add-port=. Les protocoles peuvent êtretcp ouudp:

sudo firewall-cmd --zone=public --add-port=5000/tcp
outputsuccess

Nous pouvons vérifier que cela a réussi en utilisant l'opération--list-ports:

sudo firewall-cmd --zone=public --list-ports
output5000/tcp

Il est également possible de spécifier une plage séquentielle de ports en séparant les ports de début et de fin dans la plage par un tiret. Par exemple, si notre application utilise les ports UDP 4990 à 4999, vous pouvez les ouvrir sur «public» en tapant:

sudo firewall-cmd --zone=public --add-port=4990-4999/udp

Après les tests, nous souhaiterions probablement les ajouter au pare-feu permanent. Vous pouvez le faire en tapant:

sudo firewall-cmd --zone=public --permanent --add-port=5000/tcp
sudo firewall-cmd --zone=public --permanent --add-port=4990-4999/udp
sudo firewall-cmd --zone=public --permanent --list-ports
outputsuccess
success
5000/tcp 4990-4999/udp

Définir un service

Ouvrir des ports pour vos zones est facile, mais il peut être difficile de garder une trace de la fonction de chacune d’elles. Si vous retirez un service sur votre serveur, vous aurez peut-être du mal à vous rappeler quels ports ouverts sont toujours nécessaires. Pour éviter cette situation, il est possible de définir un service.

Les services sont simplement des collections de ports avec un nom et une description associés. L'utilisation des services est plus facile à administrer que les ports, mais nécessite un peu de travail préalable. La manière la plus simple de démarrer est de copier un script existant (trouvé dans/usr/lib/firewalld/services) dans le répertoire/etc/firewalld/services où le pare-feu recherche les définitions non standard.

Par exemple, nous pourrions copier la définition de service SSH à utiliser pour notre définition de service «exemple» comme celle-ci. Le nom de fichier moins le suffixe.xml dictera le nom du service dans la liste des services de pare-feu:

sudo cp /usr/lib/firewalld/services/ssh.xml /etc/firewalld/services/example.xml

Maintenant, vous pouvez ajuster la définition trouvée dans le fichier que vous avez copié:

sudo vi /etc/firewalld/services/example.xml

Pour commencer, le fichier contiendra la définition SSH que vous avez copiée:

/etc/firewalld/services/example.xml



  SSH
  Secure Shell (SSH) is a protocol for logging into and executing commands on remote machines. It provides secure encrypted communications. If you plan on accessing your machine remotely via SSH over a firewalled interface, enable this option. You need the openssh-server package installed for this option to be useful.
  

La majorité de cette définition sont en fait des métadonnées. Vous voudrez changer le nom court du service dans les balises<short>. Ceci est un nom lisible par l’homme pour votre service. Vous devez également ajouter une description afin de disposer de davantage d'informations si vous devez auditer le service. La seule configuration à effectuer qui affecte réellement la fonctionnalité du service sera probablement la définition du port où vous identifiez le numéro de port et le protocole que vous souhaitez ouvrir. Cela peut être spécifié plusieurs fois.

Pour notre service «exemple», imaginez que nous devions ouvrir le port 7777 pour TCP et 8888 pour UDP. En entrant en mode INSERT en appuyant suri, nous pouvons modifier la définition existante avec quelque chose comme ceci:

/etc/firewalld/services/example.xml



  Example Service
  This is just an example service.  It probably shouldn't be used on a real system.
  
  

Appuyez surESC, puis entrez:x pour enregistrer et fermer le fichier.

Rechargez votre pare-feu pour accéder à votre nouveau service:

sudo firewall-cmd --reload

Vous pouvez voir qu'il fait maintenant partie de la liste des services disponibles:

firewall-cmd --get-services
outputRH-Satellite-6 amanda-client amanda-k5-client bacula bacula-client bitcoin bitcoin-rpc bitcoin-testnet bitcoin-testnet-rpc ceph ceph-mon cfengine condor-collector ctdb dhcp dhcpv6 dhcpv6-client dns docker-registry dropbox-lansync elasticsearch example freeipa-ldap freeipa-ldaps freeipa-replication freeipa-trust ftp ganglia-client ganglia-master high-availability http https imap imaps ipp ipp-client ipsec iscsi-target kadmin kerberos kibana klogin kpasswd kshell ldap ldaps libvirt libvirt-tls managesieve mdns mosh mountd ms-wbt mssql mysql nfs nrpe ntp openvpn ovirt-imageio ovirt-storageconsole ovirt-vmconsole pmcd pmproxy pmwebapi pmwebapis pop3 pop3s postgresql privoxy proxy-dhcp ptp pulseaudio puppetmaster quassel radius rpc-bind rsh rsyncd samba samba-client sane sip sips smtp smtp-submission smtps snmp snmptrap spideroak-lansync squid ssh synergy syslog syslog-tls telnet tftp tftp-client tinc tor-socks transmission-client vdsm vnc-server wbem-https xmpp-bosh xmpp-client xmpp-local xmpp-server

Vous pouvez maintenant utiliser ce service dans vos zones comme vous le feriez normalement.

Créer vos propres zones

Bien que les zones prédéfinies soient probablement plus que suffisantes pour la plupart des utilisateurs, il peut être utile de définir vos propres zones plus descriptives de leur fonction.

Par exemple, vous souhaiterez peut-être créer une zone pour votre serveur Web, appelée "publicweb". Toutefois, vous souhaiterez peut-être configurer une autre zone pour le service DNS que vous fournissez sur votre réseau privé. Vous voudrez peut-être une zone appelée «privateDNS» pour cela.

Lors de l'ajout d'une zone, vous devez l'ajouter à la configuration du pare-feu permanent. Vous pouvez ensuite recharger pour amener la configuration dans votre session en cours. Par exemple, nous pourrions créer les deux zones discutées ci-dessus en tapant:

sudo firewall-cmd --permanent --new-zone=publicweb
sudo firewall-cmd --permanent --new-zone=privateDNS

Vous pouvez vérifier leur présence dans votre configuration permanente en tapant:

sudo firewall-cmd --permanent --get-zones
outputblock dmz drop external home internal privateDNS public publicweb trusted work

Comme indiqué précédemment, ceux-ci ne seront pas encore disponibles dans l'instance actuelle du pare-feu:

firewall-cmd --get-zones
outputblock dmz drop external home internal public trusted work

Rechargez le pare-feu pour amener ces nouvelles zones dans la configuration active:

sudo firewall-cmd --reload
firewall-cmd --get-zones
outputblock dmz drop external home internal privateDNS public publicweb trusted work

Vous pouvez maintenant commencer à attribuer les services et les ports appropriés à vos zones. Il est généralement judicieux d’ajuster l’instance active, puis de transférer ces modifications dans la configuration permanente après le test. Par exemple, pour la zone «publicweb», vous pouvez ajouter les services SSH, HTTP et HTTPS:

sudo firewall-cmd --zone=publicweb --add-service=ssh
sudo firewall-cmd --zone=publicweb --add-service=http
sudo firewall-cmd --zone=publicweb --add-service=https
sudo firewall-cmd --zone=publicweb --list-all
outputpublicweb
  target: default
  icmp-block-inversion: no
  interfaces:
  sources:
  services: ssh http https
  ports:
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

De même, nous pouvons ajouter le service DNS à notre zone «privateDNS»:

sudo firewall-cmd --zone=privateDNS --add-service=dns
sudo firewall-cmd --zone=privateDNS --list-all
outputprivateDNS
  interfaces:
  sources:
  services: dns
  ports:
  masquerade: no
  forward-ports:
  icmp-blocks:
  rich rules:

Nous pourrions ensuite changer nos interfaces vers ces nouvelles zones pour les tester:

sudo firewall-cmd --zone=publicweb --change-interface=eth0
sudo firewall-cmd --zone=privateDNS --change-interface=eth1

À ce stade, vous avez la possibilité de tester votre configuration. Si ces valeurs fonctionnent pour vous, vous voudrez ajouter les mêmes règles à la configuration permanente. Vous pouvez le faire en réappliquant les règles avec l'indicateur--permanent:

sudo firewall-cmd --zone=publicweb --permanent --add-service=ssh
sudo firewall-cmd --zone=publicweb --permanent --add-service=http
sudo firewall-cmd --zone=publicweb --permanent --add-service=https
sudo firewall-cmd --zone=privateDNS --permanent --add-service=dns

Après avoir appliqué de manière permanente ces règles, vous pouvez redémarrer votre réseau et recharger votre service de pare-feu:

sudo systemctl restart network
sudo systemctl reload firewalld

Validez que les bonnes zones ont été attribuées:

firewall-cmd --get-active-zones
outputprivateDNS
  interfaces: eth1
publicweb
  interfaces: eth0

Et validez que les services appropriés sont disponibles pour les deux zones:

sudo firewall-cmd --zone=publicweb --list-services
outputhttp https ssh
sudo firewall-cmd --zone=privateDNS --list-services
outputdns

Vous avez créé avec succès vos propres zones! Si vous souhaitez faire de l'une de ces zones la valeur par défaut pour d'autres interfaces, n'oubliez pas de configurer ce comportement avec le paramètre--set-default-zone=:

sudo firewall-cmd --set-default-zone=publicweb

Conclusion

Vous devriez maintenant avoir une assez bonne compréhension de la façon d’administrer le service firewalld sur votre système CentOS pour une utilisation quotidienne.

Le service firewalld vous permet de configurer des règles et des ensembles de règles maintenables qui prennent en compte votre environnement réseau. Il vous permet de passer de manière transparente entre différentes stratégies de pare-feu grâce à l'utilisation de zones et donne aux administrateurs la possibilité de résumer la gestion des ports dans des définitions de service plus conviviales. Acquérir une connaissance pratique de ce système vous permettra de tirer parti de la flexibilité et de la puissance offertes par cet outil.