Serveur dédié – Mise en place du firewall
4 août 2010 | Posté dans Serveur dédié | Vu 534 foisMaintenant 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 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.
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
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 Nous enregistrons le fichier et lui donnons les droits en exécution :
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
[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 Vous voyez que nos différentes instructions ont bien été enregistrée.
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
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