FAIL2BAN

FAIL2BAN jmv

Fail2Ban est un moyen de défense contre les attaques par déni de service (Denial of Service ou "DoS").

Dans le cas qui nous occupe, il s'agit de protéger le site Web du club Linux Gatineau qui s'est mis à cesser de répondre à intervalles irréguliers pendant quelques mois. Je recevais constamment des courriels de Jean-François qui me disait être incapable d'accéder au site, et des textos de ma conjointe qui me disait qu'elle n'arrivait pas à faire afficher la page de connexion du webmail de Securinux. Les deux sites sont hébergés sur le même serveur. Pourtant, quand je vérifiais l'état du serveur, ça me disait qu'il était démarré (Started). J'avais beau chercher dans les journaux d'erreurs d'Apache, je ne trouvais rien. Je redémarrais le service et tout se remettait à fonctionner... jusqu'à ce que le serveur retombe.

C'est à force de faire des recherches sur Internet que j'ai fini par trouver le bobo. Dans un quelconque forum, quelqu'un parlait de nombreuses requêtes faites à son serveur, ce qui m'a fait penser de regarder non pas les journaux d'erreurs du serveur, mais bien les journaux d'accès. Et c'est là que j'ai constaté (avec horreur) que le serveur était victime d'attaques provenant de plusieurs adresses à la fois. Les lignes défilaient à l'écran à une vitesse phénoménale (plus d'une dizaine à la seconde).

Selon Wikipedia :

"Une attaque par déni de service (denial of service attack, d'où l'abréviation DoS) est une attaque informatique ayant pour but de rendre indisponible un service, d'empêcher les utilisateurs légitimes d'un service de l'utiliser. Il peut s'agir de :

L'attaque par déni de service peut ainsi bloquer un serveur de fichiers, rendre impossible l'accès à un serveur web ou empêcher la distribution de courriel dans une entreprise."

Configuration

Configuration jmv

Fail2Ban fait partie du dépôt de la grande majorité des distributions. Il s'installe donc avec tous les apt-get, yum, pacman et emerge de ce monde.

Configuration

  • Fail2Ban fonctionne à l'aide de "prisons"  (jails). 
  • Chaque service (web, courriel, etc.)  a sa propre prison.
  • Toute la configuration se trouve sous /etc/fail2ban/
  • En général, l'installation comprend par défaut un fichier jail.conf pour lequel seule la "prison ssh" est activée (désactivée dans le cas qui nous occupe, parce qu'il n'y a pas d'attaque contre ce service)
  • Certains recommandent d'en faire une copie (jail.local, que fail2ban pourrra lire), d'autres conseillent de créer ses propres fichiers dans le répertoire jail.d, ce que j'ai fait en partie.

Jail.conf

Contient les paramètres par défaut et les prisons que l'on veut activer :

  • ignoreip -> la boucle locale (127.0.0.1) et les autres adresses du réseau local ou des sous-réseaux
  • bantime -> la période de temps, en secondes, durant laquelle l'adresse IP offensante sera bannie. Dans ce cas-ci, il est à 86 400 secondes, soit 24h. Ce paramètre peut être modifié dans les prisons individuelles, qui ont préséance.
  • findtime -> la période de temps, en secondes, durant laquelle le nombre de "maxretry" établi aura été atteint.
  • maxretry -> le nombre de fois que l'adresse IP offensante aura tenté une action sur le serveur

Je n'ai rien changé au reste, si ce n'est l'activation de la prison Postfix pour le courriel

Configuration (suite)

Configuration (suite) jmv

filter.d/

Ce répertoire est rempli de filtres pour des services de toutes sortes, surtout pour Apache, le serveur Web.

  • Je n'ai rien trouvé qui me satisfaisait dans ce répertoire, étant donné que la majorité des attaques se faisaient au moyen de la requête "POST  / xmlrpc.php HTTP/1.1" qui sert à faire des modifications dans les pages du site à l'aide du courriel
  • Ces requêtes ne génèrent aucun message d'erreur.
  • La majorité des filtres préétablis s'appliquent aux messages d'erreur.
  • J'ai donc décidé de créer mon propre filtre pour Apache.
  • Après de nombreux essais et erreurs (je ne suis pas un spécialiste des expressions régulières), je suis arrivé à ceci :

failregex = ^<HOST>.*"POST /xmlrpc.php HTTP.*
            ^<HOST>.*"GET / .*

J'ai utilisé un fichier existant, j'ai remplacé le contenu de la définition par ce qui précède et je l'ai nommé apache-post.conf.

jail.d/

Au départ, ce répertoire est vide, du moins dans le cas de la distribution Gentoo. C'est dans ce répertoire que j'ai créé le fichier apache.conf :


[apache-post-clg]
enabled = true  (prison activée)
filter = apache-post (filter.d/apache-post.conf)
action = iptables[name=APACHE, port=http, protocol=tcp]
(action.d/iptables.conf) port = http,https logpath = /var/log/apache2/clo_access_log (le journal d'accès au serveur, et non pas le journal d'erreurs)
maxretry = 10 (nombre d'essais maximal)
findtime = 60 (période de temps durant laquelle le nombre d'essais sont effectués -- pourrait être plus courte)
bantime = 432000 (période de temps pendant laquelle l'adresse offensante sera bannie -- 5 jours)

[apache-post-securinux] enabled = true
filter = apache-post
action = iptables[name=APACHE, port=http, protocol=tcp] port = http,https]
logpath = /var/log/apache2/tux_access
log maxretry = 10
findtime = 60
bantime = 432000

 

Outils

Outils jmv

fail2ban-client a plusieurs fonctions, notamment celle de vérifier l'état des prisons avec l'option status :

fail2ban-client status nom-de-la-prison

Dans le cas du serveur du club, il n'y en a que quatre : postfix, sasl et apache-post-clg et apache-post-securinux

fail2ban-client a de nombreuses autres fonctions, dont celle de bannir un adresse IP immédiatement (fail2ban set <nom-de-la-prison> banip <adresse-ip-offensante>). Voir la page de manuel.

On peut aussi vérifier l'efficacité de la défense dans iptables

iptables -L