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.
Table of Contents
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 :
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.
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 headerX-Forwarded-For
à la place de l’adresse IP de l’hôte distant. C’est utile lorsque le serveur est derrière un proxy.SetEnvIf X-Forwarded-For "^.*\..*\..*\..*" forwarded
: Cette directive définit une variable d’environnement appelée « forwarded » si le header HTTPX-Forwarded-For
est présent.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.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.SetEnvIfNoCase X-Forwarded-For "^([^,]+)" REMOTE_HOST=$1
: Cette directive extrait la première adresse IP du headerX-Forwarded-For
(en supposant qu’il peut y avoir plusieurs adresses IP séparées par des virgules) et l’assigne à la variable d’environnementREMOTE_HOST
.SetEnvIfNoCase REMOTE_HOST "^([^,]+)" REMOTE_ADDR=$1
: Cette directive extrait la première adresse IP de la variable d’environnementREMOTE_HOST
et l’assigne à la variable d’environnementREMOTE_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.