5.14.1. Protéger le système local avec un pare-feu
Vous pouvez utiliser des règles de pare-feu comme façon de sécuriser l'accès à votre système local et, même, de limiter les connexions sortantes effectuées par celui-ci. Des règles de pare-feu peuvent être également utilisées pour protéger des processus qui ne peuvent être proprement configurés pour ne pas fournir certains services à certains réseaux, certaines adresses IP, etc.
Toutefois, cette étape est présentée en dernier dans ce manuel car il est largement préférable de ne pas dépendre exclusivement des capacités d'un pare-feu pour protéger un système donné. La sécurité dans un système est réalisée par couches, le filtrage devrait être la dernière, une fois que tous les services ont été renforcés. Vous pouvez facilement imaginer une installation dans laquelle le système est uniquement protégé par le pare-feu et que l'administrateur enlève bêtement les règles pour n'importe quelle raison (problèmes avec l'installation, exaspération, erreur humaine, etc.), ce système pourrait être grand ouvert à une attaque s'il n'y avait aucun autre renforcement dans le système pour le protéger.
D'un autre côté, avoir des règles de pare-feu sur le système local prévient également quelques mauvaises choses de se produire. Même si les services fournis sont configurés avec sécurité, un pare-feu peut protéger des erreurs de configuration ou des services fraîchement installés qui n'ont pas encore été configurés correctement. Une configuration serrée préviendra également un cheval de Troie appelant à la maison de fonctionner sauf si le code de pare-feu est enlevé. Notez qu'un intrus n'a pas besoin de l'accès superutilisateur pour installer un cheval de Troie qui pourrait être contrôlé à distance (car l'ouverture sur des ports est autorisée si le port n'est pas privilégié et si des capacités n'ont pas été supprimées).
Une configuration correcte de pare-feu serait donc une règle de refus par défaut, c'est-à-dire :
les connexions entrantes ne sont autorisés que pour des services locaux par des machines autorisées ;
les connexions sortantes ne sont autorisés que pour les services utilisés par votre système (DNS, navigation web, POP, courrier, etc.)
;
la règle forward interdit tout (à moins que vous ne protégiez d'autres systèmes, voir ci-dessous) ;
toutes les autres connexions entrantes et sortantes sont interdites.
5.14.2. Utiliser un pare-feu pour protéger d'autres systèmes
Un pare-feu Debian peut aussi être installé de façon à protéger, selon des règles de filtrage, l'accès aux systèmes derrière lui, limitant leur exposition à Internet. Un pare-feu peut être configuré pour interdire l'accès de systèmes en dehors de votre réseau local à des services internes (ports) qui ne sont pas publics. Par exemple, sur un serveur de messagerie, seul le port 25 (où le service de courrier est fourni) doit être accessible depuis l'extérieur. Un pare-feu peut être configuré pour, même s'il y a d'autres services en plus des services publics, rejeter les paquets (c'est connu sous le nom defiltrage) dirigés vers eux.
Vous pouvez même installer une machine Debian GNU/Linux en tant que pont pare-feu, c'est-à-dire un pare-feu filtrant complètement transparent pour le réseau qui est dépourvu d'adresse IP et donc ne peut pas être attaqué directement. Selon le noyau que vous avez installé, vous pouvez avoir besoin d'installer le correctif pare-feu pour pont, puis aller à
802.1d Ethernet Bridging lors de la configuration du noyau et une nouvelle option
netfilter (firewalling) support. Consultez
Section B.4, « Configuration d'un pare-feu pont » pour plus d'informations sur la façon de faire cela dans un système Debian GNU/Linux.
5.14.3. Mettre en place un pare-feu
L'installation Debian par défaut, à la différence d'autres distributions Linux, ne fournit pas encore de moyen pour l'administrateur de mettre une configuration de pare-feu lors de l'installation, mais vous pouvez installer un certain nombre de paquets de configuration de pare-feu (consultez
Section 5.14.3.1, « Paquets pare-feu »).
Bien sûr, la configuration du pare-feu dépend toujours du système et du réseau. Un administrateur doit connaître auparavant quelle est la disposition du réseau, les systèmes qu'il désire protéger et si d'autres considérations réseau (comme le NAT ou le routage) doivent être prises en compte ou non. Soyez prudent quand vous configurez votre pare-feu, comme le dit Laurence J. Lane dans son paquet iptables :
Les outils peuvent facilement être mal utilisés, entraînant d'énormes quantités de maux en paralysant complètement l'accès au réseau pour un système d'ordinateur. Il n'est pas très inhabituel pour un administrateur système de se bloquer lui-même en dehors du système situé à quelques centaines ou milliers de kilomètres de là. Il est même possible de se bloquer en dehors d'un ordinateur dont le clavier est sous ses doigts. Veuillez s'il vous plaît l'utiliser avec précaution.
Rappelez-vous de cela : installer simplement le paquet iptables (ou l'ancien code de pare-feu) ne vous fournit pas de protection, mais seulement les logiciels. Pour avoir un pare-feu, vous devez le configurer !
Si vous ne savez pas comment configurer les règles de votre pare-feu manuellement, veuillez consulter le Packet Filtering HOWTO et le NAT HOWTO fournis par iptables pour une lecture hors ligne à /usr/share/doc/iptables/html/
.
5.14.3.1. Paquets pare-feu
Configurer manuellement un pare-feu peut être compliqué pour un administrateur débutant (et même parfois pour un expert). Cependant, la communauté des logiciels libres a créé un certain nombre d'outils pouvant être utilisés pour configurer facilement un pare-feu local. Soyez prévenu que certains de ces outils sont plus orientés vers de la protection locale seulement (également connu sous le nom de pare-feu personnel) et d'autres sont plus versatiles et peuvent être utilisés pour configurer des règles complexes pour protéger des réseaux entiers.
Plusieurs logiciels peuvent être utilisés pour configurer des règles de pare-feu dans un système Debian.
Pour les systèmes de bureau :
firestarter, une application GNOME orientée vers les utilisateurs finaux et incluant un assistant utile pour définir rapidement des règles de pare-feu. L'application inclut une interface utilisateur pour pouvoir surveiller quand une règle de pare-feu bloque le trafic ;
guarddog, un paquet de configuration de pare-feu basé sur KDE orienté à la fois vers les utilisateurs novices et avancés ;
knetfilter, une interface graphique KDE pour gérer un pare-feu et des règles NAT pour iptables (alternative ou concurrent à l'outil guarddog bien que légèrement plus orienté vers les utilisateurs avancés) ;
fireflier, un outil interactif pour créer des règles iptables à partir du trafic vu sur le système et les applications. Il possède un modèle client serveur donc vous devez installer à la fois le serveur (fireflier-server) et un des clients disponibles, avec un client disponible pour chaque environnement de bureau : fireflier-client-gtk (client GTK+), fireflier-client-kde (client KDE) et fireflier-client-qt (client QT).
Pour les systèmes serveurs (sans interface graphique) :
fwbuilder, une interface graphique orientée objet qui inclut des compilateurs de règles pour diverses plates-formes de pare-feu incluant netfilter de Linux, pf de BSD (utilisé dans OpenBSD, NetBSD, FreeBSD et Mac OS X) ainsi que des listes d'accès du routeur. La fonctionnalité de fwbuilder complète est également disponible depuis la ligne de commande ;
shorewall, un outil de configuration de pare-feu qui fournit une prise en charge IPsec ainsi qu'une prise en charge limitée pour le dimensionnement du trafic (« traffic shaping ») et la définition des règles du pare-feu. La configuration est effectuée par un simple jeu de fichiers qui sont utilisés pour générer les règles iptables ;
bastille, l'application de durcissement est décrit dans
Chapitre 6, Sécurisation automatique d'un système Debian. L'une des étapes de durcissement que l'administrateur peut configurer est une définition du trafic autorisé et interdit qui est utilisée pour générer un ensemble de règles de pare-feu que le système exécutera au démarrage.
De nombreuses autres interfaces à iptables sont disponibles dans Debian ; une liste exhaustive de comparaison des différents paquets dans Debian est tenue à jour sur la
http://wiki.debian.org/Firewalls.
Remarquez que certains des paquets cités ci-dessus introduiront probablement des scripts de pare-feu à exécuter lors de l'amorçage du système. Testez-les de manière exhaustive avant de redémarrer le système ou vous pourriez vous retrouver bloqué en dehors de la machine. Si vous mélangez différents paquets de pare-feu, vous pouvez obtenir des effets indésirables. Habituellement, le script de pare-feu qui s'exécute en dernier sera celui qui configurera le système (qui peut ne pas être ce que vous voulez). Consultez la documentation du paquet et utilisez l'un d'entre eux pour ces configurations.
Comme mentionné précédemment, certains programmes comme firestarter, guarddog ou knetfilter sont des interfaces graphiques pour l'administration qui utilisent soit GNOME, soit KDE (les deux derniers). Ces applications sont plus orientées utilisateur (c'est-à-dire utilisation « familiale ») tandis que certains des autres paquets de la liste sont plus orientés administrateur. Certains des programmes mentionnés auparavant (comme bastille
) sont ciblés sur la mise en place de règles de pare-feu qui protègent l'hôte sur lequel ils fonctionnent, mais ils ne sont pas nécessairement conçus pour mettre en place des règles de pare-feu pour des hôtes de pare-feu qui protègent un réseau (comme shorewall
ou fwbuilder
).
Il existe encore un autre type d'application de pare-feu: les serveurs mandataires (proxy) applicatifs. Si vous cherchez à mettre en place un tel pare-feu de niveau d'entreprise qui effectue du filtrage de paquets et fournit un certain nombre de serveurs mandataires transparents qui peuvent faire une analyse fine du trafic, vous devriez considérer l'utilisation de zorp, qui fournit cela dans un seul programme. Vous pouvez également mettre en place ce type de pare-feu manuellement en utilisant les serveurs mandataires disponibles dans Debian pour différents services comme pour le DNS en utilisant bind (correctement configuré), dnsmasq, pdnsd ou totd pour le FTP en utilisant frox ou ftp-proxy, pour X11 en utilisant xfwp, pour IMAP en utilisant imapproxy, pour le courrier en utilisant smtpd, ou pour POP3 en utilisant p3scan. Pour d'autres protocoles, vous devriez soit utiliser un serveur mandataire TCP générique comme simpleproxy, soit un serveur mandataire SOCKS comme dante-server, tsocks ou socks4-server. Vous devrez également typiquement utiliser un système de cache web (comme squid) et un système de filtrage web (comme squidguard ou dansguardian).
5.14.3.2. Configuration manuelle init.d
Une autre possibilité est de configurer manuellement vos règles de pare-feu par un script init.d qui exécutera toutes les commandes
iptables
. Suivez les étapes ci-dessous.
Consultez le script ci-dessous et adaptez-le à vos besoins.
Testez le script et vérifiez les messages du journal système pour voir le trafic qui est rejeté. Si vous testez depuis le réseau, vous voudrez soit exécuter le script shell en exemple qui enlève le pare-feu (si vous ne tapez rien pendant 20 secondes), soit commenter les définitions de règle default deny (-P INPUT DROP et -P OUTPUT DROP) et vérifier que le système ne rejette pas de trafic légitime.
Déplacez le script dans /etc/init.d/parefeu
.
Le script ci-dessous tire avantage de l'utilisation (depuis Squeeze) par Debian d'un séquençage d'amorçage basé sur les dépendances. Pour plus d'informations voir :
https://wiki.debian.org/LSBInitScripts/DependencyBasedBoot et
https://wiki.debian.org/LSBInitScripts. Si les en-têtes LSB sont définis comme ils le sont dans le script, insserv configurera automatiquement le système pour qu'il lance le pare-feu avant le démarrage de n'importe quel réseau, et ne l'arrête qu'après la fermeture de tous les réseaux.
# insserv myfirewall
Voici l'exemple de script de pare-feu :
#!/bin/sh
# Exemple de configuration de pare-feu.
#
# Mises en garde
# - Cette configuration s'applique à toutes les interfaces réseau.
# Si vous voulez ne restreindre cela qu'à une interface donnée,
# utilisez « -i INTERFACE » dans les appels iptables ;
# - L'accès à distance pour les services TCP/UDP est accordé à tout
# hôte, vous voudrez probablement restreindre cela en utilisant
# « --source ».
#
# chkconfig : 2345 9 91
# description : activer ou désactiver le pare-feu au démarrage
#
# Vous pouvez tester ce script avant de l'appliquer avec l'extrait
# de script shell suivant, si vous ne tapez rien pendant
# 20 secondes, les règles de pare-feu seront effacées.
#---------------------------------------------------------------
# while true; do test=""; read -t 20 -p "OK ? " test ; \
# [ -z "$test" ] && /etc/init.d/parefeu clear ; done
#---------------------------------------------------------------
PATH=/bin:/sbin:/usr/bin:/usr/sbin
# Services que le système offrira au réseau
TCP_SERVICES="22" # seulement SSH
UDP_SERVICES=""
# Services que le système utilisera du réseau
REMOTE_TCP_SERVICES="80" # navigation web
REMOTE_UDP_SERVICES="53" # DNS
# Réseau qui sera utilisé pour la gestion à distance
# (si non défini, aucune règle ne sera mise en place)
# NETWORK_MGMT=192.168.0.0/24
# Port utilisé pour le service SSH, à définir si vous avez configuré
# une gestion de réseau mais l'avez enlevé de TCP_SERVICES
# SSH_PORT="22"
if ! [ -x /sbin/iptables ]; then
exit 0
fi
fw_start () {
# Trafic d'entrée :
/sbin/iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# Services
if [ -n "$TCP_SERVICES" ] ; then
for PORT in $TCP_SERVICES; do
/sbin/iptables -A INPUT -p tcp --dport ${PORT} -j ACCEPT
done
fi
if [ -n "$UDP_SERVICES" ] ; then
for PORT in $UDP_SERVICES; do
/sbin/iptables -A INPUT -p udp --dport ${PORT} -j ACCEPT
done
fi
# Gestion à distance
if [ -n "$NETWORK_MGMT" ] ; then
/sbin/iptables -A INPUT -p tcp --src ${NETWORK_MGMT} --dport ${SSH_PORT} -j ACCEPT
else
/sbin/iptables -A INPUT -p tcp --dport ${SSH_PORT} -j ACCEPT
fi
# Test à distance
/sbin/iptables -A INPUT -p icmp -j ACCEPT
/sbin/iptables -A INPUT -i lo -j ACCEPT
/sbin/iptables -P INPUT DROP
/sbin/iptables -A INPUT -j LOG
# Sortie :
/sbin/iptables -A OUTPUT -j ACCEPT -o lo
/sbin/iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# ICMP est permis :
/sbin/iptables -A OUTPUT -p icmp -j ACCEPT
# Ainsi que les mises à jour de sécurité :
# Remarque : vous pouvez indiquer en dur l'adresse IP ici afin de prévenir une
# usurpation DNS et configurer les règles même si le DNS ne fonctionne pas mais
# dans ce cas vous ne « verrez » pas les modifications d'IP pour ce service :
/sbin/iptables -A OUTPUT -p tcp -d security.debian.org --dport 80 -j ACCEPT
# Ainsi que pour tous les services définis :
if [ -n "$REMOTE_TCP_SERVICES" ] ; then
for PORT in $REMOTE_TCP_SERVICES; do
/sbin/iptables -A OUTPUT -p tcp --dport ${PORT} -j ACCEPT
done
fi
if [ -n "$REMOTE_UDP_SERVICES" ] ; then
for PORT in $REMOTE_UDP_SERVICES; do
/sbin/iptables -A OUTPUT -p udp --dport ${PORT} -j ACCEPT
done
fi
# Toutes les autres connexions sont enregistrées dans syslog
/sbin/iptables -A OUTPUT -j LOG
/sbin/iptables -A OUTPUT -j REJECT
/sbin/iptables -P OUTPUT DROP
# Autres protections réseau
# (certaines ne fonctionneront que pour certaines versions de noyau)
echo 1 > /proc/sys/net/ipv4/tcp_syncookies
echo 0 > /proc/sys/net/ipv4/ip_forward
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
echo 1 > /proc/sys/net/ipv4/conf/all/log_martians
echo 1 > /proc/sys/net/ipv4/ip_always_defrag
echo 1 > /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses
echo 1 > /proc/sys/net/ipv4/conf/all/rp_filter
echo 0 > /proc/sys/net/ipv4/conf/all/send_redirects
echo 0 > /proc/sys/net/ipv4/conf/all/accept_source_route
}
fw_stop () {
/sbin/iptables -F
/sbin/iptables -t nat -F
/sbin/iptables -t mangle -F
/sbin/iptables -P INPUT DROP
/sbin/iptables -P FORWARD DROP
/sbin/iptables -P OUTPUT ACCEPT
}
fw_clear () {
/sbin/iptables -F
/sbin/iptables -t nat -F
/sbin/iptables -t mangle -F
/sbin/iptables -P INPUT ACCEPT
/sbin/iptables -P FORWARD ACCEPT
/sbin/iptables -P OUTPUT ACCEPT
}
case "$1" in
start|restart)
echo -n "Démarrage du pare-feu…"
fw_stop
fw_start
echo "done."
;;
stop)
echo -n "Arrêt du pare-feu…"
fw_stop
echo "done."
;;
clear)
echo -n "Effacement des règles de pare-feu…"
fw_clear
echo "done."
;;
*)
echo "Utilisation : $0 {start|stop|restart|clear}"
exit 1
;;
esac
exit 0
Au lieu d'intégrer toutes les règles iptables dans un script init.d, vous pouvez utiliser le programme iptables-restore
pour restaurer les règles sauvées avec iptables-save
. Pour faire cela, vous devez configurer les règles et sauver le jeu de règles dans un endroit statique (comme /etc/default/firewall
).
5.14.3.3. Configurer les règles du réseau par ifup
Vous pouvez également utiliser la configuration du réseau dans
/etc/network/interfaces
pour mettre en place les règles de pare-feu. Pour cela, vous devez :
créer le jeu de règles de pare-feu à appliquer quand l'interface sera active ;
sauver le jeu de règles avec iptables-save
dans un fichier de /etc
, par exemple /etc/iptables.up.rules
;
configurer
/etc/network/interfaces
pour utiliser le jeu de règles configurées :
iface eth0 inet static
address x.x.x.x
[… configuration de l'interface …]
pre-up iptables-restore < /etc/iptables.up.rules
Optionnellement, vous pouvez mettre en place un jeu de règles à appliquer quand l'interface est
inactivée en créant un jeu de règles, en le sauvant dans
/etc/iptables.down.rules
et en ajoutant la directive suivante à la configuration de l'interface :
post-down iptables-restore < /etc/iptables.down.rules
Pour des scripts de configuration de pare-feu plus avancés avec ifupdown, vous pouvez utiliser les accroches (hooks) disponibles pour chaque interface dans les répertoires *.d/
appelés avec run-parts
(consultez run-parts(8)).
5.14.3.4. Tester la configuration de pare-feu
Tester la configuration de pare-feu est aussi facile et aussi dangereux que d'exécuter simplement le script de pare-feu (ou d'activer la configuration que vous avez définie dans l'application de configuration de pare-feu). Cependant, si vous n'êtes pas assez prudent et que vous configurez le pare-feu à distance (comme à travers une connexion SSH), vous pourriez vous enfermer dehors.
Plusieurs moyens permettent d'empêcher cela. L'un est d'exécuter un script dans un terminal séparé qui va enlever la configuration de pare-feu si vous ne faites pas d'entrée clavier. Un exemple de cela est :
$ while true; do test=""; read -t 20 -p "OK? " test ; \
[ -z "$test" ] && /etc/init.d/firewall clear ; done
Un autre moyen est d'introduire une porte dérobée dans le système par un mécanisme alternatif qui vous permet soit d'enlever le système de pare-feu, soit de percer un trou dedans si quelque chose déraille. Pour cela, vous pouvez utiliser knockd et le configurer pour qu'une tentative de connexion sur un certain port enlève le pare-feu (ou ajoute une règle temporaire). Bien que les paquets soient rejetés par le pare-feu, comme knockd
se lie à l'interface et les voit, vous pourrez contourner le problème.
Tester un pare-feu qui protège un réseau interne est un problème différent, vous voudrez étudier certains des outils utilisés pour le test de failles à distance (consultez
Section 8.1, « Outils d'évaluation des vulnérabilités à distance ») pour sonder le réseau depuis l'extérieur (ou dans toute autre direction) pour tester l'efficacité de la configuration du pare-feu.