05/12/2025

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 traefik.log. 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 :

/opt/docker-compose/traefik/logs

Puis, nous allons apporter des modifications dans le fichier Docker Compose pour ajouter un bind mount sur ce dossier. Éditez le fichier /opt/docker-compose/traefik/docker-compose.yml pour ajouter cette ligne :

    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - ./traefik.yml:/etc/traefik/traefik.yml:ro
      - ./certs:/var/traefik/certs:rw
      - ./logs:/logs:rw

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

    environment:
      - TZ=Europe/Paris

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 traefik.yml. La configuration statique doit contenir ces lignes en supplément :

accessLog:
  filePath: "/logs/traefik.log"
  format: json
  filters:
    statusCodes:
      - "200-299" # succès
      - "400-599" # échecs - erreurs
  fields:
    headers:
      defaultMode: drop # supprimer tous les headers pour en conserver uniquement 4
      names:
        User-Agent: keep
        X-Real-Ip: keep
        X-Forwarded-For: keep
        X-Forwarded-Proto: keep

Avec cette configuration, les logs d’accès seront écrits dans /logs/traefik.log et ils seront au format JSON pour faciliter leur ingestion par un outil tiers, en l'occurrence CrowdSec. Grâce à la section filters, 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 (defaultMode: drop) 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 :

sudo nano /etc/logrotate.d/traefik

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

/opt/docker-compose/traefik/logs/*.log {
  compress
  size 16M
  daily
  rotate 31
  missingok
  notifempty
  postrotate
     docker kill --signal="USR1" traefik                                                  
  endscript
}

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

DirectiveRôle
compressGzip les anciens logs
size 16MRotation quand le fichier dépasse 16 Mo
dailyVérification quotidienne
rotate 31Garder 31 archives
missingokPas d’erreur si fichier absent
notifemptyNe "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 :

/opt/docker-compose/crowdsec

Puis, dans ce répertoire, créez deux autres répertoires : data et etc. 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 docker-compose.yml de CrowdSec. L'objectif est de créer le conteneur crowdsec à partir de l'image Docker crowdsecurity/crowdsec.

services:
  crowdsec:
    image: crowdsecurity/crowdsec:latest
    container_name: crowdsec
    restart: unless-stopped
    ports:
      - 127.0.0.1:8181:8080
    expose:
      - 8080 # HTTP API pour bouncers
    volumes:
      # CrowdSec - Data et config
      - ./data:/var/lib/crowdsec/data
      - ./etc:/etc/crowdsec
      # Journaux à analyser
      - /var/log/auth.log:/var/log/auth.log:ro
      - /var/log/syslog:/var/log/syslog:ro
      - /opt/docker-compose/traefik/logs:/var/log/traefik:ro
    environment:
      - GID=1000
      - COLLECTIONS=crowdsecurity/traefik crowdsecurity/http-cve crowdsecurity/base-http-scenarios crowdsecurity/sshd crowdsecurity/linux
      - CUSTOM_HOSTNAME=Srv-Docker-Demo
    networks:
      - frontend

networks:
  frontend:
    external: true

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

Volumes (montages)

  • ./data:/var/lib/crowdsec/data et ./etc:/etc/crowdsec sont liés pour la persistance de la configuration de CrowdSec.
  • /var/log/auth.log:/var/log/auth.log:ro et /var/log/syslog:/var/log/syslog:ro : analyse des journaux de l'hôte Docker (pour détecter un brute force SSH, par exemple).
  • /opt/docker-compose/traefik/logs:/var/log/traefik:ro : 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 frontend 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 /var/log/auth.log et syslog. Cela s'explique parce que le système gère les journaux avec journald. Ils sont accessibles via la commande journalctl 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 rsyslog 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 auth.log et syslog.

sudo apt install rsyslog
sudo systemctl enable --now rsyslog

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.

docker compose up -d

Une fois que c'est fait, exécutez la commande cscli collections list 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 COLLECTION).

docker exec crowdsec cscli collections list

Vous devez voir ceci :

---------------------------------------------------------------------------------------------------------------------
 COLLECTIONS                                                                                                         
---------------------------------------------------------------------------------------------------------------------
 Name                                   📦 Status    Version  Local Path                                             
---------------------------------------------------------------------------------------------------------------------
 crowdsecurity/base-http-scenarios      ✔️  enabled  1.2      /etc/crowdsec/collections/base-http-scenarios.yaml     
 crowdsecurity/http-cve                 ✔️  enabled  2.9      /etc/crowdsec/collections/http-cve.yaml                
 crowdsecurity/linux                    ✔️  enabled  0.3      /etc/crowdsec/collections/linux.yaml                   
 crowdsecurity/sshd                     ✔️  enabled  0.7      /etc/crowdsec/collections/sshd.yaml                    
 crowdsecurity/traefik                  ✔️  enabled  0.1      /etc/crowdsec/collections/traefik.yaml                 
 crowdsecurity/whitelist-good-actors    ✔️  enabled  0.2      /etc/crowdsec/collections/whitelist-good-actors.yaml  

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 :

docker exec crowdsec cscli bouncers add traefik-bouncer
API key for 'traefik-bouncer':

   CugO1u0sW8VwqcNKXSDbX2XtRC53l9x4RngcsHL5654

Please keep this key since you will not be able to retrieve it!

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 acquis.yaml :

sudo nano /opt/docker-compose/crowdsec/etc/acquis.yaml

É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.

filenames:
 - /var/log/auth.log
 - /var/log/syslog
labels:
  type: syslog
---
filenames:
  - /var/log/traefik/*.log
labels:
  type: 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 docker logs crowdsec pour afficher les logs.

time="2025-11-24T10:20:16Z" level=info msg="loading acquisition file : /etc/crowdsec/acquis.yaml"
time="2025-11-24T10:20:16Z" level=info msg="Adding file /var/log/auth.log to datasources" type=file
time="2025-11-24T10:20:16Z" level=info msg="Adding file /var/log/syslog to datasources" type=file
time="2025-11-24T10:20:16Z" level=info msg="Adding file /var/log/traefik/traefik.log to datasources" type=file

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 traefik.yml et ajoutez ces liens à la fin (il n'y a rien à télécharger manuellement) :

# CrowdSec Traefik Bouncer Plugin
experimental:
  plugins:
    bouncer:
      moduleName: github.com/maxlerebourg/crowdsec-bouncer-traefik-plugin
      version: v1.4.6

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 traefik.yml pour déclarer un nouveau provider de type file et préciser le chemin vers le fichier de configuration. Ici, nous allons créer le fichier config.yml.

providers:
  docker:
    endpoint: "unix:///var/run/docker.sock
    exposedByDefault: false
  file:
    filename: "/etc/traefik/config.yml"

Vous devez donc modifier le fichier Docker Compose de Traefik (/opt/docker-compose/traefik/config.yml) pour ajouter un volume correspondant à ce fichier :

    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - ./traefik.yml:/etc/traefik/traefik.yml:ro
      - ./config.yml:/etc/traefik/config.yml:ro

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

nano /opt/docker-compose/traefik/config.yml

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

http:
  middlewares:
    crowdsec:
      plugin:
        bouncer:
          enabled: true
          defaultDecisionSeconds: 60
          remediationStatusCode: 403          
          crowdsecMode: live
          crowdsecLapiKey: CugO1u0sW8VwqcNKXSDbX2XtRC53l9x4RngcsHL5654
          crowdsecLapiHost: crowdsec:8080
          crowdsecLapiScheme: http
          crowdsecLapiTLSInsecureVerify: false
          forwardedHeadersTrustedIPs:
            - 10.0.0.0/8
            - 172.16.0.0/12
            - 192.168.0.0/16
          clientTrustedIPs:
            - 10.0.0.0/8
            - 172.16.0.0/12
            - 192.168.0.0/16

Quelques explications utiles à propos de cette configuration :

  • remediationStatusCode: 403 : code HTTP renvoyé lorsqu’un client est bloqué (403 Forbidden). Une page personnalisée pourrait être utilisée.
  • crowdsecMode: live : le bouncer interroge la LAPI en temps réel (API pour communiquer avec CrowdSec).
  • forwardedHeadersTrustedIPs : liste des plages IP autorisées à fournir des en-têtes comme X-Forwarded-For (le proxy).
  • clientTrustedIPs : 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 crowdsec@file sur un entryPoint).

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 :

      - traefik.http.routers.it-tools-https.middlewares=crowdsec@file

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

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 :

      - traefik.http.routers.it-tools-https.middlewares=crowdsec@file,tinyauth

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 X.X.X.X.

docker exec -it crowdsec cscli decisions add --ip X.X.X.X --type ban --duration 10m --reason "Test Ban Traefik"

L'accès est bien refusé :

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

docker exec -it crowdsec cscli decisions list

Vous pouvez supprimer la décision manuellement si besoin :

docker exec -it crowdsec cscli decisions delete --ip X.X.X.X

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 curl 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 :

curl.exe -A "Mozilla/5.0 (compatible; Nmap Scripting Engine)" https://<adresse de l'application>

Là encore, CrowdSec bloque l'adresse IP malveillante. La raison est explicite : crowdsecurity/http-bad-user-agent.

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.

curl -s https://install.crowdsec.net | sudo sh

Puis, installez le bouncer IPtables :

sudo apt install crowdsec-firewall-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).

docker exec crowdsec cscli bouncer add firewall-bouncer

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

docker exec crowdsec cscli bouncer add firewall-bouncer
API key for 'firewall-bouncer':

   EmdSzwbUzp30XzSTeb0/xNdvUmhjh23549gOQZA2x/4

Please keep this key since you will not be able to retrieve it!

Puis, éditez le fichier de configuration suivant :

/etc/crowdsec/bouncers/crowdsec-firewall-bouncer.yaml

Afin de préciser la clé d'API obtenue précédemment au niveau de api_key. Éditez aussi la directive api_url pour préciser le port 8181 au lieu de 8080. 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.

api_url: http://127.0.0.1:8181/
api_key: EmdSzwbUzp30XzSTeb0/xNdvUmhjh23549gOQZA2x/4

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

sudo service crowdsec-firewall-bouncer restart

Puis, listez les bouncers dans votre conteneur :

docker exec crowdsec cscli bouncer list

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 (/opt/docker-compose/crowdsec/docker-compose.yml) pour exposer un port supplémentaire correspondant à l'AppSec.

    expose:
      - 8080 # HTTP API pour bouncers
      - 7422 # AppSec (WAF)

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

COLLECTIONS=crowdsecurity/traefik crowdsecurity/http-cve crowdsecurity/base-http-scenarios crowdsecurity/sshd crowdsecurity/linux crowdsecurity/appsec-generic-rules crowdsecurity/appsec-virtual-patching crowdsecurity/appsec-crs

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 /opt/docker-compose/crowdsec/etc/acquis.d/appsec.yml. Ajoutez ce contenu :

appsec_config: crowdsecurity/appsec-default
labels:
  type: appsec
listen_addr: 0.0.0.0:7422
source: appsec

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 type: appsec indique qu’il s’agit d’une instance AppSec.

Enregistrez et fermez ce fichier.

Puis, dans le fichier config.yml de Traefik, ajouter ceci :

          crowdsecAppsecEnabled: true
          crowdsecAppsecHost: crowdsec:7422
          crowdsecAppsecFailureBlock: true
          crowdsecAppsecUnreachableBlock: true

Cette configuration active AppSec dans Traefik et indique que les requêtes doivent être envoyées au service CrowdSec situé sur crowdsec:7422 (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 : /rpc2 et /.env.

Cela aura pour effet de déclencher deux alertes :

  • crowdsecurity/vpatch-CVE-2023-42793
  • crowdsecurity/vpatch-env-access

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 : docker exec crowdsec cscli bouncers add <nom-du-bouncer>. 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 cscli présent dans le conteneur CrowdSec. Pour exécuter la commande dans le conteneur CrowdSec, adoptez cette syntaxe : docker exec crowdsec cscli decisions delete --ip <VOTRE_IP>.

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

Vous pouvez lister les décisions actives via la commande docker exec crowdsec cscli decisions list 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 : docker exec crowdsec cscli console enroll -e context <votre code>.

author avatar
Florian BURNEL Co-founder of IT-Connect
Ingénieur système et réseau, cofondateur d'IT-Connect et Microsoft MVP "Cloud and Datacenter Management". Je souhaite partager mon expérience et mes découvertes au travers de mes articles. Généraliste avec une attirance particulière pour les solutions Microsoft et le scripting. Bonne lecture.
Partagez cet article Partager sur Twitter Partager sur Facebook Partager sur Linkedin Envoyer par mail

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur la façon dont les données de vos commentaires sont traitées.