L'utilisation d'un WAF (Web Application Firewall) permet de minimiser les attaques connues sur les serveurs. Il existe des solutions clés en main comme cloudflare, OVH, Scaleway mais pouvant engendrer un coût. Dans notre cas, sauf demande contraire des clients, nous avons mis en place Crowdsec sur nos différents serveurs pour protéger les sites des différentes attaques connues.
Cette brique analyse les requêtes entrantes (adresse IP émettrice, code retour, type de requête, URL demandée, attaque, etc...) et prend une décision quant au retour à faire à l'utilisateur. Les décisions peuvent être du type :
Crowdsec se base également sur une base de données se mettant à jour régulièrement pour détecter de nouvelles attaques ou des IP malveillantes.
Crowdsec est disponible sur la plupart des distributions ou via docker. Dans cet article, nous allons installer cet solution sur un serveur Ubuntu 24.04 (cela fonctionne sur les versions LTS également). C'est une solution clé en main, installable facilement et rapidement.
Dans un premier temps, il faut commencer par ajouter la clé de confiance du serveur où se trouve les packages pour crowdsec. Les développeurs mettent à disposition un script shell permettant de le faire automatiquement. En tant que root, exécuter la commande suivante :
$ curl -s https://install.crowdsec.net | sudo sh
Après cette étape, le repository nécessaire pour installer crowdsec sera défini sur le serveur.
crowdsec s'installe via la commande suivante :
$ sudo apt install crowdsec
Par défaut, le service 'API' de crowdsec écoute en local sur le port 8080. Cela peut engendrer un conflit avec un autre service. Dans ce cas, il est conseillé de changer le port par défaut. Pour éviter toute alerte lors d'une mise à jour du paquet de crowdsec, il est conseillé de créer un fichier "local". Ces fichiers contiennent uniqzuement les clés à modifier, pas besoin de faire un copier/coller du fichier d'origine complet. Cette modification sera à apporter dans 2 nouveaux fichiers : "/etc/crowdsec/config.yaml.local" et "/etc/crowdsec/local_api_credentials.yaml.local". <port_crowdsec> correspond au nouveau numéro de port qui sera utilisé sur le système.
Fichier /etc/crowdsec/config.yaml.local :
api:
server:
listen_uri: 127.0.0.1:<port_crowdsec>
Fichier /etc/crowdsec/local_api_credentials.yaml.local :*
url: http://127.0.0.1:<port_crowdsec>
Lorsque la configuration de crowdsec est correcte, il faut démarrer le service (avec activation par défaut en cas de redémarrage du serveur)*
$ systemctl enable --now crowdsec.service
En cas d'erreur lors du démarrage, les logs (/var/log/crowdsec.log) ou le journal système (journalctl -xeu crowdsec.service) devraient permettre de débloquer la situation.
Un bouncer est une extension permettant de cibler une application précise sur le serveur. Dans ce cas, il s'agit de nginx.
Pour pouvoir utiliser ce bouncer, le module lua pour nginx n'est pas disponible sur les repository officiels d'ubuntu. Il faut ajouter le repository launchpad nginx d'ondrej.
L'ajout du bouncer sur le système se fait via l'ajout d'un package
$ sudo apt install crowdsec-nginx-bouncer
En fonction des modifications apportées sur crowdsec, la configuration du bouncer doit être adaptée. Sur le même principe, il faut créer un fichier de configuration 'local' pour apporter les modifications. Dans le cas du bouncer nginx, le fichier de configuration est à créer dans le dossier "/etc/crowdsec/bouncers/crowdsec-nginx-bouncer.conf.local". En reprenant l'exemple de modification du port de crowdsec, les modifications suivantes sont à mettre dans le fichier cité ci-dessus :
API_URL=http://127.0.0.1:<port_crowdsec>
Pour appliquer les modifications, il faut redémarrer les services crowdsec et nginx. En cas de requêtes jugées incorrectes, l'internaute aura alors la page par défaut de crowdsec :
Il est possible d'utiliser son propre template HTML en paramétrant un autre chemin vers un template au couleur de la société. Dans le fichier "/etc/crowdsec/bouncers/crowdsec-nginx-bouncer.conf.local", ajouter la variable BAN_TEMPLATE_PATH avec le chemin du fichier template devant être affiché.
BAN_TEMPLATE_PATH=<chemin absolu vers le template>
Il est également possible d'utiliser un autre template pour le captcha, en ajoutant la variable CAPTCHA_TEMPLATE_PATH de la même manière que pour la page ban.
CAPTCHA_TEMPLATE_PATH=<chemin absolu vers le template>
Un bouncer doit être installé pour que la communication entre les 2 élements (bouncer et appsec) puisse se faire
L'installation d'Appsec se fait via l'application cliente de crowdsec "cscli".
$ sudo cscli collections install crowdsecurity/appsec-virtual-patching crowdsecurity/appsec-generic-rules
Cette commande permet d'ajouter les règles de base pour Appsec. D'autres collections sont disponibles sur le site de crowdsec et installables via la commande ci-dessus.
Appsec doit être déclaré dans la configuration de crowdsec pour qu'il puisse être activé et utilisé. La mise en place se fait en créant un nouveau fichier de configuration "/etc/crowdsec/acquis.d/appsec.yml", en ajoutant et en adaptant le contenu suivant. <port_appsec> correspond au port (7422 par défaut) devant être utilisé pour permettre au bouncer de communiquer avec Appsec.
appsec_config: crowdsecurity/appsec-default
labels:
type: appsec
listen_addr: localhost:<port_appsec>
source: appsec
Pour activer le lien entre le bouncer et Appsec, le fichier "/etc/crowdsec/bouncers/crowdsec-nginx-bouncer.conf.local" doit être modifié pour ajouter la ligne suivante
APPSEC_URL=http://localhost:<port_appsec>
Une fois le paramétrage réalisé, les services nginx et crowdsec doivent être redémarrés.
Malgré une configuration plutôt permissive sur le filtrage des robots (rappelons qu’en 2024, 51 % du trafic web provenait de bots selon Imperva) les résultats ont largement dépassé nos attentes en matière de détection et de blocage.
Le chiffre est éloquent : 1,5 million d’attaques bloquées en 7 jours, pour un périmètre d’environ 100 sites actifs.
Répartition des attaques sur la semaine
Les tentatives de scan de port et SSH bruteforce sont relativements faible du à notre politique de sécurité préventive mise en place en amont (Firewall, Serveur Anti-DDos et Fail2ban).
CrowdSec ne se limite pas à une simple brique de détection sur logs et bouncer en mode client sur votre serveur. En combinant ses briques additionnelles, il devient une véritable plateforme de protection collaborative et centralisée.
La CrowdSec Console permet de superviser et administrer plusieurs instances depuis une interface centralisée. Elle facilite la gestion des alertes, des décisions de blocage, des allowlists/denylists, et permet d’homogénéiser vos politiques de sécurité sur plusieurs serveurs.
La version gratuite (Community) suffit pour protéger un ou plusieurs serveurs classiques avec une bonne efficacité. Pour les besoins avancés (gouvernance multi-instance, rétention longue, quotas plus élevés, API étendue, gestion centralisée des allowlists...), il existe un plan Premium, activable à tout moment, sans avoir à changer l’architecture technique.
CrowdSec repose sur un hub communautaire de scénarios, parsers et collections. Vous pouvez ajouter des modules (comme AppSec présenté ici), ou intégrer CrowdSec à d'autres briques de votre système (firewalls, reverse proxy, outils d'alerting). Cela permet de bâtir une solution sur-mesure, évolutive, tout en gardant la logique « comportementale » au cœur.
N'hésitez pas à nous contacter si vous avez besoin d'un renseignement sur la sécurisation de vos environnements.