| Les firewalls | Vincent Defert - 20 Déc. 1998 |
Un firewall (littéralement : "mur de feu") est un dispositif de contrôle du traffic réseau permettant de protéger dans une certaine mesure un réseau relié en permanence à l'Internet. Ce contrôle peut s'exercer sur 2 niveaux : au niveau des paquets (données brutes) et au niveau des protocoles (ce que les paquets demandent de faire à la machine), le présent document traitant uniquement du contrôle des paquets.
Pour faciliter les explications, nous nous référerons à une installation fictive dont le schéma est le suivant :
Pour pouvoir contrôler le traffic réseau, le firewall (ici fw.mynett.fr) doit être le point de passage obligé de tous les échanges. Il contiendra donc 3 cartes réseau :
Nous aurions pu nous contenter de 2 cartes réseau en plaçant les machines de la DMZ sur le même hub que le routeur, mais le découpage en trois zones offre plus de confort et de sécurité: on peut par exemple bloquer le port 23 sur l'interface eth0, ce qui permet d'administrer les machines de la DMZ depuis n'importe quel poste du réseau interne par telnet sans qu'il soit pour autant possible de s'y connecter de l'extérieur.
Le noyau de Linux contient tout ce qu'il faut pour mettre en place un firewall (filtrage des paquets et translation d'adresses). Pour bénéficier de ces fonctions, il vous faudra recompiler le noyau en activant les options suivantes d'activées dans la rubrique "Networking options" :
Concernant le choix de la machine, un 486 est sans doute un peu juste, mais un Pentium 90 avec 32 Mo de RAM fera l'affaire : le processeur doit être suffisament rapide pour traiter les données en un temps raisonnable. Ne soyez pas trop chiche avec l'espace de swap. Si vous avez un gros disque dur, laissez donc un espace non partitionné : vous serez content de le trouver si vous avez besoin de plus de swap. Enfin, prenez ces conseils avec prudence: il ne sont que le reflet de mon expérience, sans aucune garantie d'aucune sorte.
Il n'y a rien de particulier à signaler, le firewall agissant comme un simple routeur à 3 interfaces :
# Pensez à charger le(s) module(s) correspondant aux cartes installées ifconfig lo 127.0.0.1 route add -net 127.0.0.0 netmask 255.0.0.0 lo ifconfig eth0 194.51.72.2 route add -net 194.51.72.0 netmask 255.255.255.128 eth0 ifconfig eth1 194.51.72.129 route add -net 194.51.72.128 netmask 255.255.255.128 eth1 ifconfig eth2 192.168.0.1 route add -net 192.168.0.0 eth2 route add default gw 194.51.72.1
Le traitement à appliquer aux paquets est défini à l'aide de règles de filtrage : on indique une politique par défaut (tout accepter ou tout rejeter) et une liste d'exceptions. Voici un exemple simple :
# Supprimer toutes les règles actuellement en vigueur ipfwadm -I -f ipfwadm -O -f ipfwadm -A -f # Règles à appliquer aux paquets entrants # Par défaut, tout accepter ipfwadm -I -p accept # ... sauf les paquets ICMP ipfwadm -I -a deny -P icmp -V 194.51.72.2 # ... bloquer le port Telnet ipfwadm -I -a deny -P tcp -V 194.51.72.2 -D 0.0.0.0/0 23 # ... rejeter les paquets "forgés" ipfwadm -I -a deny -V 194.51.72.2 -S 194.51.72.128/25 ipfwadm -I -a deny -V 194.51.72.2 -S 192.168.0.0/24 ipfwadm -I -a deny -V 194.51.72.2 -S 127.0.0.0/8 # ... bloquer les ports utilisés par SMB # (empêche de se connecter à une machine sous MS-Windows 95 ou NT # ayant partagé des ressources ainsi que d'explorer le réseau, le # cas échéant) /sbin/ipfwadm -I -a deny -P tcp -V 194.206.79.70 -D 0.0.0.0/0 137 /sbin/ipfwadm -I -a deny -P udp -V 194.206.79.70 -D 0.0.0.0/0 137 /sbin/ipfwadm -I -a deny -P tcp -V 194.206.79.70 -D 0.0.0.0/0 138 /sbin/ipfwadm -I -a deny -P udp -V 194.206.79.70 -D 0.0.0.0/0 138 /sbin/ipfwadm -I -a deny -P tcp -V 194.206.79.70 -D 0.0.0.0/0 139 /sbin/ipfwadm -I -a deny -P udp -V 194.206.79.70 -D 0.0.0.0/0 139 # ... bloquer le port utilisé par IPX # (empêche de se connecter à un serveur Netware, le cas échéant) /sbin/ipfwadm -I -a deny -P tcp -V 194.206.79.70 -D 0.0.0.0/0 213 /sbin/ipfwadm -I -a deny -P udp -V 194.206.79.70 -D 0.0.0.0/0 213 # Règles à appliquer aux paquets sortants # Par défaut, tout accepter ipfwadm -O -p accept
Ensuite, pour permettre de dissimuler le réseau privé tout en le laissant accéder à l'extérieur, il nous faut utiliser une technique appelée "Translation d'adresses" (en anglais : NAT, Network Address Translation, ou encore IP Masquerading).
Imaginez que votre réseau est une cité administrative. Les adresses IP correspondent aux numéros de bâtiments et les numéros de ports aux numéros de guichets. Maintenant, de par leur nature, certains services peuvent être soumis à des tentatives de pression de la part de certains usagers. Pour les protéger, on découple la relation avec le public du traitement des dossiers. Ainsi, vous remettez votre dossier au guichet 18 du bâtiment A qui le transmet à son collègue du guichet 23 du bâtiment D. Ce dernier le traite et le rend à son collègue qui vous le transmet.
C'est exactement la même chose avec la NAT: un certain nombre de ports du firewall sont utilisés pour transformer un couple adresse + port du réseau privé en un autre couple adresse + port du firewall. Le firewall tient à jour une table de correspondance afin de faire la transformation appropriée dans les 2 sens. Ainsi, il est possible de communiquer avec l'extérieur, mais il est impossible de deviner quel port va être affecté à une communication donnée, donc impossible d'initier une communication avec une machine du réseau privé à partir de l'extérieur.
Certains protocoles, comme FTP, communiquent à la machine distante une adresse et un numéro de port sur la machine locale. Avec FTP, cette information est transmise sous forme de texte (commande PORT). Le problème est que la machine distante n'a aucun moyen d'utiliser cette information puisque la machine locale lui est inaccessible.
Il est donc nécessaire de mettre en oeuvre un mécanisme intermédiaire adapté au protocole considéré afin de mettre à jour la table de translation du firewall et de modifier l'adresse et le numéro de port fournis à la machine distante en conséquence. Ce mécanisme est réalisé sous forme de kernel modules.
La mise en place de la translation d'adresses dans le cadre de notre exemple se fera de la façon suivante :
# Charger les modules de support pour certains protocoles insmod ip_masq_ftp insmod ip_masq_cuseeme insmod ip_masq_irc insmod ip_masq_quake insmod ip_masq_raudio insmod ip_masq_vdolive # Activer la translation d'adresses ipfwadm -F -f ipfwadm -F -p deny ipfwadm -F -a m -S 192.168.0.0/24
Une attaque contre votre réseau commencera forcément par votre firewall. Il est donc vital d'apporter un soin particulier à sa configuration.
Ainsi, vous veillerez à supprimer toutes les lignes de /etc/inetd.conf (sauf celle de telnet pour pouvoir l'administrer à distance, puisque le port correspondant a été bloqué sur l'interface eth0).
Vous ferez également le point sur tous les services lancés au démarrage de la machine (en principe aucun).
Vous apporterez un soin tout particulier au choix du mot de passe de root et vous éviterez de créer des utilisateurs sur cette machine. Vous ajouterez également la ligne suivante dans le fichier /etc/login.access :
-:ALL EXCEPT root:ALL
afin d'interdire la connection sur cette machine sous un autre nom que root.
Si vous conservez une trace de l'activité de la machine, stockez les journaux sur un serveur distinct ("loghost") afin d'éviter qu'un pirate ne "plante" votre machine en saturant son disque avec des messages d'erreur.
Enfin, n'oubliez jamais qu'un firewall n'est qu'un des moyens à la disposition de l'administrateur pour assurer la sécurité de son réseau et qu'il ne suffit pas d'en installer un pour être à l'abri de toutes les attaques. Atteindre une sécurité raisonnable nécessite la mise en oeuvre conjointe de plusieurs mesures. Par exemple :
Ces quelques indications vous montrent que la sécurité informatique ne repose pas que sur des logiciels, loin de là !
Les documents suivants traitent des firewalls dans divers contextes :
Les HOWTOs peuvent être consultés au format HTML et en français sur Freenix.