Sécurité

CrowdSec Web UI: Visualiser et gérer ses décisions depuis une interface moderne et gratuite – guide complet

CrowdSec Web UI est un projet open source développé par TheDuffman85 et ses contributeurs. Sans leur travail, cet article n’existerait pas. Le projet est disponible sur GitHub sous licence AGPL-3.0 — si vous l’utilisez, pensez à lui laisser une ⭐ sur le repo.

Sommaire


Introduction

Après avoir configuré CrowdSec pour protéger son serveur, on se retrouve vite à taper par exemple cscli decisions list dans le terminal pour voir ce qui se passe. Ça fonctionne, mais c’est loin d’être pratique, surtout quand on veut partager un rapport avec quelqu’un d’autre ou avoir une vue d’ensemble claire de son infrastructure.

CrowdSec Web UI répond exactement à ce besoin. C’est une interface web open source qui se connecte à l’API locale de CrowdSec et expose tout ce dont on a besoin : tableau de bord avec statistiques, carte géographique des attaquants, gestion des décisions, historique des alertes et système de notifications.

Je l’utilise personnellement pour produire des rapports lisibles et donner accès à des tiers de confiance sans ouvrir un accès SSH.


Ce que ça apporte concrètement

Le tableau de bord affiche en temps réel les alertes actives, les décisions en cours et les scénarios déclenchés. Une carte mondiale positionne géographiquement les IPs bloquées, pratique pour visualiser d’un coup d’œil l’exposition de son serveur.

La gestion des décisions permet de bannir ou débannir une IP directement depuis l’interface, sans passer par le terminal. Si un client ou un hébergeur vous contacte parce qu’une de ses IPs est bloquée, vous pouvez lui donner accès en lecture ou intervenir vous-même et produire un rapport structuré.

Le système de notifications envoie des alertes par email, ntfy, MQTT ou webhook quand un seuil est dépassé ou qu’un CVE récent est détecté dans les alertes.


Prérequis

  • CrowdSec déjà installé (paquet natif ou Docker)
  • Docker et Docker Compose installés

1. Créer le compte machine CrowdSec

CrowdSec Web UI se connecte à l’API locale via un compte machine dédié. Commencez par générer un mot de passe sécurisé :

openssl rand -hex 32

Notez ce mot de passe. Créez ensuite le compte machine selon votre installation.

CrowdSec en paquet natif :

sudo cscli machines add crowdsec-web-ui --password <mot-de-passe-généré> -f /dev/null

CrowdSec en Docker :

docker exec crowdsec cscli machines add crowdsec-web-ui --password <mot-de-passe-généré> -f /dev/null

Le flag -f /dev/null est important car il empêche d’écraser le fichier de credentials du conteneur CrowdSec existant.


2. Configurer l’écoute de la LAPI

C’est le point qui pose le plus de problèmes. CrowdSec Web UI tourne en Docker et doit joindre l’API CrowdSec (LAPI). Selon votre configuration, deux approches sont possibles.

CrowdSec en paquet natif {#crowdsec-natif}

Par défaut, la LAPI écoute sur 127.0.0.1:8080. Un conteneur Docker ne peut pas joindre le loopback de l’hôte — il faut donc faire écouter la LAPI sur l’IP locale du serveur.

Éditez /etc/crowdsec/config.yaml :

api:
  server:
    listen_uri: 192.168.1.30:8080

Remplacez 192.168.1.30 par l’IP locale de votre serveur. Redémarrez CrowdSec :

sudo systemctl restart crowdsec

CrowdSec en Docker {#crowdsec-docker}

Si CrowdSec lui-même tourne en Docker, la solution la plus propre est de mettre CrowdSec Web UI sur le même réseau Docker. Les conteneurs du même réseau se joignent par leur nom de service, sans passer par l’IP de l’hôte.

Vérifiez le nom du réseau de votre conteneur CrowdSec :

docker inspect crowdsec | grep -A 10 Networks

Dans votre .env, utilisez le nom du service CrowdSec :

CROWDSEC_URL=http://crowdsec:8080

Et dans le docker-compose.yml, attachez les deux conteneurs au même réseau.


3. Déployer CrowdSec Web UI

Créez un dossier pour le projet :

mkdir -p /opt/docker/crowdsec-web-ui/data
cd /opt/docker/crowdsec-web-ui

Créez le fichier .env en adaptant selon votre cas :

# CrowdSec natif — adapter l'IP
CROWDSEC_URL=http://192.168.1.30:8080

# CrowdSec Docker — décommenter et commenter la ligne ci-dessus
# CROWDSEC_URL=http://crowdsec:8080

CROWDSEC_USER=crowdsec-web-ui
CROWDSEC_PASSWORD=<mot-de-passe-généré>
CROWDSEC_REFRESH_INTERVAL=30s
CROWDSEC_LOOKBACK_PERIOD=168h

Créez le docker-compose.yml :

services:
  crowdsec-web-ui:
    image: ghcr.io/theduffman85/crowdsec-web-ui:latest
    container_name: crowdsec_web_ui
    env_file:
      - .env
    volumes:
      - ./data:/app/data
    restart: unless-stopped
    networks:
      - crowdsec-net

networks:
  crowdsec-net:
    external: true

Démarrez le conteneur :

docker compose up -d
docker compose logs -f

4. Vérifier la connexion

curl http://localhost:3000/api/health
# {"status":"ok"}

Vérifiez que le compte machine est actif :

# CrowdSec natif
sudo cscli machines list

# CrowdSec Docker
docker exec crowdsec cscli machines list

Vous devriez voir crowdsec-web-ui dans la liste avec un statut actif.

[📷 Screenshot de cscli machines list avec crowdsec-web-ui actif — à insérer ici]


5. Protéger l’accès avec Nginx et Authentik

CrowdSec Web UI n’a aucune authentification intégrée. La sécurité sera déléguée au reverse proxy, ce qui est la bonne approche.

Pour ma part, j’utilise Authentik comme SSO centralisé. Tous mes services internes passent par Nginx qui vérifie l’authentification avant de laisser passer la requête.

Le guide Authentik complet fera l’objet d’un article dédié.


6. Donner accès à un tiers de confiance

Un des cas d’usage concrets : permettre à quelqu’un d’autre de consulter les données sans accès SSH.

Si un client vous contacte parce qu’une de ses IPs est bloquée, deux options selon le niveau de confiance accordé : lui donner un accès temporaire via Authentik pour qu’il consulte lui-même les alertes qui ont déclenché le blocage, ou intervenir directement depuis l’interface, débannir l’IP et lui envoyer un rapport visuel.

La carte géographique et les statistiques par scénario permettent de produire rapidement un document compréhensible, même par quelqu’un qui ne connaît pas CrowdSec.


7. Configurer les notifications

CrowdSec Web UI peut envoyer des alertes quand un seuil est dépassé. Rendez-vous dans l’interface → NotificationsNouveau canal.

Les destinations supportées : email, ntfy, Gotify, MQTT et webhook. Pour chaque canal, vous pouvez définir des règles sur le type d’événement — pic d’alertes, seuil dépassé, CVE récent détecté, ou mise à jour disponible.


Conclusion

CrowdSec Web UI transforme la supervision de sécurité en quelque chose d’accessible et de partageable. L’interface est propre, les données sont claires, et la carte géographique donne une vision immédiate de l’exposition de son serveur.

L’essentiel à retenir : ne jamais exposer le port 3000 directement sur Internet. Derrière Authentik ou n’importe quel proxy auth, c’est un outil très utile au quotidien, aussi bien pour soi que pour collaborer avec un tiers.

Sources : TheDuffman85/crowdsec-web-ui — AGPL-3.0

← Protéger Nginx (NPM/SWAG) avec CrowdSec — guide complet
Laisser un commentaire