Avant de lire cette partie du chapitre, vous devriez avoir déjà installé iptables comme décrit dans la section précédente.
L'objectif général d'un pare-feu est de protéger un ordinateur ou un réseau contre les accès malveillants.
Dans un monde parfait, tout démon et tout service sur le la machine est parfaitement configuré et immunisé contre des fléaux tels que les débordements de mémoire ou d'autres problèmes liés à leur sécurité. De plus, vous faites confiance aux utilisateurs qui accèdent à vos services. Dans ce monde, vous n'avez pas besoin de pare-feu.
Mais dans le monde réel, les démons peuvent être mal configurés et les exploits contre des services essentiels sont librement disponibles. Vous pouvez souhaiter choisir les services qui sont accessibles à certaines machines ou vous pourriez souhaiter limiter les machines ou les applications qui sont autorisés à y accéder depuis l'extérieur. Sinon, vous pouvez tout simplement ne pas faire confiance à certaines de vos applications ou à certains de vos utilisateurs. Vous êtes probablement connectés à Internet. Dans ce monde, un pare-feu est essentiel.
N'imaginez toutefois pas qu'un pare-feu rend redondante les mauvaises configurations, ni qu'il ôte tout risque d'une mauvaise configuration par négligence. Il n'empêche personne d'exploiter un service que vous offrez intentionnellement, mais que vous n'avez pas mis à jour récemment ou que vous n'avez pas corrigé après qu'un exploit a été publié. Bien qu'ayant un pare-feu, vous avez besoin d'avoir sur votre système des applications et des démons configurés correctement et à jour. Un pare-feu n'est pas le remède à tout, mais il devrait être une partie essentielle de votre stratégie globale de sécurité.
Le mot « pare-feu » peut avoir plusieurs sens différents.
C'est un périphérique matériel ou un logiciel disponible sur le commerce (ou offert gratuitement) par des sociétés telles que Symantec qui prétend que cela sécurise un ordinateur familial ou de bureau connecté à Internet. Ce type de pare-feu est fort pertinent pour les utilisateurs qui ne savent pas comment on pourrait accéder à leur ordinateur par Internet ou comment désactiver cet accès, surtout s'ils sont toujours en ligne et connectés par des liens à connexion illimitée.
C'est un système placé entre Internet et l'intranet. Pour minimiser le risque de compromettre le pare-feu lui-même, il ne devrait en général jouer qu'un rôle—celui de protéger l'intranet. Bien que cela ne soit pas sans risques, la tâche de routage et de masquerading d'IPs (réécrire des en-têtes IP de paquets qu'il route depuis les clients avec des adresses privées sur Internet afin qu'elles semblent venir du pare-feu lui-même) est en général considérée comme relativement sécurisée.
C'est souvent un vieil ordinateur à la retraite et que vous avez presqu'oublié, qui fait du masquerading ou des fonctions de routage mais qui offre des services de non pare-feu tels qu'un cache Web ou la messagerie. Cela peut être utilisé pour des réseaux familiaux, mais ce n'est pas considéré comme sécurisé en tant que machine uniquement dédiée au pare-feu car la combinaison d'un serveur et d'un routeur/pare-feu sur une machine augmente la complexité du paramétrage.
Cette machine effectue du masquerading ou du routage mais elle autorise un accès public à certaines branches de votre réseau qui, du fait des IPs publiques et d'une structure physique séparée, est epsentiellement un réseau séparé avec un accès direct à Internet. Les serveurs sur ce réseau sont les plus facilement accessibles, tant par Internet que depuis l'intranet. Le pare-feu protège les deux réseaux. Ce type de pare-feu a un minimum de trois interfaces réseaux.
Ce type de pare-feu fait du routage et du masquerading, mais il ne maintient pas un tableaux d'état de flux de communication en cours. Il est rapide mais a des capacités de blocage des paquets indésirés très limitées sans bloquer les paquets désirés.
Cette introduction sur la façon de paramùqrer un pare-feu n'est pas un guide complet pour sécuriser des systèmes. Le pare-feu est un sujet complexe qui exige une configuration soignée. Les scripts cités ici ne visent qu'à donner des exemples de la façon dont fonctionne un pare-feu. Ils n'ambitionnent pas de convenir à toute configuration particulière et ils peuvent ne pas offrir de protection complète contre une attaque.
Une personnalisation de ces scripts pour votre situation spécifique sera nécessaire pour avoir une configuration optimale, mais vous devriez étudier sérieusement la documentation d'iptables et la création de pare-feux en général avant de toucher quoique ce soit. Jetez un œil sur la liste de links for further reading à la fin de cette section pour plus de détails. Vous y trouverez une liste de liens contenant des informations rapides et complètes sur la construction de votre propre pare-feu.
Le script de configuration de pare-feu installé dans la section sur iptables diffère du script de configuration standard. Il n'a que deux des cibles standards : start et status. Les autres cibles sont vides et verrouillées. Par exemple, si vous lancez :
/etc/rc.d/init.d/iptables start
le pare-feu sera redémarré comme s'il s'agissait du démarrage du szstème. La cible status présentera une liste de toutes les règles actuellement implémentées. La cible vide désactive toutes les règles de pare-feu et la cible verrouillée (lock) bloquera tous les paquets entrant et sortant sur l'ordinateur sauf l'interface loopback.
Le pare-feu de démarrage principal se trouve dans le fichier
/etc/rc.d/rc.iptables
. Les sections
ci-dessous présentent trois approches différentes qu'on peut
utiliser sur un système.
Vous devriez toujours exécuter vos règles de pare-feu à partir d'un script. Cela vous assure d'être cohérent et de vous souvenir de ce que vous avez fait. Cela permet aussi de mettre des commentaires essentiels à la compréhension des règles longtemps après les avoir écrites.
Un pare-feu personnel est conçu pour vous permettre un accès à tous les services offerts sur Internet, mais il garde votre machine ainsi que vos données privées en sécurité.
Voici ci-dessous une version légèrement modifiée de la recommandation de Rusty Russell sur le Linux 2.4 Packet Filtering HOWTO (guide pratique sur le filtrage des paquets avec Linux 2.4). Il s'applique encore aux noyaux Linux 2.6.
cat > /etc/rc.d/rc.iptables << "EOF"
#!/bin/sh
# Début de $rc_base/rc.iptables
# Insère les modules de traquage de connexion (inutile si construit dans
# le noyau
modprobe ip_tables modprobe iptable_filter modprobe ip_conntrack
modprobe ip_conntrack_ftp modprobe ipt_state modprobe ipt_LOG
# Activation de la protection écho broadcast
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
# Désactivation des paquets routés à la source
echo 0 > /proc/sys/net/ipv4/conf/all/accept_source_route
echo 0 > /proc/sys/net/ipv4/conf/default/accept_source_route
# Activation de la protection des cookies SYN TCP
echo 1 > /proc/sys/net/ipv4/tcp_syncookies
# Activation de la protection des cookies SYN TCP
echo 0 > /proc/sys/net/ipv4/conf/default/accept_redirects
# N'envoie pas de messages redirigés
echo 0 > /proc/sys/net/ipv4/conf/default/send_redirects
echo 0 > /proc/sys/net/ipv4/conf/default/send_redirects
# Accepte les paquets Spoofed entrant sur une interface, où les réponses
# feraient sortir une réponse sur une interface différente.
echo 1 > /proc/sys/net/ipv4/conf/default/rp_filter
echo 1 > /proc/sys/net/ipv4/conf/default/rp_filter
# Enregistrement des paquets avec des adresses impossibles.
echo 1 > /proc/sys/net/ipv4/conf/all/log_martians
echo 1 > /proc/sys/net/ipv4/conf/default/log_martians
# être verbeux sur les adresses IP dynamiques (inutile en cas d'IP statique)
echo 2 > /proc/sys/net/ipv4/ip_dynaddr
# Désactivation de la notification de congestion explicite car trop de routeurs
# l'ignorent
echo 0 > /proc/sys/net/ipv4/tcp_ecn
# Paramétrage d'un état connu
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT DROP
# Ces lignes sont au cas où les règles sont déjà en place et où le script
# est déjà retourné à la volée. Nous voulons supprimer toutes les règles et les
# chaînes d'utilisateur préexistantes avant d'implémenter de nouvelles
# règles.
iptables -F
iptables -X
iptables -Z
iptables -t nat -F
# Ne permettre que les connexions locales
iptables -A INPUT -i lo -j ACCEPT
# Sortie libre sur n'importe quelle interface, n'importe quelle IP pour n'importe
# quel service (revient à -P ACCEPT)
iptables -A OUTPUT -j ACCEPT
# Permet des réponses sur des connexions déjà établies et permet de nouvelles
# connexions liées à celles établies (comme le port en mode ftp)
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# Enregistre tout le reste.
Log everything else. What's Windows' latest exploitable vulnerability?
iptables -A INPUT -j LOG --log-prefix "FIREWALL:INPUT "
# Fin de $rc_base/rc.iptables
EOF
chmod 700 /etc/rc.d/rc.iptables
Ce script est très simple, il accepte tout le trafic venant dans votre ordinateur qui a été initié par votre ordinateur, mais tant que vous surfez simplement sur Internet, il y a peu de chances que vous dépassiez ses limites.
Si vous rencontrez souvent certains fichiers lkrs de l'accès à vos serveurs FTP, jetez un œil sur BusyBox example number 4.
Même si vous avez des démons ou des services en fonction sur votre système, il sera inaccessible partout sauf par l'ordinateur lui-même. Si vous voulez permettre l'accès à des services sur votre machine tels que ssh ou ping, jetez un œil sur BusyBox.
Un vrai pare-feu a deux interfaces, une connectée à un intranet, dans cet exemple eth0, et une connectée à Internet, ici ppp0. Pour offrir le maximum de sécurité au pare-feu lui-même, assurez-vous qu'il n'y a pas de serveurs inutiles en fonction dessus tels que X11 et al. En principe général, le pare-feu lui-même ne devrait pas accéder à un service non routé (pensez à un serveur distant qui donne des réponses que fait planter un démon sur votre système, ou même pire, ceci implémente un travail par un débordement de mémoire).
cat > /etc/rc.d/rc.iptables << "EOF"
#!/bin/sh
# Début de $rc_base/rc.iptables
echo
echo "You're using the example configuration for a setup of a firewall"
echo "from Beyond Linux From Scratch."
echo "This example is far from being complete, it is only meant"
echo "to be a reference."
echo "Firewall security is a complex issue, that exceeds the scope"
echo "of the configuration rules below."
echo "You can find additional information"
echo "about firewalls in Chapter 4 of the BLFS book."
echo "http://www.linuxfromscratch.org/blfs"
echo
# Insérer les modules iptables (inutile si construit en dur dans le noyau).
modprobe ip_tables
modprobe iptable_filter
modprobe ip_conntrack
modprobe ip_conntrack_ftp
modprobe ipt_state
modprobe iptable_nat
modprobe ip_nat_ftp
modprobe ipt_MASQUERADE
modprobe ipt_LOG
modprobe ipt_REJECT
# Active la protection echo broadcast
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
# Désactive les paquets routés depuis la source
echo 0 > /proc/sys/net/ipv4/conf/all/accept_source_route
# Activation de la protection des cookies SYN TCP
echo 1 > /proc/sys/net/ipv4/tcp_syncookies
# Désactive l'acceptation des redirections ICMP
echo 0 > /proc/sys/net/ipv4/conf/all/accept_redirects
# N'envoie pas de messages redirigés
echo 0 > /proc/sys/net/ipv4/conf/all/send_redirects
# Accepte les paquets Spoofed entrant sur une interface, où les réponses
# feraient sortir une réponse sur une interface différente.
echo 1 > /proc/sys/net/ipv4/conf/all/rp_filter
# Enregistrement des paquets aux adresses impossibles.
echo 1 > /proc/sys/net/ipv4/conf/all/log_martians
# Etre verbeux sur les adresses IP dynamiques (inutile en cas d'IP statique)
echo 2 > /proc/sys/net/ipv4/ip_dynaddr
# Désactivation de la notification de congestion explicite car trop de routeurs
# l'ignorent
echo 0 > /proc/sys/net/ipv4/tcp_ecn
# Paramètre un état connu
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT DROP
# Ces lignes sont au cas où les règles sont déjà en place et où le script
# est déjà retourné à la volée. Nous voulons supprimer toutes les règles et les
# chaînes d'utilisateur préexistantes avant d'implémenter de nouvelles
# règles.
iptables -F
iptables -X
iptables -Z
iptables -t nat -F
# Permettre les connexions locales
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
# Permettre les redirections si initié sur l'intranet
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -i ! ppp+ -m state --state NEW -j ACCEPT
# Faire du masquerading (inutile si l'intranet n'utilise pas des adresses IP
# privées
iptables -t nat -A POSTROUTING -o ppp+ -j MASQUERADE
# Enregistre tout pour du débogage (dernière des règles, mais avant les règles
# de politique de sécurité)
iptables -A INPUT -j LOG --log-prefix "FIREWALL:INPUT "
iptables -A FORWARD -j LOG --log-prefix "FIREWALL:FORWARD "
iptables -A OUTPUT -j LOG --log-prefix "FIREWALL:OUTPUT "
# Activation de la redirection d'IP
echo 1 > /proc/sys/net/ipv4/ip_forward
EOF
chmod 700 /etc/rc.d/rc.iptables
Avec ce script, votre intranet devrait être raisonnablement sécurisé contre les attaques externes. Personne ne devrait pouvoir paramétrer de nouvelle connexion pour n'importe quel service interne et, s'il est masqueradé, il rend votre intranet invisible depuis Internet. En outre, votre pare-feu devrait être relativement sécurisé car il n'y a pas de services en fonction qu'un pirate pourrait attaquer.
Si l'interface par laquelle vous vous connectez à Internet ne
se connecte pas par PPP, vous devrez modifier <ppp+>
par le nom de
l'interface (par exemple, eth1) que vous utilisez.
Ce scénario n'est pas très différent du Masquerading Router, mais il offre en plus des services à votre intranet. On peut en avoir des exemples quand vous voulez administrer votre pare-feu à partir d'un autre hôte de votre Intranet ou l'utiliser en tant que proxy ou serveur de DNS or a name server.
Faire le tour de la question du vrai concept de protéger un serveur offrant des services sur Internet va plus beaucoup plus loin que l'objectif de ce document. Voir les références à la fin de cette section pour plus d'informations.
Faites attention. Chaque service que vous avez activé complexifie votre configuration et rend moins sécurisé votre pare-feu. Vous êtes exposé aux risques d'une mauvaise configuration des services ou d'exécution d'un service ayant un bogue exploitable. Un général, un pare-feu ne devrait exécuter aucun service supplémentaire. Voir l'introduction au Masquerading Router pour des détails supplémentaires.
Si vous voulez ajouter des services tels que Samba interne ou serveurs de DNS qui n'ont pas besoin d'accéder eux-mêmes à Internet, les réglages supplémentaires sont très simples et devraient être encore acceptables du point de vue de la sécurité. Ajoutez simplement les lignes suivantes au script avant les règles de connexion.
iptables -A INPUT -i ! ppp+ -j ACCEPT
iptables -A OUTPUT -o ! ppp+ -j ACCEPT
Si des démons tels que squid, doivent accéder eux-mêmes à Internet, vous pouvez en général ouvrir OUTPUT et restreindre INPUT.
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -j ACCEPT
Il n'est toutefois pas conseillé de laisser OUTPUT sans restrictions. Vous perdez alors le contrôle des chevaux de Troie (trojan) qui voudraient « rentrer chez vous » et c'est un peu redondant si vous avez mal configuré un service pour qu'il broadcast son existence dans le monde.
Pour faire cela, vous devriez restreindre INPUT et OUTPUT sur tous les ports sauf ceux qu'il vous faut absolument ouvrir. Les ports que vous devez ouvrir dépendent de vos besoins : en général, vous les trouverez en découvrant des échecs d'accès dans vos fichiers journaux.
Jetez un œil sur les exemples suivants :
Squid met en cache Internet :
iptables -A OUTPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --sport 80 -m state --state ESTABLISHED \
-j ACCEPT
Votre serveur de DNS cache (comme nommé) effectue ses recherches à travers UDP :
iptables -A OUTPUT -p udp --dport 53 -j ACCEPT
Vous voulez pouvoir pinger votre ordinateur vous vérifier qu'il est toujours en vie :
iptables -A INPUT -p icmp -m icmp --icmp-type echo-request -j ACCEPT
iptables -A OUTPUT -p icmp -m icmp --icmp-type echo-reply -j ACCEPT
Si vous accédez souvent à des serveurs FTP ou que vous aimez chatter,, vous pourriez remarquer certains délais car certaines implémentations de ces démons ont une fonction de recherche d'un identd sur votre système pour obtenir des noms d'utilisateur. Bien qu'il y ait très peu de dangers, le fait d'avoir un identd en fonction n'est pas recommandé car de nombreux experts en sécurité trouvent que le service donnent trop d'informations supplémentaires.
Pour éviter ces délais, vous pourriez rejeter les requêtes avec un 'tcp-reset' :
iptables -A INPUT -p tcp --dport 113 -j REJECT --reject-with tcp-reset
Pour enregistrer et rejeter des paquets invalides (des paquets qui sont entrés après le timeout du netfilter ou certains types d'analyse de paquets) :
iptables -I INPUT -p tcp -m state --state INVALID \
-j LOG --log-prefix "FIREWALL:INVALID "
iptables -I INPUT -p tcp -m state --state INVALID -j DROP
Tout ce qui vient de l'extérieur ne devrait pas avoir d'adresse privée, c'est une attaque courante appelée IP-spoofing :
iptables -A INPUT -i ppp+ -s 10.0.0.0/8 -j DROP
iptables -A INPUT -i ppp+ -s 172.16.0.0/12 -j DROP
iptables -A INPUT -i ppp+ -s 192.168.0.0/16 -j DROP
Il y a d'autres adresses que vous pourriez aussi vouloir rejeter : 0.0.0.0/8, 127.0.0.0/8, 224.0.0.0/3 (multicast et expérimental), 169.254.0.0/16 (Link Local Networks, lien réseaux locaux), et 192.0.2.0/24 (réseau de test défini par IANA).
Si votre pare-feu est un client, vous devez autoriser ces paquets:
iptables -A INPUT -i ppp0 -p udp -s 0.0.0.0 --sport 67 \
-d 255.255.255.255 --dport 68 -j ACCEPT
Pour simplifier le débogage et éloigner ceux qui aimeraient accéder à un service que vous avez désactivé, par erreur ou volontairement, vous pourriez REJECT ces paquets qui sont rejetés.
Cela doit évidemment se faire directement après avoir enregistré les toutes dernières lignes avant que les paquets ne soient rejetés par les règles :
iptables -A INPUT -j REJECT
Ce ne sont que des exemples pour vous montrer quelques
possibilités du code de pare-feu de Linux. Jetez un œil sur
la page de man d'iptables. Vous y trouverez beaucoup plus
d'informations. Vous pouvez trouver les numéros de port qui sont
nécessaires dans /etc/services
, au
cas où vous ne les auriez pas trouvé à partir des compte-rendu et
des erreurs dans votre fichier journal.
En fin de compte, vous devez vous souvenir d'une chose : l'effort employé pour attaquer un système dépend de la valeur ajoutée que s'attend à y trouver un pirate. Si vous êtes responsables d'informations de valeur, vous devez passer du temps à les protéger correctement.
www.netfilter.org - Page d'accueil du projet netfilter/iptables
FAQ liée à Netfilter
guides pratiques liés à Netfilter
en.tldp.org/LDP/nag2/x-087-2-firewall.html
en.tldp.org/HOWTO/Security-HOWTO.html
en.tldp.org/HOWTO/Firewall-HOWTO.html
www.linuxsecurity.com/docs/
www.little-idiot.de/firewall (en allemand & obsolète, mais très complet)
linux.oreillynet.com/pub/a/linux/2000/03/10/netadmin/ddos.html
staff.washington.edu/dittrich/misc/ddos
www.e-infomax.com/ipmasq
www.circlemud.org/~jelson/writings/security/index.htm
www.securityfocus.com
www.cert.org - tech_tips
security.ittoolbox.com
www.insecure.org/reading.html
Last updated on 2011-10-28 20:57:13 +0200