Tutoriels gratuits et ouverts à toutes et à tous · mis à jour régulièrementNouveautésVeilleGlossaireÀ propos

CrowdSec : un IPS collaboratif pour protéger un serveur web

Distinguer IDS, IPS, pare-feu et WAF, puis protéger un serveur Nginx sous Debian 13 avec CrowdSec : détection d’un scan Nikto, bouncer, décisions, listes d’autorisation, modèle open core et points de vigilance.

Cybersécurité✎ B. Jousseaume📅 23 octobre 2026⏱ 3 h📶 Intermédiaire

Point de départ : de Fail2ban à CrowdSec

Vous connaissez peut-être Fail2ban (mis en œuvre dans le cours Nextcloud) : il surveille les journaux d’un service (SSH, serveur web…), repère par des expressions régulières les tentatives suspectes répétées et bannit l’adresse IP fautive en ajoutant une règle au pare-feu local. C’est simple, léger et efficace — mais chaque serveur se défend seul, avec ce qu’il voit.

CrowdSec reprend exactement cette idée de départ (lire les journaux, détecter, bannir), puis la prolonge : séparer la détection du blocage, et surtout mutualiser ce que voient des milliers de serveurs.

CritèreFail2banCrowdSec
PrincipeLit les journaux, détecte, bannitIdentique au départ : lit les journaux, détecte, décide
Langage / licencePython, GPL v2Go (plus performant sur de gros volumes), MIT
Règles de détectionFiltres à base d’expressions régulières, regroupés dans des jailsParseurs et scénarios en YAML, regroupés en collections installables depuis le Hub
BlocageActions intégrées : règle iptables/nftables sur la machineBouncers séparés : pare-feu, Nginx, Cloudflare, captcha…, éventuellement sur une autre machine
PortéeUn serveur = une instance isoléePlusieurs serveurs peuvent partager une même API locale
RenseignementUniquement ce que le serveur voit lui-mêmeListe communautaire : on bloque des attaquants signalés ailleurs, avant même qu’ils ne vous visent
Bannissement par défaut10 minutes (bantime)4 heures
Adresses privéesSeule la boucle locale est ignorée (ignoreip)Toutes les plages privées sont ignorées par défaut
Administrationfail2ban-clientcscli
ActionFail2banCrowdSec
Voir les bannisfail2ban-client status sshdcscli decisions list
Débannirfail2ban-client set sshd unbanip X.X.X.Xcscli decisions delete --ip X.X.X.X
Bannir à la mainfail2ban-client set sshd banip X.X.X.Xcscli decisions add --ip X.X.X.X

IDS et IPS : de quoi parle-t-on ?

Les systèmes de détection d’intrusion (IDS) analysent le trafic réseau ou les journaux pour repérer des signes d’attaque. Les systèmes de prévention d’intrusion (IPS) réalisent la même analyse, mais peuvent en plus bloquer ce qu’ils jugent malveillant, ce qui permet de stopper l’attaque en cours.

Tous deux comparent l’activité observée à une base de menaces connues (signatures) et/ou à des modèles de comportement. La différence tient à ce qui se passe ensuite : l’IDS est un système de surveillance, l’IPS est un système de contrôle.

IDS (Intrusion Detection System)IPS (Intrusion Prevention System)
RôleSurveiller et alerterSurveiller et bloquer
PositionEn dérivation (copie du trafic, journaux)En coupure, comme un pare-feu, entre l’extérieur et le réseau interne
ActionAucune action automatique : un humain ou un autre outil doit prendre le relaisRejette automatiquement les paquets ou requêtes correspondant à une menace
Point fortExcellent outil d’analyse a posteriori pour l’équipe de réponse à incident (CSIRT)Réaction immédiate, sans intervention humaine
Risque principalVolume d’alertes à traiter (« fatigue d’alerte »)Faux positif bloquant : un utilisateur légitime est banni

De nombreux éditeurs intègrent aujourd’hui ces fonctions dans des pare-feu dits UTM (Unified Threat Management) ou NGFW (Next-Generation Firewall), qui réunissent filtrage, IDS/IPS, antivirus et filtrage web dans un même équipement — c’est le cas de pfSense avec les paquets Suricata ou Snort.

Ce qu’apportent les IDS/IPS à une stratégie de cybersécurité

  • Automatisation : ils fonctionnent en grande partie seuls et s’intègrent facilement aux outils de sécurité existants.
  • Conformité : ils aident à démontrer que des mesures de protection sont en place (contrôles du CIS, exigences NIS 2, ISO 27001) et produisent des traces d’audit utiles lors d’une enquête.
  • Application de la politique de sécurité : ils sont configurables pour faire respecter des règles internes au niveau du réseau (par exemple, bloquer un VPN non autorisé).

CrowdSec : présentation

CrowdSec est une solution de sécurité open source, gratuite dans sa version de base et française. Elle reprend le principe de Fail2ban — lire les journaux, détecter un comportement malveillant, bannir l’adresse IP — en le modernisant sur trois points :

  • La séparation détection / blocage : le moteur décide, des composants spécialisés appliquent la décision.
  • Le partage communautaire : chaque instance signale les adresses qu’elle a bannies à une API centrale. CrowdSec agrège ces signalements et redistribue une liste de blocage communautaire. Un mécanisme de réputation évite qu’une adresse soit bannie partout dès le premier signalement.
  • Le Hub : les règles de détection (parseurs, scénarios, collections) sont maintenues par CrowdSec et la communauté, et s’installent en une commande.

Architecture

Depuis la version 1.0, tous les composants communiquent via une API REST locale (LAPI). Seule cette API accède à la base de données, ce qui rend les composants indépendants les uns des autres.

ComposantRôle
Security Engine (agent)Lit les journaux (acquisition), les découpe (parseurs) et les confronte aux scénarios. Si un scénario se déclenche, il crée une alerte et une décision.
API locale (LAPI)Stocke alertes et décisions, et les distribue aux composants de remédiation.
Composants de remédiation (bouncers)Interrogent la LAPI et appliquent les décisions : blocage dans Nginx, dans le pare-feu (nftables), captcha, etc.
API centrale (CAPI)Reçoit les signalements de toutes les instances et diffuse la liste de blocage communautaire.
cscliOutil en ligne de commande pour tout piloter : collections, décisions, alertes, bouncers, métriques.
Console CrowdSecInterface web (app.crowdsec.net) pour visualiser alertes et décisions d’une ou plusieurs instances.

Le schéma de principe se lit ainsi : les agents détectent → la LAPI centralise → les bouncers bloquent, tandis que la LAPI échange avec la CAPI (envoi des signalements, réception de la liste communautaire).

Modèle économique : l’« open core »

CrowdSec est une entreprise, pas une association : elle doit financer son développement. Elle applique le modèle de l’open core : le cœur du produit est gratuit et open source, et l’éditeur vend des services construits autour. Ce support n’utilise que la partie gratuite, qui suffit pour protéger un serveur.

Version communautaire (gratuite)Offres payantes
Moteur, cscli, bouncers, HubInclus, open source (licence MIT)Identiques : on paie des services, pas le logiciel
Listes de blocageListe communautaire (en échange de vos signalements)Liste communautaire premium ; listes spécialisées (renseignement sur les menaces, par secteur, par pays, robots d’IA…)
Console webNombre d’alertes remontées et durée d’historique limitésHistorique étendu, gestion centralisée de plusieurs serveurs et des allowlists, notifications, accès API (Console Premium, facturée par moteur)
Renseignement sur les menacesRéputation de base via la liste communautaireAPI de réputation d’adresses IP, suivi des CVE activement exploitées
SupportForum, Discord, documentationSupport et correctifs d’urgence, en option

Le point clé est l’effet de réseau : chaque instance gratuite envoie ses signalements à l’API centrale. Plus il y a d’utilisateurs gratuits, plus la base de renseignement de CrowdSec est riche… et c’est précisément cette base, affinée et enrichie, qui est vendue aux entreprises. Les utilisateurs gratuits ne sont pas de simples clients non payants : ce sont eux qui produisent la matière première.

Le laboratoire

MachineRôleConfiguration
SRV-WEBCibleDebian 13 (Trixie), Nginx opérationnel, accès SSH
KALIAttaquantKali Linux avec Nikto et curl (préinstallés)
Réseau—Les deux VM sur un réseau isolé de l’hyperviseur, joignables entre elles

Installation de CrowdSec sur Debian 13

Plusieurs méthodes existent : paquet des dépôts Debian, dépôt officiel CrowdSec, image Docker… On retient le dépôt officiel, car les paquets Debian ont souvent du retard et, pour un outil de sécurité, la fraîcheur des règles compte autant que celle du binaire.

Préparer le serveur

sudo apt update && sudo apt full-upgrade -y
sudo apt install -y nginx curl
systemctl status nginx --no-pager

Ajouter le dépôt CrowdSec

La documentation propose un script qui ajoute le dépôt et sa clé de signature. Plutôt que de l’exécuter « à l’aveugle », on le télécharge, on le lit, puis on l’exécute :

curl -fsSL https://install.crowdsec.net -o install-crowdsec.sh
less install-crowdsec.sh        # lire avant d'exécuter !
sudo sh install-crowdsec.sh
apt-cache policy crowdsec       # vérifier que la version vient du dépôt CrowdSec

Installer le moteur

sudo apt install -y crowdsec

Pendant l’installation, CrowdSec analyse la machine pour repérer les services qu’il sait surveiller. Il détecte ici le système Linux, SSH et les journaux de Nginx (/var/log/nginx/access.log et error.log), crée les fichiers d’acquisition correspondants dans /etc/crowdsec/acquis.d/ et installe les collections associées.

sudo cscli collections list              # collections installées
sudo systemctl status crowdsec --no-pager
# si la collection nginx est absente :
sudo cscli collections install crowdsecurity/nginx
sudo systemctl reload crowdsec
Élément du HubRôleExemple
ParseurDécoupe une ligne de journal en champs exploitablescrowdsecurity/nginx-logs
ScénarioDécrit un comportement malveillant (seuils, fenêtres de temps)crowdsecurity/http-probing
CollectionRegroupe parseurs et scénarios pour un servicecrowdsecurity/nginx

Adapter au labo (adresses privées)

sudo cscli parsers remove crowdsecurity/whitelists --force
sudo systemctl reload crowdsec

Vérifiez enfin que CrowdSec lit bien les journaux Nginx : la section Acquisition Metrics doit afficher des lignes lues pour /var/log/nginx/access.log.

sudo cscli metrics

Premier scan Nikto : détection sans blocage

Nikto est un scanner de vulnérabilités web open source : il recherche fichiers sensibles, défauts de configuration, en-têtes de sécurité manquants, etc. Il s’agit d’une reconnaissance, pas d’une exploitation — mais c’est souvent la première étape d’une attaque réelle.

État initial

Sur SRV-WEB, listez les décisions actives, c’est-à-dire les adresses que CrowdSec a décidé de bloquer :

sudo cscli decisions list

Le résultat doit être No active decisions. Ajoutez maintenant l’option --all : apparaissent les adresses issues de la liste communautaire (origine CAPI), construite à partir des signalements de toutes les instances CrowdSec.

sudo cscli decisions list --all | head -20

Lancer le scan depuis KALI

nikto -h http://IP_SRV_WEB

Observer la réaction de CrowdSec

sudo cscli decisions list
sudo cscli alerts list
sudo cscli alerts inspect ID_ALERTE -d

L’adresse de KALI apparaît avec une décision ban d’une durée de 4 heures (valeur par défaut). La liste des alertes montre les scénarios déclenchés : http-probing, http-sensitive-files, http-path-traversal-probing, http-bad-user-agent, http-crawl-non_statics…

Avant de passer à la suite, supprimez cette décision pour repartir d’un état propre :

sudo cscli decisions delete --ip IP_KALI

Mettre en place un composant de remédiation

Pour qu’une décision soit appliquée, CrowdSec s’appuie sur des composants de remédiation, historiquement appelés bouncers. Chacun interroge régulièrement la LAPI et applique les décisions à son niveau : refus de la requête, présentation d’un captcha, suppression des paquets…

BouncerNiveau d’actionEffet pour l’attaquantIntérêt
Nginx (crowdsec-nginx-bouncer)Serveur web (module Lua)Page 403 Forbidden ou captchaVisible et pédagogique ; protège seulement le site
Pare-feu (crowdsec-firewall-bouncer-nftables)Noyau Linux (nftables)Paquets ignorés : plus aucun service ne répondProtège toute la machine (SSH compris)
AutresCloudflare, Traefik, HAProxy, WordPress…VariableBloquer au plus près de l’application ou en amont

Installer le bouncer Nginx

Il n’est plus nécessaire de télécharger une archive depuis GitHub : le bouncer est disponible dans le dépôt CrowdSec déjà configuré. Le paquet installe ses dépendances (lua5.1, libnginx-mod-http-lua…) et s’enregistre automatiquement auprès de la LAPI avec sa propre clé d’API.

sudo apt install -y crowdsec-nginx-bouncer
sudo cscli bouncers list             # le bouncer doit apparaître
sudo nginx -t && sudo systemctl reload nginx

Si le bouncer n’apparaît pas dans la liste, il faut l’enregistrer à la main : on génère une clé d’API, puis on la reporte dans le paramètre API_KEY du fichier /etc/crowdsec/bouncers/crowdsec-nginx-bouncer.conf, avant de recharger Nginx.

sudo cscli bouncers add nginx-bouncer     # affiche la clé une seule fois
sudo nano /etc/crowdsec/bouncers/crowdsec-nginx-bouncer.conf   # API_KEY=CLE
sudo nginx -t && sudo systemctl reload nginx

Second scan : CrowdSec passe à l’action

Depuis KALI, vérifiez d’abord que le site répond normalement :

curl -I http://IP_SRV_WEB       # attendu : HTTP/1.1 200 OK

Relancez le scan, puis, pendant ou juste après, la même requête curl :

nikto -h http://IP_SRV_WEB
curl -I http://IP_SRV_WEB       # attendu : HTTP/1.1 403 Forbidden

Le code 403 Forbidden indique un accès refusé : le bouncer Nginx applique la décision. Comptez quelques secondes : le scénario doit d’abord se déclencher, puis le bouncer consulte la LAPI (à chaque requête avec un court cache en mode live, à intervalle régulier en mode stream) ; le blocage n’est donc pas instantané. Confirmez côté serveur avec sudo cscli decisions list : l’adresse de KALI est bannie pour 4 heures. Cette liste n’affiche que la dernière alerte par adresse alors que plusieurs décisions peuvent exister : decisions delete --ip les supprime toutes. Les journaux Nginx (/var/log/nginx/error.log) mentionnent d’ailleurs le refus prononcé par CrowdSec.

Gérer les décisions manuellement

BesoinCommande
Débannir une adresse (faux positif)sudo cscli decisions delete --ip X.X.X.X
Bannir manuellement (4 h par défaut)sudo cscli decisions add --ip X.X.X.X
Bannir 24 h avec un motifsudo cscli decisions add --ip X.X.X.X --duration 24h --reason "scan Nikto"
Bannir une plage entièresudo cscli decisions add --range 203.0.113.0/24

Une décision ajoutée manuellement porte l’origine cscli et, sans motif précisé, une raison du type manual ‘ban’ from ….

Ne pas se bannir soi-même : les listes d’autorisation

Depuis la version 1.6.8, les allowlists permettent de déclarer, directement avec cscli, les adresses qui ne doivent jamais être bannies — typiquement le poste d’administration. Les modifications sont prises en compte immédiatement.

sudo cscli allowlists create admins -d "Postes d'administration"
sudo cscli allowlists add admins IP_POSTE_ADMIN -d "poste d'administration"
sudo cscli allowlists inspect admins

Visualiser l’activité

L’ancienne commande cscli dashboard, qui déployait un tableau de bord Metabase dans un conteneur Docker, a été dépréciée puis retirée (version 1.7.0). CrowdSec la jugeait trop limitée, et de nombreuses installations n’étaient ni mises à jour ni sécurisées alors que l’image Metabase faisait l’objet de vulnérabilités (CVE).

OutilUsage
sudo cscli metricsLignes lues par source, parseurs et scénarios sollicités, activité des bouncers
sudo cscli alerts list / inspectHistorique et détail des alertes
Console CrowdSec (app.crowdsec.net)Interface web officiellement supportée : alertes, décisions, abonnement à des listes de blocage supplémentaires
Prometheus + GrafanaAlternative auto-hébergée : CrowdSec expose des métriques au format Prometheus

Pour rattacher une instance à la Console, on crée un compte, on récupère la clé d’enrôlement, puis :

sudo cscli console enroll CLE_ENROLEMENT
# dans la Console : Engines > sélectionner l'instance > Accept enroll
sudo systemctl restart crowdsec
sudo cscli console status      # CAPI authentifiée, instance « enrolled »

Maintenir CrowdSec à jour

Les règles évoluent en permanence : un IPS non mis à jour perd rapidement de son efficacité.

sudo cscli hub update        # récupère l'index des parseurs, scénarios, collections
sudo cscli hub upgrade       # met à jour les éléments installés
sudo apt update && sudo apt upgrade   # met à jour le moteur et les bouncers

Une fois les essais terminés, réactivez la protection des adresses privées retirée à l’étape Adapter au labo :

sudo cscli parsers install crowdsecurity/whitelists
sudo systemctl reload crowdsec

Aller plus loin

  • Protéger SSH : la collection crowdsecurity/sshd est installée par défaut ; associée au bouncer pare-feu, elle bloque les attaques par force brute.
  • Composant AppSec : CrowdSec propose un module de type WAF qui inspecte les requêtes HTTP en temps réel (règles virtuelles contre des CVE connues), en complément de l’analyse des journaux. Depuis la version 1.8, il peut aussi soumettre les visiteurs à une détection de robots (page de défi), désactivée par défaut : à tester avant de l’activer, car elle s’applique à tous les visiteurs.
  • Mode simulation : sudo cscli simulation enable <scénario> génère des alertes sans bannir — utile pour régler un scénario avant de l’activer en production.

Ressources

Synthèse

Mémento cscli

CommandeRôle
cscli collections listCollections installées
cscli metricsVérifier l’acquisition des journaux et l’activité
cscli decisions list [--all]Décisions actives (locales [+ communautaires])
cscli decisions add / delete --ip XBannir / débannir manuellement
cscli alerts list / inspect ID -dAlertes et détail
cscli bouncers listComposants de remédiation enregistrés
cscli allowlists create / addAdresses à ne jamais bannir
cscli hub update / upgradeMise à jour des règles
cscli capi statusVérifier la connexion à l’API centrale (partage communautaire)

🧠 Testez vos connaissances

6 questions. Répondez puis cliquez sur « Corriger ». Rien n’est enregistré : c’est de l’auto-évaluation.

1. Quelle est la différence essentielle entre un IDS et un IPS ?

💬 L’IDS est un système de surveillance ; l’IPS est un système de contrôle, qui agit sur ce qu’il détecte.

2. Après le premier scan Nikto, une décision de bannissement existe mais le site répond toujours 200 OK. Pourquoi ?

💬 CrowdSec décide, les bouncers appliquent. Sans bouncer, une décision ne bloque rien.

3. Que fait le parseur crowdsecurity/whitelists installé par défaut ?

💬 Les plages 10.0.0.0/8, 172.16.0.0/12 et 192.168.0.0/16 ne sont jamais bannies : il faut le savoir pour un labo… et pour un réseau d’entreprise.

4. Pour un attaquant banni, quelle est la différence entre le bouncer Nginx et le bouncer pare-feu ?

💬 Le bouncer Nginx agit au niveau du serveur web ; le bouncer nftables agit dans le noyau et protège toute la machine.

5. Pourquoi éviter « curl … | sudo sh » pour installer un logiciel ?

💬 Télécharger, lire, vérifier la source, puis exécuter : un script compromis ou un nom de domaine mal saisi compromettrait tout le serveur.

6. Que reçoit l’éditeur de CrowdSec quand une instance partage ses signalements ?

💬 C’est la contrepartie de la liste communautaire ; en entreprise, ce partage doit être connu et validé (RSSI, DPO).

© 2026 Bruno Jousseaume. Ce cours est publié sous licence CC BY-NC-SA 4.0 : vous pouvez le partager et l’adapter en citant l’auteur et un lien vers cette page, sans usage commercial, et en partageant vos adaptations sous la même licence.

Pour aller plus loin