5. Configuration du filtrage

5.1. Introduction

La sécurité informatique est un terme général qui cache de nombreux aspects, tels que la sécurité physique de la machine, le contrôle d'accès aux fichiers, etc. L'un des aspects de la sécurité concerne la sécurité des réseaux. Avec la démocratisation d'Internet, les tentatives d'intrusions se développent. Afin de limiter le nombres de ces attaques, le mieux est encore de filtrer dès l'entrée du réseau tout ce qui n'est pas sensé y entrer. Le système qui permet la mise en place de ce filtrage s'appelle un firewall ou un «pare-feu» en français.

Un firewall peut se définir comme un dispositif de protection (matériel et/ou logiciel) constituant un filtre entre un ordinateur ou un réseau local et un réseau non sûr (Internet ou un autre réseau local par exemple). On distingue deux grandes familles de firewalls :

  • Les firewalls basés sur le filtrage réseau. Ces éléments fonctionnent au niveau transmission de l'information des couches du modèle OSI. Le filtrage s'effectue en fonction des informations contenues dans les en-têtes des trames, des paquets (adresses source et destination) et des segments (ports source et destination). Ce type de filtrage ne s'intéresse pas au contenu des paquets.

  • Les firewalls applicatifs ou de services. Ce type de filtrage permet de contrôler le traitement de l'information. Dans ce cas, l'information contenue dans le paquet peut être prise en compte. Les demandes de connexions sont dirigées vers un programme spécial appelé mandataire ou proxy de service. C'est ce dernier qui établira la connexion vers le service extérieur demandé.

5.2. Netfilter et iptables

Pour pouvoir bénéficier des fonctions de filtrage réseau du noyau LINUX, il faut y intégrer l'option Network packet filtering lors de la compilation. Cette fonctionnalité est une structure générale qui permet à d'autres éléments de se «brancher» dessus. Pour pouvoir indiquer les différentes règles au noyau, on dispose de l'utilitaire appelé iptables.

L'outil iptables utilise le concept de tables de règles, chaque table correspondant à une fonctionnalité d'examen du paquet. La table filter correspond au filtrage des paquets, la table nat concerne la traduction d'adresse et la table mangle permet la modification des paquets.

5.3. Utilisation de l'outil iptables

Dans un premier temps, iptables servira à la gestion des chaînes. Une chaîne peut être assimilée à une politique de sécurité associée à un flux de données. Par exemple, on peut définir une chaîne INTERNET pour désigner tous les flux venant de l'extérieur de votre réseau local. Trois chaînes par défaut existent, à savoir INPUT, FORWARD et OUTPUT. Si le nombre de règles est limité, on peut se contenter de celles-ci, mais si les règles deviennent conséquentes, il est préférable, pour faciliter la gestion, de créer de nouvelles chaînes. Les commandes de l'outil iptables associées à la gestion des chaînes sont les suivantes :

-N

Création d'une nouvelle chaîne. Exemple iptables -N INTERNET.

-X

Suppression d'une chaîne vide. Exemple iptables -X INTERNET.

-P

Mise en place de la règle par défaut pour une chaîne existante. Exemple : iptables -P INPUT DROP. Seules les chaînes INPUT, FORWARD et OUTPUT peuvent avoir une règle par défaut et les seules cibles disponibles sont ACCEPT et DROP.

-L

Lister les règles d'une chaîne. Exemple : iptables -L INTERNET.

-F

Effacer les règles d'une chaîne. Exemple : iptables -F INTERNET.

Dans un deuxième temps, il convient de construire les règles à l'intérieur des différentes chaînes. L'ajout d'une règle s'effectue avec l'option -A de l'outil iptables, tandis que l'effacement d'une règle se fait avec l'option -D. Les principales spécifications sur lesquelles les règles peuvent s'appuyer sont les suivantes :

  • -s : spécifie l'adresse IP source

  • -d : spécifie l'adresse IP de destination

  • -p : spécifie le protocole. Le protocole peut être tcp, udp ou icmp

  • -i : spécifie le nom de l'interface physique à travers laquelle les paquets entrent

  • -o : spécifie le nom de l'interface physique à travers laquelle les paquets sortent

Ces spécifications sont les plus générales, mais il en existe bien d'autres qui sont parfaitement listées dans la page de manuel de l'outil iptables.

5.4. Le filtrage avec iptables

Avec iptables, les différentes règles de filtrage sont organisées et regroupées dans des chaînes. Par défaut, il y a trois chaînes appelées INPUT, OUTPUT et FORWARD. L'arrangement de ces chaînes est proposé sur le schéma suivant :

                             _____
   Incoming                 /     \         Outgoing
          -->[Routing ]--->|FORWARD|------->
             [Decision]     \_____/    ^
              |                        |
              v                      ____
             ___                    /    \
            /   \                  |OUTPUT|
           |INPUT|                  \____/
            \___/                      ^
              |                        |
               ----> Local Process ----
   (c)2000 Rusty Russell

Les différentes chaînes sont consultées suivant la procédure suivante :

  1. Quand un paquet arrive, le noyau décide de la destination de ce paquet : c'est la phase de routage.

  2. Si le paquet est destiné à la machine, le paquet descend dans le diagramme et la chaîne INPUT est appliquée. Si le paquet passe cette chaîne, celui-ci sera transmis à l'un des processus locaux.

  3. Si le routage décide que le paquet est destiné à un autre réseau, alors c'est la chaîne FORWARD qui est appliquée.

  4. Enfin, les paquets envoyés par un processus local seront examinés par la chaîne OUTPUT. Si le paquet est accepté, celui-ci sera envoyé quelle que soit son interface de sortie.

Une chaîne est composée d'une liste de règles. Une règle décide de l'avenir d'un paquet en fonction de son en-tête. Les règles d'une chaîne sont examinées les unes après les autres jusqu'à ce qu'une correspondance soit trouvée. Finalement, si aucune correspondance n'est trouvée, la règle par défaut, policy, est appliquée. On associe à chaque règle une action à réaliser qui décide de l'avenir du paquet. Les fonctions principales sont les suivantes :

  • ACCEPT : cette cible permet d'accepter les paquets.

  • DROP : cette cible permet de refuser les paquets sans avertir le demandeur que sa demande de connexion a été refusée.

  • REJECT : cette cible permet de refuser les paquets, mais en avertissant le demandeur que sa demande de connexion a été refusée en lui envoyant un paquet RESET (RST).

5.5. Le suivi des communications, stateful firewalling

L'une des grandes nouveautés de la partie réseau du noyau 2.4 est la possibilité du suivi des communications. Ceci fait référence à la capacité du noyau à maintenir une table de suivi des communications en se basant, par exemple, sur le couple adresses (source et destination), sur les numéros de ports (source et destination), sur les types de protocoles ou l'état de la communication. Les pare-feux disposant de cette fonctionnalité sont appelés stateful firewalls. Dans ce cas, les paquets sont inspectés dans le contexte d'une session. Par exemple, un segment TCP avec le bit ACK activé sera rejeté si aucun segment SYN correspondant n'a été reçu auparavant.

Le suivi des «communications» se base sur trois états :

  • NEW : correspond à la demande de communication TCP initiale, au premier datagramme UDP ou au premier message ICMP.

  • ESTABLISHED : si une entrée de la table de suivi des communications correspond, alors le paquet appartient à une communication de type ESTABLISHED. Dans le cas du protocole TCP, on se réfère au bit ACK après qu'une communication ait été initiée. Dans le cas de datagrammes UDP c'est l'échange entre deux hôtes et les correspondances de numéros de ports qui sont prises en compte. Enfin, les messages ICMP echo-reply doivent correspondre aux requêtes echo-request.

  • RELATED : se réfère aux messages d'erreurs ICMP correspondant à une «communication» TCP ou UDP déjà présente dans la table de suivi.

D'un point de vue pratique, le module de suivi des communications sera activé grâce à l'option -m state de la commande iptables. L'option --ctstate permet de spécifier l'état de la communication à considérer.

Exemple 36. Autorisation d'une connexion ssh vers l'extérieur

# iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
# iptables -A OUTPUT -p tcp -d 0/0 --dport 22 -m conntrack --ctstate NEW -j ACCEPT

5.6. La traduction d'adresse (NAT)

La traduction d'adresse est une technique qui permet de remplacer une adresse source ou destination par une autre. La traduction d'adresse du noyau 2.4 supporte le source NAT (SNAT) et le destination NAT (DNAT). La table nat permet la modification des adresses source et destination grâce à deux chaînes par défaut :

  • PREROUTING : permet la modification de l'adresse de destination (DNAT) avant que le paquet ne passe par les fonctions de routage.

  • POSTROUTING : permet la modification de l'adresse source (SNAT) après que le paquet soit passé par les fonctions de routage.

        _____                                     _____
       /     \                                   /     \
     PREROUTING -->[décision]----------------->POSTROUTING----->
       \D-NAT/     [de routage]                  \S-NAT/
        -----          |                            ^
                       |                          __|__
                       |                         /     \
                       |                        | OUTPUT|
                       |                         \D-NAT/
                       |                            ^
                       |                            |
                       -------->Processus local------

Intéressons nous dans un premier temps à la traduction d'adresse source ou S-NAT. Il existe en deux formes distinctes au sein des noyaux (2.4|2.6) : SNAT et MASQUERADE. SNAT est la forme standard de la traduction d'adresse source, tandis que la deuxième est plus spécialisée au cas d'adresses IP assignées dynamiquement. La distinction entre les deux formes est subtile.

Avec SNAT, la communication est maintenue pendant un certain temps d'attente lors d'un dysfonctionnement. Si cette communication est rétablie suffisamment rapidement, les programmes réseaux ne seront pas affectés et le trafic TCP interrompu sera retransmis, dans la mesure où l'adresse IP n'a pas été changée.

Avec la forme MASQUERADE, il n'y a pas de temps d'attente quand la connexion est rompue et les informations concernant la traduction d'adresse sont effacées. Ceci permet d'utiliser immédiatement la nouvelle adresse IP qui peut être attribuée lors d'une reconnexion à un fournisseur d'accès, par exemple.

Exemple 37. SNAT standard

# iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source 192.192.192.192

Exemple 38. MASQUERADE

# iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE