Installer et utiliser Fail2ban

De Wiki Amis SH
Aller à la navigation Aller à la recherche



Le wiki : Accueil - Administrateur - Bureautique - Développeur - Intégrateur - Marketing - Multimédia - Objets numériques - Jeux - We make Hack


Installer et utiliser Fail2ban

Introduction

# Fail2ban est un outil initialement utilisé pour lutter contre les scans Brute Force.
# Fail2ban permet de bloquer l'attaquant en se basant sur les logs du service attaqué et de définir des règles de bannissement personnalisées.
# Cependant, en cas de correspondance d'une règle Fail2Ban, celui-ci peut accomplir n'importe quel comportement comme envoyer un mail ou rediriger vers une autre adresse IP...

Installer et démarrer Fail2ban

# Installer Fail2ban :
sudo apt-get install fail2ban
# Activer le service Fail2ban :
sudo systemctl start fail2ban
# Activer le service Fail2ban au démarrage :
sudo systemctl enable fail2ban
# Prendre en compte une nouvelle configuration Fail2ban :
sudo systemctl reload fail2ban
# Redémarrer le service Fail2ban :
sudo systemctl restart fail2ban
# Si les règles ne sont pas toutes chargées, ou, si aucun blocage ne s'effectue pas correctement, lire les logs de Fail2ban :
sudo tail -f -n 30 /var/log/fail2ban.log
# Redémarrer Fail2ban et lire directement les logs :
sudo systemctl restart fail2ban && tail -f -n 30 /var/log/fail2ban.log

Le principe

# Créer une règle de jail (contenant le fichier de log à surveiller, le maximum de tentative, le temps de bannissement, ...) dans /etc/fail2ban/jail.d/
# Créer une règle de filtre (contenant la regex à appliquer pour détecter l'attaque) dans /etc/fail2ban/filter.d/
# Par défaut le fichier /etc/fail2ban/jail.conf est rempli de règles non activé, la directive "enabled = true" étant absente.
# Il est recommandé de ne pas modifier les fichiers de configuration /etc/fail2ban/fail2ban.conf et /etc/fail2ban/jail.conf car ils peuvent être écrasés par une mise à jour.
# Ces fichiers contiennent les configurations de base qu'on peut surcharger depuis /etc/fail2ban/fail2ban.local et /etc/fail2ban/jail.local, et depuis /etc/fail2ban/jail.d également.
# Le fichier /etc/fail2ban/jail.conf doit servir uniquement de référence et de documentation. 
# Il est préférable de créer les règles à part dans /etc/fail2ban/jail.d pour faciliter la gestion des règles, comme mentionné dans la documentation.
# En plus de la simple action de blocage, ils peuvent également être utilisés pour générer des mails ou exécuter d'autres commandes en réponse à l'activité du journal.

Paramétrages de Fail2ban depuis le fichier etc/fail2ban/fail2ban.local

# Par précaution il est conseillé de copier le fichier de configuration fail2ban.conf localement en tant que fail2ban.local pour que les réglages ne soient pas écrasés après une mises à jour.
cd /etc/fail2ban
sudo cp fail2ban.conf fail2ban.local
# Le fichier jail.local prend le relais sur le fichier jail.conf.
# Éditer le fichier fail2ban.local pour configurer Fail2ban :
sudo nano /etc/fail2ban/fail2ban.local
[Definition]
# Option: loglevel
# Notes.: Set the log level output.
#         CRITICAL
#         ERROR
#         WARNING
#         NOTICE
#         INFO
#         DEBUG
# Values: [ LEVEL ]  Default: ERROR
loglevel = INFO

# Option: logtarget
logtarget = /var/log/fail2ban.log

# Option: syslogsocket
syslogsocket = auto

# Option: socket
socket = /var/run/fail2ban/fail2ban.sock

# Option: pidfile
pidfile = /var/run/fail2ban/fail2ban.pid

# Options: dbfile
# Vérifier quelle valeur utilisée, dans le cas de l'utilisation de MariaDB.
dbfile = /var/lib/fail2ban/fail2ban.sqlite3

# Options: dbpurgeage
# Values: [ SECONDS ] Default: 86400 (24hours)
dbpurgeage = 1d

Paramétrages des prisons depuis le fichier etc/fail2ban/jail.local

# Par précaution il est conseillé de copier le fichier de configuration jail.conf localement en tant que jail.local pour que les réglages ne soient pas écrasés après une mises à jour.
cd /etc/fail2ban
sudo cp jail.conf jail.local
# Le fichier jail.local prend le relais sur le fichier jail.conf.
# Éditer le fichier jail.local pour configurer Fail2ban :
sudo nano /etc/fail2ban/jail.local
# Afficher les paramètres de jail.local :
fail2ban-client -d
# Exemple :
Afficher la réponse de fail2ban-client -d sur une installation par défaut.

Paramètres par défaut

# Éditer le fichier jail.local pour configurer Fail2ban :
sudo nano /etc/fail2ban/jail.local
# Durée de l'analyse permettant de considérer plusieurs fois la même adresse IP dans cette durée de temps.
# 3600 secondes, une heure :
findtime = 3600
# Temps de ban en secondes.
# 86400 secondes, 24 heures :
bantime = 86400
# Une IP sera bannie pour 24 heures après 3 tentatives de connexion avortées sur un délai de 3600 secondes.
maxretry = 3
# Liste des adresses IP de confiance devant être ignorées par Fail2ban.
# La valeur de ignoreip peut être une adresse IP, un masque CIDR ou un hôte DNS.
ignoreip = 127.0.0.1
# Adresse mail destinataire des notifications :
destmail = monitoring@test.com
# Action à entreprendre en cas de détection positive.
# Les actions sont situées dans le répertoire /etc/fail2ban/action.d/
action =
# La méthode de surveillance des logs :
backend =
# pyinotify : Le module Python permet de monitorer les modifications sur un fichier.
# gamin : Le module équivalent pour le projet Gnome.
# polling : Le fichier est simplement vérifier à intervalles réguliers afin de vérifier s'il y a eu des écritures.
# systemd : Fail2Ban se greffe sur SystemD pour être alerté de nouveaux logs.
# auto : Mode automatique qui va tenter les solutions précédentes dans ce même ordre.

Paramétrer les prisons pour surveiller les services

# Spécifier à Fail2ban quels services doivent être surveillés en activant les prisons (jails) correspondantes.
# Il est inutile d'activer des prisons pour des services qui ne sont pas utilisés sur le serveur.
# Utiliser true pour activer ou false pour désactiver un jail.
# En observant le fichier /etc/fail2ban/jail.local, dans la partie jail, on retrouve des blocs du type :
[sshd]
port    = ssh
logpath = %(sshd_log)s
backend = %(sshd_backend)s
# Définitions :
port = Les ports à bloquer au moyen des règles iptables.
logpath = L'emplacement des fichiers de log à surveiller.
backend = Le moteur de surveillance des logs.
# Les valeurs représentées ainsi %(sshd_logs)s sont des variables qui sont définies dans d'autres fichiers de configuration et notamment :
paths_common.conf
paths_debian.conf
# Ajouter plusieurs fichiers de logs directement dans la configuration de la jail :
logpath      = /var/log/apache2/access.log
               /var/log/apache2/error.log
# Activer la surveillance des connexion SSH en ajoutant la valeur enabled = true au dessous du bloc [sshd] dans le fichier /etc/fail2ban/jail.local :
# Procéder de même pour chaque service a activer.
[sshd]
enabled = true
# Spécifier le port, par exemple, quand SSH n'est pas en écoute sur un port standard, un fichier de log particulier, ou un nombre de tentatives différent de la valeur par défaut :
sudo nano /etc/fail2ban/jail.local
[sshd]
enabled = true
# To use more aggressive sshd modes set filter parameter "mode" in jail.local:
# normal (default), ddos, extra or aggressive (combines all).
# See "tests/files/logs/sshd" or "filter.d/sshd.conf" for usage example and details.
mode   = normal
port    = ssh
# Correspond à /var/log/auth.log
logpath = %(sshd_log)s
backend = %(sshd_backend)s
maxretry = 2

Quelques paramètres pouvant supplanter les paramètres globaux pour configurer une prison

# Chaque section possède ses propres paramètres qui prennent le pas sur les globaux s'ils sont mentionnés :
# Monitoring activé (true) ou non (false) :
enabled =
# Port IP concerné :
port =
# Fichier de log à analyser pour détecter des anomalies
logpath =
# Filtre utilisé pour l'analyser du log
filter =

Exemple de filtres disponibles par défaut sur une Release3 OVH

# Les filtres suivants contiennent les regex qui définissent les règles de blocage pour les prisons.
# Il faudra activer le bloc de jail correspondant, comme vu précédemment pour [sshd], avec la valeur "enabled = true".
# Aller dans le répertoire des jails :
cd /etc/fail2ban/filter.d
# Lister les filtres existants :
ls -l
-rw-r--r-- 1 root root  767 juin  12  2013 apache-auth.conf
-rw-r--r-- 1 root root 2375 nov.  29  2011 apache-badbots.conf
-rw-r--r-- 1 root root  352 juin  12  2013 apache-common.conf
-rw-r--r-- 1 root root  758 juin  12  2013 apache-nohome.conf
-rw-r--r-- 1 root root  904 juin  12  2013 apache-noscript.conf
-rw-r--r-- 1 root root  580 juin  12  2013 apache-overflows.conf
-rw-r--r-- 1 root root 1217 nov.  29  2011 common.conf
-rw-r--r-- 1 root root  610 nov.  29  2011 courierlogin.conf
-rw-r--r-- 1 root root  585 nov.  29  2011 couriersmtp.conf
-rw-r--r-- 1 root root 1006 nov.  29  2011 cyrus-imap.conf
-rw-r--r-- 1 root root  735 nov.  29  2011 dovecot.conf
-rw-r--r-- 1 root root 1651 nov.  29  2011 dropbear.conf
-rw-r--r-- 1 root root  607 nov.  29  2011 exim.conf
-rw-r--r-- 1 root root  441 nov.  29  2011 gssftpd.conf
-rw-r--r-- 1 root root  397 nov.  29  2011 lighttpd-fastcgi.conf
-rw-r--r-- 1 root root 1007 nov.  29  2011 named-refused.conf
-rw-r--r-- 1 root root  867 nov.  29  2011 pam-generic.conf
-rw-r--r-- 1 root root  867 nov.  29  2011 php-url-fopen.conf
-rw-r--r-- 1 root root  585 nov.  29  2011 postfix.conf
-rw-r--r-- 1 root root  860 nov.  29  2011 proftpd.conf
-rw-r--r-- 1 root root  803 nov.  29  2011 pure-ftpd.conf
-rw-r--r-- 1 root root  600 nov.  29  2011 qmail.conf
-rw-r--r-- 1 root root  677 nov.  29  2011 sasl.conf
-rw-r--r-- 1 root root  575 nov.  29  2011 sieve.conf
-rw-r--r-- 1 root root 1643 nov.  29  2011 sshd.conf
-rw-r--r-- 1 root root  621 nov.  29  2011 sshd-ddos.conf
-rw-r--r-- 1 root root  694 nov.  29  2011 vsftpd.conf
-rw-r--r-- 1 root root  821 nov.  29  2011 webmin-auth.conf
-rw-r--r-- 1 root root  431 nov.  29  2011 wuftpd.conf
-rw-r--r-- 1 root root  842 nov.  29  2011 xinetd-fail.conf

Exemples de regex

# Les regex ou expressions régulières deFail2ban reposent sur le langage POSIX :
Source : https://fr.wikipedia.org/wiki/POSIX
Exemples de regex pour le filtre apache-probe.conf
# Configuration présente par défaut.
[Definition]
failregex = ^[[][^]]+[]] [[]error[]] [[]client <HOST>[]] File does not exist: (?i)/\S*/admin\S*
            ^[[][^]]+[]] [[]error[]] [[]client <HOST>[]] File does not exist: (?i)/\S*\.(aspx?|ini|exe|plx?|inc|mdb|conf|jsp|sql|java|yml|class|sqlite3|cfm|backup|bak|log|bitrix|\.git|\.svn|_?api)
            ^[[][^]]+[]] [[]error[]] [[]client <HOST>[]] File does not exist: (?i)/\S*/jmx-console
            ^[[][^]]+[]] [[]error[]] [[]client <HOST>[]] File does not exist: (?i)/\S*/ictupr
            ^[[][^]]+[]] [[]error[]] [[]client <HOST>[]] File does not exist: (?i)/\S*/phpmyadmin
            ^[[][^]]+[]] [[]error[]] [[]client <HOST>[]] File does not exist: (?i)/\S*/pma.*
            ^[[][^]]+[]] [[]error[]] [[]client <HOST>[]] File does not exist: (?i)/\S*/manager.*
            ^[[][^]]+[]] [[]error[]] [[]client <HOST>[]] File does not exist: (?i)/\S*/server-info
            ^[[][^]]+[]] [[]error[]] [[]client <HOST>[]] File does not exist: (?i)/\S*/mysql.*
            ^[[][^]]+[]] [[]error[]] [[]client <HOST>[]] File does not exist: (?i)/\S*/sqlweb.*
            ^[[][^]]+[]] [[]error[]] [[]client <HOST>[]] File does not exist: (?i)/\S*/webdb.*
            ^[[][^]]+[]] [[]error[]] [[]client <HOST>[]] File does not exist: (?i)/\S*/vtigercrm.*
            ^[[][^]]+[]] [[]error[]] [[]client <HOST>[]] File does not exist: (?i)/\S*/auth
            ^[[][^]]+[]] [[]error[]] [[]client <HOST>[]] File does not exist: (?i)/\S*/autologin
            ^[[][^]]+[]] [[]error[]] [[]client <HOST>[]] File does not exist: (?i)/\S*/controlpanel
            ^[[][^]]+[]] [[]error[]] [[]client <HOST>[]] File does not exist: (?i)/\S*/cpanel
            ^[[][^]]+[]] [[]error[]] [[]client <HOST>[]] File does not exist: (?i)/\S*/horde
            ^[[][^]]+[]] [[]error[]] [[]client <HOST>[]] File does not exist: (?i)/\S*/iisadmin
            ^[[][^]]+[]] [[]error[]] [[]client <HOST>[]] File does not exist: (?i)/\S*/myadmin
            ^[[][^]]+[]] [[]error[]] [[]client <HOST>[]] File does not exist: (?i)/\S*/phpinfo\.php
            ^[[][^]]+[]] [[]error[]] [[]client <HOST>[]] .*/etc/passwd.*
            ^[[][^]]+[]] [[]error[]] [[]client <HOST>[]] .*testasp.vulnweb.com.*
            ^[[][^]]+[]] [[]error[]] [[]client <HOST>[]] Invalid method in request (ACUNETIX|DEBUG|HELP|NETSPARKER|SEARCH|TRACK)
            ^[[][^]]+[]] [[]error[]] [[]client <HOST>[]] Invalid URI in request
            ^[[][^]]+[]] [[]error[]] [[]client <HOST>[]] client denied by server configuration
            ^[[][^]]+[]] [[]error[]] [[]client <HOST>[]] script '\S*/wp-login.php' not found or unable to stat
            ^[[][^]]+[]] [[]error[]] [[]client <HOST>[]] request failed: URI too long
ignoreregex =
Exemples de regex pour le filtre sshd.conf
# Configuration pouvant être ajoutée.
# Des programmes tels que Systemd, CRON et PostgreSQL peuvent générer beaucoup d'activité auth.log tout au long de la journée.
# Ajouter les expressions suivantes pour le filtrer :
ignoreregex = : pam_unix\((cron|sshd|systemd-user):session\): session (open|clos)ed for user (daemon|munin|postgres|root)( by \(uid=0\))?$
              : Successful su for (postgres) by root$
              New session \d+ of user (postgres)\.$
              Removed session \d+\.$
# Cette configuration n'a pas été testée.
# Tester la validité de la règle avec la commande suivante :
fail2ban-regex -v --print-all-missed /var/log/auth.log /etc/fail2ban/filter.d/sshd.conf /etc/fail2ban/filter.d/sshd.conf | less
# Sera affiché :
# Toutes les expressions failregex et le nombre de correspondances.
# Toutes les expressions ignoreregex et le nombre de correspondances.
# Formats de date détectés.
# Nombre de lignes ne correspondant pas aux expressions recherchées.
Exemples de regex pour le filtre apache-noscript.conf
# Configuration pouvant être ajoutée.
# En étudiant les lignes ne correspondant pas aux expressions recherchées, on peut améliorer le script :
fail2ban-regex -v --print-all-missed /var/log/apache2/error.log /etc/fail2ban/filter.d/apache-noscript.conf /etc/fail2ban/filter.d/apache-noscript.conf | less
failregex = ^%(_apache_error_client)s ((AH001(28|30): )?File does not exist|(AH01264: )?script not found or unable to stat): /\S*\.(php|aspx?|exe|pl|cgi|rar|zip|gz)(, referer: \S+)?\s*$
            ^%(_apache_error_client)s script '/\S*\.(php|aspx?|exe|pl)\S*' not found or unable to stat(, referer: \S+)?\s*$
            ^%(_apache_error_client)s (script not found or unable to stat|attempt to invoke directory as script): /usr/lib/cgi-bin

ignoreregex = [[]pagespeed:(warn|error)[]]
              [[]client \S+[]] PHP (Notice|Parse error|Warning): 
              [[]client \S+[]] script '.*\.html' not found or unable to stat(, referer: \S+)?\s*$
              [[]client \S+[]] Operation timed out after \d+ milliseconds
# Cette configuration n'a pas été testée.
# Les lignes ne correspondant pas sont différentes entre les serveurs et les systèmes d'exploitation.
# Les lignes manquantes restantes concernent principalement IPv6, ou, seront capturées par d'autres filtres tels que apache-overflows ou apache-wordpress.
Exemples de regex pour le filtre sendmail.conf
# Configuration pouvant être ajoutée.
# En étudiant les lignes ne correspondant pas aux expressions recherchées, on peut améliorer le script :
fail2ban-regex --print-all-missed /var/log/mail.log /etc/fail2ban/filter.d/sendmail.conf /etc/fail2ban/filter.d/sendmail.conf | less
failregex = lost input channel from .*\[<HOST>\] to MTA-v\d after (data|mail|rcpt)$
            \[<HOST>\] did not issue MAIL/EXPN/VRFY/ETRN during connection to (MSP|MTA)-v\d$
            \[<HOST>\], reject.*\.\.\. (Relaying denied)
            \[<HOST>\]: Possible SMTP RCPT flood, throttling\.$
            timeout waiting for input from \[<HOST>\] during server cmd read
            rejecting commands from( .+)? \[<HOST>\] due to pre-greeting traffic
            relay=([^ ]+ )?\[<HOST>\], .* Domain of sender address [\w@.-]+ does not (exist|resolve)$

ignoreregex = sm-mta\[\d+\]: \w+: (from|to)=
              sm-mta\[\d+\]: \S+[[]\d[]]:
              sm-mta\[\d+\]: STARTTLS=(client|server)
              sm-mta\[\d+\]: STARTTLS: (read|write) error=(generic|syscall|timeout)
              : timeout waiting for input from [\w.-]+ during server cmd read$
              : collect: premature EOM: (unexpected close|Connection timed out with [\[\]\w.-]+|Connection reset by \S+)(, sender=\S+)?$
              : collect: (I/O error|read timeout|unexpected close) on connection from
              [\w.-]+ did not issue MAIL/EXPN/VRFY/ETRN during connection to MTA-v\d$
# Cette configuration n'a pas été testée.
# Les lignes ne correspondant pas sont différentes entre les serveurs et les systèmes d'exploitation.
# L'acceptation du courrier est relativement scrict et toute activité inhabituelle entraînera un blocage Fail2Ban, même si Sendmail ou un des DNSBL auxquels nous sommes abonnés résoudrait déjà le problème.

Mettre son réseau local et son adresse IP internet en liste blanche

# Éditer le fichier jail.local pour configurer Fail2ban :
sudo nano /etc/fail2ban/jail.local
# Utiliser un espace entre chaque adresse IP devant être ajoutée en liste blanche.
# ignoreip = 127.0.0.1 192.168.1.0/24 8.8.8.8
ignoreip = 127.0.0.1/8 ::1 ADRESSE_IP_DE_LA_BOX

Déplacer les règles par défaut qui ont été activées vers le dossier jail.d

# Par commodité, on préfèrera déplacer les règles actives dans le dossier jail.d plutôt que de les laisser dans le fichier jail.local.
# Éditer le fichier jail.local pour copier puis supprimer les règles par défaut qui ont été activées en les passant à enabled = true :
sudo nano /etc/fail2ban/jail.local
# Coller les règles dans le fichier /etc/fail2ban/jail.d/custom.conf :
sudo nano /etc/fail2ban/jail.d/custom.conf
# Sur debian, le fichier /etc/fail2ban/jail.local inclus par défaut le fichier /etc/fail2ban/jail.d/defaults-debian.conf
# Les règles actives proposées par défaut pourraient être placées dans ce fichier, plutôt que dans un éventuel fichier custom.conf afin de respecter la cohérence proposée par le système.
sudo nano /etc/fail2ban/jail.d/defaults-debian.conf
# On obtient quelque chose d'approchant, en fonction des services activés sur votre serveur et protégés par fail2ban :
# SSH servers
[sshd]
enabled = true
# To use more aggressive sshd modes set filter parameter "mode" in jail.local:
# normal (default), ddos, extra or aggressive (combines all).
# See "tests/files/logs/sshd" or "filter.d/sshd.conf" for usage example and details.
mode   = aggressive
port    = ssh
# Correspond à /var/log/auth.log
logpath = %(sshd_log)s
# backend = %(sshd_backend)s
maxretry = 2
backend = polling
journalmatch =

# HTTP servers
[apache-auth]
enabled = true
port     = http,https
logpath  = %(apache_error_log)s
maxretry = 2
backend = polling
journalmatch =

[apache-badbots]
enabled = true
# Ban hosts which agent identifies spammer robots crawling the web
# for email addresses. The mail outputs are buffered.
port     = http,https
logpath  = %(apache_access_log)s
bantime  = 48h
maxretry = 1
backend = polling
journalmatch =

[apache-noscript]
enabled = true
port     = http,https
logpath  = %(apache_error_log)s
backend = polling
journalmatch =

[apache-overflows]
enabled = true
port     = http,https
logpath  = %(apache_error_log)s
maxretry = 2
backend = polling
journalmatch =

[apache-nohome]
enabled = true
port     = http,https
logpath  = %(apache_error_log)s
maxretry = 2
backend = polling
journalmatch =

[apache-botsearch]
enabled = true
port     = http,https
logpath  = %(apache_error_log)s
maxretry = 2
backend = polling
journalmatch =

[apache-fakegooglebot]
enabled = true
port     = http,https
logpath  = %(apache_access_log)s
maxretry = 1
ignorecommand = %(ignorecommands_dir)s/apache-fakegooglebot <ip>
backend = polling
journalmatch =

[apache-modsecurity]
enabled = true
port     = http,https
logpath  = %(apache_error_log)s
maxretry = 2
backend = polling
journalmatch =

[apache-shellshock]
enabled = true
port    = http,https
logpath = %(apache_error_log)s
maxretry = 1
backend = polling
journalmatch =

[php-url-fopen]
port    = http,https
logpath = %(apache_access_log)s
#          %(nginx_access_log)s

[proftpd]
enabled = true
port     = ftp,ftp-data,ftps,ftps-data
logpath  = %(proftpd_log)s
# backend  = %(proftpd_backend)s
maxretry = 2
backend = polling
journalmatch =

[exim]
# see filter.d/exim.conf for further modes supported from filter:
mode = normal
enabled = true
port   = smtp,465,submission
logpath = %(exim_main_log)s
backend = polling
journalmatch =

[exim-spam]
enabled = true
port   = smtp,465,submission
logpath = %(exim_main_log)s
backend = polling
journalmatch =

# [mysqld]
# log-error=/var/log/mysqld.log
[mysqld-auth]
enabled = true
port     = 3306
logpath  = %(mysql_log)s
# backend  = %(mysql_backend)s
maxretry = 2
backend = polling
journalmatch =
# Vérifier la valeur de %(mysql_log)s
# Vérifier que l'écriture des logs de mysql soit fonctionnel.
# Dans le fichier /etc/mysql/my.cnf
# general_log_file = /var/log/path/file.log
# general_log = 1
# Jail for more extended banning of persistent abusers
# !!! WARNINGS !!!
# 1. Make sure that your loglevel specified in fail2ban.conf/.local
#    is not at DEBUG level -- which might then cause fail2ban to fall into
#    an infinite loop constantly feeding itself with non-informative lines
# 2. Increase dbpurgeage defined in fail2ban.conf to e.g. 648000 (7.5 days)
#    to maintain entries for failed logins for sufficient amount of time
[recidive]
enabled = true
logpath  = /var/log/fail2ban.log
banaction = %(banaction_allports)s
bantime  = 1w
findtime = 1d
backend = polling
journalmatch =
maxretry = 5
action_mwl = %(banaction)s[name=%(__name__)s, bantime="%(bantime)s", port="%(port)s", protocol="%(protocol)s", chain="%(chain)s"]
             %(mta)s-whois-lines[name=%(__name__)s, sender="%(sender)s", dest="%(destemail)s", logpath=%(logpath)s, chain="%(chain)s"]

[phpmyadmin-syslog]
port    = http,https
logpath = %(syslog_authpriv)s
backend = %(syslog_backend)s

# D'après la documentation présente dans le fichier jail.conf :
# Note: if systemd backend is chosen as the default but you enable a jail
#       for which logs are present only in its own log files, specify some other
#       backend for that jail (e.g. polling) and provide empty value for
#       journalmatch. See https://github.com/fail2ban/fail2ban/issues/959#issuecomment-74901200
# 
# Pour faire simple :
# Les règles qui nécessitent d'avoir accès à des fichiers de log devront impérativement avoir les définitions backend = polling et journalmatch = car le backend par défaut est réglé sur auto (C'est à dire systemd.). 
#
# Ajouter alors à chacune des règles les deux valeurs suivantes :
backend = polling
journalmatch =
# Redémarrer Fail2ban :
sudo service fail2ban restart

Gérer les notifications

Recevoir un mail en cas de ban

# Éditer le fichier jail.local pour configurer globalement Fail2ban :
sudo nano /etc/fail2ban/jail.local
# Renseigner l'adresse mail de l'administrateur :
destemail = administrateur@domaine.tld
# Remplacer mta = mail par :
mta = sendmail
# Par défaut, la valeur suivante de action ne permet pas l'envoie d'une alerte mail suite à une action de blocage de Fail2ban.
action = %(action_)s
# Pour recevoir un simple mail, remplacer action = %(action_)s par :
action = %(action_mw)s
# Pour recevoir un mail avec whois et la ligne du fichier de log, remplacer action = %(action_)s par :
action = %(action_mwl)s
# Dans le cas de la jail recidive qui ne semble pas recevoir de mail par défaut, ajouter la commande suivante à la fin de la règle jail :
action_mwl = %(banaction)s[name=%(__name__)s, bantime="%(bantime)s", port="%(port)s", protocol="%(protocol)s", chain="%(chain)s"]
             %(mta)s-whois-lines[name=%(__name__)s, sender="%(sender)s", dest="%(destemail)s", logpath=%(logpath)s, chain="%(chain)s"]
Exemple de mail reçu
Hi,

The IP 148.251.xxx.xxx has just been banned by Fail2Ban after
3 attempts against apache-auth.


Here is more information about 148.251.xxx.xxx :

missing whois program

Regards,

Fail2Ban
Exemple de mail reçu avec le programme whois
# Installer le programme whois :
sudo apt install whois
Hi,

The IP 162.210.196.98 has just been banned by Fail2Ban after
3 attempts against apache-auth.


Here is more information about 162.210.196.98 :


#
# ARIN WHOIS data and services are subject to the Terms of Use
# available at: https://www.arin.net/resources/registry/whois/tou/
#
# If you see inaccuracies in the results, please report at
# https://www.arin.net/resources/registry/whois/inaccuracy_reporting/
#
# Copyright 1997-2020, American Registry for Internet Numbers, Ltd.
#


NetRange:       162.210.192.0 - 162.210.199.255
CIDR:           162.210.192.0/21
NetName:        LEASEWEB-USA-WDC-01
NetHandle:      NET-162-210-192-0-1
Parent:         NET162 (NET-162-0-0-0-0)
NetType:        Direct Allocation
OriginAS:       AS30633
Organization:   Leaseweb USA, Inc. (LU)
RegDate:        2013-04-26
Updated:        2016-06-06
Comment:        Please send all abuse notifications to the following email address: abuse@us.leaseweb.com. To ensure proper processing of your abuse notification, please visit the website www.leaseweb.com/abuse for notification requirements. All police and other government agency requests must be sent to subpoenas@us.leaseweb.com.
Ref:            https://rdap.arin.net/registry/ip/162.210.192.0


OrgName:        Leaseweb USA, Inc.
OrgId:          LU
Address:        9480 Innovation Dr
City:           Manassas
StateProv:      VA
PostalCode:     20109
Country:        US
RegDate:        2010-09-13
Updated:        2019-08-13
Comment:        www.leaseweb.com
Ref:            https://rdap.arin.net/registry/entity/LU


OrgTechHandle: LEASE-ARIN
OrgTechName:   Leaseweb ARIN
OrgTechPhone:  +1-571-814-3777 
OrgTechEmail:  netops@us.leaseweb.com
OrgTechRef:    https://rdap.arin.net/registry/entity/LEASE-ARIN

OrgAbuseHandle: LUAD3-ARIN
OrgAbuseName:   Leaseweb US abuse dept
OrgAbusePhone:  +1-571-814-3777 
OrgAbuseEmail:  abuse@us.leaseweb.com
OrgAbuseRef:    https://rdap.arin.net/registry/entity/LUAD3-ARIN

OrgNOCHandle: LEASE-ARIN
OrgNOCName:   Leaseweb ARIN
OrgNOCPhone:  +1-571-814-3777 
OrgNOCEmail:  netops@us.leaseweb.com
OrgNOCRef:    https://rdap.arin.net/registry/entity/LEASE-ARIN

RAbuseHandle: LUAD3-ARIN
RAbuseName:   Leaseweb US abuse dept
RAbusePhone:  +1-571-814-3777 
RAbuseEmail:  abuse@us.leaseweb.com
RAbuseRef:    https://rdap.arin.net/registry/entity/LUAD3-ARIN


#
# ARIN WHOIS data and services are subject to the Terms of Use
# available at: https://www.arin.net/resources/registry/whois/tou/
#
# If you see inaccuracies in the results, please report at
# https://www.arin.net/resources/registry/whois/inaccuracy_reporting/
#
# Copyright 1997-2020, American Registry for Internet Numbers, Ltd.
#

Regards,

Fail2Ban
Modifier le texte du mail envoyé
# Mettre le texte en Français par exemple.
/etc/fail2ban/action.d/mail-whois.conf
# Option: actionban
# Notes.: command executed when banning an IP. Take care that the
# command is executed with Fail2Ban user rights.
# Tags: See jail.conf(5) man page
# Values: CMD
#
actionban = printf %%b "Hi,\n
The IP <ip> has just been banned by Fail2Ban after
<failures> attempts against <name>.\n\n
Here is more information about <ip>:\n
'whois <ip> || echo missing whois program'\n
Regards,\n
Fail2Ban"|mail -s "[Fail2Ban] <name>: banned <ip> from 'uname -n'" <dest>

Changer le système par défaut de Fail2Ban qui envoie un mail à chaque bannissement

Remplacer les rapports par un seul rapport journalier - Ne fonctionne pas
# Fail2ban ne redémarre pas.
# Dans les actions disponibles on trouvera mail-buffered.conf qui attend 5 bannissements par défaut avant d'envoyer un mail.
cd /etc/fail2ban/action.d/
ls
# Utilisons mail-buffered.conf comme base de départ mais au lieu de configurer un mail tous les x bannissements on va configurer un rapport tous les jours à une heure précise.
# Créer mail-daily.conf dans /etc/fail2ban/action.d/ :
cd /etc/fail2ban/action.d/
sudo nano mail-daily.conf
# Coller le contenu suivant :
[Definition]
actionstart = echo -en "***** Fail2Ban *****\n\nNotification Type: RECOVERY\n\nService: <name>\nHost: <server>\nAddress: <serverip>\nState: STARTED\n\nDate/Time: `date`\n\nAdditional Info:\n\n" | mail -a "From: <from>" -s "** RECOVERY alert - <server>/<name> jail is STARTED **" <dest>

actionstop = echo -en "***** Fail2Ban *****\n\nNotification Type: ALERT\n\nService: <name>\nHost: <server>\nAddress: <serverip>\nState: STOPPED\n\nDate/Time: `date`\n\nAdditional Info:\n\n" | mail -a "From: <dest>" -s "** ALERT alert - <server>/<name> jail is STOPPED **" <dest>

actioncheck =
actionban = echo `date | awk -F ' ' '{print $4}'`" - <ip> (<failures> attempts against <name>)" >> <tmpfile>
actionunban =

[Init]
tmpfile = /tmp/fail2ban-mail.txt

# default dest
dest = root
# Un bannissement Fail2ban ajoute une ligne au fichier de stockage temporaire /tmp/fail2ban-mail.txt
# Les infos suivantes seront stockées : Adresse IP de provenance, service attaqué et nombre de tentatives.
# L'envoi du rapport par mail se configuration dans l'état suivante.
# Pour chaque règle jail en place, préciser l'action mail-daily[] suivante pour modifier le comportement de notification par mail.
# Toutes mes règles actives se trouvent dans le répertoire /etc/fail2ban/jail.d suite à la bonne configuration de Fail2ban.
action   = iptables[name=SSH, port=ssh, protocol=tcp]
           mail-daily[name=SSH, dest=%(emailt)s, from=%(fromt)s, server=%(servert)s, serverip=%(serveript)s]
# Générer le rapport avec le script bash suivant :
sudo nano /etc/fail2ban/action.d/report.sh
#!/bin/sh

SERVER="139.99.173.195"
IP="127.0.0.1"
FROM="Fail2ban "
TO="mail@visionduweb.com"
TMP=/tmp/fail2ban-mail.txt

if [ -f $TMP ]; then
echo -en "***** Fail2Ban *****\n\nNotification Type: INFO\n\nService: *\nHost: $SERVER\nAddress: $IP\nState: OK\n\nDate/Time: `date`\n\nAdditional Info:\n\nThese hosts have been banned on `date --date '1 days ago' +"%a %d %b"`\n`cat $TMP`" | mail -a "From: $FROM" -s "** INFO alert - $SERVER jail REPORT **" $TO
rm $TMP
fi
# Ajouter la tâche suivante dans les actions de crontab.
# Cette configuration génère et envoie un rapport tous les jours à 19h05.
05 19 * * *      /etc/fail2ban/action.d/report.sh > /dev/null
# Redémarrer Fail2ban pour appliquer la nouvelle configuration :
sudo service fail2ban restart
Envoyer un rapport des IP bannis
# Script cron pour envoyer 2 fois par jour le statut des jails.
sudo nano /etc/fail2ban/action.d/fail2ban-status-ban.sh
#!/bin/sh
# Script de rapport fail2ban
# Prend en compte tous les jails
#
dest=mail@visionduweb.com
msg=$(fail2ban-client status | sed -n 's/,//g;s/.*Jail list://p' | xargs -n1 fail2ban-client status);
echo "$msg" | mail -s "Rapport Fail2ban De $(hostname -s) $(date)" $dest
# Rapport de fail2ban
sudo crontab -e
30 6,19 * * * sudo sh /etc/fail2ban/action.d/fail2ban-status-ban.sh >> /var/log/mail.log 2>&1
# Un mail en erreur est retourné avec le message :
X-Exim-DSN-Information: Due to administrative limits only headers are returned

# Le message est peut être trop grand ou mal formé.
# Configurer SPF et DKIM pourrait corriger ce problème.
# Les logs de EXIM informent :
1jGTMg-0003QT-AM ** mail@visionduweb.com R=dnslookup T=remote_smtp: message is too big (transport limit = 1)
Warning: No server certificate defined; will use a selfsigned one.
Suggested action: either install a certificate or change tls_advertise_hosts option
1jGTMg-0003QX-Ka <= <> R=1jGTMg-0003QT-AM U=Debian-exim P=local S=1787
1jGTMg-0003QT-AM Completed
Warning: No server certificate defined; will use a selfsigned one.
Suggested action: either install a certificate or change tls_advertise_hosts option

# Cela signifie qu'une limite de LIGNE maximale de 998 caractères a été atteinte
# Ajouter la ligne suivante dans la configuration :
IGNORE_SMTP_LINE_LENGTH_LIMIT = 1
# Ajouter la ligne à la fin du fichier existant :
sudo bash
/etc/exim4/update-exim4.conf.conf 
# Préférer l'ajout de la ligne dans un nouveau fichier de configuration complémentaire :
sudo bash
nano /etc/exim4/exim4.conf.localmacros

# Redémarrer Exim.

# Le mail arrivera correctement.
# Spécifier un jail particulier peut également permettre l'arrivée du rapport pour contourner l'erreur d'envoi de mail, mais, il est peu pratique d'envoyer un seul rapport.
dest=mail@visionduweb.com
msg=$(fail2ban-client status apache-auth | sed -n 's/,//g;s/.*Jail list://p' | xargs -n1 fail2ban-client status apache-auth);
echo "$msg" | mail -s "Rapport Fail2ban De $(hostname -s) $(date)" $dest

Envoyer un SMS en cas de bannissement par Fail2ban

 Alerte par SMS : https://medspx.fr/blog/Sysadmin/configurer_fail2ban/#alertesparsms

Commandes de base pour utiliser Fail2ban

Lire les logs de Fail2ban

# Suivre en temps réel les 30 dernières lignes du fichier de logs de Fail2ban.
# Remplacer 30 par le nombre de ligne à afficher :
tail -f -n 30 /var/log/fail2ban.log
# Afficher uniquement les adresses IP bannies :
cat /var/log/fail2ban.log | grep "ban"
# Ou :
tail -f -n 30 /var/log/fail2ban.log | grep "ban"

Afficher le statut de Fail2ban

# Permet notamment d'identifier une erreur au démarrage, par exemple, si un fichier de log ne peut pas être chargé car il n'existe pas :
sudo systemctl status fail2ban

Afficher les jails activés

sudo /usr/bin/fail2ban-client status
# Exemple :
Status
|- Number of jail:	11
`- Jail list:	apache-auth, apache-badbots, apache-botsearch, apache-fakegooglebot, apache-nohome, apache-noscript, apache-overflows, exim, exim-spam, proftpd, sshd

Afficher le statut d'un jail

# Connaître le statut pour un jail en particulier, connaître le nombre d'erreurs rencontrées, le nombre de blocages effectués :
sudo /usr/bin/fail2ban-client status sshd
# Vérifier toutes les 2 secondes l'état de la prison :
sudo watch fail2ban-client status apache-auth
Every 2,0s: fail2ban-client status apache-auth

Status for the jail: apache-auth
|- Filter
|  |- Currently failed: 0
|  |- Total failed:     3
|  `- File list:        /var/log/apache2/error.log /var/log/apache2/redmine.error.log
`- Actions
   |- Currently banned: 37
   |- Total banned:     37
   `- Banned IP list:   104.xxx.226.50 108.xxx.8.70 ...

Contrôler la validité d'une règle

# Avant de relancer fail2ban, vérifier si les nouvelles règles fonctionnent.
# Relancer les tests régulièrement, ou, au moins après toute mise à niveau majeure.
fail2ban-regex /var/log/apache2/access.log /etc/fail2ban/filter.d/joomla-auth.conf
# Le résultat obtenu ressemblera à :
Running tests
=============

Use   failregex filter file : joomla-auth, basedir: /etc/fail2ban
Use         log file : /var/log/apache2/access.log
Use         encoding : UTF-8


Results
=======

Failregex: 12 total
|-  #) [# of hits] regular expression
|   3) [6] ^<HOST> -.*GET /administrator HTTP.*
|   4) [6] ^<HOST> -.*POST /administrator/index.php HTTP.*
`-

Ignoreregex: 0 total
# Cet outil peut être utilisé en mode interactif.
# Pour lancer le mode interactif, utiliser la même commande avec l'option -i.

Consulter les adresses IP bannies par Fail2Ban dans Iptables

# Lister les adresses IP bannies :
iptables -L
iptables -L -n --line
Afficher la réponse de iptables -L -n --line sur une installation par défaut.

Bannir une adresse IP

# Pour ajouter une adresse IP à la liste des adresses bloquées, pour le jail postfix par exemple :
fail2ban-client set Nom_de_la_jail banip Addresse_IP
# Ou :
sudo iptables -I fail2ban-postfix 1 -s 1.163.149.165 -j DROP

Débannir une adresse IP

# Débannir une adresse IP :
fail2ban-client set Nom_de_la_jail unbanip Addresse_IP
# Mon IP fixe 80.xx.xxx.xx est bloquée via une adresse hôte qui est affichée dans Iptables à la place de mon adresse IP : laubervilliers-xxx-x-xx-xx.xxx-xx.abo.wanadoo.fr.
# C'est malgré tout bien l'adresse IP qui doit être utilisée pour ne plus être bannie.
# La lecture des adresses IP bannies n'est pas évidente ainsi.

Contrôler les jails

# Le contrôle des prison est le nerf de la guerre dans Fail2Ban.
# Les principales actions de contrôle :
# Active une jail et définit son backend (on mettra `auto` la plupart du temps) :
sudo /usr/bin/fail2ban-client add <JAIL> <BACKEND>
# Démarre une jail arrêtée :
sudo /usr/bin/fail2ban-client start <JAIL>
# Arrête et désactive une jail :
sudo /usr/bin/fail2ban-client stop <JAIL>
# Retourne les détails d'une jail en particulier :
sudo /usr/bin/fail2ban-client status <JAIL>
# Obtenir des informations détaillées concernant des jails en particulier :
# Retourne le chemin du fichier de log analysé par cette jail :
sudo /usr/bin/fail2ban-client get <JAIL> logpath
# Récupère l'encodage du fichier de log utilisé par cette jail :
sudo /usr/bin/fail2ban-client get <JAIL> logencoding
# Récupère les entrées du fichier de log matchées par cette jail :
sudo /usr/bin/fail2ban-client get <JAIL> journalmatch
# Affiche les ips ignorées :
sudo /usr/bin/fail2ban-client get <JAIL> ignoreip
# Affiche les entrée du `ignorecommand` de cette jail :
sudo /usr/bin/fail2ban-client get <JAIL> ignorecommand
# Affiche la `failregex` de cette jail :
sudo /usr/bin/fail2ban-client get <JAIL> failregex
# Affiche l'`ignoreregex` de cette jail :
sudo /usr/bin/fail2ban-client get <JAIL> ignoreregex
# Retourne le délai pris de prise en compte de tentatives pour cette jail :
sudo /usr/bin/fail2ban-client get <JAIL> findtime
# Retourne la durée de bannissement pour cette jail :
sudo /usr/bin/fail2ban-client get <JAIL> bantime
# Retourne le nombre d'erreurs tolérées avant bannissement :
sudo /usr/bin/fail2ban-client get <JAIL> maxretry
# Retourne le nombre maximum de lignes analysées :
sudo /usr/bin/fail2ban-client get <JAIL> maxlines
# Affiche l'ensemble des actions liées à cette jail :
sudo /usr/bin/fail2ban-client get <JAIL> actions

Gestion des logs par Fail2ban

# L'outil génère ses propres logs.
# A suivre via d'autres tutoriels pour compléter cette utilisation.
# Définit le niveau de logging.
set loglevel
# Retourne le niveau de logging.
get loglevel
# Définit la cible des logs (STDOUT, STDERR, SYSLOG ou chemin vers un fichier).
set logtarget
# Retourne le chemin du fichier de log (ou autre si ce n'est pas un fichier).
get logtarget
# Vide le fichier de logs (si disponible). Cette fonction est dédié à la rotation.
flushlogs

Utiliser Fail2ban avec la base de données

# Fail2Ban possède une base de données interne SQLite.
# Cette dernière permet de faire persister des informations suite à un redémarrage pour recréer les règles Iptables.
# A suivre via d'autres tutoriels pour compléter cette utilisation.
# Définir la localisation de la base de données.
set dbfile
# Retourne le chemin de la base de données.
get dbfile
# Définit la durée de rétention des informations dans la base de données.
set dbpurgeage
# Récupère le nombre de secondes de rétentions des informations en base de données de la configuration actuelle.
get dbpurgeage

Ajouter des jails pour protéger le serveur des attaques les plus courantes

Règle d'authentification web pour Joomla

# Créer le fichier /etc/fail2ban/jail.d/joomla-auth.conf
sudo nano /etc/fail2ban/jail.d/joomla-auth.conf
[joomla-auth]
enabled = true
maxretry = 2
findtime = 3h
bantime = 12h
filter = joomla-auth
port = 80,443
logpath = /var/log/apache2/*access.log
# Créer le fichier /etc/fail2ban/filter.d/joomla-auth.conf
sudo nano /etc/fail2ban/filter.d/joomla-auth.conf
[Definition]
failregex = ^<HOST> -.*POST /administrator HTTP.*
            ^<HOST> -.*PUT /administrator HTTP.*
            ^<HOST> -.*GET /administrator HTTP.*
            ^<HOST> -.*POST /administrator/index.php HTTP.*
            ^<HOST> -.*PUT /administrator/index.php HTTP.*
            ^<HOST> -.*GET /administrator/index.php HTTP.*
# Cette expression régulière permet de détecter une attaque en surveillant les requêtes POST PUT GET sur l'URL administrator.
# Une connexion depuis le formulaire du site, depuis le navigateur, est une connexion POST. 2 tentatives entraînent le ban du client.
# L'adresse IP autorisée est en liste blanche.

Règle d'authentification web Mediawiki

# Créer le fichier /etc/fail2ban/jail.d/mediawiki-http.conf
sudo nano /etc/fail2ban/jail.d/mediawiki-http.conf
[mediawiki-http]
enabled=true
filter = mediawiki-http
journalmatch =
backend      = polling
logpath  = %(apache_access_log)s
findtime = 20m
bantime = 4h
maxretry = 4
port = http,https
# Créer le fichier /etc/fail2ban/filter.d/mediawiki-http.conf
sudo nano /etc/fail2ban/filter.d/mediawiki-http.conf
[Definition]
failregex = # Surveiller la connexion et la création de compte pour Mediawiki.
            ^<HOST> - .* /index.php.*Connexion
            ^<HOST> - .* /index.php.*er_un_compte
ignoreregex =
# Cette expression régulière permet de détecter une attaque sur la création de compte mediawiki en surveillant les requêtes sur certains fichiers ou dossiers existants.

Règle anti botscan sur les failles connues de ThinkPHP

# Vérifier la regex de cette règle lors du prochain affichage d'une attaque contre ThinkPHP !
# Créer le fichier /etc/fail2ban/jail.d/thinkphp.conf
sudo nano /etc/fail2ban/jail.d/thinkphp.conf
[thinkphp]
enabled = true
port = 80,443
protocol = tcp
filter = thinkphp
logpath = /var/log/apache2/*access.log
maxretry = 1
findtime = 30m
# Bantime: 1 semaine
bantime  = 604800
# Créer le fichier /etc/fail2ban/filter.d/thinkphp.conf
sudo nano /etc/fail2ban/filter.d/thinkphp.conf
[Definition]
failregex = .*:(80|443) <HOST> .*(POST|PUT|GET) .*/TP/index.php
            .*:(80|443) <HOST> .*(POST|PUT|GET) .*/TP/html/public/index.php
            .*:(80|443) <HOST> .*(POST|PUT|GET) .*/TP/public/index.php
            .*:(80|443) <HOST> .*(POST|PUT|GET) .*/html/public/index.php
            .*:(80|443) <HOST> .*(POST|PUT|GET) .*/thinkphp/html/public/index.php
            .*:(80|443) <HOST> .*(POST|PUT|GET) .*/thinkphp/public/index.php
# Cette expression régulière permet de détecter une attaque en surveillant les requêtes POST PUT GET sur les URL fréquemment attaquées du CMS ThinkPHP.

Règle d'authentification web anti Brute Force Wordpress

# Créer le fichier /etc/fail2ban/jail.d/wordpress-auth.conf
sudo nano /etc/fail2ban/jail.d/wordpress-auth.conf
[wordpress-auth]
enabled = true
maxretry = 3
findtime = 3h
bantime = 12h
filter = wordpress-auth
port = 80,443
logpath = /var/log/apache2/*access.log
# Créer le fichier /etc/fail2ban/filter.d/wordpress-auth.conf
sudo nano /etc/fail2ban/filter.d/wordpress-auth.conf
[Definition]
failregex = ^<HOST> -.*POST /wp-login.php HTTP.*
            ^<HOST> -.*PUT /wp-login.php HTTP.*
            ^<HOST> -.*GET /wp-login.php HTTP.*
            ^<HOST> -.*POST /wp-admin HTTP.*
            ^<HOST> -.*PUT /wp-admin HTTP.*
            ^<HOST> -.*GET /wp-admin HTTP.*
# Cette expression régulière permet de détecter une attaque en surveillant les requêtes POST PUT GET sur l'URL wp-login.php.
# Une connexion depuis le formulaire du site, depuis le navigateur, est une connexion POST. 2 tentatives entraînent le ban du client.
# Les requêtes sur xmlrpc.php sont exclues depuis la règle anti bot scann : /etc/fail2ban/jail.d/botscan-http.conf

Règle apache-fakegooglebot

# La prison apache-fakegooglebot est chargée depuis le fichier /etc/fail2ban/jail.d/apache-fakegooglebot :
[apache-fakegooglebot]
enabled = true
port     = http,https
logpath  = %(apache_access_log)s
maxretry = 1
ignorecommand = %(ignorecommands_dir)s/apache-fakegooglebot <ip>
backend = polling
journalmatch =
# Modifier le filtre :
sudo nano /etc/fail2ban/filter.d/apache-fakegooglebot
# Fail2Ban filter for fake Googlebot User Agents

[Definition]

failregex = ^\s*<HOST> \S+ \S+(?: \S+)?\s+\S+ "[A-Z]+ /\S* [^"]*" \d+ \d+ \"[^"]*\" "[^"]*\bGooglebot/[^"]*"

ignoreregex =

datepattern = ^[^\[]*(\[{DATE}\s*\])
              {^LN-BEG}

# DEV Notes:
#
# Author: Lee Clemens
# Thanks: Johannes B. Ullrich, Ph.D.
# Reference: https://isc.sans.edu/forums/diary/When+Google+isnt+Google/15968/
# Compléter le script dans le dossier ignorecommands :
sudo nano /etc/fail2ban/filter.d/ignorecommands/apache-fakegooglebot
#!/usr/bin/env fail2ban-python
# Inspired by https://isc.sans.edu/forums/diary/When+Google+isnt+Google/15968/
#
# Written in Python to reuse built-in Python batteries and not depend on
# presence of host and cut commands
#
import sys
from fail2ban.server.ipdns import DNSUtils, IPAddr

def process_args(argv):
    if len(argv) != 2:
       raise ValueError("Please provide a single IP as an argument. Got: %s\n"
                        % (argv[1:]))
    ip = argv[1]

    if not IPAddr(ip).isValid:
       raise ValueError("Argument must be a single valid IP. Got: %s\n"
                        % ip)
    return ip

google_ips = None

def is_googlebot(ip):
    import re

    host = DNSUtils.ipToName(ip)
    if not host or not re.match(r'.*\.google(bot)?\.com$', host):
       return False
    host_ips = DNSUtils.dnsToIp(host)
    return (ip in host_ips)

if __name__ == '__main__': # pragma: no cover
    try:
      ret = is_googlebot(process_args(sys.argv))
    except ValueError as e:
      sys.stderr.write(str(e))
      sys.exit(2)
    sys.exit(0 if ret else 1)
# Erreur rencontrée dans les logs suite à la montée en version de Debian Buster vers Debian Bullseye :
ERROR   7f2a5ca26c60 -- stderr: "iptables: /usr/local/lib/libnftnl.so.11: version `LIBNFTNL_13' not found (required by iptables)"
# Tenter de sauvegarder les règles de Iptables affiche le même message d'erreur :
sudo iptables-save > iptables-2021.rules
iptables-save: /usr/local/lib/libnftnl.so.11: version `LIBNFTNL_13' not found (required by iptables-save)

# Il faut donc, soit mettre à jour la dernière version de Iptables, soit changer de Firewall et utiliser nftables.
# Suite à la réinstallation de Iptables, je ne rencontre plus le message d'erreur concernant la librairie.
# Certaines règles personnalisées de Fail2ban sont à modifier suite à la montée en version de Fail2ban.
# Lire les détails de la montée en version de Fail2ban : most /usr/share/doc/fail2ban/changelog.gz
# Consulter les filtres actuels de Fail2ban depuis le dépôt officiel du projet Fail2ban sur Github : https://github.com/fail2ban/fail2ban/blob/master/config/jail.conf
# Nouvelle erreur rencontrée : stderr: '/bin/sh: 1: /etc/fail2ban/filter.d/ignorecommands/apache-fakegooglebot: Permission denied'
# Issue ouverte sur Github : https://github.com/fail2ban/fail2ban/issues/3106
# Appliquer le droit utilisateur exécutable avec chmod u+x sur le script apache-fakegooglebot du dossier ignorecommands pour résoudre l'erreur.
# Le chmod 755 est le chmod par défaut et permet également de résoudre l'erreur. 744 fonctionnerait également.
# J'avais supprimé le fichier, qui avait été recréé avec les droits 644. Il manquait le droit d'exécution.
sudo chmod 755 /etc/fail2ban/filter.d/ignorecommands/apache-fakegooglebot

Règle apache-dosevasive

# Créer le fichier /etc/fail2ban/jail.d/apache-dosevasive.conf
sudo nano /etc/fail2ban/jail.d/apache-dosevasive.conf
[apache-dosevasive]
enabled = true
filter  = apache-dosevasive
action = iptables-allports[name=apache-dosevasive]
#logpath = /var/log/ispconfig/httpd/*/error*
logpath = /var/log/apache*/*error.log
bantime = 1h
maxretry = 3
findtime = 30m
# Créer le fichier /etc/fail2ban/filter.d/apache-dosevasive.conf
sudo nano /etc/fail2ban/filter.d/apache-dosevasive.conf
[Definition]
failregex =  \[client <HOST>:[0-9]+\] .*client denied by server configuration
ignoreregex =
# Cette expression régulière permet de détecter une attaque en surveillant les erreurs "client denied by server configuration" dans /var/log/apache2/error.log.

Règle http-404

# Créer le fichier /etc/fail2ban/jail.d/http-404.conf
sudo nano /etc/fail2ban/jail.d/http-404.conf
[http-404]
enabled = true
filter  = http-404
action = iptables-allports[name=http-404]
logpath = /var/log/apache*/*access.log
bantime = 2h
maxretry = 5
findtime = 60m
# Créer le fichier /etc/fail2ban/filter.d/http-404.conf
sudo nano /etc/fail2ban/filter.d/http-404.conf
# Regex pour matcher avec les erreurs 404 :
[Definition]
failregex = ^<HOST> -.*"(GET|POST|HEAD).*HTTP\/1\.(0|1)" 404 [\d]{3} .*$
ignoreregex =
# Cette expression régulière permet de limiter un scan qui entraînerait de trop nombreuses erreurs 404 dans /var/log/apache2/*access.log.
//
Peut être adaptée pour traiter le code 301 :
Les erreurs 301 ou 404 sont uniquement liées à une URL non existante qui pourrait être généré en cas d'énumération.
#Créer le fichier /etc/fail2ban/jail.d/bot-enum.conf
[bot-enum]
enabled=true
filter = bot-enum
logpath = /var/log/nginx/access.log
findtime = 300
bantime = 7200
maxretry = 10
port = http,https

# Créer le fichier /etc/fail2ban/filter.d/bot-enum.conf
[Definition]
failregex = ^<HOST> - .*(301|404) .*
Au bout de 10 erreurs 301 ou 404 en 5 minutes, l'IP sera bloqué 2 heures.

Règle d'authentification web anti botscan

# Créer le fichier /etc/fail2ban/jail.d/botscan-http.conf
sudo nano /etc/fail2ban/jail.d/botscan-http.conf
[botscan-http]
enabled=true
filter = botscan-http
journalmatch =
backend      = polling
logpath  = %(apache_access_log)s
findtime = 30m
bantime = 18h
maxretry = 3
port = http,https
# Créer le fichier /etc/fail2ban/filter.d/botscan-http.conf
sudo nano /etc/fail2ban/filter.d/botscan-http.conf
[Definition]
# Filtre pour identifier les tentatives d'accès sur les URLs interdites aux personnes non autorisées :
# Vérifier si le mot clé xmlrpc.php match bien dans les logs suite à une consultation d'un site WordPress/xmlrpc\.php
badbot = myadmin|phpadmin|bdd|sql|webdb|wp-login\.php|soapCaller|manager|setup\.php|pma|status|admin\.php|phpmyadmin\.php|pma\.php|PMA|phpmyadmin|myadmin|mysql|mysqladmin|sqladmin|mypma|admin|xampp|mysqldb|mydb|db|pmadb|phpmyadmin1|phpmyadmin2|administrator|database|sql|phpMyAdmin|MyAdmin|dbadmin|php-myadmin|phpmy-admin|phpmyAdmin|xmlrpc\.php

failregex = ^(?i)<HOST> .* "(GET|POST|PUT|HEAD) .*(%(badbot)s).* HTTP.*" (403|404) .*$
# La regex suivante peut être adaptée avec un nouveau jail pour identifier les pages 403 et les pages 404.
# Regex complémentaire pour identifier les utilisateurs qui GET POST HEAD et tombent sur une page 403 ou 404 :
#            ^(?i)<HOST> .* "(GET|POST|HEAD) / HTTP.*" (403|404) .*$

# Bloquer le visiteur en cas de correspondance du mot clé. Trop restrictif !
#failregex = ^<HOST> -.*phpmyadmin.*$

ignoreregex =
# Cette expression régulière permet de détecter une attaque botscan en surveillant les requêtes sur certains fichiers ou dossiers existants.

Règle d'authentification apache-pma

# Créer le fichier /etc/fail2ban/jail.d/apache-pma.conf
sudo nano /etc/fail2ban/jail.d/apache-pma.conf
[apache-pma]
enabled      = true
filter = apache-pma
maxretry     = 1
journalmatch =
backend      = polling
logpath      = %(apache_error_log)s
findtime     = 30m
bantime      = 18h
port = http,https
# Créer le fichier /etc/fail2ban/filter.d/apache-pma.conf
sudo nano /etc/fail2ban/filter.d/apache-pma.conf
[Definition]
# Regex sans erreur mais vérifier si elle match réellement !
failregex = ^<HOST> -.*(GET|POST).*/phpmyadmin/index\.php?pma_username=root&pma_password=.*$
ignoreregex =
# Cette expression régulière permet de détecter une attaque pma (Pour PHPMyAdmin) en surveillant les requêtes sur certains fichiers ou dossiers qui n'existent pas.
Source de la regex d'origine : https://www.lntn203.com/wiki/doku.php/linux/fail2ban/fail2ban-phpmyadmin-filter

Règle d'authentification apache-w00tw00t

# Créer le fichier /etc/fail2ban/jail.d/apache-w00tw00t.conf :
sudo nano /etc/fail2ban/jail.d/apache-w00tw00t.conf
[apache-w00tw00t]
enabled      = true
filter = apache-w00tw00t
maxretry     = 1
journalmatch =
backend      = polling
logpath      = %(apache_access_log)s
findtime     = 3h
bantime      = 24h
# Créer le fichier /etc/fail2ban/filter.d/apache-w00tw00t.conf :
sudo nano /etc/fail2ban/filter.d/apache-w00tw00t.conf
[Definition]
# Option:  failregex
# Notes.:  regex to match the w00tw00t scan messages in the logfile. The
#          host must be matched by a group named "host". The tag "<HOST>" can
#          be used for standard IP/hostname matching.
# Values:  TEXT
failregex = ^<HOST> -.*"GET \/w00tw00t\.at\.ISC\.SANS\.DFind\:\).*".*

# Option:  ignoreregex
# Notes.:  regex to ignore. If this regex matches, the line is ignored.
# Values:  TEXT
ignoreregex =
# Cette expression régulière permet de détecter une attaque w00tw00t en surveillant le fichier de log access.log de Apache2.

Règle d'authentification des erreurs 401 de Nginx nginx-unauthorized

# Détecter les tentatives de connexion infructueuses qui renvoient une erreur 401 sur Nginx.
# Ajouter le jail nginx-unauthorized.conf :
sudo nano /etc/fail2ban/jail.d/nginx-unauthorized.conf

# Bloquer l'utilisateur pour 5 minutes après 5 tentatives en 2 minutes :
[nginx-unauthorized]
enabled = true
# si le filtre possède la même nom que la règle, il n'est pas nécessaire de le renseigner
filter = nginx-unauthorized
port = 80,443 # tous les ports par défaut
logpath = /var/log/nginx/access.log
maxretry = 5
findtime = 120
bantime = 300
# Ajouter le filtre nginx-unauthorized :
sudo nano /etc/fail2ban/filter.d/nginx-unauthorized

# Fail2Ban filter for unauthorized
[Definition]
failregex =  - - \[.*\] ".*" 401
ignoreregex =

A tester - Interdire la navigation via l'adresse IP du serveur

# Pas certain que cette règle fonctionne.
# Entre temps, ma configuration VirtualHost redirige vers un site internet principale, au lieu de servir une page erreur 403.
# La règle reste en place malgré tout.
# Depuis la configuration de Virtualhost :
L'accès au serveur par IP est limité sur le port 80.
Par contre, je n'ai pas réussi à limiter l'accès par IP sur le port 443.
# Éditer le fichier jail.local pour ajouter la nouvelle règle :
sudo nano /etc/fail2ban/jail.local
# Mieux encore, ajouter cette configuration directement dans le dossier /etc/fail2ban/jail.d/
sudo nano apache-ipserveur.conf
# Ajouter à la fin du fichier les lignes suivantes :
[apache-ipserveur]
enabled = true
port    = http,https
filter  = apache-ipserveur
logpath = /var/log/apache2/ip-error.log
maxretry = 1
banTime = 3h
# Ajouter le filtre de détection en créant le fichier suivant :
sudo nano /etc/fail2ban/filter.d/apache-ipserveur.conf
Cette règle ne travail pas mais certainement à cause des points de l'adresse ip dans le path de la regex. A suivre !
[Definition]
failregex = [[]client []] client denied by server configuration: /var/www/139.99.173.195/.*
ignoreregex=
# Que je modifie en :
[Definition]
failregex = ^[[][^]]+[]] [[]error[]] [[]client <HOST>[]] client denied by server configuration: /var/www/139.99.173.195/.*
# [[]client []] denied by server configuration: /var/www/139.99.173.195/.*
ignoreregex=
# Redémarrer Fail2Ban et consulter les logs pour voir quelle sera la première adresse IP à tenter la connexion directement sur l'adresse IP du serveur :
sudo systemctl restart fail2ban && tail -f -n 30 /var/log/fail2ban.log
# Depuis Tor Browser :
# Premier essai :
2020-02-10 01:53:17,247 fail2ban.filter         [8373]: INFO    [apache-auth] Found 18.27.197.252 - 2020-02-10 01:53:16
2020-02-10 01:53:27,468 fail2ban.filter         [8373]: INFO    [apache-auth] Found 18.27.197.252 - 2020-02-10 01:53:27
2020-02-10 01:53:51,713 fail2ban.filter         [8373]: INFO    [apache-auth] Found 18.27.197.252 - 2020-02-10 01:53:51
2020-02-10 01:53:52,458 fail2ban.actions        [8373]: NOTICE  [apache-auth] Ban 18.27.197.252
# L'adresse IP est bloquée au bout du troisième essai.
# Ça ne semble pas correspondre à un maxretry de 1.
# Passé 1 minute, l'adresse est toujours bloquée.
# Ça ne semble pas correspondre à un banTime = 60.
# Actuellement, la consultation du serveur via son adresse IP directement sur le port http va entraîner le blocage de l'adresse IP cliente lors du 3ème essai.
# Ce sont les options globales qui sont appliquées, 3 essais, et pas 1, et, le temps de ban est global.
# Attention :
# Si l'adresse IP est bien bloquée au bout de 3 essais, le jail apache-ipserveur ne semble pas exister !
sudo /usr/bin/fail2ban-client status apache-ipserveur
NOK: ('apache-ipserveur',)
Sorry but the jail 'apache-ipserveur' does not exist
####################################################
# Activer la règle apache-ipserveur :
sudo nano /etc/fail2ban/jail.d/defaults-debian.conf
[apache-ipserveur]
enabled = true
# Éditer le fichier jail.local pour ajouter la nouvelle règle.
sudo nano /etc/fail2ban/jail.local
# Interdire l'accès par l'ip du serveur :
[apache-ipserveur]
port    = http
filter  = apache-ipserveur
logpath = /var/log/apache*/*error.log
#          /var/log/fail2ban.log
maxretry     = 1
banTime = 1m
# Cette fois, je retrouve bien le jail apache-ipserveur comme étant activé et les informations sont bien affichées comme étant chargées avec les paramètres en surcharge.
# J'ai également ajouté une ligne complémentaire pour écouter un autre fichier de log, mais, ça semble facultatif ici voir inutile.
# Pourtant, les configurations maxretry et banTime ne sont toujours pas respectées.
# Bien que mes essais sur Tor Browser indiquent que les IP du client sont bannies après la 3ème tentative de connexion HTTP sur l'adresse IP du serveur, je ne retrouve pas les bans dans les status :
sudo /usr/bin/fail2ban-client status apache-ipserveur
Status for the jail: apache-ipserveur
|- Filter
|  |- Currently failed:	0
|  |- Total failed:	0
|  `- File list:	/var/log/apache2/error.log /var/log/apache2/redmine.error.log
`- Actions
   |- Currently banned:	0
   |- Total banned:	0
   `- Banned IP list:
# En regardant les logs, je me rend compte que c'est le jail apache-auth qui travail.
# En affichant le statut de apache-auth, on retrouve l'adresse IP du client ayant tenté de se connecté à l'adresse IP du serveur par HTTP :
sudo /usr/bin/fail2ban-client status apache-auth
Status for the jail: apache-auth
|- Filter
|  |- Currently failed:	1
|  |- Total failed:	17
|  `- File list:	/var/log/apache2/error.log /var/log/apache2/redmine.error.log
`- Actions
   |- Currently banned:	11
   |- Total banned:	11
   `- Banned IP list:	185.117.215.9 185.220.101.76 192.99.10.170 192.99.6.138 5.196.87.174 85.208.96.14 185.220.101.47 185.220.100.246 158.69.243.138 77.247.181.162 178.17.171.110
# Reste à voir pourquoi ce n'est pas apache-ipserveur qui travail !
Changer la directive du VHOST IPSERVEUR avec la bonne URL 403 car avec la configuration précédente, c'était le chemin /var/www/site1 qui est utilisé et pas /var/www/IP
Malgré tout, c'est toujours apache-auth qui travail.

Fail2ban et Dovecot

Dovecot est un serveur IMAP et POP3 pour les systèmes d'exploitation Unix et dérivés, conçu avec comme premier but la sécurité.
La procédure de A à Z : ça devrait être bon ! : www.how-to.ovh/viewtopic.php?t=19
Un lien pour aider a paramétrer 2 fichier pour fail2ban pour dovecot : wiki2.dovecot.org/HowTo/Fail2Ban
richardjh.org/blog/blocking-brute-force-attacks-dovecot-centos.php

Fail2ban et Iptables

# Avec mon installation, je n'ai pas eu besoin de créer une règle spécifique pour Iptables.
# Vérifier si il est nécessaire et comment configurer Iptables avec Fail2ban :
 Sécurisation du serveur (SSH, firewall iptables, fail2ban...) : https://www.alsacreations.com/tuto/lire/622-Securite-firewall-iptables.html
# Cette commande ne me retourne rien, mais, les prisons fonctionnent correctement.
# Par défaut, le port 22 (SSH) est surveillé, vous pouvez vérifier que les règles Iptables ont bien pris en compte fail2ban :
iptables -S | grep fail2ban
-A INPUT -p tcp -m multiport --dports 22 -j fail2ban-ssh 
-A fail2ban-ssh -j RETURN

Fail2ban et nftables

# Ajouter ces lignes dans jail.local :
[DEFAULT]
banaction = nftables-multiport
banaction_allports = nftables-allports

Erreurs rencontrées

Arrêts des jails aléatoires

# Pourquoi les jails s'arrêtent et redémarrent, aléatoirement ?
# En général, cela est du aux rotations de logs, qui peuvent être également optimisées.

Rendu graphique des actions de fail2ban avec Munin

Source : https://www.thorandco.fr/?p=366

Bibliographie

Documentation officielle

 Le wiki officiel de Fail2ban : http://www.fail2ban.org/wiki/index.php/Main_Page (Ne semble pas avoir été mis à jour depuis plus de 3 ans.)
 Le wiki officiel de Fail2ban - Les commandes de Fail2ban : https://www.fail2ban.org/wiki/index.php/Commands
 Le wiki du Github officiel de Fail2ban : https://github.com/fail2ban/fail2ban/wiki
 Le Github officiel de Fail2ban : https://github.com/fail2ban/fail2ban

Documentation Ubuntu

 Fail2ban : https://doc.ubuntu-fr.org/fail2ban

Documentation Fedora

 SSH : Se protéger des attaques avec fail2ban : https://doc.fedora-fr.org/wiki/SSH_:_Se_prot%c3%a9ger_des_attaques_avec_fail2ban

Documentation Debian

 Fail2ban : https://wiki.debian-fr.xyz/Fail2ban

Tutoriels non officiels

 Protéger Apache2 avec fail2ban : https://www.tartarefr.eu/proteger-apache-avec-fail2ban/
 Optimiser les filtres Fail2Ban : https://www.the-art-of-web.com/system/fail2ban-filters/
 Fail2ban : https://buzut.net/installer-et-parametrer-fail2ban/

Règles complémentaires

 Setting up your firewall with fail2ban : https://notes.sagredo.eu/en/qmail-notes-185/setting-up-your-firewall-with-fail2ban-170.html
 Bannir définitivement les IP bannies fréquemment par Fail2ban : https://www.cybernaute.ch/bannir-definitivement-ip-bannies-frequemment-fail2ban/

Autres tutoriels

 How Fail2Ban Works to Protect Services on a Linux Server : https://www.digitalocean.com/community/tutorials/how-fail2ban-works-to-protect-services-on-a-linux-server
 Filtres et actions personnalisés dans Fail2ban : https://www.it-connect.fr/filtres-et-actions-personnalises-dans-fail2ban/#IV_Creation_dune_action_personnalisee
 Source : https://forums.archlinux.fr/viewtopic.php?t=16398
 Source : https://reseau.developpez.com/tutoriels/fail2ban/

Alternatives à Fail2ban

 Pyruse Pyruse est une alternative légère à fail2ban qui utilise systemd-journal : https://yalis.fr/git/yves/pyruse/
 Tallow Tallow est une alternative légère à fail2ban qui utilise systemd-journal : https://github.com/clearlinux/tallow

Complémentaire à Fail2ban

 Iplists : https://iplists.firehol.org/#aboutCollapseThree%E2%80%A6
 Les pénibles sur liste noire : https://blognote32.net/iptables-ip-blacklist/

NAVIGATION

PARTICIPER ET PARTAGER

Bienvenue sur le wiki de Amis SH.
De nombreuses pages sont partagées sur ce wiki.
Créer un compte utilisateur pour participer sur le wiki.
Les pages présentées sur le wiki évoluent tous les jours.
Certaines recherches sont peu abouties et incluent des erreurs.
Utiliser la recherche interne du wiki pour trouver votre contenu.
La page de discussion de Amis SH vous permet de poser vos questions.
Consulter le site amis-sh.fr pour installer votre propre serveur web.
Améliorer le contenu des pages avec vos retours depuis l'onglet discussion.
Ce contenu ne doit pas servir à nuire à autrui ou à un système informatique.
Protéger votre système Linux ou Windows avec cette page dédiée à la sécurité.

SOUTENIR CE WIKI

Soutenir le wiki avec un don en monnaie numérique :
AEON - Bitcoins - Bitcoins Cash - Bitcoins Gold - Bitcore - Blackcoins - Basic Attention Token - Bytecoins - Clams - Dash - Monero - Dogecoins - Ğ1 - Ethereum - Ethereum Classique - Litecoins - Potcoins - Solarcoins - Zcash

OBTENIR DE LA MONNAIE NUMERIQUE

Obtenir gratuitement de la monnaie numérique :
Miner de la cryptomonnaie.