Configuration de fail2ban et IPTables – Debian, Raspberry

mettre en place fail2ban et iptables sur linux disto basées debian

Aujourd’hui nous allons voir comment protéger votre serveur des tentatives de connexions malveillantes. Nous allons utiliser fail2ban et IPTables.

IPTables est un pare feu (firewall), c’est lui qui va déterminer qui a le droit de communiquer avec notre hôte. Le but étant de n’ouvrir que les ports nécessaires et de laisser les autres fermés afin de laisser le moins d’opportunités possible aux pirates éventuels (sur le réseau).

Fail2ban va quand à lui scanner les logs et bannir les IP indésirables en fonction des paramètres de la prison que nous allons mettre en place. Pour ce faire, des règles IPTables vont être générées.

Installation et configuration de fail2ban

On installe le paquet

apt install fail2ban

Puis on fait une sauvegarde du fichier de conf pour avoir une copie clean.

cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.conf.save

Pour éditer le fichier de configuration

sudo nano /etc/fail2ban/jail.conf

Configuration de fail2ban

Nous allons maintenant configurer fail2ban. Première étape, ajouter des IP à ignorer pour éviter de se bannir soit même. Il faut donc chercher la ligne ignoreip et la décommenter.

ignoreip = 127.0.0.1/8

Il suffit d’ajouter les adresses que vous souhaitez ignorer, par exemple

ignoreip = 127.0.0.1/8 1.1.1.1 192.168.80.0/16

Une fois que c’est fait, on va passer aux paramètres qui s’appliqueront par défaut à toutes les prisons.

Bantime correspond au temps que l’IP sera bannie. La valeur par défaut est de10 minutes. Vous pouvez mettre la valeur que vous voulez. 10s pour 10 secondes, 10m pour 10 minutes. Si vous souhaitez mettre en place des ban définitifs, il vous suffit d’indiquer une valeur négative. Pour moi elle est définie sur -1.

bantime = 10m

Findtime correspond à l’intervalle de temps entre le nombre d’occurrences. En d’autres termes, si vous avez un maxretry de 6 et un findtime de 5 minutes, si une personne essaye de se connecter 5 fois à raison de 1 fois par minute, elle ne sera jamais bannie. Car elle aura fait 5 tentatives en 5 minutes et il en faut 6 pour un ban. Dans mon cas le findtime est de 24h

findtime = 86400

Maxretry correspond aux nombres d’essais autorisés avant de se faire ban. La valeur par défaut est de 5, je l’ai descendu à 3

maxretry = 3

Configuration de notre première prison

À la ligne 279 nous pouvons trouver la prison [sshd]. On peut voir que le port à surveiller est indiqué. Vous pouvez indiquer le protocole ou un port. Si vous avez changé le port SSH, ajoutez le numéro de port ici, ce qui donnerait par exemple

port = ssh, sftp, 1234

Même si vous n’utilisez pas le port 22, surveillez le quand même, au moins ceux qui essayent de se connecter au port 22 seront bannis. Un exemple avec mon VPS

tous les ip bannis pour avoir essayées de se connecter au port 22

Par défaut les prisons sont désactivées. Pour activer les activer il suffit d’ajouter

enabled = true

C’est tout bon pour la prison sshd, on relance

systemctl restart fail2ban

Pour voir toutes vos prisons

fail2ban-client status

Pour une prison précise

fail2ban-client status nom_de_la_prison

Si vous souhaitez ajouter des prisons présentes par défaut, vous connaissez maintenant la démarche. Si vous voulez ajouter des prisons personnalisées, je vous invite à faire quelques recherches. Il y a de nombreux scripts disponibles sur internet.

Installation et configuration d’IPTtables

Normalement IPTables est déjà installé sur votre machine. Nous allons installer un plugin d’IPTables qui va permettre à notre future configuration d’être persistantes et de ne pas s’effacer après un redémarrage. On va en profiter pour lancer l’installation d’IPTables, même si pour la plupart d’entre vous ce ne sera pas nécessaire

On met à jour la liste des packages et on installe

apt update
apt install iptables iptables-persistent

Une fenêtre va apparaître pour nous demander si vous souhaitons sauvegarder la les règles IPv4 actuelles, on va dire oui. La même question sera posée pour l’IPv6, même réponse, oui.

sauvegarde règles iptables tables ipv4

Comment indiqué sur la boite de dialogue, les fichiers de configuration se trouve dans /etc/iptables/. Le fichier rules.v4 contient les règles pour l’IPv4 et le fichier rules.v6 les règles pour l’IPv6.

Configuration d’IPTables

Voici quelques règles de bases

INPUT DROP [0:0] tous les inputs sont rejetés
FORWARD DROP [0:0] tous les paquets forward sont rejetés
OUTPUT ACCEPT [0:0] tous les paquets en sortie sont autorisés. Dans l’exemple qui suit, DNS (bind) a des règles en output car dans ma configuration les outputs ne sont pas autorisés par défaut.

*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]

# Allow internal traffic on the loopback device
-A INPUT -i lo -j ACCEPT

# Continue connections that are already established or related to an established connection
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT

# Drop non-conforming packets, such as malformed headers, etc.
-A INPUT -m conntrack --ctstate INVALID -j DROP

# SSH
-A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT

# DHCP used by OVH
-A INPUT -p udp --dport 67:68 --sport 67:68 -j ACCEPT

# DNS (bind)
#-A OUTPUT -p tcp --dport 53 -j ACCEPT
#-A OUTPUT -p udp --dport 53 -j ACCEPT

# HTTP + HTTPS
-A INPUT -p tcp -m multiport --dports 80,443 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT


# Email (postfix + devecot)
# 25 = smtp, 587 = submission and 993 = IMAPS
#-A INPUT -p tcp -m multiport --dports 25,587,993 -j ACCEPT

# NTP
-A INPUT -p udp --dport 123 -j ACCEPT

# Chain for preventing ping flooding - up to 6 pings per second from a single
# source, again with log limiting. Also prevents us from ICMP REPLY flooding
# some victim when replying to ICMP ECHO from a spoofed source.
-N ICMPFLOOD
-A ICMPFLOOD -m recent --name ICMP --set --rsource
-A ICMPFLOOD -m recent --name ICMP --update --seconds 1 --hitcount 6 --rsource --rttl -m limit --limit 1/sec --limit-burst 1 -j LOG --log-prefix "iptables[ICMP-flood]: "
-A ICMPFLOOD -m recent --name ICMP --update --seconds 1 --hitcount 6 --rsource --rttl -j DROP
-A ICMPFLOOD -j ACCEPT

# Permit useful IMCP packet types.
# Note: RFC 792 states that all hosts MUST respond to ICMP ECHO requests.
# Blocking these can make diagnosing of even simple faults much more tricky.
# Real security lies in locking down and hardening all services, not by hiding.
-A INPUT -p icmp --icmp-type 0  -m conntrack --ctstate NEW -j ACCEPT
-A INPUT -p icmp --icmp-type 3  -m conntrack --ctstate NEW -j ACCEPT
-A INPUT -p icmp --icmp-type 8  -m conntrack --ctstate NEW -j ICMPFLOOD
-A INPUT -p icmp --icmp-type 11 -m conntrack --ctstate NEW -j ACCEPT

# Drop all incoming malformed NULL packets
-A INPUT -p tcp --tcp-flags ALL NONE -j DROP

# Drop syn-flood attack packets
-A INPUT -p tcp ! --syn -m conntrack --ctstate NEW -j DROP

# Drop incoming malformed XMAS packets
-A INPUT -p tcp --tcp-flags ALL ALL -j DROP
COMMIT

Attention, si vous appliquez ces règles sur une machine distante, vérifiez bien que le port SSH est le bon. Si vous souhaitez restreindre l’accès SSH à une IP précise ou à une plage d’IP prenez garde à ne pas commettre d’erreur sous peine de bloquer votre accès à la machine.

Pour appliquer les règles

iptables-apply /etc/iptables/rules.v4

Si vous souhaitez installer Grafana par exemple vous devez ajouter la règle suivante

#Allow Grafana
-A INPUT -p tcp --dport 3000 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT

Si vous avez des restrictions sur output vous devrez aussi ajouter l’autorisation.

Retrouvez plus de règles sur Digital Ocean. Le manuel d’IPTables est disponible ici

C’est fini pour ce tutoriel. N’hésitez pas à poser vos questions, vos remarques ou autre en commentaire !

4.7/5 - (40 votes)

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Articles de la même catégorie

Retour en haut