Temps de lecture estimé: 3 minutes
J’ai fait un article pour sécuriser un minimum ssh après une nouvelle installation d’Ubuntu 22.04. Pour aller plus loin, je vais rajouter Fail2ban pour bloquer les utilisateurs qui tenteront de se connecter sans succès un trop grand nombre de fois.
Fail2ban surveille différents fichiers de logs de différentes applications (dans mon cas je vais l’utiliser pour ssh mais sur mon autre serveur j’ai quelques filtres pour Apache ) et suivant certains schémas, ou certains comportements plus ou moins répétés dans les logs, fail2ban va blocker les IPs fautives
Installation de Fail2ban
Donc pour commencer, l’installation
sudo apt install fail2ban
Activation de fail2ban au démarrage
On n’oublie pas de l’activer pour qu’il se lance au démarrage
systemctl enable fail2ban
Configuration de fail2ban
On créer son fichier de config, soit à partir du fichier général, soit dans /etc/fail2ban/jail.d/ (d’ailleurs dans /etc/fail2ban/jail.d/ il y a déjà defaults-debian.conf qui active par défaut la protection sshd
Dans mon cas
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
Ensuite on passe à l’édition du fichier
Sudo nano /etc/fail2ban/jail.local
Dans la section
[DEFAULT]
j’adapte les valeurs de
- bantime : le délai où une adresse IP est bannie
- findtime : le délai pour remonter dans les journaux
- maxretry : le nombre de tentatives au delà duquel le nom d’hôte est banni
# "bantime" is the number of seconds that a host is banned.
bantime = 10m
# A host is banned if it has generated "maxretry" during the last "findtime"
# seconds.
findtime = 10m
# "maxretry" is the number of failures before a host get banned.
maxretry = 5
Je décommente Ignoreip et j’ajoute mon IP local
ignoreip = 127.0.0.1/8 ::1 192.168.1.88
Et puis ensuite, j’active les prisons/jail qui m’intéressent en ajoutant
enabled = true
Dans les sections correspondantes, notamment pour sshd
[sshd]
enabled = true
mode = aggressive
port = ssh,1234
logpath = %(sshd_log)s
backend = %(sshd_backend)s
Un petit reload qui va bien du service fail2ban
sudo systemctl reload fail2ban
Vérifier le status de fail2ban
Et puis pour vérifier que la règle est bien active
sudo fail2ban-client status
Ce qui me donne bien dans mon cas
Status
|- Number of jail: 1
`- Jail list: sshd
et pour avoir plus de détail sur une des prisons
fail2ban-client status sshd
Ce qui me donne
Status for the jail: sshd
|- Filter
| |- Currently failed: 0
| |- Total failed: 0
|
- File list: /var/log/auth.log
- Actions
|- Currently banned: 0
|- Total banned: 0
`- Banned IP list:
Vérifier le fonctionnement d’un filtre
Dans une utilisation plus avancée, on peut créer ses propres filtres. c’est ce que j’ai fait pour éviter les sniffer/ceux qui teste aléatoirement des adresses comme admin.php ou xmlrpc.php
pour tester un filtre et une regex sur un fichier de log, on peut utiliser fail2ban-regex. par exemple moi je voulais tester mon filtre sniff-apache.conf
#sniff-apache.conf
[Definition]
failregex = ^<HOST> .* "POST .*xmlrpc.php.*
^<HOST> .* "GET .*/wordpress/wp-login.php.*
^<HOST> .* "GET .*/blog/wp-login.php.*
^<HOST> .* "GET .*/wp/wp-login.php.*
^<HOST> .* "GET .*/sql/myadmin/index.php.*
^<HOST> .* "GET .*/mysql/pMA/index.php.*
^<HOST> .* "GET .*/db/dbweb/index.php.*
^<HOST> .* "GET .*/admin/index.php.*
^<HOST> .* "GET .*/sql/myadmin/index.php.*
^<HOST> .* "GET .*/sql/phpMyAdmin2/index.php.*
^<HOST> .* "GET .*/mysqlmanager/index.php.*
ignoreregex =
donc je test mon filtre sur mon fichier de log apache
sudo fail2ban-regex /var/log/apache2/access.log /etc/fail2ban/filter.d/sniff-apache.conf
ça me permet de voir qu’en appliquant ce filtre, 20 lignes sont concernées
Running tests
=============
Use failregex filter file : sniff-apache, basedir: /etc/fail2ban
Use log file : /var/log/apache2/access.log
Use encoding : UTF-8
Results
=======
Failregex: 20 total
|- #) [# of hits] regular expression
| 5) [2] ^<HOST> .* "GET .*/sql/myadmin/index.php.*
| 6) [2] ^<HOST> .* "GET .*/mysql/pMA/index.php.*
| 7) [2] ^<HOST> .* "GET .*/db/dbweb/index.php.*
| 8) [6] ^<HOST> .* "GET .*/admin/index.php.*
| 9) [2] ^<HOST> .* "GET .*/sql/myadmin/index.php.*
| 10) [2] ^<HOST> .* "GET .*/sql/phpMyAdmin2/index.php.*
| 11) [4] ^<HOST> .* "GET .*/mysqlmanager/index.php.*
`-
Ignoreregex: 0 total
Date template hits:
|- [# of hits] date format
| [614] Day(?P<_sep>[-/])MON(?P=_sep)ExYear[ :]?24hour:Minute:Second(?:\.Microseconds)?(?: Zone offset)?
`-
Lines: 614 lines, 0 ignored, 18 matched, 596 missed
[processed in 0.12 sec]
Missed line(s): too many to print. Use --print-all-missed to print all 596 lines
retirer une adresse IP bannie
si pour X raisons tu as une adresse IP qui a été bannie et que tu souhaites la dé bannir
fail2ban-client set NOM_DE_LA_JAIL unbanip ADRESSE_IP
Voilà! l’installation et la configuration sommaire de fail2ban sont finies. Si tu souhaites sécuriser un peu plus ssh, tu peux aller voir l’article que j’ai fait ici pour sécuriser ssh sur un serveur Ubuntu 22.04.
N’hésite pas à me faire un retour! En attendant, je te dis à bientôt pour de nouvelles aventures.