Module Sécurité TP4 : Firewall IPTABLES Ala Rezmerita François Lesueur Le TP donnera lieu à la rédaction d un petit fichier texte contenant votre nom, les réponses aux questions ainsi que d éventuels résultats de commandes. Le fichier portera votre nom suivi du numéro de TP et sera envoyé par mail en fin de TP. 1 Présentation de Netfilter/Iptables 1.1 Étude générale Depuis la version 2.4, le module destiné au filtrage réseau dans Linux est Netfilter. Il se configure au moyen de l outil iptables. Le filtrage réseau consiste à examiner les paquets réseaux et à prendre des décisions sur le traitement à leur appliquer. Le système de filtrage permet notamment d interdire des connexions sur certains ports d un ordinateur, de limiter le nombre de connexions, de limiter les bandes passantes, etc. Netfilter a de très nombreuses fonctionnalités. Durant ce TP, nous n étudierons que les parties essentielles (filtrage de paquets, suivi de connexions, NAT). Le principe de fonctionnement est le suivant : lorsque la carte réseau reçoit un paquet, il est transmis à la partie Netfilter du noyau ; Netfilter étudie ce paquet (en-têtes et contenu) en se basant sur des règles définies par l administrateur du système ; Netfilter choisit de laisser passer le paquet intact, de modifier ce paquet, de le transmettre à une autre machine ou encore d interdire le passage. Netfilter fonctionne en utilisant 3 tables : la table filter correspond aux notions de filtrage réseau (accepter ou refuser un paquet) ; la table nat correspond aux fonctions de routage par translation d adresse (partage d accès internet par exemple) ; la table mangle permet de modifier les paquets à la volée. Vous devrez travailler en root pendant tout le TP (seul root est habilité à manipuler le pare-feu). 1
1.2 Filtrage (table filter) Netfilter se base sur 3 listes de règles pour définir son comportement vis-à-vis d un paquet (au niveau de la table filter). Le schéma suivant récapitule le trajet d un paquet au travers ces 3 chaînes : Les trois chaînes ont les rôles suivants : quand un paquet est reçu et est destiné à la machine locale, ce paquet passe dans la chaîne INPUT. S il est accepté par cette chaîne, les processus qui attendent le paquet le recevront ; quand un paquet est reçu et est destiné à une autre machine (la machine locale doit le router vers une autre machine), ce paquet passe dans la chaîne FORWARD. S il est accepté, il est retransmis vers sa destination ; quand un paquet est émis par la machine locale, ce paquet passe dans la chaîne OUTPUT. S il est accepté, il sera envoyé vers sa destination. Pour chaque paquet qui passe dans ces chaînes, l action peut être : ACCEPT, auquel cas le paquet est accepté ; DROP, auquel cas le paquet est refusé silencieusement (l expéditeur ne reçoit d erreur) ; REJECT, auquel cas le paquet est refusé et l expéditeur reçoit une erreur. Chaque chaîne possède enfin une règle par défaut (policy) qui définit l action par défaut, initialement ACCEPT. 2 Protection de la machine locale Nous allons maintenant mettre en place un firewall sur la machine locale. En utilisant la page de manuel d iptables, affichez l ensemble des règles actives. Vous devriez voir quelque chose qui ressemble à : Chain INPUT (policy ACCEPT 819K packets, 170M bytes) pkts bytes target prot opt in out source destination Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 728K packets, 188M bytes) pkts bytes target prot opt in out source destination 2
Vous voyez donc pour chaque chaîne : la policy (comportement par défaut) ; le nombre de paquets qui a traversé les règles de la chaîne ; le nombre d octets correspondants. Pour le moment, aucune règle supplémentaire n est définie ; par la suite, cette commande vous permettra de lister l ensemble des règles actives dans la table filter. Ici, Netfilter accepte donc tous les paquets. 2.1 Première règle iptables Nous allons maintenant interdire les connexions sur le port 22 (SSH). Pour cela, il faut interdire les paquets dans la chaîne INPUT sur le port 22 : # iptables -A INPUT -p tcp --dport 22 -j DROP Demandez maintenant à votre voisin d essayer de se connecter en SSH sur votre machine. Question 1 Nous avons ici utilisé l action DROP. Vous pouvez constater que la connexion est bien refusée mais que le client SSH met un certain temps à s en apercevoir. Pourquoi? Comment changer ce comportement? 2.2 Priorité des règles Un même paquet peut correspondre à plusieurs règles de filtrage, éventuellement contradictoires : Netfilter applique les règles dans l ordre et choisit systématiquement la première règle correspondant au paquet. Afin de tester ce comportement, rajoutons quelques paramètres de filtrage disponibles : --source IP[/netmask] correspond à l adresse source du paquet (soit de la forme 192.168.0.3 pour une machine unique, soit de la forme 192.168.0.0/24 pour tout le sous-réseau correspondant) ; --destination IP[/netmask] correspond à l adresse destination du paquet ; --sport PORT correspond au port source du paquet ; --dport PORT correspond au port destination du paquet. Question 2 Montrez sur un exemple que l ordre des règles compte. Pour modifier le filtrage, vous aurez besoin de supprimer des règles et d en ajouter à des endroits spécifique : référez-vous au manuel d iptables. Question 3 Mettez en place un jeu de règles autorisant le SSH uniquement depuis la machine de votre voisin. 2.3 Modules iptables Iptables est extensible par un système de modules. Par exemple, le module multiport permet de créer des règles correspondant à plusieurs ports : 3
iptables -A INPUT -m multiport -p tcp --dports port1,port2,port3 -j... Vous trouverez une description des modules existant dans le manuel d iptables, dans la section MATCH EXTENSIONS Question 4 Créez une règle avec multiport autorisant à la fois SSH et Telnet. 3 Suivi de connexion (conntrack) 3.1 Principe Netfilter permet le suivi des connexions via le module state (firewall stateful). Ce module permet d identifier les nouveaux flux, les flux établis et les flux liés à un autre flux. Ce suivi de connexion permet d affiner le filtrage de certains protocoles. Le module state définit plusieurs états possibles pour les flux réseaux : NEW : c est une nouvelle connexion ESTABLISHED : on connaît déjà cette connexion (elle est passée par l état NEW il y a peu de temps) RELATED : plus subtil, cela permet d identifier une connexion qui serait liée ou dépendante d une connexion déjà ESTABLISHED INVALID : tout ce qui n est pas correctement identifiable (paquets corrompus etc...) Voici un exemple, le protocole FTP en mode actif. Le protocole FTP utilise 2 connexions TCP pour communiquer : l une sert à envoyer les commandes du client vers le serveur (connexion de commandes) l autre sert à envoyer les données du serveur vers le client (connexion de données). Dans son fonctionnement standard, un client FTP se connecte sur le port 21 du serveur FTP. Le client indique ensuite au serveur sur quel port il (le client) recevra les données. Le serveur FTP va alors établir une connexion depuis son port 20 vers le port ( 1023) indiqué par le client. Si le client est protégé par un firewall stateless, l administrateur devrait donc autoriser toutes les connexions venant de l extérieur vers tous les ports supérieurs à 1023 du client, ce qui perdrait tout l intérêt du firewall. Le suivi de connexion permet alors de détecter qu une connexion FTP est établie (au moment où le client se connecte sur le port 21 du serveur) et ouvrir de manière dynamique le filtrage pour cette connexion spécifique vers le port que le client aura choisi. 3.2 Mise en pratique Effacez toutes les règles précédentes. Chargez ensuite le module noyau qui permet de gérer le suivi de connexion FTP : # modprobe ip_conntrack_ftp 4
Commencez par tout interdire : # iptables -A INPUT -j DROP Vérifiez que les connexions FTP depuis votre machine en mode FTP actif ne fonctionnent pas (utilisez une adresse IP et non un nom DNS dans la ligne de commande, le DNS n est pas résolu puisque tous les paquets sont bloqués) : # ftp?.?.?.? Ça ne marche pas car on DROP tous les paquets entrants pour le moment. Acceptons maintenant les paquets provenant d un serveur FTP dans le cas d une connexion préalablement établie avec notre client FTP : # iptables -I INPUT 1 -p tcp --sport 21 -m state --state ESTABLISHED -j ACCEPT # ftp?.?.?.? Cette fois, la connexion fonctionne. La connexion de commandes sur le port 21 est bien fonctionnelle. Une fois connecté, essayez de faire ls. La connexion se bloque. En effet, la commande ls en FTP utilise la connexion de données pour transmettre son résultat. Hors pour le moment, notre firewall bloque ces connexions. Question 5 Autorisez les transferts de données en FTP depuis le serveur vers votre machine. Pour cela, il faudra autoriser les connexions provenant du port 20 du serveur FTP et qui sont liées à la connexion de commandes qui a été initiée juste avant par notre machine. Pour tester, vérifiez que la commande ls fonctionne bien maintenant (il faut relancer la session FTP entièrement pour être sur que le suivi de connexions est bien à jour). 4 Bonus : Shorewall 4.1 Présentation Vous avez pu vous rendre compte de la complexité du réglage manuel du pare-feu. En particulier, la lecture des règles existantes ou la vérification de leur cohérence peut présenter des problèmes. La maintenance d une telle solution est donc complexe dans un environnement de production : les règles changent souvent et demandent une inspection régulière. De nombreuses solutions ont été développées pour faciliter la gestion des règles iptables. Nous allons ici utiliser shorewall. Shorewall n est pas un démon et repose entièrement sur iptables. Il consiste en une série de scripts permettant de simplifier la configuration. Installez shorewall avec la commande yum install shorewall 4.2 Configuration Vous pouvez inspecter les fichiers de configuration dans le répertoire /etc/shorewall. Les fichiers de configuration sont tous documentés, comme vous pourrez le remarquer : zones : définit des zones (pour donner des noms logiques aux interfaces utilisées, par exemple Internet, dmz...) interfaces : correspondance interface / zone 5
rules : contient la liste des exceptions policy : politiques par défaut pour certaines interfaces masq : traduction d adresses pour un réseau entier nat : translation d adresses pour un hôte particulier blacklist : pour bloquer spécifiquement certains trafics Question 6 Refaites le travail de la partie précédente, mais en utilisant cette fois-ci shorewall. De nouvelles possibilités pourront êtres explorées. Vous verrez que la configuration est beaucoup plus rapide... 6