Un serveur en production est soumis à de nombreuses requêtes venant de partout. Leurs buts ? Trouver une faille pour transformer votre serveur en zombie. Les serveur hébergés dans des datacenter sont des cibles de choix, bande passante importante et disponibilité constante.
Il vaut donc mieux changer votre port d’écoute SSH car c’est le service le plus critique. Mais aussi configurer votre firewall. Le mieux étant de rester très restrictif.
Je vais vous proposer ici une configuration qui va par défaut drop (ne pas répondre) les paquets. Puis nous allons lister tout les ports que nous voulons garder ouvert.
Sommaire
Listes les services présent sur votre serveur
Nous allons bloquer tout le trafic entrant, il faut donc savoir quels sont les ports en écoute sur le serveur, pour autoriser le trafic en destination de ces ports.
netstat -tulpn | grep LISTEN
Je vous conseille de vérifier tout les services, il est possibles que votre serveur héberge des services que vous ne voulez pas rendre disponible sur internet.
Configuration
Pour pouvoir vous souvenir de pourquoi vous avez mit telle au telle ligne, je vous conseille de faire un fichier bash qui va contenir toutes les insertions de règles.
Si vous perdez votre connexion SSH vous pourrez toujours redémarrer votre machine (en hard si vous avez accès sinon via le panel de votre hébergeur), toutes les règles ne seront pas reéxécutés.
C’est une configuration en IPv4, la même chose est a faire en IPv6 avec la commande ipv6tables !
#!/bin/sh
IPT="/sbin/iptables"
# Supression des anciennes regles pour que celles presentes soient appliques
$IPT --flush
$IPT --delete-chain
$IPT -t nat --flush
$IPT -t nat --delete-chain
# Regles par defaut
$IPT -P INPUT DROP
$IPT -P FORWARD DROP
$IPT -P OUTPUT ACCEPT # On choisit la solution de facilité et on permet au serveur d'accéder a tout le monde extérieur. Une meilleure pratique est de bloquer la sortie de certains paquets qui pourraient être émis en cas de compromisation de votre serveur. Ce qui permanenterait de réduire les attaques possible à partir de votre serveur.
# Aucune restriction sur l'interface de loopback
$IPT -A INPUT -i lo -j ACCEPT
$IPT -A OUTPUT -o lo -j ACCEPT
# All TCP session
# Oblige que les paquets TCP commencent pas une connexion (comportement normal de TCP)
$IPT -A INPUT -p tcp ! --syn -m state --state NEW -j DROP
# On accepte tout les paquets qui proviennent d'une session TCP déjà établie.
# Si le serveur ouvre une connexion TCP vers un destination extérieur, via
# cette commande, la réponse ne sera pas DROP.
$IPT -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPT -A INPUT -p tcp --dport 20 -j ACCEPT # ftp-data
$IPT -A INPUT -p tcp --dport 21 -j ACCEPT # ftp
$IPT -A INPUT -p tcp --dport 22 -j ACCEPT # SSH
$IPT -A INPUT -p tcp --dport 80 -j ACCEPT # http
$IPT -A INPUT -p tcp --dport 443 -j ACCEPT # https
# Accepte les paquets ICMP (pour la configuration des protocoles de routage internet comme BGP
# ICMP ping est utilisé, nous autorisons donc les pings)
$IPT -A INPUT -p ICMP --icmp-type 8 -j ACCEPT
Valider votre configuration
Faites bien tout les tests de tout vos service pour être bien sur que tout est bon. Une fois le cas il vous reste plus qu’a rendre cette configuration permanente (après un reboot iptables reprendra la configuration que vous avez mise).
Sauvegarder votre configuration
Pour sauvegarder votre configuration (vérifiez bien avant que tout est bon !).
Vous aurez besoin de la commande iptables-save.
Vous devez l’installer via.
apt-get install iptables-converter
ou
apt-get install iptables-persistent
mkdir /etc/iptables
iptables-save > /etc/iptables/rules
Cela permet de sauvegarder les règles iptables dans le fichier /etc/iptables/rules
Nous allons maintenant faire un script pour charger ce fichier. Pour cela on va utiliser un hook présent dans ifconfig. Avant que les interfaces réseaux soit disponibles (montées), nous allons charger les règles iptables.
Créez un fichier /etc/network/if-pre-up.d/iptables et mettez cette commande dedans :
#!/bin/sh
/sbin/iptables-restore < /etc/iptables/rules
N’oubliez pas de donner les droit d’execution a ce nouveau fichier et tout est bon !
chmod +x /etc/iptables/rules