Photographies, informatique et bien d'autres choses…

Serveur dédié – Mise en place du firewall

4 août 2010 | Posté dans Serveur dédié | Vu 534 fois

Maintenant que notre connexion SSH est parfaitement configurée, attelons-nous à mettre en place un bon firewall.

Le noyau Linux contient de base le programme Iptables qui officie comme firewall, mais de base celui-ci est vide et n’empêche aucune tentative de connexion sur quelque port que ce soit, c’est pourquoi nous allons mettre en place un script bash que j’ai réécrit sur la base de plusieurs sources diverses et variées.

Nous allons ouvrir 3 terminaux chacun connecté à notre serveur via SSH. Dans le premier nous vérifierons la bonne mise en place du firewall, dans le deuxième nous lancerons le script qui renseignera le firewall, et dans le troisième nous exécuterons une petite ligne de commande qui remettra automatiquement le firewall à zéro si nous nous retrouvons bloqué.

Premier terminal
Vérification des règles du firewall :
[root@serveur:~]# iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
 
Chain FORWARD (policy DROP)
target     prot opt source               destination
 
Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination
 
Chain LOG_REJECT_SMTP (0 references)
target     prot opt source               destination
Vous devriez avoir le même type d’affichage, à savoir aucune ligne n’apparaissant sous les lignes commençant par target. Nous reviendrons plus tard sur ce terminal.

Deuxième terminal
Nous créons un fichier intitulé firewall dans le dossier /etc/init.d/ :
[root@serveur:~]# vim /etc/init.d/firewall et nous y ajoutons le code suivant :
#!/bin/bash
IPT=/sbin/iptables
function start {
# Vider les tables actuelles
$IPT -t filter -F
# Vider les règles personnelles
$IPT -t filter -X
# Interdire toute connexion entrante et sortante
$IPT -t filter -P INPUT DROP
$IPT -t filter -P FORWARD DROP
$IPT -t filter -P OUTPUT DROP
# ---
# Ne pas casser les connexions etablies
$IPT -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
$IPT -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
# Autoriser loopback
$IPT -t filter -A INPUT -i lo -j ACCEPT
$IPT -t filter -A OUTPUT -o lo -j ACCEPT
# ICMP (Ping)
$IPT -t filter -A INPUT -p icmp -j ACCEPT
$IPT -t filter -A OUTPUT -p icmp -j ACCEPT
# RTM (Real Time Monitoring) pour OVH
$IPT -A INPUT -p udp --dport 6100:6200 -j ACCEPT
$IPT -A OUTPUT -p udp --dport 6100:6200 -j ACCEPT
# ---
# SSH In
$IPT -t filter -A INPUT -p tcp --dport 22 -j ACCEPT
# SSH Out
$IPT -t filter -A OUTPUT -p tcp --dport 22 -j ACCEPT
# DNS In/Out / Nécessaire pour Bind9 et pour Inadyn
$IPT -t filter -A OUTPUT -p tcp --dport 53 -j ACCEPT
$IPT -t filter -A OUTPUT -p udp --dport 53 -j ACCEPT
$IPT -t filter -A INPUT -p tcp --dport 53 -j ACCEPT
$IPT -t filter -A INPUT -p udp --dport 53 -j ACCEPT
# NTP Out
$IPT -t filter -A OUTPUT -p udp --dport 123 -j ACCEPT
# HTTP + HTTPS Out
#$IPT -t filter -A OUTPUT -p tcp --dport 80 -j ACCEPT
#$IPT -t filter -A OUTPUT -p tcp --dport 443 -j ACCEPT
# HTTP + HTTPS In
#$IPT -t filter -A INPUT -p tcp --dport 80 -j ACCEPT
#$IPT -t filter -A INPUT -p tcp --dport 443 -j ACCEPT
#$IPT -t filter -A INPUT -p tcp --dport 8443 -j ACCEPT
# Mail SMTP:25
#$IPT -t filter -A INPUT -p tcp --dport 25 -j ACCEPT
#$IPT -t filter -A OUTPUT -p tcp --dport 25 -j ACCEPT
# Mail POP3:110
#$IPT -t filter -A INPUT -p tcp --dport 110 -j ACCEPT
#$IPT -t filter -A OUTPUT -p tcp --dport 110 -j ACCEPT
# Mail IMAP:143
#$IPT -t filter -A INPUT -p tcp --dport 143 -j ACCEPT
#$IPT -t filter -A OUTPUT -p tcp --dport 143 -j ACCEPT
# Mail POP3S:995
#$IPT -t filter -A INPUT -p tcp --dport 995 -j ACCEPT
#$IPT -t filter -A OUTPUT -p tcp --dport 995 -j ACCEPT
# FTP Out
#$IPT -t filter -A OUTPUT -p tcp --dport 20:21 -j ACCEPT
# FTP In
#modprobe ip_conntrack_ftp # ligne facultative avec les serveurs OVH
#$IPT -t filter -A INPUT -p tcp --dport 20:21 -j ACCEPT
#$IPT -t filter -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# Webmin:10000
#$IPT -t filter -A INPUT -p tcp --dport 10000 -j ACCEPT
#$IPT -t filter -A OUTPUT -p tcp --dport 10000 -j ACCEPT
# Anti flood ou déni de service
$IPT -A FORWARD -p tcp --syn -m limit --limit 1/second -j ACCEPT
$IPT -A FORWARD -p udp -m limit --limit 1/second -j ACCEPT
# Limitation des scans de ports à 1 scan par seconde
$IPT -A FORWARD -p tcp --tcp-flags SYN,ACK,FIN,RST RST -m limit --limit 1/s -j ACCEPT
# Anti relais SMTP
$IPT -N LOG_REJECT_SMTP
$IPT -A LOG_REJECT_SMTP -j LOG --log-prefix ' SMTP REJECT PAQUET : '
$IPT -A LOG_REJECT_SMTP -j DROP
}
function stop {
$IPT -P INPUT ACCEPT
$IPT -P OUTPUT ACCEPT
$IPT -t filter -F
}
case "$1" in
start|restart)
echo -n "Démarrage du firewall..."
stop
start
echo "OK."
;;
stop)
echo -n "Arrêt du firewall..."
stop
echo "OK."
;;
*)
echo "Utilisation : $0 {start|stop|restart}";
exit 1
;;
esac
exit 0
Nous enregistrons le fichier et lui donnons les droits en exécution :
[root@serveur:~]# chmod +x /etc/init.d/firewall Comme vous pouvez le constater, j’ai commenté une bonne partie des commandes, ce qui fait qu’elles ne seront pas enregistrées dans Iptables. Nous les modifierons au fur et à mesure de l’installation des programmes qui auront besoin de ces accès.

Troisième terminal
Ici nous allons préparer une ligne de commande qui va arrêter automatiquement notre firewall après avoir pressé une touche quelconque ou au plus tard 20 secondes après son lancement, ainsi nous pouvons tester sans risque notre script. Voici la ligne à préparer :
[root@serveur:~]# while true; do test=""; read -t 20 -p "OK? " test ; [ -z "$test" ] && /etc/init.d/firewall stop ; done Si vous n’avez pas suffisamment de temps pour effectuer vos tests, vous pouvez modifier le chiffre après le -t.

Testons notre firewall
Allez dans le 3e terminal et lancer la ligne de commande. Passez rapidement dans le 2e terminal et lancez le firewall :
[root@serveur:~]# /etc/init.d/firewall start Dirigez-vous ensuite directement dans le 1er terminal et vérifiez si vos nouvelles règles ont été enregistrées :
[root@serveur:~]# iptables -L
Chain INPUT (policy DROP)
target     prot opt source               destination
ACCEPT     all  --  anywhere             anywhere            state RELATED,ESTABLISHED
ACCEPT     all  --  anywhere             anywhere
ACCEPT     icmp --  anywhere             anywhere
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:ssh
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:domain
ACCEPT     udp  --  anywhere             anywhere            udp dpt:domain
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:www
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:https
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:8443
 
Chain FORWARD (policy DROP)
target     prot opt source               destination
ACCEPT     tcp  --  anywhere             anywhere            tcp flags:FIN,SYN,RST,ACK/SYN limit: avg 1/sec burst 5
ACCEPT     udp  --  anywhere             anywhere            limit: avg 1/sec burst 5
ACCEPT     tcp  --  anywhere             anywhere            tcp flags:FIN,SYN,RST,ACK/RST limit: avg 1/sec burst 5
 
Chain OUTPUT (policy DROP)
target     prot opt source               destination
ACCEPT     all  --  anywhere             anywhere            state RELATED,ESTABLISHED
ACCEPT     all  --  anywhere             anywhere
ACCEPT     icmp --  anywhere             anywhere
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:ssh
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:domain
ACCEPT     udp  --  anywhere             anywhere            udp dpt:domain
ACCEPT     udp  --  anywhere             anywhere            udp dpt:ntp
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:www
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:https
 
Chain LOG_REJECT_SMTP (0 references)
target     prot opt source               destination
LOG        all  --  anywhere             anywhere            LOG level warning prefix ` SMTP REJECT PAQUET : '
DROP       all  --  anywhere             anywhere
Vous voyez que nos différentes instructions ont bien été enregistrée.

Mise en place du firewall
Maintenant que nous avons testé notre firewall, nous pouvons le lancer pour de bon :
[root@serveur:~]# /etc/init.d/firewall start Il faut aussi que nous enregistrions notre firewall pour qu’il se lance automatiquement au démarrage du serveur et qu’il s’arrête automatiquement à l’arrêt du serveur (ben oui, ici on fait bien les choses ;-) ) :
[root@serveur:~]# update-rc.d firewall start 40 S . stop 89 0 6 .
Adding system startup for /etc/init.d/firewall ...
/etc/rc0.d/K89firewall -> ../init.d/firewall
/etc/rc6.d/K89firewall -> ../init.d/firewall
/etc/rcS.d/S40firewall -> ../init.d/firewall

Et voilà, le tour est joué !

Prochaine étape : Un peu de sécurité supplémentaire avec Fail2ban
Etape précédente : Configuration de SSH

Dernières modifications :
16.08.2010 Ouverture des ports 6100 à 6200 en UDP pour autoriser le RTM (Real Time Monitoring) d’OVH

Poster un commentaire