Fail2Ban est un outil qui permet d'empêcher les tentatives d'accès non autorisés (serveurs accessibles depuis internet de préférence).
Pour cela Fail2ban va scruter les logs. Toute tentative d'accès échouée durant une période de temps définie se verront bannie pour une durée définie.
Nous allons mettre en place fail2ban sous Ubuntu 20.04 / debian (mêmes commandes). puis effectuer une configuration simple, cela suffira pour la plupart des besoins
Nous n'aborderons pas les regex ici
Au préalable, il serait intéressant d'avoir mis en place la gestion d'envoi de mail depuis votre serveur afin de recevoir les blocages effectués par fail2ban
Crée un compte dédié à l'envoi de mail. N'utilisait pas un compte personnel
Tapez sur votre moteur de recherche l'une des lignes suivantes :
envoi mail gmail linux exim4
envoi mail gmail linux
Je recommande exim4, car c'est celui utilisé par défaut dans fail2ban, vous pouvez choisir autre chose que gmail si vous le souhaitez
Si vous ne choisissez pas EXIM4, faites attention. SSMTP n'est plus maintenu à jour. Si vous avez activé la double authentification sur le mail utilisé pour la remontée d'info, faites des recherches. Certains sites expliquent la démarche à suivre dans ce cas.
Commençons par l'installer
apt install fail2ban
Maintenant qu'il est installé, allons dans le fichier de configuration principal :
nano /etc/fail2ban/jail.conf
Ignioreip vous permet de ne pas appliquer les règles de bannissement aux IP indiquées sur cette ligne
127.0.0.1/8, indique que toute la plage 127.X.X.X est ignorée, ::1 c'est l'adresse locale en IPV6 (ce sont les adresses locales du serveur)
La séparation entre chaque IP se fait via un espace
Pour les IP statiques
Pensez à ajouter les IP avec lesquelles vous allez vous connecter au serveur
Pour les IP dynamiques
Vous pouvez mettre un nom de domaine
Exemple : je pourrais mettre monpc.assistancenum.fr et actualiser l'ip de mon PC sur ce sous-domaine à chaque fois que l'IP change.
ignoreip = 127.0.0.1/8 ::1
Ce qui deviendrait pour de l'IP statique
ignoreip = 127.0.0.1/8 ::1 1.1.1.1
et pour une IP dynamique
ignoreip = 127.0.0.1/8 ::1 monpc.assistancenum.fr
Faites la recherche suivante :
mise à jour dynamique dns
Bantime indique le temps en seconde pendant lequel l'IP sera bannie, perso j'ai mis 10 jours
Il est possible de mettre des jours, des mois, des années au lieu des secondes (qui est la valeur par défaut) (y = year / d = day / mo = month ou mon / minute = m ou mm) , cela est indiqué dans le man de fail2ban à la section TIME ABBREVIATION FORMAT
bantime = 864000
ou
bantime = 10d
Je vous déconseille de bannir trop longtemps, comme les pirates changent souvent d'IP, vous pourriez bloquer un client potentiel qui aurait récupéré l'IP bloqué
Findtime est en corrélation avec maxretry, Findtime fait sa recherche sur une durée (dans mon cas 60 minutes). Si fail2ban trouve 3 essais (maxretry) dans les 60 minutes (findtime) alors il bannit l'IP
findtime = 60m
maxretry = 3
Ceci sont les valeurs par défaut pour toutes les Jails, après vous pouvez les modifier pour chaque Jail en ajoutant maxretry dans la règle concernée (on voit cela en dessous)
Si vous avez configuré l'envoi de mail, je vous recommande de dé-commenté ces lignes et de les remplir.
Cela servira à vous envoyer des notifications dès qu'une IP sera bannie (dans certains cas, j'explique cela plus loin)
Destmail représente l'adresse de destination
destemail = receiver@assistancenum.fr
Dans sender indiquer l'adresse d'envoi, l'adresse avec lequel vous avez paramétré l'envoi de mail dans Exim4
sender = sender@assistancenum.fr
Le mta est l'outil qui va envoyer le mail par défaut c'est EXIM4 (sendmail), les deux seuls choix que vous pouvez indiquer dans mta sont sendmail et mail
mta = sendmail
Les Jails commencent par un mot entre crochets [] .
Chacun de ces blocs (Jail) sont reliés à leurs fichiers (/etc/fail2ban/filter.d/) qui contiennent tous les paramètres de recherche regex à appliquer aux logs. Je n'explique pas comment cela fonctionne dans ce document
Exemple avec apache
[apache-auth]
port = http,https
logpath = %(apache_error_log)s
bantime = 48h
maxretry = 1
Port : Les protocoles nommés sont récupérés dans /etc/services
Si vous avez modifié le port par défaut d'un protocole, alors effectuez aussi ces modifications dans le fichier services pour qu'il soit pris en compte par fail2ban
Logpath indique le chemin ou chercher les logs, les variables indiquées sont visibles dans les fichiers suivants : /etc/fail2ban/paths_common.conf et /etc/fail2ban/paths_debian.conf
Si Bantime et maxretry sont indiquées, alors les valeurs définies par défaut au niveau global ne seront pas prises en compte (paramétré plus haut)
bantime 48h au lieu de 10j par défaut
maxretry 1 fois au lieu de 3 par défaut
Ce bloc est relié au fichier : /etc/fail2ban/filter.d/apache-auth.conf
Maintenant que nous avons configuré jail.conf, nous allons activer les services souhaités pour nous protéger des attaques
nano /etc/fail2ban/jail.d/defaults-debian.conf
[sshd]
enabled = true
action = %(action_mw)s
Par défaut seul SSH est protégé
Enabled Définit l'état du service. Actif / Inactif.
Action Indique ce que fail2ban doit faire quand il détecte une attaque.
Pour ajouter des services il suffit de copier les noms de service entre crochets présents dans /etc/fail2ban/jail.conf. J'explique comment faire plus bas
exemple :
dans /etc/fail2ban/jail.conf vous avez [apache-auth]
donc dans le fichier /etc/fail2ban/jail.d/defaults-debian.conf vous ajouter une ligne [apache-auth], puis en dessous vous indiquez les mêmes options que pour [sshd]
Ce qui vous donne
[sshd]
enabled = true
action = %(action_mw)s
[apache-auth]
enabled = true
action = %(action_mw)s
Valeur action
plusieurs possibilités s'offrent à vous
%(action_)s
Ban l'ip
%(action_mw)s
Ban l'ip, envoi un mail avec le WHOIS
%(action_mwl)s
Ban l'IP, envoi un mail avec le WHOIS et les lignes du fichier log concerné
Deux autres actions sont disponibles, mais dans certaines conditions.
Il faut installer le paquet bind-utils pour que fail2ban puisse faire des interrogations reverse DNS via la commande DIG, (équivalent de la commande Nslookup)
Etre concerné parmis une ou plusieurs des propositions suivantes :
Ban l'IP et envoi un mail au contact présent dans le WHOIS du reverse
%(action_xarf)s
Explication :
Vous pouvez faire une interrogation DNS pour avoir une IP, mais vous pouvez aussi faire une interrogation d'une IP pour avoir un domaine, c'est ce qu'on appelle un reverse DNS ou PTR
Si vous choisissez cette action, alors fail2ban enverra un mail au contact du domaine qu'il a trouvé en faisant un reverse de l'IP et lui joindra les logs
Fais la même chose qu'au-dessus, mais indique aussi à CloudFlare de ban l'IP
%(action_cf_mwl)s
ATTENTION avec ces deux paramètres, un pirate pourrait très bien avoir un domaine lié a sont IP et donc savoir que vous le bloquez (Cas possible)
Pour transférer des blocs disponibles dans jail.conf vers defaults-debian.conf, il suffit d'entrer les commandes suivantes
Exemple avec apache
Deux façons de faire :
Soit
sudo grep -P '(\[apache.*\])' /etc/fail2ban/jail.conf
Vous pouvez remplacer apache par un autre nom (postfix, etc)
Vous allez avoir tous les blocs [] contenant le mot apache, il vous suffit de tout copier avec votre souris et de coller dans /etc/fail2ban/jail.d/defaults-debian.conf en ne gardant que ce qui vous intéresse
Sinon
sudo grep -P '(\[apache.*\])' /etc/fail2ban/jail.conf >> /etc/fail2ban/jail.d/defaults-debian.conf
Puis d'ajouter au-dessous de chaque bloc les éléments habituels, c'est-à-dire :
enabled = true
action = ACTIONACHOISIR
Vous pouvez aussi ajouter d'autres options, ces options seront prioritaires à celles présents dans le fichier /etc/fail2ban/jail.conf
maxretry = 1
findtime = 10m
bantime = 10d
Ce qui peut vous donner
[ssh]
enabled = true
action = %(action_mw)s
maxretry = 1
findtime = 10m
bantime = 10d
Pour enlever le BAN d'une IP voici la commande à taper :
fail2ban-client set SERVICE unbanip IP
SERVICE et le nom du service qui a banni l'IP
IP et l'IP à débloquer
Pour enlever le BAN d'une IP qui a été banni avec le service SSH ça donnerait cela :
fail2ban-client set ssh unbanip 1.1.1.1
Vous permet de voir toutes les Jails actives
fail2ban-client status
Affiche l'état d'un service en particulier (remplacer JAIL par l'un des noms affichés avec la commande ci-dessus)
fail2ban-client status JAIL
Exemple : fail2ban-client status apache-auth
Vous permet de voir toutes les stats liées à la Jail (apache-auth dans notre cas)
Cette option va permettre d'avoir le nombre d'essais maximum avant ban de l'ip pour le service postfix. Vous pouvez indiquer un autre service et choisir une autre option pour avoir la valeur définie.
fail2ban-client get postfix maxretry
Dans /etc/fail2ban/jail.conf, maxretry et findtime ont des valeurs par défaut. Dans certain cas il est pratique d'appliquer des valeurs différentes dans les Jail. Comme pour l'exemple de [apache-auth]
Vérifier régulièrement les logs de vos services (apache2, nginx, postfix, etc...). Certains malins, jouent avec les valeurs par défaut de fail2ban pour éviter de se faire bannir.
Cela m'est arrivé avec postfix. Du coup j'ai dû revoir les valeurs par défaut pour la Jail postfix, afin de bannir les IP qui passait leur temps à faire du brute force.
Il est possible d'ajouter des modules en cherchant sur internet, comme par exemple un module pour les erreurs 404 d'apache
Le type de module 404 peut servir à bannir les personnes qui s'amusent à essayer différentes URL dans le but de trouver une faille ou un accès privilégié
Attention, avant d'ajouter des modules, soyer sûrs de ce que vous faites, dans le cas du module 404, si vous avez des liens brisés, vous risquez de bannir des utilisateurs légitimes