CrowdSec
Détection et blocage des comportements malveillants. CrowdSec lit les journaux (SWAG, SSH, Authelia, Nextcloud), y reconnaît des attaques (force brute, scans, exploitation de failles connues) et décide de bannir les adresses en cause. Le blocage lui-même est appliqué par le bouncer intégré à SWAG. CrowdSec partage aussi ses signalements avec la communauté et reçoit en retour une liste d'adresses malveillantes connues.
Déploiement : dans la stack swag, voir Reverse proxy.
Fonctionnement
| Composant | Rôle |
|---|---|
| Agent | Lit les journaux, les analyse (parseurs) et détecte les attaques (scénarios) |
| API locale (LAPI) | Enregistre les alertes et les décisions (bannissements) |
| Bouncer (dans SWAG) | Interroge l'API locale et bloque, ou présente un captcha, aux adresses concernées |
| API centrale (CAPI) | Partage des signalements, liste de blocage communautaire |
| Console | Tableau de bord en ligne sur app.crowdsec.net (instance enregistrée) |
Sources de journaux
Dans <APPDATA>/crowdsec/config/acquis.yaml et acquis.d/ :
- /var/log/host/auth.log
labels:
type: syslog
---
filenames:
- /var/log/swag/*
labels:
type: nginx
acquis.d/authelia-docker.yaml :
container_name:
- authelia
labels:
type: authelia
acquis.d/nextcloud.yaml :
- /var/log/nextcloud-data/nextcloud.log
labels:
type: Nextcloud
Montages correspondants dans le service crowdsec de la stack :
| Hôte | Conteneur | Pour |
|---|---|---|
| /var/log | /var/log/host (lecture seule) | Connexions SSH (auth.log) |
| <APPDATA>/swag/config/log/nginx | /var/log/swag (lecture seule) | Requêtes HTTP |
| /var/run/docker.sock | idem (lecture seule) | Journaux Docker d'Authelia |
| <APPDATA>/Nextcloud/Data | /var/log/nextcloud-data (lecture seule) | Connexions Nextcloud |
Pour Nextcloud, le dossier entier est monté plutôt que le seul fichier : lors de la rotation du journal, un montage de fichier resterait attaché à l'ancien. Nextcloud doit aussi connaître SWAG comme proxy de confiance (trusted_proxies et forwarded_for_headers dans config.php), sinon son journal ne contient que l'adresse de SWAG.
Autres sources prises en charge par l'image : journald, syslog, Loki, Kafka, S3, Kubernetes, requêtes HTTP…
Collections
Une collection regroupe les parseurs et scénarios d'un logiciel. Elle n'a d'effet que si CrowdSec reçoit les journaux correspondants.
| Collection | Détecte |
|---|---|
| crowdsecurity/nginx | Journaux de SWAG |
| crowdsecurity/base-http-scenarios | Scans, robots malveillants, force brute HTTP |
| crowdsecurity/http-cve | Tentatives d'exploitation de failles connues |
| crowdsecurity/linux et crowdsecurity/sshd | Force brute SSH |
| LePresidente/authelia | Échecs de connexion au portail Authelia |
| crowdsecurity/nextcloud | Échecs de connexion et alertes de force brute de Nextcloud |
| crowdsecurity/whitelist-good-actors | Ne jamais bannir les robots légitimes connus (moteurs de recherche…) |
Installées puis retirées faute de journaux : Jellyfin (tourne sur le Raspberry Pi), nginx-proxy-manager (autre reverse proxy), joplin-server.
docker exec crowdsec cscli collections install <COLLECTION>
docker exec crowdsec cscli collections remove <COLLECTION>
docker exec crowdsec cscli hub update && docker exec crowdsec cscli hub upgrade
Les collections de départ sont aussi déclarées dans la variable COLLECTIONS de la stack.
Vérifier que tout est lu
Chaque source doit avoir des lignes lues ; une source absente ou à zéro ne protège rien. Colonne Lines whitelisted : lignes ignorées, notamment celles venant du réseau local.
Décisions et alertes
docker exec crowdsec cscli decisions delete --ip <IP> # débloquer
docker exec crowdsec cscli decisions add --ip <IP> --duration 24h # bannir à la main
docker exec crowdsec cscli alerts list # dernières détections
docker exec crowdsec cscli alerts inspect <ID> # détail d'une alerte
Bouncer
Le bouncer est un mod de SWAG (swag-crowdsec), configuré par les variables du service swag : CROWDSEC_LAPI_URL, CROWDSEC_API_KEY, et pour le captcha CROWDSEC_CAPTCHA_PROVIDER avec ses clés Turnstile.
docker exec crowdsec cscli bouncers list
docker exec -it crowdsec cscli bouncers prune -d 168h # supprimer les entrées inactives depuis 7 jours
À chaque recréation, SWAG change d'adresse IP et CrowdSec enregistre une nouvelle entrée swag-bouncer@<IP> avec la même clé. Nettoyer de temps en temps avec prune.
Communauté et console
En place : instance enregistrée dans la console (abonnement communautaire), partage des signalements activé, liste de blocage communautaire et listes de la console reçues.
Options disponibles, non utilisées ici
Profils de remédiation
/etc/crowdsec/profiles.yaml décide de la réponse à chaque alerte : type (ban ou captcha) et durée (4 heures par défaut). Exemple, captcha plutôt que bannissement pour les alertes HTTP :
filters:
- Alert.Remediation == true && Alert.GetScope() == "Ip" && Alert.GetScenario() startsWith "crowdsecurity/http"
decisions:
- type: captcha
duration: 4h
on_success: break
À placer avant le profil par défaut.
Liste blanche personnalisée
Fichier dans /etc/crowdsec/parsers/s02-enrich/ :
description: "Adresses à ne jamais bannir"
whitelist:
reason: "adresses de confiance"
ip:
- "<IP>"
cidr:
- "<RESEAU>/24"
Mode simulation
Utile pour tester un nouveau scénario sans risque de bloquer des visiteurs légitimes.
Pare-feu applicatif (AppSec)
Composant de pare-feu web : analyse chaque requête avant qu'elle n'atteigne le service et bloque les exploitations connues (correctifs virtuels). Nécessite une source appsec dans l'acquisition et un bouncer compatible. Un essai a été désactivé ici (acquis.d/appsec.yaml.BAD).
Notifications
Greffons d'envoi (HTTP, courriel, Slack…) déclenchés à chaque décision, déclarés dans profiles.yaml (notifications:). Le greffon HTTP permet par exemple un message Telegram à chaque bannissement.
Tester l'analyse d'une ligne
Montre quel parseur reconnaît la ligne et quel scénario elle alimente.
Sauvegarde
<APPDATA>/crowdsec (configuration, base des décisions, identifiants de l'API centrale) est sauvegardé par le script de Sauvegarde.