Avant de lire cette partie du chapitre, notez que nous assumons que vous avez déjà installé iptables comme décrit dans la section précédente.
Le but général d'un pare-feu est de protéger un réseau contre les accès malintentionnés en utilisant une simple machine comme pare-feu. Ceci implique que le pare-feu est considéré comme le seul point de risque, mais cela rend la vie des administrateurs bien plus facile.
Dans un monde parfait où vous sauriez que chaque démon ou service dans chaque machine a été parfaitement configuré et est insensible aux dépassements de tampons et autres problèmes imaginables en regard avec la sécurité, et où vous auriez confiance dans tous les utilisateurs accédant aux services, vous n'auriez pas besoin d'utiliser un pare-feu! Néanmoins, dans le monde réel, les démons peuvent être mal configurés, des exploits contre des services essentielles sont disponibles librement, vous pourriez vouloir choisir les services accessibles par certaines machines, vous pourriez vouloir limiter quelles machines ou applications sont autorisées à accéder à internet ou vous pourriez simplement ne pas faire confiance à certaines applications ou à certains utilisateurs. Dans ces situations, vous pouvez bénéficier de l'utilisation d'un pare-feu.
Ne considérez pas néanmoins qu'avoir un pare-feu fait que la configuration précise est redondante, pas plus qu'elle ne rend les configurations négligées sans risque, pas plus qu'elle n'empêche qui que ce soit d'exploiter un service que vous avez intentionnellement offert mais que vous n'avez pas récemment mis à jour ou patché après qu'un exploit ait été rendu public. Bien que vous ayez un pare-feu, vous avez besoin de conserver des applications et des besoins sur votre système bien configuré et mis à jour; un pare-feu n'est pas une cure!
Le mot pare-feu peut avoir plusieurs sens différents.
Ce sont des programmes sous Windows vendus par des compagnies comme Symantec, compagnies qui affirment ou prétendent qu'ils sécurisent un PC de bureau ou personnel avec accès à internet. Ce thème est très important pour les utilisateurs qui ne connaissent pas les façons dont leurs ordinateurs peuvent être accédés via internet et comment les désactiver, spécialement si ils sont en ligne et si ils sont connectés via des lignes 'broadband'.
Il s'agit d'une boîte placé entre internet et l'intranet. Pour minimiser le risque de compromettre le pare-feu lui-même, il doit généralement n'avoir qu'un seul rôle, celui de protéger l'intranet. Bien que pas complètement sans risques, les tâches de router et éventuellement d'IP masquerading (réécrire les entêtes IP des pacquets qu'il dirige des clients avec des adresses IP privées vers l'internet, de façon à ce qu'ils semblent provenir du pare-feu lui-même) sont généralement considéré sans gros risques.
C'est souvent une ancienne machine que vous aviez retirée et presque oubliée, réalisant du masquerading ou des fonctions de routage, mais offrant un ensemble de fonctions, comme cache web, mail, etc... Elle pourrait être utilisée pour un réseau personnel, mais ne peut définitivement plus être considéré comme sécurisé parce que la combinaison de serveur et routeur sur une seule machine augmente la complexité de sa configuration.
Cette machine réalise du masquerading ou du routage, mais accorde un accès public à certains points de votre réseau qui, à cause des IPs publiques et d'une structure séparée physiquement, n'est pas considéré comme faisant partie d'internet et de l'intranet. Le pare-feu les protège tous les deux.
Faire du routage ou du masquerading, mais permettre de sélectionner seulement les services accessibles, quelque fois seulement les utilisateurs ou les machines; généralement utilisé dans des contextes professionnels hautement sécurisés, quelques fois à cause d'utilisateurs dont on n'a pas confiance. C'était une configuration commune du pare-feu au temps du noyau Linux 2.2. Il est encore possible de configurer un pare-feu de cette façon, mais cela rend les règles assez complexes et longues.
Ce document est une introduction sur la configuration d'un firewall - ce n'est pas un guide complet sur la sécurisation d'un système. La mise au point de pare-feux est un problème complexe qui nécessite une configuration minutieuse. Les scripts données ici ont pour but de donner un exemple sur le fonctionnement des pare-feux. Il ne sont pas conçus dans l'idée de convenir à toutes les configurations imaginables et n'empêcheront pas toutes les attaques.
Le but de ce texte est simplement de vous donner une idée de la façon de commencer la mise au point d'un pare-feu.
La personnalisation de ces scripts pour votre cas particulier sera nécessaire pour une configuration optimale, mais vous devrez d'abord étudier sérieusement la documentation d'iptables et de la mise au point de pare-feux avant de le faire. Jetez un oeil sur la liste de Links for further reading à la fin de cette section pour plus d'aide. Vous y trouverez une liste de sites (URLs) contenant des informations importantes pour la création de votre propre pare-feu.
Si vous voulez que votre machine Linux fasse pare-feu, vous devez d'abord vous assurer que le noyau a bien été compilé avec les options adéquates
Comment configurer votre noyau, avec l'activation d'options à compiler dans le noyau ou en tant que modules, dépend de vos préférences personnelles et de votre expérience. Notez que pour les scripts donnés en exemples, il est supposé que les modules ont d'abord été chargés.
Network options menu Network packet filtering: Y Unix domain sockets: Y or M TCP/IP networking: Y IP: advanced router: Y IP: verbose route monitoring: Y IP: TCP Explicit Congestion Notification support: Y IP: TCP syncookie support: Y IP: Netfilter Configuration menu Every option except: Y or M ipchains (2.2-style) support N ipfwadm (2.0-style) support N Fast switching: N
Un pare-feu personnel est supposé vous laisser l'accès à tous les services offerts sur internet, mais fait en sorte que votre machine est sécurisé et que vos données restent privées.
Ci-dessous est une version légèrement modifiée des recommandations de Rusty Russell à partir de " Linux 2.4 Packet Filtering HOWTO":
cat > /etc/rc.d/init.d/firewall << "EOF" #!/bin/sh # Début $rc_base/init.d/firewall # Insertion des modules de traces de connexion (pas nécessaire si intégrés au # noyau). modprobe ip_tables modprobe iptable_filter modprobe ip_conntrack modprobe ip_conntrack_ftp modprobe ipt_state modprobe ipt_LOG # permet les connexions local uniquement iptables -A INPUT -i lo -j ACCEPT # free output on any interface to any ip for any service (equal to -P ACCEPT) iptables -A OUTPUT -j ACCEPT # autorise les réponses à des connexions déjà établies # et permet les nouvelles connexions en relation avec celles déjà établies (par # exemple active-ftp) iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # Enregistre tout le reste: Quelle est la dernière vulnérabilité de Windows? iptables -A INPUT -j LOG --log-prefix "FIREWALL:INPUT " # Met en place une politique saine: tout ce qui n'est pas accepté > /dev/null iptables -P INPUT DROP iptables -P FORWARD DROP iptables -P OUTPUT DROP # soit verbeux pour les adresses dynamiques (pas nécessaire dans le cas des adresses IP statiques) echo 2 > /proc/sys/net/ipv4/ip_dynaddr # désactive ExplicitCongestionNotification - trop de routeurs les ignorent encore echo 0 > /proc/sys/net/ipv4/tcp_ecn # Fin $rc_base/init.d/firewall EOF
Son script est assez simple, il 'oublie' (drop) tout trafic venant sur votre ordinateur qui n'a pas été initié à partir de votre machine, mais aussi longtemps que vous surfez simplement sur internet, vous ne risquez pas d'excéder ces limites.
Si vous rencontrez fréquemment certains délais pour accéder à des serveurs ftp, jetez un oeil sur BusyBox - example no. 4.
Même si vous avez des démons ou services tournant sur votre machine, ils seront inaccessibles partout ailleurs que sur votre machine. Si vous souhaitez permettre l'accès à des services sur votre machine, tels que ssh ou ping, regardez BusyBox.
Un vrai pare-feu a deux interfaces, une connectée à un intranet, dans cette exemple, eth0, et une connectée à internet, ici, ppp0. Pour apporter le maximum de sécurité sur cette machine, assurez-vous qu'aucun serveur ne tourne dessus, et spécialement X11. Et, comme principe général, la machine elle-même ne devrait accéder à aucun service (pensez à un serveur de nom donnant des réponses qui feront crasher bind, ou, même pire, qui implémente un vers via un dépassement de tampon.) auquels vous ne faites pas confiance.
cat > /etc/rc.d/init.d/firewall << "EOF"
#!/bin/sh
# Début $rc_base/init.d/firewall
echo
echo "You're using the example-config for a setup of a firewall"
echo "from the firewalling-hint written for LinuxFromScratch."
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 quoted configuration rules."
echo "You can find some quite comprehensive information"
echo "about firewalling in Chapter 4 of the BLFS book."
echo "http://www.linuxfromscratch.org/blfs"
echo
# Insert iptables modules (not needed if built into the kernel).
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
# allow local-only connections
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
# allow forwarding
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -m state --state NEW -i ! ppp+ -j ACCEPT
# do masquerading (not needed if intranet is not using private ip-addresses)
iptables -t nat -A POSTROUTING -o ppp+ -j MASQUERADE
# Log everything for debugging (last of all rules, but before DROP/REJECT)
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 "
# set a sane policy
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT DROP
# be verbose on dynamic ip-addresses (not needed in case of static IP)
echo 2 > /proc/sys/net/ipv4/ip_dynaddr
# disable ExplicitCongestionNotification
echo 0 > /proc/sys/net/ipv4/tcp_ecn
# activate TCPsyncookies
echo 1 > /proc/sys/net/ipv4/tcp_syncookies
# activate Route-Verification = IP-Spoofing_protection
for f in /proc/sys/net/ipv4/conf/*/rp_filter; do
echo 1 > $f
done
# activate IP-Forwarding
echo 1 > /proc/sys/net/ipv4/ip_forward
EOF
Avec ce script, votre intranet devrait être suffisamment sécurisé contre les attaques externes: personne ne pourra être capable de mettre en place une connexion vers un service interne et, si il est masqueradé, il est même invisible; de plus, votre pare-feu doit être pratiquement inattaquable car il n'existe aucun service lancé qu'un cracker pourrait attaqué.
Note: si l'interface, par laquelle vous vous connectez à Internet, ne se connecte pas via ppp, vous aurez besoin de changer ppp+ par le nom de l'interface que vous utilisez. Si vous utilisez le même type d'interface pour vous connecter à l'intranet et à l'internet, vous devez utiliser le nom actuel de l'interface tel que eth0, sur les deux interfaces.
Si vous avez besoin d'une sécurité plus forte (c'est-à-dire DOS, connexion highjacking, spoofing, etc.), jetez un oeil sur la liste de Links for further reading à la fin de cette section.
Ce scénario n'est pas trop différent de (Masquerading Router), mais dans ce cas, vous voulez offrir certains services à votre intranet. Des exemples de ceci peuvent être lorsque vous voulez administrer votre machine d'un autre hôte sur votre intranet ou l'utiliser comme un proxy ou comme un serveur de noms. Note: Surligner un vrai concept sur la façon de protéger un serveur qui offre des services sur internet va bien au delà de ce document, voir Disclaimer.
Faites attention. Chaque service que vous offrez et que vous activez rends votre configuration plus complexe et votre machine moins sécurisée: vous courrez le risque de services mal configurés ou de lancer un service avec un bug exploitable. Un pare-feu ne devrait généralement pas avoir de services supplémentaires. Voir l'introduction Masquerading Router pour plus de détails.
Si les services que vous voulez offrir n'ont pas besoin d'accéder à internet eux-même, c'est assez simple et cela devrait encore être acceptable d'un point de vue de la sécurité. Ajoutez seulement les lignes suivantes avant les règles de traces (logging-rules) dans le script.
iptables -A INPUT -i ! ppp+ -j ACCEPT iptables -A OUTPUT -o ! ppp+ -j ACCEPT
Si vos démons doivent accéder au web eux-mêmes, comme squid, vous pouvez ouvrir la sortie (OUTPUT) et restreindre l'entrée (INPUT).
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A OUTPUT -j ACCEPT
Néanmoins, il n'est pas conseillé de laisser la sortie sans restriction: vous perdez tout contrôle sur des chevaux de troie qui aimeraient "appeler chez eux", et un peu de redondance dans le cas où vous auriez (mal) configuré un service qui révèlerait son existence à tout le monde.
Si vous préférez avoir cette protection, vous pouvez restreindre l'entrée et la sortie sur tous les ports sauf ceux qui sont absolument nécessaires. Quels ports vous ouvrez dépend de vos besoins: la plupart deu temps, vous les trouverez en regardant dans les accès refusés de vos fichiers de traces.
Jetez un oeil sur les exemples suivants:
Squid fait un cache du web:
iptables -A OUTPUT -p tcp --dport 80 -j ACCEPT iptables -A INPUT -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT
Votre cache-serveur de noms (par exemple, dnscache) fait ses recherches via udp:
iptables -A OUTPUT -p udp --dport 53 -j ACCEPT iptables -A INPUT -p udp --sport 53 -m state --state ESTABLISHED -j ACCEPT
Autrement, si vous voulez être capable de 'ping'uer votre machine pour vous assurez qu'elle fonctionne toujours:
iptables -A INPUT -p icmp -m icmp --icmp-type echo-request -j ACCEPT -j ACCEPT iptables -A OUTPUT -p icmp -m icmp --icmp-type echo-reply -j ACCEPT
Si vous accédez fréquemment à des serveurs ftp ou que vous appréciez faire du chat, vous pouvez vous rendre compte de délais parce que certaines implémentations de ces démons ont la fonctionnalité de lancer une requête à identd sur votre machine pour votre nom d'utilisateur lors de la connexion. Bien qu'il n'y ait pas de mal à ça, avoir identd lancé n'est pas recommandé parce que certaines implémentations sont connues comme étant vulnérable.
Pour éviter ces délais, vous devez rejeter ces requêtes à un 'tcp-reset':
iptables -A INPUT -p tcp --dport 113 -j REJECT --reject-with tcp-reset iptables -A OUTPUT -p tcp --sport 113 -m state --state RELATED -j ACCEPT
Pour tracer et 'drop'er les paquets invalides, beaucoup de paquets inoffensifs arrivant après le dépassement du délai de netfilter sont scannés:
iptables -I INPUT 1 -p tcp -m state --state INVALID -j LOG --log-prefix \ "FIREWALL:INVALID" iptables -I INPUT 2 -p tcp -m state --state INVALID -j DROP
Tout ce qui vient de l'extérieur ne devrait pas avoir d'adresses privées, c'est une attaque commune appelée IP-spoofing:
iptables -t nat -A PREROUTING -i ppp+ -s 10.0.0.0/8 -j DROP iptables -t nat -A PREROUTING -i ppp+ -s 172.16.0.0/12 -j DROP iptables -t nat -A PREROUTING -i ppp+ -s 192.168.0.0/16 -j DROP
Pour simplifier le débuggage et être gentil avec tous ceux qui aimeraient accéder à un service que vous avez désactivé, volontairement ou par erreur, vous devez rejeter (REJECT) les pacquets en question.
Evidemment, ceci doit être fait tout de suite après les avoir enregistré (loggué):
iptables -A INPUT -j REJECT iptables -A OUTPUT -p icmp --icmp-type 3 -j ACCEPT
Ce sont seulement des exemples pour vous montrer les capacités du nouveau code pare-feu dans le noyau Linux 2.4. Regardez la page man de iptables. Vous y trouverez bien plus de choses. Les numéros de ports dont vous avez besoin pour ceci se trouvent dans /etc/services, au cas où vous ne les trouveriez pas en essayant dans vos fichiers de traces.
Si vous ajoutez un service tel que ci-dessus, peut-être même en FORWARD ou pour des communications intranet, et supprimez les clauses générales, vous obtiendrez un filtre de paquets d'ancienne génération.
Finalement, j'aimerais vous rappeller ce fait que nous ne devons pas oublier: L'effort passé à attaquer un système correspond à la valeur que le cracker attends en gagner. Si vous êtes reponsable de valeurs pour lesquelles de potentiels crackers pourraient faire de gros efforts, vous n'aurez pas besoin de cette astuce!
www.netfilter.org - Page d'accueil du
projet netfilter/iptables
FAQ
en relation avec Netfilter
Guides
pratiques en relation avec Netfilter
www.linuxdoc.org/LDP/nag2/x-087-2-firewall.html
www.linuxdoc.org/HOWTO/Security-HOWTO.html
www.linuxdoc.org/HOWTO/Firewall-HOWTO.html
www.ibm.com/developerworks/security/library/s-fire.html
www.ibm.com/developerworks/security/library/s-fire2.html
www.interhack.net/pubs/fw-faq/
www.linuxsecurity.com/docs/
www.little-idiot.de/firewall
(allemande et obsolète, mais très compréhensible)
www.linuxgazette.com/issue65/stumpel.html
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.linux-firewall-tools.com/linux/
logi.cc/linux/athome-firewall.php3
www.insecure.org/reading.html
www.robertgraham.com/pubs/firewall-seen.html
Si vous souhaitez jeter un oeil sur les chaînes de votre pare-feu et l'ordre dans lesquelles elles prendront effet:
cat > /etc/rc.d/init.d/firewall.status << "EOF" #!/bin/sh # Début $rc_base/init.d/firewall.status echo "iptables.mangling:" iptables -t mangle -v -L -n --line-numbers echo echo "iptables.nat:" iptables -t nat -v -L -n --line-numbers echo echo "iptables.filter:" iptables -v -L -n --line-numbers EOF
Si vous avez besoin d'arrêter votre pare-feu, ce script vous le permettra:
cat > /etc/rc.d/init.d/firewall.stop << "EOF" #!/bin/sh # Début $rc_base/init.d/firewall.stop # deactivate IP-Forwarding echo 0 > /proc/sys/net/ipv4/ip_forward iptables -Z iptables -F iptables -t nat -F PREROUTING iptables -t nat -F OUTPUT iptables -t nat -F POSTROUTING iptables -t mangle -F PREROUTING iptables -t mangle -F OUTPUT iptables -X iptables -P INPUT ACCEPT iptables -P FORWARD ACCEPT iptables -P OUTPUT ACCEPT EOF