Mettre en place un pare-feu réseau

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.

Introduction à la création de pare-feux

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!

Signification du mot pare-feu

Le mot pare-feu peut avoir plusieurs sens différents.

Personal Firewall

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'.

Masquerading Router

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.

BusyBox

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.

Pare-feu avec une zone démilitarisé [pas décrit plus en profondeur ici]

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.

Packetfilter / accessible partiellement du réseau [décrit partiellement ici, voir BusyBox]

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.

Réclamations

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.

Avoir un noyau dont le pare-feu est actif

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

Maintenant, vous pouvez commencer la construction de votre pare-feu.

Un pare-feu personnel

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/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.

Router Masquerading

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.

BusyBox

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, risques contre lesquels un pare-feu devrait être immunisés. 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.

Conclusion

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!

Informations supplémentaires

firewall.status

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

firewall.stop

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