0 Votes

Code source wiki de CrowdSec

Modifié par john le 2026/09/19 20:31

Afficher les derniers auteurs
1 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.
2
3 Déploiement : dans la stack swag, voir [[Reverse proxy>>Wiki Batcave John.Infrastructure.ServeurPrincipal.ReverseProxy.WebHome]].
4
5 == Fonctionnement ==
6
7 |=Composant|=Rôle
8 |Agent|Lit les journaux, les analyse (parseurs) et détecte les attaques (scénarios)
9 |API locale (LAPI)|Enregistre les alertes et les décisions (bannissements)
10 |Bouncer (dans SWAG)|Interroge l'API locale et bloque, ou présente un captcha, aux adresses concernées
11 |API centrale (CAPI)|Partage des signalements, liste de blocage communautaire
12 |Console|Tableau de bord en ligne sur app.crowdsec.net (instance enregistrée)
13
14 == Sources de journaux ==
15
16 Dans ##<APPDATA>/crowdsec/config/acquis.yaml## et ##acquis.d/## :
17
18 {{code language="yaml"}}
19 filenames:
20 - /var/log/host/auth.log
21 labels:
22 type: syslog
23 ---
24 filenames:
25 - /var/log/swag/*
26 labels:
27 type: nginx
28 {{/code}}
29
30 ##acquis.d/authelia-docker.yaml## :
31
32 {{code language="yaml"}}
33 source: docker
34 container_name:
35 - authelia
36 labels:
37 type: authelia
38 {{/code}}
39
40 ##acquis.d/nextcloud.yaml## :
41
42 {{code language="yaml"}}
43 filenames:
44 - /var/log/nextcloud-data/nextcloud.log
45 labels:
46 type: Nextcloud
47 {{/code}}
48
49 Montages correspondants dans le service crowdsec de la stack :
50
51 |=Hôte|=Conteneur|=Pour
52 |##/var/log##|##/var/log/host## (lecture seule)|Connexions SSH (##auth.log##)
53 |##<APPDATA>/swag/config/log/nginx##|##/var/log/swag## (lecture seule)|Requêtes HTTP
54 |##/var/run/docker.sock##|idem (lecture seule)|Journaux Docker d'Authelia
55 |##<APPDATA>/Nextcloud/Data##|##/var/log/nextcloud-data## (lecture seule)|Connexions Nextcloud
56
57 {{warning}}
58 Debian 13 n'installe plus rsyslog : sans lui, ##/var/log/auth.log## n'existe pas et les tentatives SSH ne sont pas surveillées. Installer ##rsyslog## sur l'hôte.
59 {{/warning}}
60
61 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.
62
63 Autres sources prises en charge par l'image : journald, syslog, Loki, Kafka, S3, Kubernetes, requêtes HTTP…
64
65 == Collections ==
66
67 Une collection regroupe les parseurs et scénarios d'un logiciel. Elle n'a d'effet que si CrowdSec reçoit les journaux correspondants.
68
69 |=Collection|=Détecte
70 |##crowdsecurity/nginx##|Journaux de SWAG
71 |##crowdsecurity/base-http-scenarios##|Scans, robots malveillants, force brute HTTP
72 |##crowdsecurity/http-cve##|Tentatives d'exploitation de failles connues
73 |##crowdsecurity/linux## et ##crowdsecurity/sshd##|Force brute SSH
74 |##LePresidente/authelia##|Échecs de connexion au portail Authelia
75 |##crowdsecurity/nextcloud##|Échecs de connexion et alertes de force brute de Nextcloud
76 |##crowdsecurity/whitelist-good-actors##|Ne jamais bannir les robots légitimes connus (moteurs de recherche…)
77
78 Installées puis retirées faute de journaux : Jellyfin (tourne sur le Raspberry Pi), nginx-proxy-manager (autre reverse proxy), joplin-server.
79
80 {{code language="bash"}}
81 docker exec crowdsec cscli collections list
82 docker exec crowdsec cscli collections install <COLLECTION>
83 docker exec crowdsec cscli collections remove <COLLECTION>
84 docker exec crowdsec cscli hub update && docker exec crowdsec cscli hub upgrade
85 {{/code}}
86
87 Les collections de départ sont aussi déclarées dans la variable ##COLLECTIONS## de la stack.
88
89 == Vérifier que tout est lu ==
90
91 {{code language="bash"}}
92 docker exec crowdsec cscli metrics show acquisition
93 {{/code}}
94
95 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.
96
97 == Décisions et alertes ==
98
99 {{code language="bash"}}
100 docker exec crowdsec cscli decisions list # adresses bannies
101 docker exec crowdsec cscli decisions delete --ip <IP> # débloquer
102 docker exec crowdsec cscli decisions add --ip <IP> --duration 24h # bannir à la main
103 docker exec crowdsec cscli alerts list # dernières détections
104 docker exec crowdsec cscli alerts inspect <ID> # détail d'une alerte
105 {{/code}}
106
107 == Bouncer ==
108
109 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.
110
111 {{code language="bash"}}
112 docker exec crowdsec cscli bouncers add swag-bouncer # nouvelle clé, à reporter dans CROWDSEC_API_KEY
113 docker exec crowdsec cscli bouncers list
114 docker exec -it crowdsec cscli bouncers prune -d 168h # supprimer les entrées inactives depuis 7 jours
115 {{/code}}
116
117 À 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##.
118
119 == Communauté et console ==
120
121 {{code language="bash"}}
122 docker exec crowdsec cscli capi status
123 {{/code}}
124
125 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.
126
127 == Options disponibles, non utilisées ici ==
128
129 === Profils de remédiation ===
130
131 ##/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 :
132
133 {{code language="yaml"}}
134 name: captcha_http
135 filters:
136 - Alert.Remediation == true && Alert.GetScope() == "Ip" && Alert.GetScenario() startsWith "crowdsecurity/http"
137 decisions:
138 - type: captcha
139 duration: 4h
140 on_success: break
141 {{/code}}
142
143 À placer avant le profil par défaut.
144
145 === Liste blanche personnalisée ===
146
147 Fichier dans ##/etc/crowdsec/parsers/s02-enrich/## :
148
149 {{code language="yaml"}}
150 name: perso/whitelist
151 description: "Adresses à ne jamais bannir"
152 whitelist:
153 reason: "adresses de confiance"
154 ip:
155 - "<IP>"
156 cidr:
157 - "<RESEAU>/24"
158 {{/code}}
159
160 === Mode simulation ===
161
162 {{code language="bash"}}
163 docker exec crowdsec cscli simulation enable <SCENARIO> # détecter sans bannir
164 {{/code}}
165
166 Utile pour tester un nouveau scénario sans risque de bloquer des visiteurs légitimes.
167
168 === Pare-feu applicatif (AppSec) ===
169
170 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##).
171
172 === Notifications ===
173
174 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.
175
176 === Tester l'analyse d'une ligne ===
177
178 {{code language="bash"}}
179 docker exec crowdsec cscli explain --log '<LIGNE_DE_JOURNAL>' --type nginx
180 {{/code}}
181
182 Montre quel parseur reconnaît la ligne et quel scénario elle alimente.
183
184 == Sauvegarde ==
185
186 ##<APPDATA>/crowdsec## (configuration, base des décisions, identifiants de l'API centrale) est sauvegardé par le script de [[Sauvegarde>>Wiki Batcave John.Infrastructure.Sauvegarde.WebHome]].