Sécurisez l’accès à distance SSH de votre Raspberry Pi avec Fail2Ban

Si vous avez besoin d’accèder à distance à votre Raspberry Pi vous avez très certainement « ouvert » votre port SSH (22) et peut-être même effectué une redirection de port depuis votre box. Tout fonctionne parfaitement et c’est tant mieux !

Cependant vous l’ignorez peut-être mais de très nombreuses machines (souvent infectées) effectuent de manière régulière des scan de port (notamment SSH) afin de détecter des proies faciles… L’article que je vous présente aujourd’hui va vous permettre de mettre très facilement en oeuvre une solution de protection basique mais particulièrement efficace contre ce type d’attaque.

Les basiques

Votre système Raspbian est livré par défaut avec un seul et unique utilisateur: pi dont le mot de passe est raspberry. Inutile donc de vous dire que la toute première chose à faire est de changer le mot de passe de cet utilisateur. Pour ce faire il vous suffit de tapez la commande passwd et de suivre les instructions:

pi@raspberrypi ~ $ passwd
Changing password for pi.
(current) UNIX password:
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully
pi@raspberrypi ~ $

Je vous conseille d’utiliser un mot de passe contenant au moins 8 caractères mélangeant minuscules, majuscules, chiffres et caractères spéciaux en évitant bien évidemment tout mot directement issue du langage courant (quelque soit la langue).
Vous pouvez par exemple utiliser le générateur de mot de passe de « Gibson Research Corporation » disponible ici: https://www.grc.com/passwords.htm

Présentation de fail2ban

Maintenant que votre mot de passe (ainsi que ceux de l’ensemble des utilisateurs du système que vous auriez pu créer) est un minimum sécurisé nous allons pouvoir passer à l’installation de notre outil.

Comme son nom l’indique fail2ban est un outil permettant de surveiller les tentatives d’accès (SSH mais aussi de nombreux autres services) et de bannir un utilisateur (en l’occurence une adresse IP) si le nombre d’essai infructueux est jugé trop important sur un laps de temps donné.
Ainsi par exemple si un utilisateur tente de se connecter à votre Rapsberry Pi en saissisant 5 mots de passes incorrects sur une période de quelques minutes, celui-ci se verra banni durant 10 minutes. Bien que cette approche n’empêche pas totalement les attaques de type « dictionnaire » (consistant à balayer l’ensemble des mots de passes possibles pour un utilisateur donné) elle permet toutefois de les rendre quasi-inefficaces avec un nombre de tentative possible par heure qui devient ridiculement faible.

Installation de fail2ban

L’installation est on ne peut plus simple, on commence par se connecter en tant que root:

pi@raspberrypi ~ $ su -
Password:

Puis on éxécute l’installation avec un classique apt-get:

root@raspberrypi:~# apt-get update && apt-get install fail2ban
[...]

Répondez éventuellement « y » à la question posée si besoin.
Voilà, l’installation est terminée et par défaut opérationnelle sur SSH, bonne nouvelle !

Nous allons néanmoins inspecter les quelques fichiers de configuration afin de mieux comprendre le fonctionnement.

Configuration de fail2ban

Commençons par nous rendre dans le dossier de configuration de fail2ban et regardons ce que l’on y trouve:

root@raspberrypi:~# cd /etc/fail2ban/
root@raspberrypi:/etc/fail2ban# ls
action.d  fail2ban.conf  filter.d  jail.conf
root@raspberrypi:/etc/fail2ban#

On distingue 2 fichiers et 2 dossiers:

  • fail2ban.conf  qui est le fichier de configuration principal mais qui ne contient presque rien mis à part la destination du fichier de log (par défaut /var/log/fail2ban.log)
  • jail.conf contient la liste des « jails » (prison en français) et les paramètres associés à chacune (actif ou non, nombre d’échecs, action associée…). Il s’agit du principal fichier de configuration.
  • Le dossier  filter.d qui l’ensemble des filtres permettant de détecter les tentatives d’accès infructueuses. Dans notre cas c’est le fichier sshd.conf qui s’applique et on retrouve à l’interieur de celui-ci les expressions régulières (regex) permettant l’analyse des fichiers de logs. Ne vous inquiétez pas vous n’avez normalement rien à y faire 🙂
  • Et enfin le dernier dossier action.d contient la liste des actions pouvant être executées à l’issue d’une détection. Dans notre cas c’est le fichier iptables-multiport.conf qui s’applique par défaut mais là encore vous ne devriez pas avoir besoin d’y toucher.

 

Jetons désormais un coup d’oeil un peu plus précis au fichier jail.conf:

root@raspberrypi:/etc/fail2ban# nano jail.conf

Parcourez le fichier en descendant quelques lignes et vous devriez tomber sur les lignes suivantes:

[ssh]
enabled  = true
port     = ssh
filter   = sshd
logpath  = /var/log/auth.log
maxretry = 5

On y retrouve les principales informations suivantes:

  •  enabled  indique que cette « prison » est active
  • port indique le port concerné
  • filter fait référence au fichier sshd.conf dans le dossier filter.d/
  • logpath indique le fichier où sont stockés les logs ssh par défaut (fichier que le filtre va analyser »
  • maxretry enfin indique le nombre de tentatives avant « mise en prison »

Comme vous pouvez le voir il manque quelques informations telle que la durée de cette « mise en prison » et l’action associée. Ces informations sont en fait reprises des valeurs par défaut situées au début du fichier. Je vous conseille donc de modifier votre prison de cette manière:

[ssh]
enabled  = true
port     = ssh
filter   = sshd
logpath  = /var/log/auth.log
maxretry = 5
bantime  = 600
banaction = iptables-multiport

Vous avez désormais la main sur les principaux paramètres de votre prison:

  • bantime correpondant à la durée de la « mise en prison », ici 600 secondes soit 10 minutes.
  • banaction étant l’action à effectuer. Ici il s’agit du script iptables-multiport.conf du dossier action.d/ permettant de filtrer une adresse IP précise sur un port donné (le port étant indiqué par la directive port située quelques lignes plus haut).

Renforcement de la sécurité

Nous allons modifier légèrement ces valeurs pour renforcer davantage la sécurité. Pour cela nous allons:

  • Faire passer le nombre d’essai maximum à 3 (au lieu de 5 par défaut)
  • Bloquer complétèment l’attaquant au lieu de ne bloquer que le port SSH, vous deviendrez ainsi totalement invisible à ses yeux durant le bantime c’est à dire 10 minutes.

Voici les modifications  à apporter au fichier jail.conf:

[ssh]
enabled  = true
port     = ssh
filter   = sshd
logpath  = /var/log/auth.log
maxretry = 3
bantime  = 600
banaction = iptables-allports

Et voilà c’est aussi simple que cela. Nous avons pour cela changé deux valeurs: le maxretry et le banaction. La règle iptables-allports est une règle standard permettant de bannir un attaquant sur l’ensemble des ports et non uniquement sur le port SSH.

Redémarage et test

Une fois votre fichier sauvegardé il est nécessaire de redémarrer le service afin de prendre en compte vos modifications. Cela se fait de manière de la manière suivante:

root@raspberrypi:/etc/fail2ban# service fail2ban restart
[ ok ] Restarting authentication failure monitor: fail2ban.
root@raspberrypi:/etc/fail2ban#

Vous pouvez désormais monitorer le fonctionnement de la manière suivante:

root@raspberrypi:/etc/fail2ban/action.d# tail -f /var/log/fail2ban.log
[...]

Essayez de vous connecter depuis une autre machine (histoire de ne pas bannir votre propre IP…) et observez le résultat au bout de 3 essais infructueux:

2015-01-16 15:48:46,135 fail2ban.actions: WARNING [ssh] Ban 5.39.xx.xx

puis une dizaine de minutes plus tard:

2015-01-16 15:58:46,205 fail2ban.actions: WARNING [ssh] Unban 5.39.xx.xx

N’hésitez pas à vous plonger dans la documentation si vous souhaitez aller plus loin, cette outil est à la fois simple, efficace et trés bien conçu.

Et voilà, j’espère que tout est clair, sinon n’hésitez pas à poser vos questions !

2 Responses to “Sécurisez l’accès à distance SSH de votre Raspberry Pi avec Fail2Ban”
  1. Beatrice says:
  2. panko says:

Laisser un commentaire

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