Reverse Proxy Traefik : intégration de CrowdSec pour bloquer les attaques

CybersécuritéServeur Web

Reverse Proxy Traefik : intégration de CrowdSec pour bloquer les attaques

I. Présentation

Ce tutoriel explique comment associer le reverse proxy Traefik à la solution CrowdSec pour détecter et bloquer les attaques effectuées sur les applications publiées. CrowdSec analysera les journaux d’accès HTTP de Traefik pour identifier les comportements suspects et ainsi bloquer les adresses IP malveillantes.

L’outil open source CrowdSec (alternative à Fail2ban) se positionnera comme un middleware au niveau de Traefik. En complément, nous déploierons aussi un bouncer CrowdSec sur l’hôte Docker en lui-même pour étendre la protection jusqu’à l’hôte, en plus des conteneurs. Nous finirons par une introduction au module AppSec (WAF) de CrowdSec pour aller plus loin dans la protection de nos services.

Voici les étapes que nous allons suivre pour effectuer cette configuration :

  • Configurer Traefik pour générer des logs d’accès
  • Installer CrowdSec avec Docker
  • Enregistrer un nouveau bouncer Traefik
  • Configurer le plugin CrowdSec pour Traefik
  • Enregistrer et configurer un bouncer firewall pour l’hôte Docker
  • Activer et configurer le module AppSec de CrowdSec (WAF)

Si vous souhaitez un tutoriel pour débuter avec Traefik, voici :

Note : Traefik et CrowdSec sont deux solutions open source françaises !

II. Activer les logs access dans Traefik

CrowdSec a besoin de parser des journaux pour détecter les comportements malveillants et bloquer les adresses IP associées. De ce fait, Traefik doit générer des journaux d’accès, sous la forme d’un fichier . Il sera alimenté par Traefik et lu par CrowdSec : en utilisant un volume Docker, les deux conteneurs auront accès à ce fichier.

A. Activer la persistance des journaux Traefik

Tout d’abord, nous allons configurer Traefik pour activer la persistance des journaux. Cela permettra aussi de les rendre accessibles par les différents conteneurs. Nous commençons par créer le fichier suivant :


Puis, nous allons apporter des modifications dans le fichier Docker Compose pour ajouter un bind mount sur ce dossier. Éditez le fichier pour ajouter cette ligne :


Enfin, dans les variables d’environnement, nous en profitons pour déterminer le fuseau horaire :


B. Personnaliser les journaux Traefik

Pour que le reverse proxy Traefik génère des logs d’accès, nous devons modifier la configuration via le fichier . La configuration statique doit contenir ces lignes en supplément :


Avec cette configuration, les logs d’accès seront écrits dans et ils seront au format JSON pour faciliter leur ingestion par un outil tiers, en l’occurrence CrowdSec. Grâce à la section , nous indiquons à Traefik de loguer que les requêtes dont le code HTTP est dans ces plages :

  • 400–599 : erreurs côté client ou serveur
  • 200–299 : requêtes réussies

Nous choisissons aussi de supprimer tous les headers des requêtes et réponses () afin de conserver uniquement des headers spécifiques, dont le UserAgent qui indique le type de client (navigateur web, outil, etc.). Les autres informations permettront de conserver l’adresse IP du client d’origine (ce qui est utile si vous utilisez Cloudflare, par exemple). L’idée étant d’éviter de conserver ce qui est trop verbeux et inutile vis-à-vis de notre besoin.

Si vous avez besoin d’approfondir ce sujet :

C. Configurer la rotation des logs

Grâce à l’outil logrotate, nous allons définir une stratégie de rotation automatique des journaux de Traefik. Cela va éviter de surcharger le serveur Docker avec les journaux de Traefik : le fichier peut rapidement grossir s’il y a beaucoup de connexions et/ou d’applications publiées.

Nous allons définir la stratégie logrotate dans ce fichier :


Voici la configuration à appliquer pour garder 31 versions, avec une rotation quotidienne (si nécessaire). Un fichier de log est limité à 16 Mo.


Ci-dessous des explications sur les directives utilisées.

Directive Rôle
compress Gzip les anciens logs
size 16M Rotation quand le fichier dépasse 16 Mo
daily Vérification quotidienne
rotate 31 Garder 31 archives
missingok Pas d’erreur si fichier absent
notifempty Ne “rotate” pas un fichier vide
docker kill –signal=”USR1″` Demande à Traefik de rouvrir les logs après rotation

Enregistrez et fermez le fichier.

III. Installer CrowdSec avec Docker

Désormais, nous allons nous atteler à l’installation et la configuration de CrowdSec avec Docker. Il existe une image officielle, ce qui va grandement nous faciliter la tâche.

A. Docker Compose pour CrowdSec

Nous commençons par créer un répertoire dédié à ce projet :


Puis, dans ce répertoire, créez deux autres répertoires : et . Ils seront utilisés pour stocker les données de CrowdSec et les fichiers de configuration. Cela va assurer la persistance de la configuration et de la base des adresses IP bannies même en cas de redémarrage.

Voici le code à insérer dans le fichier de CrowdSec. L’objectif est de créer le conteneur à partir de l’image Docker .


J’attire votre attention sur la configuration des , la variable d’environnement et la connectivité réseau de ce conteneur.

Volumes (montages)

  • et sont liés pour la persistance de la configuration de CrowdSec.
  • et : analyse des journaux de l’hôte Docker (pour détecter un brute force SSH, par exemple).
  • : nécessaire pour que CrowdSec soit en mesure de lire les journaux de Traefik.

COLLECTIONS

Les collections déterminent les scénarios d’attaques que va détecter CrowdSec. Les collections choisies doivent être cohérentes vis-à-vis de l’environnement à protéger. Ici, nous avons 5 collections, les 3 premières sont liées à Traefik et à la surveillance HTTP, tandis que les 2 dernières sont pour les journaux système Linux (notamment pour la protection de l’accès SSH).

Réseau

Le connecteur est connecté au réseau déjà utilisé par Traefik. C’est donc un réseau externe que Docker ne doit pas chercher à recréer.

Vous pouvez enregistrer et fermer ce fichier.

B. Installer rsyslog pour générer les journaux

Si, comme moi, vous utilisez Debian 13, vous pourrez constater qu’il n’y a pas les fichiers de logs et . Cela s’explique parce que le système gère les journaux avec . Ils sont accessibles via la commande et ne sont pas lisibles directement comme des fichiers textes. C’est un problème vis-à-vis de la configuration que nous souhaitons déployer.

Pour remédier à cela, nous allons simplement installer le paquet sur le serveur. Nous allons aussi activer son démarrage automatique. Cette simple opération va mettre en place le mécanisme de gestion des fichiers de logs via et .


Note : effectuez cette configuration avant de lancer le conteneur CrowdSec. Sinon, il constatera que ces fichiers n’existent pas et il va créer des dossiers à la place.

C. Exécuter le conteneur CrowdSec

Exécutez la commande ci-dessous pour lancer la construction du conteneur Docker CrowdSec.


Une fois que c’est fait, exécutez la commande dans le conteneur. Ce sera l’occasion de lister les collections installées et de voir s’il a bien appliqué notre configuration (soit les valeurs de la variable ).


Vous devez voir ceci :


C’est tout bon !

D. Ajouter le bouncer Traefik

À partir de maintenant, nous allons commencer à intégrer CrowdSec avec Traefik. Tout d’abord, exécutez la commande ci-dessous pour enregistrer un bouncer Traefik :


Gardez de côté la clé d’API retournée : elle devra être spécifiée dans la configuration de CrowdSec.

Note : sans bouncer, CrowdSec peut détecter les comportements suspects sans pour autant bloquer les adresses IP malveillantes. Cette tâche doit être accomplie par le bouncer (bannir, afficher un captcha, etc.).

E. Configurer l’acquisition des logs

Il est également nécessaire d’ajuster la configuration de CrowdSec pour lui dire d’analyser les journaux de CrowdSec. Vous devez modifier le fichier :


Écrasez la configuration actuelle par le code ci-dessous (en particulier s’il n’y a qu’une seule ligne). Cette configuration indique à CrowdSec de parser les journaux système et ceux de Traefik.


Enregistrez et relancez le conteneur CrowdSec.

Dans les journaux, vous devriez voir passer des événements mettant en évidence la prise en charge de ces nouvelles règles d’acquisition des logs. Vous pouvez exécuter la commande pour afficher les logs.


Pour le moment, la configuration de CrowdSec s’arrête-là. Passons à la configuration de Traefik.

IV. Intégrer CrowdSec à Traefik

A. Plugin Bouncer CrowdSec pour Traefik

Un plugin communautaire permet d’intégrer CrowdSec à Traefik en tant que middleware. Ici, je fais référence au projet hébergé sur ce dépôt GitHub :

Pour appeler ce plugin dans Traefik, modifiez le fichier de configuration et ajoutez ces liens à la fin (il n’y a rien à télécharger manuellement) :


Enregistrez le fichier.

B. Configurer CrowdSec avec la configuration dynamique

Pour configurer le plugin CrowdSec de Traefik, vous devez utiliser un fichier de configuration dynamique. Si vous avez suivi mon tutoriel d’introduction à Traefik, vous n’avez pas vu cette notion. Vous devez éditer le fichier pour déclarer un nouveau de type et préciser le chemin vers le fichier de configuration. Ici, nous allons créer le fichier .


Vous devez donc modifier le fichier Docker Compose de Traefik () pour ajouter un volume correspondant à ce fichier :


Puis, ouvrez ce fichier avec pour le créer et le modifier :


Ajoutez le contenu ci-dessous à ce fichier. Vous devez préciser votre clé d’API au niveau de la ligne . Il n’est pas obligatoire de modifier les autres options. Attention tout de même à la directive , car elle détermine l’adresse du service CrowdSec dans Docker (nom de conteneur + port LAPI).


Quelques explications utiles à propos de cette configuration :

  • : code HTTP renvoyé lorsqu’un client est bloqué (403 Forbidden). Une page personnalisée pourrait être utilisée.
  • : le bouncer interroge la LAPI en temps réel (API pour communiquer avec CrowdSec).
  • : liste des plages IP autorisées à fournir des en-têtes comme (le proxy).
  • : liste des plages IP considérées comme clients sûrs (pas filtrés, pas bannis).

Ces deux dernières instructions sont notamment là pour considérer les adresses du réseau local comme fiables, c’est une configuration fréquente avec CrowdSec.

Une fois la configuration effectuée et le conteneur redémarré, le middleware est bien visible sur le tableau de bord de Traefik.

B. Protéger une application avec CrowdSec

Pour activer CrowdSec auprès des applications publiées par Traefik, il y a deux approches :

  • Une approche par application avec le système de Labels.
  • Une approche globale où CrowdSec est activé automatiquement (grâce à l’attribution du middleware sur un ).

Ici, nous verrons son activation auprès d’une application. Nous prenons l’exemple de l’application IT-Tools, mais cela importe peu. Le principe reste le même pour toutes les applications : éditer le fichier Docker Compose pour ajouter un label afin d’associer le middleware CrowdSec.

Si nous modifions le fichier Docker Compose de IT-Tools, déjà intégré à Traefik, la ligne suivante doit être ajoutée :


Le middleware CrowdSec étant configuré dans le fichier de configuration dynamique, il doit être appelé avec la valeur .

Si vous utilisez Tinyauth, il y aura donc 2 middlewares ! Ne dupliquez pas la ligne. Séparez simplement les noms de middleware par une virgule :


Enregistrez et relancez le conteneur de l’application.

V. Tester la configuration

Désormais, nous allons effectuer quelques tests. Tout d’abord, vous devez choisir de bannir une adresse IP publique manuellement via l’exécution de la commande ci-dessous. Vous n’avez qu’à préciser l’adresse IP à bannir à la place de .


L’accès est bien refusé :

Pour lister les adresses IP bannies actuellement, lancez cette commande :


Vous pouvez supprimer la décision manuellement si besoin :


Ensuite, pour se mettre dans la peau d’un attaquant, vous pouvez effectuer une action très basique : un scan de ports avec Nmap, par exemple. Autre possibilité : utiliser pour requêter la page IT-Tools avec une valeur de User-Agent suspecte (celle de Nmap ou un autre outil).

Par exemple, cette commande fonctionne bien sur Windows :


Là encore, CrowdSec bloque l’adresse IP malveillante. La raison est explicite : .

Cette configuration est un bon début, mais elle a un inconvénient : Traefik bloque les adresses IP malveillantes, mais l’hôte Docker quant à lui, reste exposé. Si cet hôte est accessible depuis l’extérieur (un VPS, par exemple), l’attaquant peut toujours communiquer avec lui.

VI. Protéger l’hôte Docker avec CrowdSec

Si vous souhaitez protéger l’hôte Docker en plus des conteneurs, c’est-à-dire étendre la protection au-delà des flux web et de Traefik, suivez cette partie du tutoriel.

Pour bannir les adresses IP malveillantes aussi au niveau de l’hôte physique, il convient de déployer le bouncer iptables et de le faire pointer vers notre instance CrowdSec Docker. Il n’est pas nécessaire d’installer le moteur CrowdSec sur l’hôte : nous l’avons déjà dans le conteneur.

Sur l’hôte Docker, exécutez la commande suivante pour ajouter les dépôts CrowdSec.


Puis, installez le bouncer IPtables :


Vous devez ensuite exécuter une commande dans le conteneur CrowdSec pour enregistrer un nouveau bouncer firewall (il y en a plusieurs, dont celui IPtables).


Cette commande retourne une clé d’API que vous devez noter :


Puis, éditez le fichier de configuration suivant :


Afin de préciser la clé d’API obtenue précédemment au niveau de . Éditez aussi la directive pour préciser le port au lieu de . Ceci est obligatoire si vous avez activé le tableau de bord Traefik sur le port 8080 ou si une autre application exploite déjà ce port.


Enregistrez et fermez le fichier. Pour appliquer les changements, redémarrez le service lié au bouncer :


Puis, listez les bouncers dans votre conteneur :


Voici le résultat attendu :

Désormais, une adresse IP bannie par Traefik sera bannie aussi sur l’hôte Docker, et inversement. Par exemple : une machine tente un brute force SSH sur l’hôte Docker, CrowdSec va bannir l’adresse IP au niveau des deux bouncers (firewall et Traefik). Soit un blocage global de cette adresse IP.

VII. Traefik : utiliser CrowdSec AppSec comme WAF

Pour aller plus loin, il est possible d’ajouter une véritable couche de protection applicative en intégrant CrowdSec AppSec, la brique WAF de CrowdSec. Cette solution analyse le trafic HTTP en temps réel, détecte les attaques courantes (scanners, injections, exploitation de failles connues…) et applique automatiquement des remédiations, comme le blocage temporaire des IP malveillantes. C’est très intéressant pour aller plus loin dans la détection des flux web malveillants.

Cette dernière partie du tutoriel explique comment faire évoluer la configuration évoquée jusqu’ici pour activer CrowdSec AppSec avec Traefik.

Tout d’abord, éditez le fichier Docker Compose de CrowdSec () pour exposer un port supplémentaire correspondant à l’AppSec.


Dans ce même fichier, vous devez aussi modifier la liste des collections pour ajouter 3 collections liées à AppSec :


Ici, nous avons ajouté 3 collections supplémentaires dédiées à l’AppSec :

  • crowdsecurity/appsec-generic-rules – ensemble de règles génériques pour détecter les attaques web les plus courantes : injections, scans, comportements anormaux, patterns suspects… C’est la base indispensable pour obtenir une première protection applicative efficace.
  • crowdsecurity/appsec-virtual-patching – collection virtual patching : elle applique des protections ciblées contre des vulnérabilités connues, même si votre application n’est pas encore corrigée. Idéal pour combler un délai entre la découverte d’une faille et son patch réel.
  • crowdsecurity/appsec-crs – intégration de l’OWASP Core Rule Set (CRS) dans CrowdSec AppSec.

Sur votre serveur Docker, créez le fichier . Ajoutez ce contenu :


Cette configuration active le module AppSec de CrowdSec en utilisant le profil par défaut et expose le service sur le port 7422 pour permettre à Traefik ou aux bouncers d’y accéder. Le label indique qu’il s’agit d’une instance AppSec.

Enregistrez et fermez ce fichier.

Puis, dans le fichier de Traefik, ajouter ceci :


Cette configuration active AppSec dans Traefik et indique que les requêtes doivent être envoyées au service CrowdSec situé sur (attention il s’agit du nom du conteneur CrowdSec). Si AppSec renvoie une alerte ou devient inaccessible, Traefik bloque automatiquement la requête pour éviter de laisser passer du trafic potentiellement dangereux.

Enregistrez et fermez ce fichier, et relancez les deux conteneurs pour appliquer les modifications.

Comment tester rapidement l’efficacité du module AppSec ?

Il est assez facile de déclencher une règle surveillée par le Virtual Patching. Par exemple, vous pouvez requêter ces deux adresses sur n’importe quelle application : et .

Cela aura pour effet de déclencher deux alertes :

Si je vous encourage à effectuer 2 actions suspectes, ce n’est pas un hasard. Une action, ce n’est pas suffisant : c’est un comportement pour éviter les faux positifs. Mais dès la deuxième action malveillante, l’adresse IP sera bannie.

Pour approfondir la configuration de l’AppSec, consultez cette documentation :

VIII. Conclusion

En suivant ce tutoriel, vous disposez désormais d’un environnement Traefik entièrement protégé par l’IDS/IPS CrowdSec, aussi bien au niveau réseau qu’au niveau applicatif. Le module AppSec, qui assure la fonction de WAF, apporte un vrai plus à la solution CrowdSec : et aussi pour la sécurité des applications. Le tout grâce à deux solutions open source complémentaires !

FAQ

Pourquoi utiliser CrowdSec avec Traefik plutôt que Fail2Ban ?

CrowdSec est plus moderne et il a un aspect collaboratif. Contrairement à Fail2Ban qui analyse simplement des logs, CrowdSec partage les adresses IP malveillantes détectées avec sa communauté globale. En l’intégrant à Traefik, vous bénéficiez d’une protection proactive contre des IP qui ont attaqué d’autres utilisateurs, avant même qu’elles ne vous touchent. De plus, CrowdSec peut jouer le rôle de WAF, ce qui n’est pas dans les capacités de Fail2Ban.

Comment fonctionne techniquement l’intégration entre Traefik et CrowdSec ?

L’intégration repose sur un Middleware (via un plugin Traefik). Traefik intercepte chaque requête entrante et interroge l’API locale de CrowdSec (LAPI) pour vérifier si l’IP est bannie. Si l’IP est sur liste noire, Traefik rejette la requête (erreur 403 dans notre cas) avant qu’elle n’atteigne votre service. Pour étendre la protection jusqu’à l’hôte Docker, un bouncer firewall a été déployé sur l’hôte.

L’utilisation de CrowdSec avec Traefik est-elle gratuite ?

Oui, CrowdSec est un outil Open Source et gratuit. L’utilisation du moteur de détection et du Bouncer pour Traefik ne nécessite pas de licence payante. Avec CrowdSec, vous devez simplement payer si vous souhaitez utiliser pleinement la console centralisée ou bénéficier de listes de blocages d’IP spécifiques.

Faut-il installer un agent sur chaque conteneur Docker ?

Non, c’est tout l’intérêt de cette architecture. Il suffit d’un seul conteneur CrowdSec qui lit les logs, et d’une configuration Middleware dans Traefik. De son côté, Traefik agit comme la porte d’entrée unique qui protège tous les services derrière lui.

Où trouver la clé API (LAPI Key) pour connecter le Bouncer CrowdSec ?

La clé API est obtenue en exécutant une commande spécifique dans le conteneur CrowdSec pour inscrire un nouveau bouncer. Cette commande, comme l’explique cet article, est sous cette forme : . Cette clé doit ensuite être renseignée dans la configuration du Bouncer Traefik.

Peut-on protéger uniquement certaines routes ou sous-domaines ?

Tout à fait. Grâce au système de routeurs de Traefik, vous pouvez choisir d’appliquer le middleware CrowdSec uniquement sur des services critiques (comme une page de login admin) et le laisser inactif sur des pages publiques statiques. Nous avons vu cette approche via l’utilisation des labels Docker.

CrowdSec : comment débloquer mon IP si je me suis banni par erreur ?

Il faut utiliser l’outil en ligne de commande présent dans le conteneur CrowdSec. Pour exécuter la commande dans le conteneur CrowdSec, adoptez cette syntaxe : .

Où puis-je voir la liste des IP actuellement bloquées par mon Traefik ?

Vous pouvez lister les décisions actives via la commande qui cible le conteneur CrowdSec, ou utiliser le tableau de bord web (CrowdSec Console) si vous y avez connecté votre instance (point non abordé dans ce tutoriel). Après avoir récupéré un “code d’inscription” depuis la console web CrowdSec, vous devez exécuter cette commande : .

SOURCE