Articles récents
Configuration du firewall Netfilter de Linux
Netfilter est le firewall natif de Linux, il est directement accessible par la commande iptables. Très complet et ultra simple d'utilisation, ce système de firewalling est configurable par script dès lors que l'on dispose de bonnes connaissances des protocoles réseaux. Cette article explicite comment segmenter vos réseaux avec des DMZ (zone démilitarisée), comment appliquer des règles simples sur vos DMZ, comment utiliser un suivi dynamique des connexions (CONNTRACK)...
1)Présentation
La version 2.4 du noyau Linux avait introduit une nouvelle version de firewall, appelé Netfilter (successeur d’IPCHAINS). Il est lié à l’utilitaire de configuration iptables, , on confond souvent netfilter et iptables dans la littérature.Netfilter reprend des principes de bases comme les chaînes, mais il y a des nouveautés :
- Une architecture modulaire
- Un système de firewall statefull
- Une traduction d’adresses (NAT)
- Une interface d’altération d’en-têtes de paquets (packet mangling)
Les fichiers de Netfilter sont répartis comme tels :
- Modules netfilter sont sous /lib/modules/num noyau/kernel/net/ipv4/netfilter
- Chargement des modules iptables dans etc/rc.modules (modprobe ip-tables)
- DĂ©marrage au boot dans /etc/init.d/iptables et /etc/sysconfig/iptables
2) Configuration de Netfilter : cas général
Ce chapitre ne décrit pas le fonctionnement des différentes règles de Iptables mais expose les différentes fonctionnalités utilisées au travers de Iptables pour notre projet.Configuration d’une passerelle:
Une passerelle est un périphérique connecté à plusieurs réseaux physiques capable de router les paquets protocolaires TCP/IP. Un firewall doit avoir cette fonction de passerelle, c'est un routeur filtrant. Sur Linux, il faut préciser au système l’activation du routage de paquets ; par défaut cette option est désactivée.
Il y a 2 méthodes pour activer la fonctionnalité de passerelle (forwarding en anglais) IP:
- Lancer un cat /proc/sys/net/ipv4/conf/all/forwarding. Si la commande renvoie 1, le forwarding est activé, sinon faire un echo 1 > /proc/sys/net/ipv4/conf/all/forwarding. Cette solution est volatile puisqu'elle n'est plus prise en compte après un redémarrage.
- Ouvrir le fichier /etc/sysctl.conf et vérifier que la variable net.ipv4.ip_forward est positionnée sur 1. La modification du fichier permet une prise en compte permanente.
Pour configurer le routage, linux dispose de la commande route. Par exemple :
#Cette commande ajoute la route par défaut route add default gw x.x.x.x #Ajoute une route route add y.y.y.y eth0 |
Politique de filtrage:
En firewalling, il existe 2 politiques : 1) Tout ce qui n’est pas explicitement autorisé est interdit. (Politique restrictive) 2) Tout ce qui n’est pas explicitement interdit est autorisé. (Politique permissive) |
En général, on applique la politique restrictive :
#Politique par defaut (restrictive) iptables -P INPUT DROP iptables -P OUTPUT DROP iptables -P FORWARD DROP |
La politique par défaut s’applique comme la dernière règle en vigueur ; ainsi on peut, grâce aux règles qui précèdent, ne faire passer que les paquets explicitement autorisés.
Remarque :
L’opérateur DROP supprime le paquet sans préavis. On peut le remplacer par l’opérateur REJECT qui envoie un paquet ICMP host-unreachable pour prévenir l’expéditeur. Le problème est que le fait d’utiliser des icmp peut rendre le système sensible à des attaques de type smurf (l’attaquant utilise en rebond notre firewall en lui envoyant un grand nombre de paquets avec l’adresse source de la cible par spoofing, et donc notre firewall va répondre à chacun des paquets ce qui provoquera à coup sûr un Deny of Service imparable sur la cible).
DĂ©coupage des flux:
Une chaîne est un ensemble de règles. Iptables peut alors identifier des paquets qui correspondent à certains critères, et les détourner vers la chaîne appropriée.
#Exemple d’utilisation #Creation de la chaine iptables –N LOGDROP #Description de la chaîne iptables -A LOGDROP -j LOG --log-prefix "Paquets DROP FW RZO :" iptables -A LOGDROP -j DROP #Jumps des flux iptables –A INPUT –j LOGDROP iptables –A OUTPUT –j LOGDROP iptables –A FORWARD –j LOGDROP |
Prenons le cas d’un simple firewall à 2 interfaces : LAN, WAN. On peut identifier les flux tel que:
Dans cet exemple nous distinguons 12 flux TCP/UDP. Si l’on considère que les 2 flux ETH1 et ETH2 sont les mêmes, il reste 8 flux à gérer pour FW :
- LAN2WAN (se lit LAN Ă WAN en anglais)
- WAN2LAN
- LAN2FW
- WAN2FW
- FW2LAN
- FW2WAN
- WAN2WAN
- LAN2LAN
Le fichier de configuration de netfilter avec la gestion des flux LAN/WAN/FW est Ă la page suivante.
Remarque : Un firewall possédant une zone démilitarisée a une gestion similaire. Par contre, le nombre de chaînes à paramétrer sera beaucoup plus important.
Fichiers de configuration du firewall de test du LAN 192.168.0.0/16 :
#Regles du firewall #variables intlan="eth0" intwan="eth1" reslan="192.168.0.0/16" adfwlan="192.168.x.x/32" adfwwan="y.y.y.y/32" any="0.0.0.0/0" #Vidage des filtres par defaut et des chaines utilisateurs iptables -F iptables -X iptables -t nat -F iptables -t nat -X #Definition de la politique de securite (restrictive) iptables -P INPUT DROP iptables -P OUTPUT DROP iptables -P FORWARD DROP #Pour acceder au firewall iptables -A INPUT -i lo -j ACCEPT iptables -A OUTPUT -o lo -j ACCEPT #Creation des chaines iptables -N LAN2WAN iptables -N WAN2LAN iptables -N LAN2FW iptables -N WAN2FW iptables –N FW2LAN iptables –N FW2WAN iptables -N WAN2WAN iptables -N LAN2LAN #Jumps des flux iptables -A FORWARD -s $reslan -d ! $reslan -i $intlan -o $intwan -j LAN2WAN iptables -A FORWARD –s ! $reslan -d $reslan -i $intwan -o $intlan -j WAN2LAN iptables -A INPUT -s $reslan -i $intlan -j LAN2FW iptables -A INPUT –s ! $reslan -i $intwan -j WAN2FW iptables -A OUTPUT -d $reslan -o $intwan -j FW2LAN iptables -A OUTPUT -d ! $reslan -o $intlan -j FW2WAN iptables -A FORWARD –s ! $reslan -d ! $reslan -i $intwan -o $intwan -j WAN2WAN iptables -A FORWARD –s $reslan -d $reslan -i $intlan -o $intlan -j LAN2LAN #Gestion des flux iptables -A LAN2WAN -j ACCEPT iptables -A WAN2LAN -j ACCEPT iptables –A LAN2FW -j ACCEPT iptables –A WAN2FW -j ACCEPT iptables –A FW2LAN -j ACCEPT iptables –A FW2WAN -j ACCEPT iptables -A LAN2LAN –j ACCEPT iptables –A WAN2WAN - DROP |
Pour les flux ICMP, on peut les traiter avec des chaînes particulières :
########################################################################### #Regles de gestion du protocole ICMP ########################################################################### #Acceptation du protocole ICMP iptables -A ICMP-ACC -p icmp -j ACCEPT ########################################################################### #Filtrage du protocole ICMP #echo-reply iptables -A ICMP-FIL -p icmp --icmp-type 0 -j LOGDROP #destination-unreachable iptables -A ICMP-FIL -p icmp --icmp-type 3 -j ACCEPT #source-quench iptables -A ICMP-FIL -p icmp --icmp-type 4 -j ACCEPT #echo-request iptables -A ICMP-FIL -p icmp --icmp-type 8 -j LOGDROP #Time-exceed iptables -A ICMP-FIL -p icmp --icmp-type 11 -j ACCEPT #Parameter-problem iptables -A ICMP-FIL -p icmp --icmp-type 12 -j ACCEPT |
Il est nécessaire de conserver en partie le protocole ICMP. Ce protocole est utile pour résoudre les éventuels problèmes réseaux. Le chapitre suivant propose une autre solution pour la gestion du protocole ICMP.
3) Utilisation du Statefull Inspection
Le suivi de connexion est un concept essentiel de Netfilter. Prenons l’exemple d’une connexion TCP classique, son établissement suit un protocole strict :1. SYN : Requête de synchronisation
2. SYN, ACK : Réponse et accusé réception de la synchronisation de la part du serveur
3. ACK : Accusé réception du client
Donc par exemple, l’arrivée d’un paquet ACK sans demande de synchronisation doit être rejetée.
On peut suivre les protocoles TCP, UDP, ICMP et FTP grâce au moteur de suivi de connexion Conntrack.
Le suivi de TCP est réalisé par le module ip_contrack_proto_tcp.o qui se charge de suivre le déroulement des connexions à partir des drapeaux de l’en-tête protocolaire. On peut observer les entrées de la table des états sous /proc/net/ip_conntrack :
- SYN_SENT UNREPLIED pour une demande de synchronisation
- SYN_RECV pour la réception de la demande
- ESTABLISHED pour signaler que le flux est autorisé
- NEW : pour les nouveaux flux.
- ESTABLISHED : le paquet correspond à une entrée de la table des états.
- RELATED : le paquet est attendu par le moteur Conntrack
- INVALID : le paquet n’a pas un état reconnu
#Exemple de suivi de connexion TCP par iptables LAN->WAN #Laisse passer les paquets d’etats RELATED et ESTABLISHED iptables -A WAN2LAN -p TCP -m state --state RELATED,ESTABLISHED -j ACCEPT #Creation à chaque connexion d’une entree dans la table des etats iptables -A LAN2WAN -p TCP --dport 80 --sport 1024: -m state --state NEW -j ACCEPT |
Le suivi du protocole UDP plus délicat à faire, car UDP se fait sans connexion, il se base sur les timeouts. Le premier paquet, créé une session dans la table des entrées par l’indicateur NEW puis ESTABLISHED. La session est détruite au bout de quelques minutes, lorsque l’échange est terminé.
#Exemple de suivi de connexion UDP par iptables LAN->WAN #Laisse passer les paquets d’etats RELATED et ESTABLISHED WAN->LAN iptables -A WAN2LAN -p UDP -m state --state RELATED,ESTABLISHED -j ACCEPT #Creation à chaque connexion d’une entree dans la table des etats iptables -A LAN2WAN -p UDP --dport 25 --sport 1024: -m state --state NEW -j ACCEPT |
Le suivi de ICMP fait toujours intervenir 2 types de paquets :
- Les requĂŞtes ICMP (Echo Request, TimeStamp, Adress Mask et Info)
- Les réponses (Source Quench, Echo Reply, …)
iptables –A INPUT –p icmp –m state - -state RELATED –j ACCEPT |
Pour le protocole FTP, le client établit une connexion de commande initiée en TCP sur le port 21 du serveur. Donc pour l’autoriser :
iptables –A FORWARD –m state - -state ESTABLISHED –j ACCEPT iptables –A FORWARD –p TCP –d $FTP_SVR - -dport 21 - -sport1024: –m state - -state NEW –j ACCEPT |
Un paquet qui est ESTABLISHED est autorisé à passer pour la connexion cliente. Dés que le client fait un transfert de données, une deuxième connexion de données est ouverte pour le mode actif par le serveur. Le serveur se connecte depuis son port 20 sur le client vers un port indiqué. Si le module Conntrack FTP n’est pas utilisé, il faut rajouter :
iptables –A FORWARD –p TCP –s $FTP_SVR - -sport 20 - -dport 1024: –m state - -state NEW –j ACCEPT |
Si le module de suivi pour FTP est utilisé (ip_conntrack_ftp.o), le premier paquet sera reconnu et passé en état RELATED, donc :
iptables –A FORWARD –s $FTP_SVR - -sport 20 - -dport 1024: –m state - -state RELATED –j ACCEPT |
En mode passif, c’est le qui client se connecte sur le port 20 du serveur.
#Sans le module iptables –A FORWARD –p TCP –d $FTP_SVR --sport 1024: --dport 1024: –m state --state NEW –j ACCEPT #Avec le module iptables –A FORWARD –p TCP –d $FTP_SVR --sport 1024: --dport 1024: –m state --state RELATED –j ACCEPT |
Il est possible d’utiliser une liaison sécurisée SSH en utilisant le démon sshd de Linux. L’administrateur utilise le logiciciel Putty (freeware) pour créer des sessions SSH depuis son poste de travail. Il faut donc autoriser le traffic SSH entre le Firewall et le LAN pour l’adresse IP de l’administrateur.
#Protocole SSH pour l'administration a distance iptables -A LAN2FW -s $ad_IP_admin1 -p TCP --dport 22 -j ACCEPT iptables -A FW2LAN -d $ad_IP_admin1 -p TCP --sport 22 -j ACCEPT #iptables -A FW2LAN -d $ad_IP_admin1 -p TCP --sport 22 -m mac --mac-source $ad_mac_admin1 -j ACCEPT #iptables -A LAN2FW -s $ad_IP_admin1 -p TCP --dport 22 -m mac --mac-source $ad_mac_admin1 -j ACCEPT |
S’il n’y a pas de routeur entre le firewall et le host de l’administrateur, on peut ajouter aussi une sécurisation par adresse MAC.
4) Journalisation des paquets
Les paquets non désirés sont supprimés mais il peut être intéressant de garder une trace de ces paquets en les journalisant.
Dans l’exemple suivant, les paquets envoyés vers la chaîne LOGDROP sont transmis au démon syslogd pour être ajoutés au fichier /var/log/messages avant d’être définitivement supprimé.
#LOG les paquets supprimes iptables –N LOGDROP iptables -A LOGDROP -j LOG --log-prefix "Paquets DROP FW :" iptables -A LOGDROP -j DROP |
#LOG les paquets INVALID iptables -A LOGINVALID -j LOG --log-prefix "Paquets INVALID FW :" iptables -A LOGINVALID -j DROP iptables –A FORWARD –m state - -state INVALID –j LOGINVALID iptables –A OUTPUT –m state - -state INVALID –j LOGINVALID iptables –A INPUT –m state - -state INVALID –j LOGINVALID |
5) Liste noire
Une liste noire est un inventaire d’adresses que l’on considère comme dangereuses, et dont les paquets sources ou paquets destinations sont supprimés.
#Liste noir Black_list="160.133.113.214 255.255.255.255" for ip in $Black_list; do iptables -A FORWARD -s $ip -j LOGDROP iptables -A FORWARD -d $ip -j LOGDROP iptables –A INPUT –s $ip –j LOGDROP iptables –A OUTPUT –d $ip –j LOGDROP done |
6) Interface graphique
Les administrateurs souhaitent disposer d’un logiciel capable graphiquement de générer les règles de iptables.Plusieurs logiciels existents :
- FwBuilder
- GuarDog
- Webmin
Webmin est le seul à gérer les règles par flux à partir des CHAINs. Webmin est un service web qui fonctionne avec des fichiers de type cgi. Il nécessite donc l’utilisation d’un serveur web (apache) dont la console est disponible via le port 10000.
Ce port est paramétrable, mais la possibilité de l’utiliser à distance doit être bloquée par Netfilter pour éviter la prise de contrôle illégale à distance du pare-feu du côté WAN.