INF4470 Fiabilité et sécurité informatique (Hiver 2010) 1 / 5 Travail pratique 7 : les coupe-feu avec NetFilter === DESCRIPTION GÉNÉRALE DE L'EXPÉRIMENTATION === On utilisera deux machines qui seront utilisées comme client et serveur et que l'on désignera par les noms «GAUCHE» et «DROITE». Dans les différentes étapes de la section «MANIPULATIONS» nous reproduirons deux scénarios courants dans les réseaux TCP/IP : l'échange de requêtes et de réponses ICMP Echo (Ping) et l'échange de requêtes et de réponses HTTP entre un client et un serveur Web. L'objectif de ce laboratoire est d'expérimenter les possibilités et les limites du filtrage des paquets réseau par les logiciels coupe-feu (firewall) tel que Netfilter (commande "iptables") qui est intégré à Linux depuis la version 2.4. Donc, ce que vous pouvez faire c'est désigner comme «DROITE» un serveur Web qui répond aux ping (ce serveur peut-être de n'importe quelle plateforme, et même être en dehors de votre controle). Dans le laboratoire, les machines Windows ont le serveur Web OpenSA de préinstallées et peuvent répondre aux ping si leur coupe feu est correctement configuré. Pour ce qui est de la machine «GAUCHE», celle ci DOIT être une machine Linux. Des DVD à partir desquels ont peut démarrer (bootable live DVD) un OS linux (en l'occurrence Backtrack v.4) seront disponibles pour ceux qui travail au laboratoire. Backtrack est un outils gratuit disponible sur Internet. Pour bien observer ce que vous faites, capturez les paquets d'un, ou encore mieux des deux cotés («GAUCHE» et «DROITE») et analysez vos traces. === MANIPULATIONS === FILTRAGE A L'AIDE D'IPTABLES «iptables» est la commande qui nous permet de spécifier des filtres à appliquer aux paquets réseaux. Pour vérifier l'ensemble des règles présente en mémoire vous pouvez entrer la commande : iptables -L Avant de débuter, il faut se rappeler qu'il y a deux stratégies pour créer un coupe-feu, on peut soit laisser passer tout le trafic sauf ce que l'on rejette, soit tout rejeter sauf ce que l'on autorise. De plus, l'ordre dans lequel nos règles sont entrées est important, car la première règle (du haut vers le bas dans la liste des règles) correspondant au paquet analysé sera celle appliquée. Voici quelques exemples de scénarios et de règles qui sont indépendant, c'est à dire qu'il n'ont pas à être entré consécutivement. Entre chaque scénario, vous pouvez faire la commande suivante pour vider la mémoire de toutes les règles qui ont été entrées : iptables -F
INF4470 Fiabilité et sécurité informatique (Hiver 2010) 2 / 5 Le format des règles que nous utiliserons ressemble à ceci : iptables -A moment options -j action Dans la commande iptables, le -A signifie qu'il s'agit d'une règles à ajouter en mémoire. Le moment peut prendre la valeur INPUT (le trafic destiné (adresse IP) au ROUTEUR), OUTPUT (le trafic émis (adresse IP) par le ROUTEUR) ou FORWARD (le trafic relayé (routé) par le ROUTEUR). Finalement, alors que nous verrons différentes options dans les scénarios, «-j action» défini comment traiter le paquet (DROP (supprimer le paquet), ACCEPT (traité normalement), REJECT (supprimer le paquet et envoyer un message d'erreur), LOG (le paquet sera journalisé), etc.). JOURNALISATION D'IPTABLES Afin de garder une trace des actions effectuées par Netfilter, on peut vouloir activer la journalisation d'une règle en utilisant l'action -j LOG. Il y a cependant un petit problème. L'action LOG est «non-terminale», en ce sens que l'exécution de LOG ne termine pas l'évaluation des règles. Si on utilise l'action LOG, le paquet sera journalisé et l'évaluation des règles continuera avec la prochaine règle. Alors comment pourrait-on éliminer (DROP) un paquet et journaliser (LOG) cette action en même temps? L'astuce consiste à créer une chaîne, qui est une liste de règles qui sont appliquées de concert aux paquets : chacune des règles spécifie une action qui sera appliquée au paquet qui «matche» la règle. Pour notre besoin, on créera donc d'abord une chaîne appelée logdrop qui contient deux règles: iptables -N logdrop iptables -A logdrop -j LOG iptables -A logdrop -j DROP Par la suite, lorsqu'on veut journaliser et supprimer un paquet, on n'a qu'à spécifier l'action "-j logdrop". Par défaut, iptables enregistres ses messages dans le fichier /var/log/messages. Il est possible de visualiser les plus récents messages au moyen de la commande : tail -f /var/log/messages SCÉNARIOS SUR LES ADRESSES IP On désire bloquer tout le trafic provenant (-s = @IP source) de DROITE : iptables -A INPUT -s @IP_DROITE -j DROP On désire bloquer tout le trafic destiné (-s = @IP destination) à DROITE : iptables -A OUTPUT -d @IP_DROITE -j DROP
INF4470 Fiabilité et sécurité informatique (Hiver 2010) 3 / 5 On désire bloquer tout le trafic (0/0 = toutes @IP) sauf celui avec DROITE : iptables -A INPUT -s @IP_DROITE -j ACCEPT iptables -A OUTPUT -d @IP_DROITE -j ACCEPT iptables -A INPUT -s 0/0 -j DROP iptables -A OUTPUT -d 0/0 -j DROP 1- Dans ce dernier scénario sur les adresses IP, l'ordre des règles est-il important? Pourquoi? SCÉNARIOS SUR LES PROTOCOLES Pour filtrer le trafic à l'aide du protocole, on doit utiliser différentes techniques. Comme un coupe-feu agit principalement au niveau «réseau» de la pile de protocoles, on peut filtrer directement (avec l'option -p)seulement sur les protocoles de niveau «immédiatement» supérieur à IP, c'est à dire : ICMP, TCP, UDP... On désire bloquer tout le trafic ICMP : iptables -A INPUT -p icmp -j DROP iptables -A OUTPUT -p icmp -j DROP On désire bloquer les Ping : iptables -A INPUT -p icmp --icmp-type echo-request -j DROP iptables -A OUTPUT -p icmp --icmp-type echo-request -j DROP et les Pong : iptables -A INPUT -p icmp --icmp-type echo-reply -j DROP iptables -A OUTPUT -p icmp --icmp-type echo-reply -j DROP On désire bloquer les demandes de connexion TCP émises vers DROITE : iptables -A OUTPUT -d @IP_DROITE -p tcp --syn -j DROP Par contre, au niveau transport on a aussi certains ports qui sont dédiés à des applications. Certains protocoles applicatifs peuvent donc être filtrés à l'aide de leurs ports. Par exemple, IPSec doit utiliser ISAKMP (UDP port 500) pour établir des connexions. On peut donc bloquer les connexions IPSec en faisant : iptables -A OUTPUT -p udp --dport 500 -j DROP iptables -A INPUT -p udp --dport 500 -j DROP
INF4470 Fiabilité et sécurité informatique (Hiver 2010) 4 / 5 Autre exemple, on désire bloquer HTTP sur GAUCHE (port TCP 80) : (serveur local) iptables -A INPUT -p tcp --dport 80 -j DROP iptables -A OUTPUT -p tcp --sport 80 -j DROP (serveur distant) iptables -A INPUT -p tcp --sport 80 -j DROP iptables -A OUTPUT -p tcp --dport 80 -j DROP Pour contourner cette mesure, certains utilise HTTP sur un autre port que 80, tel que le 8080, ou 443 (HTTPS). On peut alors faire : --dport 80,443,8080 -j DROP --sport 80,443,8080 -j DROP --sport 80,443,8080 -j DROP --dport 80,443,8080 -j DROP ou : --port 80,443,8080 -j DROP --port 80,443,8080 -j DROP C'est ce qui est arrivé avec le p2p (peer-to-peer) où les différents logiciels utilisaient initialement un port fixe. Lorsque l'on c'est mis à bloquer ces applications à l'aide de leurs numéros de port, de nouvelles versions sont apparues utilisant des ports aléatoires. On peut bloquer une plage de ports sources comme ceci : iptables -A OUTPUT -p tcp --sport 1024:65535 -j DROP 2- Comment bloquer tout les ports TCP entre 1024 et 65535, sauf le port 8080?
INF4470 Fiabilité et sécurité informatique (Hiver 2010) 5 / 5 SCÉNARIOS SUR LE DÉBIT Dans les règles de filtrage on peut aussi mettre des limites de débit qui permettent d'accepter seulement un certain nombre d'un certain type de paquet pour une durée quelconque. On désire ne laisser passer qu'un Ping à la seconde : iptables -A OUTPUT -p icmp --icmp-type echo-request -m limit --limit 1/second -j ACCEPT On permet à GAUCHE de ce connecter seulement 3 fois par jour au serveur Web sur DROITE : iptables -A OUTPUT -s @IP_GAUCHE -d @IP_DROITE -p TCP --dport 80 --syn -m limit --limit 3/day -j ACCEPT 3- Comment bloqueriez-vous l'attaque de «SYN flooding» réalisée dans le premier laboratoire? 4- Rédigez une (combinaison de) règle(s) qui permet de laisser passer uniquement les demandes de connexions dirigés vers les serveurs SSH et provenant de l'adresse 192.168.1.100. === À REMETTRE === Vos réponses aux 4 questions.