Sécuriser votre serveur avec Fail2Ban – Mise en œuvre de la protection contre les attaques de force brute basée sur X-Forwarded-For

Dans cet article, nous aborderons un sujet essentiel de la sécurité des systèmes : la mise en place de fail2ban, un outil open source qui aide à protéger votre serveur contre les attaques par force brute. En se concentrant sur une configuration spécifique, nous examinerons comment interdire les adresses IP en utilisant la valeur du header HTTP « X-Forwarded-For ». Cette méthode est particulièrement utile lorsque le serveur se trouve derrière un proxy ou un équilibreur de charge qui modifie l’adresse IP d’origine.

Prérequis

Pour suivre cet article, vous devez disposer d’un serveur Linux avec une installation de fail2ban. Vous devez également avoir des droits d’administrateur sur ce serveur. Si vous ne l’avez pas encore fait, installez fail2ban en utilisant le gestionnaire de paquets de votre système.

Création d’un nouveau filtre pour fail2ban

Les filtres de fail2ban sont définis dans le répertoire /etc/fail2ban/filter.d. Pour ce scénario, nous allons créer un nouveau fichier nommé listes-auth.conf. Ce fichier définira comment fail2ban identifie les tentatives d’authentification échouées dans vos fichiers de logs. Vous pouvez créer ce fichier à l’aide de votre éditeur de texte préféré, par exemple nano ou vim.

Le contenu du fichier listes-auth.conf devrait ressembler à ceci :

[INCLUDES]
before = common.conf

[Definition]
_daemon = wwsympa
_port = (?::\d+)?
_jailname = listes-auth
failregex = .*do_login.*\[session (?P<session>\d+)\].*\[client <HOST>\](.|\n)*Authentication failed$
ignoreregex =
maxlines = 6

[Init]
journalmatch = _SYSTEMD_UNIT=fail2ban.service PRIORITY=5

La partie importante ici est la ligne failregex, qui décrit une expression régulière qui identifie les tentatives de connexion échouées. Le symbole <HOST> dans cette expression régulière est utilisé par fail2ban pour identifier l’adresse IP de l’attaquant.

Configuration de la prison pour fail2ban

Ensuite, nous devons configurer une « prison » pour fail2ban. Une prison est une configuration qui utilise un filtre spécifique (défini précédemment) pour surveiller un fichier de log spécifique et exécuter une action spécifique en cas de détection de tentatives d’authentification échouées.

Ouvrez le fichier /etc/fail2ban/jail.local dans votre éditeur de texte préféré et ajoutez les lignes suivantes :

[listes-ten-min]
enabled = true
filter = listes-auth
logpath = /var/log/sympa/sympa.log
maxretry = 10
findtime = 10m
bantime = 30m
action = iptables[name=HTTP, port=http, protocol=tcp]
           iptables -I INPUT -p tcp --dport http -m string --string "X-Forwarded-For:" --algo bm -j DROP

Avec ces lignes, vous avez créé une prison nommée listes-ten-min qui utilise le filtre listes-auth pour surveiller le fichier /var/log/sympa/sympa.log. Si le filtre détecte 10 tentatives d’authentification échouées en 10 minutes, il déclenchera une action qui interdit l’adresse IP de l’attaquant pendant 30 minutes.

Modification du fichier de configuration Apache

Enfin, nous devons configurer notre serveur Apache pour qu’il enregistre correctement l’adresse IP d’origine, même si elle passe par un proxy. Pour ce faire, nous allons modifier le fichier /etc/httpd/conf.d/apache24_sympa.conf.

Ouvrez le fichier apache24_sympa.conf dans votre éditeur de texte préféré et ajoutez les lignes suivantes :

LogFormat "%t %h %l %u \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combine
LogFormat "%t %{X-Forwarded-For}i %l %u \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" proxy
SetEnvIf X-Forwarded-For "^.*\..*\..*\..*" forwarded
CustomLog "logs/access_log" combine env=!forwarded
CustomLog "logs/access_log" proxy env=forwarded
SetEnvIfNoCase X-Forwarded-For "^([^,]+)" REMOTE_HOST=$1
SetEnvIfNoCase REMOTE_HOST "^([^,]+)" REMOTE_ADDR=$1

Ces lignes définissent deux formats de log, un pour les requêtes qui passent par un proxy (et fournissent donc un en-tête X-Forwarded-For) et un autre pour les requêtes qui ne passent pas par un proxy.

Ces lignes de code sont des directives de configuration pour le serveur web Apache. Voyons chacune d’elles en détail :

  1. LogFormat "%t %h %l %u \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combine : Cette directive définit un format de journalisation personnalisé appelé « combine ». Les différentes parties du format correspondent à :
    • %t : Heure de la requête.
    • %h : Adresse IP de l’hôte distant.
    • %l : Identifiant distant (généralement - car cette information est rarement utilisée).
    • %u : Utilisateur distant (si disponible).
    • \"%r\" : La requête HTTP.
    • %>s : Le code de statut final que le serveur envoie à l’utilisateur.
    • %b : Taille de la réponse en octets.
    • \"%{Referer}i\" : La page de référence (Referer) de la requête HTTP.
    • \"%{User-Agent}i\" : L’agent utilisateur qui fait la requête.
  2. LogFormat "%t %{X-Forwarded-For}i %l %u \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" proxy : Similaire à la première directive, mais cette fois-ci, on utilise la valeur du header X-Forwarded-For à la place de l’adresse IP de l’hôte distant. C’est utile lorsque le serveur est derrière un proxy.
  3. SetEnvIf X-Forwarded-For "^.*\..*\..*\..*" forwarded : Cette directive définit une variable d’environnement appelée « forwarded » si le header HTTP X-Forwarded-For est présent.
  4. CustomLog "logs/access_log" combine env=!forwarded : Cette directive indique au serveur Apache d’utiliser le format de log « combine » pour toutes les requêtes qui n’ont pas la variable d’environnement « forwarded » définie. En d’autres termes, toutes les requêtes qui ne sont pas passées par un proxy.
  5. CustomLog "logs/access_log" proxy env=forwarded : Cette directive indique au serveur Apache d’utiliser le format de log « proxy » pour toutes les requêtes qui ont la variable d’environnement « forwarded » définie. En d’autres termes, toutes les requêtes qui sont passées par un proxy.
  6. SetEnvIfNoCase X-Forwarded-For "^([^,]+)" REMOTE_HOST=$1 : Cette directive extrait la première adresse IP du header X-Forwarded-For (en supposant qu’il peut y avoir plusieurs adresses IP séparées par des virgules) et l’assigne à la variable d’environnement REMOTE_HOST.
  7. SetEnvIfNoCase REMOTE_HOST "^([^,]+)" REMOTE_ADDR=$1 : Cette directive extrait la première adresse IP de la variable d’environnement REMOTE_HOST et l’assigne à la variable d’environnement REMOTE_ADDR.

Dans l’ensemble, ces directives permettent au serveur Apache de gérer correctement les journaux de requêtes HTTP, qu’elles proviennent directement de l’utilisateur ou soient transmises par un proxy. De plus, elles assurent que l’adresse IP réelle de l’utilisateur est correctement enregistrée, même si la requête passe par un proxy.

Conclusion

En suivant ces étapes, vous avez mis en place une solution solide pour vous protéger contre les attaques par force brute en utilisant Fail2Ban. L’utilisation de l’en-tête X-Forwarded-For permet d’identifier correctement les adresses IP des attaquants, même si votre serveur se trouve derrière un proxy. N’oubliez pas que la configuration de la sécurité est un processus en constante évolution qui nécessite une attention régulière pour rester efficace contre les nouvelles menaces.