------------------------------------------------------------------ V.: MISE EN PLACE D'UN FIREWALL Par groslameur ------------------------------------------------------------------ Vous qui vous croyez à l'abri derrière votre pc, êtes vous vraiment sûr d'être intouchables ? Vous pensez l'être, jus- qu'au jour où un pirate malveillant parvient à infiltrer votre serveur ftp, un wu-ftp pourtant tout neuf, place un cheval de troies malicieux et vous fait redemarrer, afin de l'activer, par ce que l'on apelle plus communément une attaque de refus de service, un Dos. Cette situation peut être la votre... Nul n'est à l'abri sur Internet, de millions d'utilisateurs, des pirates po- -tentiels, sondent le réseau à la recherche de serveurs, et si ils en trouvent un sensible, ils n'hésiteront pas à le mettre en pièce. Ce qui peut à tout moment vous arriver. Cet article n'a pas pour ambition de vous apprendre à sécu- riser parfaitement votre réseau, mais de vous apprendre co- -mment installer et configurer un firewall. Firewall ? En français, "mur de feu", un firewall est tout simplement un service qui a pour but de protéger vos machi- -nes du monde extérieur, une sorte de muraille. Nous nous intéresserons ici plus particulièrement aux firewall linux inclus dans le kernel (utilisant une technologie de filtre de paquets). Il existe d'autres types de firewall, un des plus connus et des plus employés est le proxy, servant à se connecter derrière une machine. Il existe deux grandes politiques concernant les firewall, en effet soit : - Tout ce qui n'est pas expréssement autorisé est interdit. Ou soit : - Tout ce qui n'est pas expréssement interdit est autorisé. Nous verrons par la suite comment mettre en place une de ces deux méthodes, pour l'instant, analysont de plus près qu'est ce qu'un firewall... [ Configuration basique ] Un firewall est installé par coutume, sur un poste n'offrant aucun service, donc isolé de vos serveurs. Une règle d'or en sécurité réseau consiste par ailleurs à installer le moins de services possibles par machine, de sorte à limiter les dégats. Soit. Il existe plusieurs architectures de firewall, la plus simple à comprendre est celle ci : `--------------' _______ --------- -------- | Internet | ---[routeur]--- | Firewal | ---- { Réseau } `--------------' ------- --------- -------- Ceci étant la configuration la plus basique, le firewall sur- -veille et bloque les données malsaintes acheminées depuis Internet par le routeur, le réseau quand à lui, peut être un ensemble de serveurs ou un intranet. [ Le Bastion Host ] Passons donc à une autre configuration, faisant cette fois ci intervenir ce que l'on apelle hôte de défiance, "Bastion Host" en anglais. L'hôte de défiance est en réalité une machine di- -rectement exposé aux attaques, c'est à dire en dehors du ré- -seau interne et du pare-feu. Dans le cas précédent, le fire- -wall faisait office de machine Bastion. Mais une machine Bas- -tion peut aussi être un serveur, Web, ftp ou dns. Le shéma suivant illustre l'utilisation d'un hôte de défiance : `----------' _______ | Internet |---[routeur]--- --------- --------- `----------' ------- | | Firewal |----( Réseau ) | --------- --------- | | -------------- | ( Bastion Host )---- -------------- Dans cet exemple, l'hôte de défiance est exposé aux attaques venant d'Internet. C'est pour ça que les services qu'ils off- -rent doivent être convenablement sécurisés. Le firewall, quand à lui, se charge de mettre hors de danger un réseau privé. [ Double firewall ] Il existe également une autre configuration basée sur cette architecture, dans le cas de la mise en place de deux firewall. Cela donnera ça : _______ ---------- --------- -------- ---[routeur]---| Firewall | | Firewal |----( Réseau ) ------- ---------- --------- -------- | | | -------------- | ----( Bastion Host )---- -------------- Dans ce shéma, nous constatons la présence d'un autre fire- -wall, externe, chargé d'assurer la sécurité de l'hôte de défiance, qui je le rapelle peut représenter un ou plusieurs serveurs offrant des services tels que ftp, http, etc... A part cela, la configuration est la même, on retrouve tou- -jours un firewall interne chargé de protéger un réseau privé. [ La zone démilitarisée ] Passons maintenant à une dernière configuration, la zone dé- -militarisée (DMZ). La DMZ est une zone rassemblant les ma- -chines Bastions (Web, FTP, DNS, Mail,etc), et les isolant ainsi du réseau interne. Voici un rapide shéma illustrant cela : `--------------' _______ --------- -------- | Internet | ---|routeur|--- | Firewal | --- ( Réseau ) `--------------' ------- --------- -------- | | #''''''''''# | DMZ | |(Serveurs)| #''''''''''# Comme nous pouvons le voir, le firewall isole la DMZ, regrou- -pant les machines publiques, du réseau interne. Cette confi- -guration est l'une des plus courantes. Cependant disposer d'une DMZ ne vous rend pas invulnérable... [ Préparation avant mise en place ] Avant de mettre en place un firewall, il faut d'abord s'assu- -rer que l'option permettant de le configurer a été bien acti- vée dans le noyau. Si oui, passez ce chapitre, si non, je vous propose de recompiler votre kernel ! Voyons comment faire... Direction --> /usr/src commençons d'abord par décompresser et décompacter les sources du kernel : [root@localhost:/usr/src] $ gzip -cd kernel-source* | tar xfv - [root@localhost:/usr/src] $ cd kernel-source* Copions maintenant le fichier de configuration du kernel dans le repertoire courant, en le renommant en .config (fichier ca- -ché), puis activons le menu de configuration du noyau : [root@localhost:kernel-source*] $ cp /boot/config-* .config [root@localhost:kernel-source*] $ make xconfig (ou make config pour le mode console ou encore make menuconfig) Allez maintenant dans Networking options et cochez les op- -tions suivantes : - Network firewalls - TCP/IP networking - IP: firewalling - IP: firewall packet logging Sauvegardez les modifications et revenez en mode console pour commencer la compilation du nouveau noyau : [root@localhost:/usr/src/kernel-source*] $ make dep [root@localhost:/usr/src/kernel-source*] $ make clean [root@localhost:/usr/src/kernel-source*] $ make modules [root@localhost:/usr/src/kernel-source*] $ make modules install Ceci fait, il ne vous reste plus qu'a créer une image com- -pressée du kernel et de la faire prendre compte au démarrage : [root@localhost:/usr/src/kernel-source*] $ make bzImage [root@localhost:/usr/src/kernel-source*] $ cp arch/i386/boot/bzImage /boot/vmlinuz.x.xa [root@localhost:kernel-source*] $ vi /etc/lilo.conf On édite maintenant le fichier lilo.conf, appuyez sur la touche Inser et créez un nouveau label du style : image=/boot/vmlinuz.x.xa label=firewall Appuyez ensuite sur Echap puis tapez ":wq". Il nous reste maintenant à enregistrer nos modifications dans lilo.conf : [root@localhost:kernel-source] $ lilo Il ne vous reste maintenant plus qu'à redemarrer, à l'écran de lilo, tapez "firewall" et appuyez sur entrée. Le nou- -veau noyau se lancera donc, intégrant les options de confi- -guration du firewall. [ Configuration du firewall ] Mettez vous maintenant en mode console. Il existe trois grandes commandes pour les firewall : ipfwadm, ipchains et iptables. Personellement j'ai configuré mon firewall avec ipchains, mais nous allons voir plus en détail chacune de toutes ces commandes... a) Configuration avec ipfwadm Ipfwadm est l'adaption linux du firewall ipfw qui équipe les *BSD. Si il est l'un des premiers firewall kernel, il n'est cependant pas le meilleur, et son utilisation ne permet pas d'accomplir certaines tâches. Cependant nous allons l'étudier de plus près... Voici sa syntaxe : # ipfwadm -categorie -commande -parametres [options] Les catégories disponibles sont : -F : indique une liste de règles de forwading. -I : indique une liste de règles d'input (ACCEPT). -O : indique une liste de règles d'output (ACCEPT). -M : pour l'ip masquerading. Les commandes disponibles sont : -f : sert à remettre à zéro toutes les règles établies. -a : ajoute une règle à la fin de la liste sélectionnée, cette option est suivie de la politique à employer pour la règle, deny (refuser) ou accept (accepter) sont les plus courantes. Par exemple un "-a accept" indiquera que tous les paquets correspondant à la règle défini seront acceptés. -i : ajoute une règle au début de la liste selectionnée, suivie de la politique à employer pour cette règle. -d : efface une règle. -l : affiche toutes les règles de la liste sélectionnée. -p : indique la politique par défaut à suivre pour une liste de règles, cela peut être soit accept (accepter), deny (refuser), reject (rejetter), ou redir (rediriger). Si un paquet entrant n'est pas conforme aux règles établies, il obéira à la politique par défaut. -h : demande de l'aide sur la syntaxe d'une commande. Les paramètres disponibles sont : -P : indique le protocole à employer, tcp, udp, icmp ou all. -S : indique l'adresse source, en général celle des attaquants potentiels pour une politique de type deny, et la votre pour une politique de type accept. L'adresse à indiquer peut être une adresse IP comme un nom d'hôte. Cete adresse est suivie du nombre de bytes devant correspondre (généralement 24). L'adresse est suivie d'un numéro de port (qui sera le numéro de port source). Le caractère ":" permet de donner une fourchette de port. Par exemple, 6000:6063 indiquera tous les ports de 6000 à 6063. -D : indique l'adresse cible, qui devrait être la votre ou celle de votre réseau pour une politique de type deny, ou celle d'une machine extérieure pour une politique de type accept. Tout comme l'adresse source, l'adresse de destination est suivie du nombre de bytes devant correspondre. L'adresse est suivie d'un numéro de port (qui sera le numéro de port de destination). -V : spécifie un nom d'interface par laquelle vont transiter les paquets, par exemple eth0 ou eth1. Les options disponibles sont : -b : indique un mode bidirectionnel pour une règle, en d'autres termes cette option ajoutera l'inverse d'une règle, et cette règle en elle même à la liste. -n : indique que les adresses ip et les numéros de ports seront affichés au format numérique. -r : indique une redirection des paquets vers une socket, on doit donc spécifier à cette option un numéro de port. -v : sert à afficher des informations détaillées sur les règles ajoutées, supprimées ou modifiées. Cette liste de catégories, de commandes, de paramètres et d'options n'est malheuresement pas exhaustive, j'ai enlevé les quelques options que je jugeais inutiles. Maintenant voyons quelques exemples d'utilisation de ipfwadm. Exemple : Nous désirons établir une règle empéchant les attaques de type smurf. Je ne reviendrais pas sur l'expli- -cation de ce type d'attaques, sachez simplement que nous configurerons notre firewall de manière à refuser les paquets icmp de type echo (port icmp 7). Nous supposerons un réseau de classe C, dont l'adresse est 192.168.13.0 : $ ipfwadm -F -f $ ipfwadm -F -p accept $ ipfwadm -a deny -P icmp -S 0/0 7 -D 192.168.13.0/24 A la première ligne nous avons formaté le contenu de la liste de règles de forwading. Nous l'avons redéfini en lui attribuant une politique par défaut de type accept, c'est à dire que tous les paquets entrant ne répondant pas aux règles définies seront acceptés. A la dernière ligne, nous avons configuré le firewall de telle sorte à ce qu'il refuse toute tentative de connexion sur le port icmp 7 (echo) sur notre réseau. Le 0/0 que nous avons mis pour l'adresse source correspond à toute adresse IP existante. b) Configuration avec ipchains Ipchains est reputé pour être un outil convivial, bien plus facile d'accès qu'un ipfwadm par exemple. Voici sa syntaxe : # ipchains -commande chaine -parametres [options] Les commandes disponibles sont : -A : ajoute une règle à la fin de toutes les règles existantes. -D : efface une règle. -R : remplace une règle dans la chaîne selectionée. -I : insère une règle au début de la chaîne. -L : liste toutes les règles d'une chaîne selectionée. -F : remet la chaîne selectionée à zéro. -P : indique la politique par défaut d'une chaîne, si les paquets entrants ne correspondent pas aux règles établies. Ces politiques sont ACCEPT, REJECT ou REDIR. Cette dernière politique sera utilisée si nous désirons rediriger un packet vers une socket distante. -h : demande de l'aide sur la syntaxe d'une commande. Les paramètres disponibles sont : -p : indique le protocole à utiliser pour la règle. Cela peut être soit tcp, soit udp, soit icmp, ou soit all (tout). -s : indique l'adresse source, ainsi que le nombre de bytes à prendre en compte (voir ipfwadm). Elle est suivie du numéro de port source. On peut également indiquer une fourchette de ports, exemple pour 0:65535, dans ce cas tous les ports serons pris en compte. -d : indique l'adresse de destination, même chose que pour l'adresse source, on peut la faire suivre d'un numéro de port (qui sera le port de destination). -i : spécifie une interface par laquelle vont transiter les paquets, par exemple eth0 ou eth1. -j : indique la politique à suivre pour la règle selectionnée, si elle correspond au paquet entrant, cela peut être soit DENY, ACCEPT, REJECT ou REDIR. Nous ne reviendrons pas sur REDIR. Les options disponibles sont : -b : indique un mode bidirectionnel pour une règle, en d'autres termes cette option ajoutera l'inverse d'une règle, et cette règle en elle même à la liste. -n : indique que les adresses ip et les numéros de ports seront affichés au format numérique. -r : indique une redirection des paquets vers une socket, on doit donc spécifier à cette option un numéro de port. -v : sert à afficher des informations détaillées sur les règles ajoutées, supprimées ou modifiées. Voici maintenant un exemple de l'utilisation d'ipchains. Notre adresse réseau sera le même que tout à l'heure : Nous souhaitons interdire l'ip spoofing sur notre réseau, nous devrons donc interdire les paquets dont l'adresse source est la même que celle de notre réseau. $ ipchains -F forward $ ipchains -P forward ACCEPT $ ipchains -A forward -s 192.168.13.0/24 -i eth+ -p tcp -j DENY Nous avons donc crée une nouvelle chaîne, forward, et défini une politique par défaut de type ACCEPT, ce qui signifie que tous les paquets ne correspondant pas aux règles établies seront acceptées. Notre dernière règle est donc celle qui nous protégera de l'ip spoofing. Elle rejette tous les paquets tcp ayant pour adresse source celle de notre réseau, cette règle s'applique pour toutes les cartes ethernet, en effet le plus devant le eth symbolise que toutes les interfaces commençant par "eth" seront prises en charge. c) Configuration avec iptables Iptables est sans doute le firewall kernel le plus populaire, de plus il est entièrement compatible avec ipchains et ipfwadm. Sa syntaxe est la suivante : # iptables -commande chaine -paramètres --extensions [options] Les commandes disponibles sont : -A : ajoute une règle à la fin de la chaîne selectionnée. -I : insére une règle au début de la chaîne selectionnée. -D : supprime une règle. -R : remplace une règle. -L : affiche toutes les règles d'une chaîne. -F : remet une chaîne à zéro. -N : crée une nouvelle chaîne. -P : indique la politique par défaut d'une chaîne, ACCEPT, DROP (équivalent de REJECT), QUEUE ou REDIR. Les paramètres disponibles sont : -p : spécifie le protocole à utiliser, tcp, udp, icmp ou all. -s : spécifie l'adresse source, avec le nombre de byte à prendre en compte. -d : spéicifie l'adresse de destination, avec le nombre de bytes. -i : spécifie l'interface à utiliser pour la règle. -o : spécifie l'interface sur laquelle le paquet va être transféré. -j : spécifie la politique à prendre en compte quand le paquet entrant correspond à la règle définie. Soit ACCEPT, DENY, REJECT ou REDIR. Les extensions (à utiliser avec les paramètres -m protocole et -p protocole) : --sport : défini le port source qu'un paquet doit utiliser pour correspondre à la règle définie. (un "!" devant le port le rend inutilisable) --dport : défini le port de destination qu'un paquet soit util- -iser pour correspondre à la règle définie. (un "!" devant le port le rend inutilisable). --tcp : il s'agit d'une extension tcp uniquement. Elle indique le flag que doit avoir le paquet pour correspondre à la règle, cela peut être SYN, ACK, RST, FIN, URG, PSH, etc... Et voici pour clore, un exemple d'utilisation de iptables. Nous souhaitons par exemple bloquer l'accès au service finger, dont le port est 79, par un firewall. Nous utiliserons comme adresse de réseau 192.168.13.0 $ iptables -F forward $ iptables -P forward ACCEPT $ iptables -A forward -p tcp -s 0/0 --sport 79 -d 192.168.13.0/24 -j DROP Ces commandes ne sont pas vraiment compliquées à comprendre et ne méritent pas d'explication. A noter qu'à la place de bloquer le port 79 par un firewall, on aurait pu tout simplement désac- -tiver le service en utilisant le démon inetd. Mais ceci est une autre histoire... [-EOF]