Bouncer CrowdSec pour Magento 2

Comment protéger votre site Magento 2 avec le module CrowdSec_Bouncer

Introduction

Chaque utilisateur qui accède à votre site est identifiable par une adresse IP.

CrowdSec est un outil open source capable de déterminer si cette IP est potentiellement malveillante ou non. Pour cela, l'agent CrowdSec que vous aurez installé sur votre serveur analysera différentes sources de données (fichiers de logs, etc.). Selon des scénarios de remédiations prédéfinis, une décision sera préconisée pour l'IP en question : laisser passer si rien de suspect n'est détecté, demander la résolution d'un captcha si un doute subsiste ou carrément bannir l'IP pendant un certain temps.

Une des forces de CrowdSec est que cette base de connaissance est partagée entre tous les utilisateurs : si votre serveur est attaqué, les décisions prises serviront à d'autres, mais vous bénéficierez aussi des décisions issues des autres attaques du monde entier.

Le rôle des bouncers est d'appliquer les décisions prises.

Désormais disponible sur la marketplace Magento 2, c'est exactement ce que fait le module CrowdSec_Bouncer : lorsqu'un utilisateur est suspecté d'être malveillant, le module lui affiche soit un captcha à résoudre, soit simplement une page notifiant que l'accès est refusé. Si l'utilisateur est considéré comme non suspect, il accède à la page normalement.

Avec ce guide, vous allez apprendre à installer et à configurer le module CrowdSec_Bouncer pour Magento 2.

Prérequis

Pour suivre ce guide, vous aurez besoin :

  • d'un serveur ou d'un environnement local avec une instance Magento 2 installée.

À ce jour, le module CrowdSec_Bouncer est compatible avec Magento 2 de la version 2.3.0 à la version 2.4.3

  • d'un agent CrowdSec actif. Pour cela, vous pouvez vous référer à la documentation. Notez que CrowdSec doit être installé sur un serveur accessible via le site Magento 2.

Magento 2 et CrowdSec ne doivent pas nécessairement être installés sur le même serveur, bien que ce soit le plus simple.

Étape 1 — Installation

L'installation du module CrowdSec_Bouncer est une installation de module Magento 2 tout à fait classique. Tout d'abord, vous allez installer le module en utilisant composer. Ensuite, vous lancerez quelques commandes post-installation afin d'avoir un module prêt à l'emploi.

Toutes les commandes de cette étape doivent être lancées depuis le dossier racine de Magento 2

Ajout des sources

Lancez la commande suivante pour ajouter le module CrowdSec_Bouncer en tant que dépendance :

composer require crowdsec/magento2-module-bouncer

Post installation

Activation du module

Après avoir installé les sources du module, celui ci doit être activé. Pour cela, lancez la commande :

bin/magento module:enable CrowdSec_Bouncer

Vous devriez pouvoir lire le message suivant :

The following modules have been enabled:

- CrowdSec_Bouncer
Mise à niveau

Une fois le module activé, vous devez mettre à niveau Magento 2 :

Si vous êtes en mode production, exécutez d'abord la commande de compilation :

bin/magento setup:di:compile

Ce n'est pas nécessaire en mode developer

Puis lancez la commande de mise à niveau :

bin/magento setup:upgrade
Nettoyage du cache

Le cache Magento 2 doit être nettoyé avec la commande :

bin/magento cache:flush
Déploiement du contenu statique

Enfin, vous devez déployer le contenu statique :

bin/magento setup:static-content:deploy -f

À ce stade, le module est prêt à être utilisé, mais ses fonctionnalités ne sont pas encore configurées et activées. Dans la prochaine étape, vous allez configurer les options de base afin de tester que tout se passe comme prévu.

Étape 2 — Configuration basique

Dans cette partie, vous naviguerez tout d'abord vers l'onglet de configuration du bouncer CrowdSec. Puis, vous vérifierez que la communication entre Magento 2 et votre agent CrowdSec est opérationnelle. Enfin, vous ferez quelques tests de fonctionnalité.

Page de configuration

À partir du tableau de bord de votre back office, vous trouverez la page de configuration du module en naviguant de la manière suivante :

Stores → Configurations → Security → CrowdSec Bouncer

Empty config

Connexion à CrowdSec

Ici, vous allez pouvoir tester la connexion entre Magento 2 et votre agent CrowdSec.

Dans le champ Your LAPI url, vous devez renseigner l'url utilisée pour contacter l'agent CrowdSec. Si vous avez installé CrowdSec sur le même serveur que Magento 2, il suffit de renseigner http://localhost:8080.

Dans le champ Your bouncer key, vous devez renseigner la clé qui sera utilisée pour l'authentification. Pour cela, il vous faut tout d'abord utiliser une commande cscli disponible lorsque CrowdSec est installé. Cette commande est la suivante :

cscli bouncers add magento2-bouncer

Vous pouvez utiliser le nom de bouncer que vous souhaitez. Ici on l'appelle magento2-bouncer.

En retour de cette commande, vous obtiendrez une clé : ne la perdez pas et ne la communiquez à personne. Copiez cette clé dans le champ Your bouncer key.

Config with connexion

Avant de sauvegarder, assurez-vous que la connexion fonctionne en cliquant sur le bouton Test CrowdSec LAPI connection.

En cas de succès, vous aurez un message

Connection test result: success

Si tel est le cas, vous pouvez sauvegarder la configuration.

Premier test

Maintenant que tout est en place, vous allez faire un test simple : bannir votre IP et constater que le bouncer vous interdit l'accès au site. Ne vous inquiétez pas, nous donnons la commande pour annuler votre bannissement un peu plus bas.

Avant tout, activez le bouncer sur la partie frontend de votre site en sélectionnant Yes dans le menu déroulant Enable bouncer on Frontend area de la partie General Settings → Bouncing :

Enable on front

Comme votre IP n'est pas encore considérée comme malveillante, vous pouvez vous rendre sur une page de votre site et vous ne constaterez aucun changement.

Vous pouvez bannir votre IP en lançant la commande cscli suivante :

cscli decisions add --ip <YOUR_IP> --duration 1h --type ban

En pratique, vous n'aurez pas à ajouter manuellement les décisions pour telle ou telle IP : c'est l'agent CrowdSec qui s'en chargera selon les scénarios installés.

Dès lors que cette commande a été lancée, votre accès au site sera impossible et vous obtiendrez l'affichage suivant :

Front ban

À présent, autorisez à nouveau l'accès au site pour votre IP en supprimant la décision précédente :

cscli decisions delete -i <YOUR_IP>

Voilà pour le cas d'usage le plus classique.

Vous allez voir dans la prochaine étape comment jouer avec les différentes configurations pour adapter le bouncer selon vos besoins.

Étape 3 — Configuration avancée

Le module CrowdSec_Bouncer propose de nombreuses options configurables : que ce soit d'un point de vue visuel ou sur des aspects plus techniques et fonctionnels. Nous allons décrire ci-dessous les paramétrages les plus utiles.

Flexibilité

Un site Magento 2 est accessible depuis plusieurs zones (areas). Vous avez la possibilté d'activer le bouncer sur une ou plusieurs zones, selon vos besoins.

La principale est la zone frontend. Nous avons vu plus haut comment activer le bouncer sur cette zone. Vous noterez d'ailleurs que cette configuration Enable bouncer on Frontend area est paramétrable par Store view. Vous pouvez aussi choisir d'activer le bouncer sur la zone du back office (Enable bouncer on Adminhtml area) ou pour protéger les appels par API REST, SOAP et GraphQL (Enable bouncer on API areas).

De plus, la configuration Bouncing level vous permet, en choisissant le Flex bouncing, de ne jamais bannir une IP en affichant, au pire, un captcha. Il devient alors impossible de bloquer accidentellement l'accès à votre site à des personnes qui ne le méritent pas.

Charte graphique et libellés

Selon les cas, le bouncer affiche une page de ban ou une page de captcha. Il est possible de personnaliser toutes les couleurs de ces pages en quelques clics afin qu'elles s'intègrent au mieux à votre charte graphique. D'autre part, tous les textes sont également entièrement personnalisables. Cela vous permettra, par exemple, de présenter des pages traduites dans la langue de vos utilisateurs. Ces configurations sont accessibles dans la partie Theme customization :

Theme config

Vous pouvez par exemple obtenir une page de captcha en français avec le design suivant :

Front capcha

Gestion du cache et mode asynchrone

Par défaut, le "mode Live" est activé. Autrement dit, la première fois qu'un utilisateur se connecte à votre site web, son IP sera vérifiée directement par l'API de CrowdSec. Le reste de la navigation de votre utilisateur sera encore plus transparent grâce au système de cache entièrement personnalisable. En particulier, vous pouvez choisir entre un système de fichiers, Redis ou Memcached pour gérer le cache de l'API Crowdsec.

Cache config

Mais vous pouvez également activer le "mode Stream" :

Stream config

Ce mode vous permet d'alimenter constamment le cache CrowdSec avec la liste des IP malveillantes via une tâche d'arrière-plan (CRON), ce qui le rend encore plus rapide lors de la vérification des IP de vos visiteurs. En outre, si votre site a beaucoup de visiteurs uniques en même temps, cela n'influencera pas le trafic vers l'API de votre instance CrowdSec.

CDN, proxy et load balancers

Si vous utilisez un CDN, un reverse proxy ou un load balancer, vous pouvez indiquer dans les paramètres les plages d'IP de ces dispositifs pour vérifier l'IP de vos utilisateurs. Pour les autres IP, le bouncer ne fera pas confiance à l'en-tête X-Forwarded-For :

CDN config

Conclusion

Avec ce guide, vous avez eu un aperçu de ce que pouvaient vous apporter CrowdSec et son bouncer spécifique Magento 2. Toutes les configurations n'ont pas été analysées dans le détail, mais vous devriez désormais avoir une idée assez précise des possibilités offertes.

Plusieurs évolutions, qui permettront notamment à l'agent CrowdSec d'utiliser des scénarios d'attaques spécifiques aux sites e-commerce, sont en cours de développement. Vous pouvez suivre ces évolutions en vous rendant sur la page GitHub dédiée.

Et si vous souhaitez échanger sur ce module ou sur tout autre sujet CrowdSec, vous pouvez contacter l'équipe en utilisant Discord.

OKAELI