2021-01-18 09:58 Temps de lecture : 14 min

Comment sécuriser votre serveur Linux avec fail2ban

Avec fail2ban, votre système Linux se protège en bloquant automatiquement les adresses IP suspectes qui tentent trop souvent de se connecter sans succès. C'est une mesure de sécurité qui s'auto-régule. Voici comment l'installer et la configurer.

Une sécurité renforcée

Comme l'a dit Wallis Simpson, duchesse de Windsor : "On n'est jamais trop riche ni trop mince." Dans notre monde moderne et hyperconnecté, nous pourrions ajouter : "On n'est jamais trop prudent ni trop en sécurité".

Si votre machine accepte des connexions entrantes, par exemple via SSH (Secure Shell), ou qu'elle fait office de serveur web ou de messagerie, elle doit être protégée contre les attaques par force brute, qui consistent à deviner les mots de passe.

Pour cela, il est nécessaire de surveiller les tentatives de connexion infructueuses. Si une adresse IP échoue plusieurs fois à s'authentifier dans un court laps de temps, elle devrait être bloquée pour prévenir d'autres tentatives.

La méthode la plus efficace est d'automatiser ce processus. Grâce à une configuration facile, fail2ban gérera la surveillance, le blocage et le déblocage à votre place.

fail2ban s'intègre avec le pare-feu Linux iptables. Il bloque les adresses IP suspectes en ajoutant des règles au pare-feu. Pour simplifier, nous utiliserons iptables avec une configuration de règles vide.

Bien entendu, si la sécurité vous préoccupe, vous avez probablement déjà un pare-feu configuré. Fail2ban ne fait qu'ajouter et supprimer ses propres règles, sans perturber le fonctionnement de votre configuration de pare-feu.

Nous pouvons voir notre configuration de règles vide en utilisant la commande suivante :

sudo iptables -L

Installation de Fail2ban

L'installation de fail2ban est simple sur les distributions que nous avons testées. Sur Ubuntu 20.04, la commande est :

sudo apt-get install fail2ban

Sur Fedora 32, utilisez :

sudo dnf install fail2ban

Sur Manjaro 20.0.1, utilisez pacman :

sudo pacman -Sy fail2ban

Configuration de Fail2ban

L'installation de fail2ban inclut un fichier de configuration par défaut, nommé jail.conf. Ce fichier est écrasé lors des mises à jour, donc nous risquons de perdre nos modifications si nous le personnalisons.

Au lieu de cela, nous allons copier jail.conf dans un fichier appelé jail.local. En plaçant nos modifications de configuration dans jail.local, elles persisteront lors des mises à jour. Fail2ban lira automatiquement les deux fichiers.

Voici comment copier le fichier :

sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local

Ouvrez ensuite le fichier dans votre éditeur de texte. Nous utiliserons gedit :

sudo gedit /etc/fail2ban/jail.local

Nous allons rechercher deux sections dans le fichier : [DEFAULT] et [sshd]. Assurez-vous de bien repérer les sections réelles. Ces étiquettes apparaissent aussi dans la description en haut du fichier, mais ce n'est pas ce que nous recherchons.

Vous trouverez la section [DEFAULT] vers la ligne 40. Il s'agit d'une section assez longue avec de nombreux commentaires et explications.

Descendez jusqu'à la ligne 90, vous trouverez les quatre paramètres importants :

  • ignoreip: Liste d'adresses IP qui ne seront jamais bloquées. Elles disposent d'un laisser-passer permanent. L'adresse IP localhost (127.0.0.1) est incluse par défaut, ainsi que son équivalent IPv6 (::1). Si d'autres adresses IP doivent être ignorées, ajoutez-les à cette liste, en les séparant par un espace.
  • bantime: Durée du blocage d'une adresse IP. Le "m" représente les minutes. Si vous entrez une valeur sans "m" ou "h" (pour les heures), elle sera interprétée comme des secondes. Une valeur de -1 bloquera définitivement une adresse IP. Soyez très prudent afin de ne pas vous bloquer vous-même de façon permanente.
  • findtime: Période pendant laquelle un trop grand nombre de tentatives de connexion infructueuses entraîne le blocage d'une adresse IP.
  • maxretry: Nombre de tentatives infructueuses considérées comme un "trop grand nombre".

Si une adresse IP échoue aux connexions maxretry durant la période findtime, elle sera bloquée pendant la durée définie par bantime. Les exceptions sont les adresses IP listées dans ignoreip.

fail2ban "met en prison" les adresses IP pour une durée spécifiée. Il prend en charge différents "jails", chacun représentant des paramètres pour un type de connexion spécifique. Cela vous permet d'appliquer des paramètres distincts pour différents types de connexion. Vous pouvez aussi limiter fail2ban à surveiller uniquement certains types de connexion.

Comme le suggère le nom de la section [DEFAULT], les paramètres que nous avons examinés sont les valeurs par défaut. Examinons maintenant les paramètres pour le "jail" SSH.

Configurer un Jail

Les jails vous permettent d'activer ou de désactiver la surveillance de fail2ban pour différents types de connexion. Si les paramètres par défaut ne vous conviennent pas pour un jail, vous pouvez définir des valeurs spécifiques pour bantime, findtime et maxretry.

Descendez jusqu'à environ la ligne 280, vous trouverez la section [sshd].

C'est ici que vous pouvez définir les valeurs pour le jail de connexion SSH. Pour activer ce jail dans la surveillance et le blocage, ajoutez la ligne suivante :

enabled = true

Nous ajoutons également cette ligne :

maxretry = 3

La valeur par défaut était de cinq, mais nous voulons être plus prudents avec les connexions SSH. Nous l'avons donc réduite à trois. Enregistrez et fermez le fichier.

Nous avons ajouté ce jail à la surveillance de fail2ban et modifié un des paramètres par défaut. Un jail peut utiliser une combinaison de paramètres par défaut et de paramètres spécifiques.

Activation de Fail2ban

Jusqu'ici, nous avons installé et configuré fail2ban. Maintenant, nous devons l'activer en tant que service qui démarre automatiquement. Nous devons aussi vérifier qu'il fonctionne comme prévu.

Pour activer fail2ban en tant que service, utilisons la commande systemctl :

sudo systemctl enable fail2ban

Nous l'utilisons également pour démarrer le service :

sudo systemctl start fail2ban

Nous pouvons également vérifier l'état du service en utilisant systemctl :

sudo systemctl status fail2ban.service

Tout semble fonctionner correctement.

Vérifions si fail2ban fonctionne correctement :

sudo fail2ban-client status

Cela reflète notre configuration. Nous avons activé un seul jail, nommé [sshd]. En ajoutant le nom du jail à la commande précédente, nous pouvons obtenir plus de détails :

sudo fail2ban-client status sshd

Cela liste le nombre d'échecs et les adresses IP bloquées. Pour l'instant, toutes les statistiques sont à zéro.

Tester notre Jail

Depuis un autre ordinateur, nous allons tenter une connexion SSH à notre machine de test et saisir un mot de passe incorrect de façon délibérée. Vous avez droit à trois tentatives de mot de passe par tentative de connexion.

La valeur maxretry est déclenchée après trois tentatives de connexion infructueuses, et non après trois tentatives de mot de passe incorrect. Nous devons donc saisir un mot de passe incorrect trois fois pour faire échouer la tentative de connexion.

Nous allons ensuite tenter une autre connexion et taper le mot de passe incorrect encore trois fois. La première tentative de mot de passe incorrect lors de la troisième demande de connexion devrait déclencher fail2ban.

Après le premier mot de passe incorrect lors de la troisième tentative de connexion, nous n'obtenons plus de réponse de la machine distante. Aucune explication, nous sommes ignorés.

Vous devez appuyer sur Ctrl+C pour revenir à l'invite de commande. Si nous réessayons, nous obtenons une autre réponse :

ssh [email protected]

Auparavant, le message d'erreur était "Permission denied". Cette fois, la connexion est carrément refusée. Nous sommes persona non grata. Nous avons été bloqués.

Examinons les détails du jail [sshd] :

sudo fail2ban-client status sshd

Il y a eu trois échecs et une adresse IP (192.168.4.25) a été bloquée.

Comme mentionné précédemment, fail2ban bloque les adresses IP en ajoutant des règles au pare-feu. Jetons un autre coup d'œil à l'ensemble de règles (il était vide au début) :

sudo iptables -L

Une règle a été ajoutée à la politique INPUT, envoyant le trafic SSH à la chaîne f2b-sshd. La règle de la chaîne f2b-sshd rejette les connexions SSH en provenance de 192.168.4.25. Nous n'avons pas modifié la valeur par défaut de bantime. Donc, dans 10 minutes, cette adresse IP sera débloquée et pourra effectuer de nouvelles demandes de connexion.

Si vous avez configuré une durée de blocage plus longue (par exemple, plusieurs heures), mais que vous souhaitez autoriser une adresse IP à se connecter plus tôt, vous pouvez la débloquer.

Pour cela, tapez :

sudo fail2ban-client set sshd unbanip 192.168.5.25

Sur notre ordinateur distant, si nous effectuons une autre demande de connexion SSH et que nous saisissons le mot de passe correct, nous serons autorisés à nous connecter :

ssh [email protected]

Simple et Efficace

Le plus simple est souvent le mieux. fail2ban est une solution élégante à un problème délicat. Il nécessite peu de configuration et n'impose quasiment aucune surcharge opérationnelle, ni pour vous, ni pour votre machine.

Auteur
France

Rédacteur tech, guides pratiques et astuces numériques.