Serveur sous Debian : suite (le firewall)
[Edit] : une grossière erreur empêchait ce script de fonctionner (INPUT bloqué même pour les connexions déjà établies, et OUTPUT trop peu permissif).
Je vous ait expliqué dans mon post précédent comment installer un serveur web sécurisé sous Debian. Voici maintenant comment le sécuriser un minimum : un script de firewall. Il n'a absolument rien de transcendant : il permet juste de fermer tous les ports, sauf les ports HTTP (80) et SSH (22), plus une mention spéciale pour le NTP.
Vérifiez tout d'abord qu'iptables est bien installé : apt-get install iptables.
Voici le script /etc/firewall.sh commenté pas-à-pas :
#!/bin/sh
Indique avec quel programme le script doit être interprété.
# Règles par défaut iptables -P INPUT DROP iptables -P FORWARD DROP iptables -P OUTPUT ACCEPT
On rejette par défaut ce qui arrive (INPUT) et ce qui ne fait que traverser (FORWARD), mais on accepte ce qui sort (OUTPUT).
# On accepte les connexions boucle locale (sur lo) iptables -A INPUT -i lo -j ACCEPT iptables -A FORWARD -i lo -j ACCEPT iptables -A FORWARD -o lo -j ACCEPT
Cela permet des tests sur les adresses localhost (127.0.0.1 et ::1).
# On accepte les connexions depuis le LAN iptables -A INPUT -s 192.168.0.0/24 -j ACCEPT iptables -A FORWARD -s 192.168.0.0/24 -j ACCEPT iptables -A FORWARD -d 192.168.0.0/24 -j ACCEPT
On accepte tout sur le LAN (les machines du réseau local, qui sont sûres dans mon cas).
# On accepte les connexions HTTP et SSH dans les deux sens iptables -A INPUT -i eth0 -p tcp --sport www -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT iptables -A INPUT -i eth0 -p tcp --sport ssh -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
On veut pouvoir se connecter à notre serveur web de l'extérieur, et naviguer depuis notre serveur (en fait, certains scripts en ont besoin) ! On autorise donc les connexions entrantes nouvelles (NEW), déjà établies (ESTABLISHED) ou en relation (RELATED). Comme HTTP possède un port bien défini (80), il est présent dans la liste des ports de /etc/services : on peut donc l'indiquer comme --sport (port source) ou -dport (port de destination) en indiquant son nom dans le fichier /etc/services : www.
Il en va de même pour SSH. SSH est aussi présent dans /etc/services.
# On autorise le ping iptables -A OUTPUT -p icmp -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT iptables -A INPUT -p icmp -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT iptables -A INPUT -p icmp -m limit --limit 2/s -j ACCEPT
On autorise enfin le ping, mais avec modération : pas plus de 2 pings par seconde (-- limit 2/s).
# On autorise les connexions TCP et UDP déjà établies à entrer iptables -A INPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A INPUT -p udp -m state --state ESTABLISHED,RELATED -j ACCEPT
Et on n'oublie pas qu'une connexion est dans les deux sens !
Voilà donc un script de lancement de firewall ! On peut également créer un script d'init pour notre firewall :
#!/bin/sh
stop() {
iptables -F INPUT
iptables -F OUTPUT
iptables -F FORWARD
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
}
case $1 in
"start")
/etc/firewall.sh
;;
"stop")
stop
;;
"restart")
stop
/etc/firewall.sh
;;
esac
La fonction stop() arrête le firewall en flushant (vidant) les règles d'INPUT, OUTPUT et FORWARD. On redéfinit les stratégies par défaut à ACCEPT (on accepte tout). L'instruction case permet ensuite de savoir si l'utilisateur veut qu'on lance (start), arrête (stop) ou redémarre (restart) le firewall. Dans le premier cas, on appelle notre script de lancement de firewall que l'on a précédemment créé. Dans le second, on appelle la fonction stop(), et dans le troisième, on combine les deux et dans le bon ordre ! $1 désigne le premier argument passé au script, on lance donc notre firewall en tapant /etc/init.d/firewall start... Vous en déduisez comment on l'arrête ou le redémarre. N'oubliez pas d'ajouter ce script à ceux qui démarrent au lancement de la machine : update-rc.d firewall defaults.
Et voilà ! Pour plus d'informations sur les iptables, outil décidément très puissant, consultez l'article de Léa Linux "Mur de feu pas-à-pas" ou "iptables par l'exemple", beaucoup plus complet.

Commentaires
1. Le mercredi 22 février 2006 à 02:25, par ativan
Ajouter un commentaire
Les commentaires pour ce billet sont fermés.