Masquer les derniers auteurs
| author | version | line-number | content |
|---|---|---|---|
![]() |
1.1 | 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]]. |
