L'outil Fail2ban permet de bannir pendant un certain temps des adresses IP qui ont essayé plusieurs fois de suite, sans succès, de s'authentifier à l'un ou l'autre des services réseau installés sur le serveur ou bien tentées d'exploiter une faille repérée par le module "mod_security" d'Apache par exemple.
Fail2ban a été installé par le script d'installation de la solution iRedMail avec des règles prédéfinies qui se trouvent dans le dossier "/etc/fail2ban/jail.d" sous la forme de fichiers se terminant par l'extension ".local".
Défense du serveur Apache
On va se baser sur ces fichiers pour créer de nouvelles règles pour protéger notre serveur Apache des attaques. On va commencer par copier l'ensemble des sections concernant Apache qui apparaissent dans le fichier "/etc/fail2ban/jail.conf" dans un nouveau fichier nommé "/etc/fail2ban/jail.d/apache.conf". A noter qu'il faut ajouter la ligne "enabled = true" pour chaque section afin que la règle associée soit prise en compte.
On peut augmenter la valeur de la variable "bantime" (le temps de banissement d'une IP) soit de façon générale en modifiant la variable qui apparait dans le fichier "/etc/fail2ban/jail.local", soit individuellement en écrivant explicitement la variable et sa valeur sous chaque service.
On pourra également, de la même façon, modifier la valeur de "maxretry" (le nombre maximal d'essais infructueux autorisés avant bannissement) et "findtime" (l'intervalle de temps durant lequel on comptabilise les essais infructueux consécutifs par une même adresse IP).
Suivant cela, voici à quoi peut ressembler notre nouveau fichier "/etc/fail2ban/jail.d/apache.conf" :
[apache-auth] backend = polling journalmatch= enabled = true filter = apache-auth logpath = /var/log/apache2/error.log action = nftables-multiport[name=apache-auth, port="80,443,25,587,465,110,995,143,993,4190", protocol=tcp] banned_db[name=apache-auth, port="80,443,25,587,465,110,995,143,993,4190", protocol=tcp] findtime = 1h bantime = 120h maxretry = 2 [apache-noscript] backend = polling journalmatch= enabled = true filter = apache-noscript logpath = /var/log/apache2/error.log action = nftables-multiport[name=apache-noscript, port="80,443,25,587,465,110,995,143,993,4190", protocol=tcp] banned_db[name=apache-noscript, port="80,443,25,587,465,110,995,143,993,4190", protocol=tcp] findtime = 1h bantime = 120h maxretry = 2 [apache-overflows] backend = polling journalmatch= enabled = true filter = apache-overflows logpath = /var/log/apache2/error.log action = nftables-multiport[name=apache-overflows, port="80,443,25,587,465,110,995,143,993,4190", protocol=tcp] banned_db[name=apache-overflows, port="80,443,25,587,465,110,995,143,993,4190", protocol=tcp] maxretry = 2 [apache-nohome] backend = polling journalmatch= enabled = true filter = apache-nohome logpath = /var/log/apache2/error.log action = nftables-multiport[name=apache-nohome, port="80,443,25,587,465,110,995,143,993,4190", protocol=tcp] banned_db[name=apache-nohome, port="80,443,25,587,465,110,995,143,993,4190", protocol=tcp] maxretry = 2 [apache-botsearch] backend = polling journalmatch= enabled = true filter = apache-botsearch logpath = /var/log/apache2/error.log action = nftables-multiport[name=apache-botsearch, port="80,443,25,587,465,110,995,143,993,4190", protocol=tcp] banned_db[name=apache-botsearch, port="80,443,25,587,465,110,995,143,993,4190", protocol=tcp] maxretry = 2 [apache-modsecurity] backend = polling journalmatch= enabled = true filter = apache-modsecurity logpath = /var/log/apache2/error.log action = nftables-multiport[name=apache-modsecurity, port="80,443,25,587,465,110,995,143,993,4190", protocol=tcp] banned_db[name=apache-modsecurity, port="80,443,25,587,465,110,995,143,993,4190", protocol=tcp] maxretry = 2 [apache-shellshock] backend = polling journalmatch= enabled = true filter = apache-shellshock logpath = /var/log/apache2/error.log action = nftables-multiport[name=apache-shellshock, port="80,443,25,587,465,110,995,143,993,4190", protocol=tcp] banned_db[name=apache-shellshock, port="80,443,25,587,465,110,995,143,993,4190", protocol=tcp] maxretry = 1
On redémarre Fail2ban en exécutant la commande suivante (vérifier les erreurs éventuellement rencontrées en regardant dans le fichier "/var/log/syslog") :
# sudo systemctl restart fail2ban
Défense du serveur Nginx
On crée le fichier "/etc/fail2ban/filter.d/nginx-403.conf" dans lequel on met le contenu suivant :
[Definition] failregex = <HOST> -.*"(GET|POST).*HTTP/[0-9]+(.[0-9]+)?" 403 .*
On crée ensuite le fichier "/etc/fail2ban/filter.d/nginx-404.conf" dans lequel on met ce contenu :
[Definition] failregex = <HOST> -.*"(GET|POST).*HTTP/[0-9]+(.[0-9]+)?" 404 .*
Et enfin, on crée le fichier "/etc/fail2ban/filter.d/nginx-429.conf" dans lequel on met le contenu ci-dessous :
[Definition] failregex = <HOST> -.*"(GET|POST).*HTTP/[0-9]+(.[0-9]+)?" 429 .*
Pour finir, on crée le fichier "/etc/fail2ban/jail.d/nginx-4xx.conf" avec le contenu suivant qui va entre autre bloquer les connexions qui ont engendré 3 fois de suite une erreur HTTP 403 (accès refusé) en une heure, 7 fois une erreur 404 (page non trouvée) en 15 minutes et 10 fois une erreur 429 (nombre de connexions trop élevé) en une heure :
[nginx-403] backend = polling journalmatch= enabled = true filter = nginx-403 logpath = /var/log/nginx/access.log action = nftables-multiport[name=nginx-403, port="80,443,25,587,465,110,995,143,993,4190", protocol=tcp] banned_db[name=nginx-403, port="80,443,25,587,465,110,995,143,993,4190", protocol=tcp] findtime = 1h bantime = 120h maxretry = 3 [nginx-404] backend = polling journalmatch= enabled = true filter = nginx-404 logpath = /var/log/nginx/access.log action = nftables-multiport[name=nginx-404, port="80,443,25,587,465,110,995,143,993,4190", protocol=tcp] banned_db[name=nginx-404, port="80,443,25,587,465,110,995,143,993,4190", protocol=tcp] findtime = 15m bantime = 120h maxretry = 7 [nginx-429] backend = polling journalmatch= enabled = true filter = nginx-429 logpath = /var/log/nginx/access.log action = nftables-multiport[name=nginx-429, port="80,443,25,587,465,110,995,143,993,4190", protocol=tcp] banned_db[name=nginx-429, port="80,443,25,587,465,110,995,143,993,4190", protocol=tcp] findtime = 1h bantime = 120h maxretry = 10
On n'oublie pas de redémarrer Fail2ban :
# sudo systemctl reload fail2ban
Commentaires