Skip to content

CrowdSec Docker : sécurité collaborative contre les attaques

Brandon Visca
Date de publication:

💡 TL;DR

  • CrowdSec analyse tes logs en temps réel, détecte les attaques et bloque les IPs grâce à une base de signatures collaborative
  • Un agent Docker + un bouncer pour ton reverse proxy = protection active en 10 minutes
  • C’est la version “2026” de Fail2Ban : même principe, mais avec une communauté qui partage les signatures d’attaques

Pourquoi CrowdSec plutôt que Fail2Ban ?

Si tu as déjà suivi mon guide sur Fail2Ban Docker, tu sais que bloquer les IPs à la main, c’est efficace mais limité. Fail2Ban observe ton serveur, repère les motifs suspects dans tes logs et bannit en conséquence. Le problème ? Chaque serveur apprend seul. Un bot qui scanne des milliers de machines répère les faiblesses avant que ton Fail2Ban ne déclenche.

CrowdSec change la donne avec une approche collaborative. Lorsque l’agent CrowdSec détecte une attaque sur ton serveur, il peut remonter les informations (de façon anonymisée) vers une base collective. Tu bénéficies alors des signatures partagées par des milliers d’autres sysadmins. Un IP qui brute-force du SSH sur un serveur en Allemagne sera bloquée chez toi avant même qu’elle n’essaie.

En bref :

Ce n’est pas que CrowdSec est “mieux” dans l’absolu. Pour un petit serveur isolé, Fail2Ban fait parfaitement le job. Mais si tu veux une couche de sécurité proactive qui apprend de la communauté mondiale, CrowdSec est la suite logique.

L’architecture CrowdSec en trois briques

CrowdSec n’est pas un outil monolithique. Il repose sur trois composants distincts qui communiquent entre eux :

1. L’Agent

L’agent est le cerveau de la détection. Il lit les fichiers de logs (SSH, nginx, Traefik, Apache, etc.), applique des scénarios (des règles YAML décrivant une attaque) et décide si un comportement est malveillant. Quand un seuil est franchi, il génère une décision (“bannir cette IP”) et l’envoie à l’API locale.

2. La Local API (LAPI)

La Local API est le point central sur ton serveur. Elle stocke les décisions prises par l’agent, les remonte éventuellement à la communauté, et les expose aux bouncers. Tu peux aussi l’interroger avec cscli pour inspecter les alertes et les bannissements actifs.

3. Les Bouncers

Un bouncer, c’est le muscle. Il lit les décisions de la LAPI et applique concrètement le blocage : ajouter une règle iptables, rejeter une requête au niveau de Traefik, ou même pousser un bannissement vers Cloudflare. Il existe des bouncers pour Nginx, Traefik, pfSense, Cloudflare, et même des bouncers “firewall” génériques.

Cette séparation agent/bouncer est astucieuse : un agent peut tourner sur ton serveur principal, et un bouncer sur ton edge router ou ton reverse proxy, même physiquement séparé.

Ce qu’il te faut pour commencer

Si tu as déjà Zabbix Docker d’installé, tu peux même superviser la santé du conteneur CrowdSec avec un template SNMP ou un agent Zabbix sur le host.

Le Docker Compose complet

Crée un dossier crowdsec et place-y un fichier docker-compose.yml :

services:
  crowdsec:
    image: crowdsecurity/crowdsec:latest
    container_name: crowdsec
    restart: unless-stopped
    environment:
      - "TZ=Europe/Paris"
      - "COLLECTIONS=crowdsecurity/linux crowdsecurity/traefik crowdsecurity/sshd"
    volumes:
      - "./data:/var/lib/crowdsec/data"
      - "./config:/etc/crowdsec"
      - "/var/log/auth.log:/var/log/auth.log:ro"
      - "/path/to/traefik/logs:/var/log/traefik:ro"
    networks:
      - crowdsec-net
    cap_add:
      - NET_ADMIN
      - NET_RAW

Quelques précisions importantes :

Fichier de config persistant : acquis.yaml

CrowdSec doit savoir où trouver tes logs. Crée un fichier ./config/acquis.yaml :

filenames:
  - /var/log/auth.log
  - /var/log/traefik/access.log
labels:
  type: syslog

Ce fichier dit à l’agent : “Analyse ces fichiers, et considère qu’ils sont au format syslog ou log d’accès web”. CrowdSec détecte automatiquement le type de service en parsant les lignes.

Démarrer le conteneur

cd crowdsec
docker compose up -d

Attends quelques secondes, puis vérifie :

docker compose logs -f crowdsec

Tu devrais voir des lignes du genre :

INFO crowdsec is finished to populate database
INFO Starting processing data

Si tu vois des erreurs de parsing, vérifie que les chemins de logs sont corrects et que CrowdSec a bien accès en lecture.

Installer le bouncer Traefik

Le bouncer le plus utile en homelab est celui de Traefik. Il lit les décisions de la LAPI et rejette directement les requêtes HTTP avant qu’elles n’atteignent tes services.

Ajoute dans le même docker-compose.yml :

  bouncer-traefik:
    image: crowdsecurity/traefik-bouncer:latest
    container_name: crowdsec-bouncer-traefik
    restart: unless-stopped
    environment:
      - "CROWDSEC_BOUNCER_API_KEY=${CROWDSEC_API_KEY}"
      - "CROWDSEC_AGENT_HOST=crowdsec:8080"
    networks:
      - crowdsec-net

La variable CROWDSEC_API_KEY doit être générée depuis le conteneur CrowdSec. Connecte-toi et crée une clé pour le bouncer :

docker exec -it crowdsec cscli bouncers add traefik-bouncer

Copie la clé affichée dans un fichier .env à la racine du dossier crowdsec :

CROWDSEC_API_KEY=votre-cle-api-ici

Puis redémarre le bouncer :

docker compose restart bouncer-traefik

Configurer Traefik pour utiliser le bouncer

Dans le middleware de ton conteneur Traefik, ajoute un plugin CrowdSec. Si tu utilises Traefik v3 avec le système de plugins, ajoute ceci dans ta configuration statique (traefik.yml ou via labels) :

experimental:
  plugins:
    crowdsec-bouncer-traefik-plugin:
      moduleName: github.com/maxlerebourg/crowdsec-bouncer-traefik-plugin
      version: v1.3.2

Puis, sur chaque route que tu veux protéger, ajoute le middleware :

    labels:
      - "traefik.http.middlewares.crowdsec.plugin.crowdsec-bouncer-traefik-plugin.enabled=true"
      - "traefik.http.middlewares.crowdsec.plugin.crowdsec-bouncer-traefik-plugin.crowdseclapikey=${CROWDSEC_API_KEY}"
      - "traefik.http.middlewares.crowdsec.plugin.crowdsec-bouncer-traefik-plugin.crowdseclapihost=http://crowdsec:8080"
      - "traefik.http.routers.monservice.middlewares=crowdsec@docker"

Dès qu’une IP malveillante est signalée par CrowdSec, Traefik rejette la requête avec un 403 Forbidden. L’attaque ne touche même pas ton application.

Si tu n’utilises pas encore Traefik, j’ai un guide complet sur Traefik v3 qui couvre l’installation, les certificats Let’s Encrypt et la découverte automatique des conteneurs.

Le bouncer firewall (optionnel)

Si tu veux bloquer au niveau réseau (pas seulement HTTP), installe le bouncer iptables :

  bouncer-firewall:
    image: crowdsecurity/cs-firewall-bouncer:latest
    container_name: crowdsec-bouncer-firewall
    restart: unless-stopped
    environment:
      - "CROWDSEC_BOUNCER_API_KEY=${CROWDSEC_API_KEY}"
      - "CROWDSEC_AGENT_HOST=crowdsec:8080"
    cap_add:
      - NET_ADMIN
      - NET_RAW
    network_mode: host

Avec network_mode: host et NET_ADMIN, ce conteneur injecte directement des règles iptables sur l’hôte. Les IPs bannies par CrowdSec sont bloquées avant même qu’elles n’atteignent Docker. C’est le niveau de protection maximum.

Attention : network_mode: host n’est pas compatible avec les réseaux Docker custom. Utilise soit le bouncer firewall en host, soit le bouncer Traefik en bridge, selon ton besoin.

Scénarios de détection : que bloque CrowdSec ?

CrowdSec arrive avec des dizaines de scénarios préconfigurés. Voici ceux qui te protègent le plus rapidement :

Brute-force SSH

Le scénario crowdsecurity/sshd détecte les tentatives de connexion échouées sur SSH. Après 5 échecs en 2 minutes, l’IP est bannie. Si tu as déjà WireGuard Docker d’installé et que tu n’exposes le SSH que via le VPN, ce scénario devient un filet de sécurité plutôt qu’une nécessité vitale. C’est d’ailleurs une bonne pratique : moins tu exposes de surface d’attaque, mieux tu te portes.

Scans HTTP

Le scénario crowdsecurity/http-bad-user-agent repère les user-agents connus de bots malveillants (scripts de scan, vulnérabilité scanners, etc.). Le scénario crowdsecurity/http-probing détecte les parcours systématiques de répertoires (/admin, /wp-login.php, etc.).

Attaques web applicatives

CrowdSec propose des collections spécifiques pour WordPress (crowdsecurity/wordpress), Nextcloud, Drupal, ou même des frameworks comme Symfony. Si tu auto-héberges une app web, cherche la collection dédiée avec cscli collections list.

Inspection avec cscli

cscli est l’outil en ligne de commande qui te permet de dialoguer avec la LAPI. Voici les commandes essentielles :

Lister les décisions actives (les IPs actuellement bannies) :

docker exec -it crowdsec cscli decisions list

Afficher les alertes récentes :

docker exec -it crowdsec cscli alerts list

Bannir manuellement une IP (test rapide ou cas d’urgence) :

docker exec -it crowdsec cscli decisions add --ip 42.42.42.42 --duration 1h --reason "test manuel"

Débannir une IP :

docker exec -it crowdsec cscli decisions delete --ip 42.42.42.42

Voir les métriques et le nombre de signaux traités :

docker exec -it crowdsec cscli metrics

Vérifier la santé de la connexion avec la communauté :

docker exec -it crowdsec cscli hub update
docker exec -it crowdsec cscli hub list

La commande hub list affiche toutes les collections, parsers et scénarios installés. Tu peux en ajouter à tout moment sans redémarrer le conteneur.

Dashboard web (console)

CrowdSec propose une interface web optionnelle pour visualiser les alertes, les IPs bannies et les tendances d’attaques. Elle s’installe comme un service Docker supplémentaire.

Ajoute dans ton docker-compose.yml :

  crowdsec-dashboard:
    image: crowdsecurity/crowdsec-dashboard:latest
    container_name: crowdsec-dashboard
    restart: unless-stopped
    environment:
      - "CROWDSEC_API_URL=http://crowdsec:8080"
    ports:
      - "3000:3000"
    networks:
      - crowdsec-net

Accède ensuite à http://IP_DU_SERVEUR:3000. L’interface te montre :

C’est pratique pour comprendre d’où viennent les menaces. Si tu as Zabbix Docker qui supervise ton infrastructure, le dashboard CrowdSec complète parfaitement les alertes techniques de Zabbix avec une vision purement sécurité.

Bonnes pratiques et limites

Ne pas exposer la LAPI sur internet. Le port 8080 de CrowdSec doit rester interne au réseau Docker. Si tu dois accéder à cscli depuis l’extérieur, passe par un tunnel SSH ou un VPN WireGuard, jamais en exposant le port.

Mettre à jour régulièrement les scénarios. Les menaces évoluent. Lance cscli hub update && cscli hub upgrade une fois par semaine pour obtenir les dernières signatures.

Ne pas bannir indéfiniment. Un bantime de 4 heures est un bon équilibre. Les bots changent d’IP rapidement, et un bannissement trop long risque d’affecter des utilisateurs légitimes derrière des CGNAT.

Vérifier la consommation CPU. CrowdSec parse beaucoup de lignes de logs. Sur un Raspberry Pi avec des logs verbeux, ça peut devenir gourmand. Ajuste les log_level si nécessaire.

Utiliser un bouncer approprié. Un bouncer firewall bloque tout (TCP/UDP), un bouncer Traefik ne bloque que le HTTP. Choisis selon la surface d’attaque que tu veux protéger. Si tu n’as que des services web exposés, le bouncer Traefik suffit largement.

Surveiller les faux positifs. Si tu remarques qu’une IP légitime est bloquée, ajoute-la en whitelist via cscli decisions delete ou dans le fichier de configuration whitelists.yaml.

CrowdSec n’est pas un WAF complet. Il détecte les attaques connues et les comportements suspects, mais il ne remplace pas un vrai Web Application Firewall pour protéger contre les injections SQL complexes ou les zero-days sophistiqués. Pour une couche supplémentaire sur tes applications web, envisage un WAF comme ModSecurity ou Coraza derrière Traefik.

CrowdSec VS Fail2Ban : tableau comparatif

CritèreFail2BanCrowdSec
Type de protectionLocale, basée sur les logs de ta machineCollaborative, intelligence partagée
InstallationImage Docker crazymax/fail2banImage officielle crowdsecurity/crowdsec
ArchitectureMonolithiqueAgent + LAPI + Bouncers (découplé)
Mises à jour signaturesRègles statiques (filtres regex)Scénarios communautaires mis à jour via cscli hub
Intégration DockerLecture de logs bindésBouncers natifs pour Traefik, Nginx, firewall
ComplexitéFacileIntermédiaire
CommunautéMature, stableEn forte croissance, très active
Cas d’usage idéalServeur unique, config simpleHomelab multi-services, infra évolutive

Mon verdict personnel : Fail2Ban reste parfait pour un serveur monolithique avec SSH et un service web. CrowdSec brille quand tu commences à avoir une stack complète (reverse proxy, plusieurs services, monitoring) et que tu veux une protection qui grandit avec ton infra.

Conclusion

CrowdSec en Docker, c’est la protection collaborative que ton homelab mérite. Tu installes l’agent, tu branches un bouncer sur ton reverse proxy, et d’un coup ton serveur ne se contente plus de réagir à ses propres logs : il tire parti de l’intelligence de milliers d’administrateurs qui partagent les signatures d’attaques en temps réel.

Ce n’est pas une baguette magique. Ça ne remplace pas des mots de passe solides, des mises à jour régulières ou un pare-feu bien configuré. Mais c’est un filet de sécurité actif, gratuit et en constante évolution qui transforme ton serveur isolé en membre d’une communauté de défense collective. Dans un monde où les attaques sont automatisées et massives, cette approche collaborative n’est pas un luxe. C’est un standard.

Next
Forgejo Docker : le fork Gitea 100% libre que tu devrais déjà utiliser