Crowdsec est une jeune solution de cybersécurité libre, gratuite, massivement collaborative et d’origine française. Il permet de détecter des comportements anormaux (à partir de l’analyse des logs provenant par exemple de syslog mais pas que) et de bloquer les attaques. Il collabore également au niveau mondial avec son réseau d’utilisateurs en partageant les adresses IP détectées. Ceci permet alors à chacun de les bloquer de manière préventive. L’objectif est de bâtir une immense base de données de réputation IP et d’en garantir un usage gratuit à ceux participant à son enrichissement.
En résumé, si vous souhaitez protéger des serveurs délivrant des services accessibles depuis Internet, Crowdsec est fait pour ça.
Fonctionnement général
Comme toute solution moderne, celle-ci vient avec son vocabulaire dont voici une présentation simplifiée :
Collection : ensemble de parsers et de scénarios.
Bouncer : en charge des blocages (en s’appuyant sur iptables, nginx…). L’installation d’un bouncer sur un serveur ne nécessite pas obligatoirement l’installation de l’agent Crowdsec sur ce même serveur.
Parser : analyseur de logs adapté à un service. L’analyseur peut être sur une machine différente que le serveur LAPI.
Scénario : permet de détecter et de qualifier un comportement spécifique, généralement une attaque.
Agent Crowdsec : peut être configuré en mode “standalone” (fonctionnement de base) ou bien configuré pour se connecter à un autre agent Crowdsec qui fait office de serveur Local API.
Serveur local API : agent crowdsec qui se connecte au serveur Central API et configuré pour que puissent se connecter :
les agents Crowdsec (faisant tourner les parsers et les scénarios)
les bouncers (pour récupérer et appliquer les décisions de blocages).
Serveur Central API : serveur Central API auquel se connecte le serveur Local API pour récupérer les décisions communautaires et participer à celles-ci.
cscli : ligne de commande permettant d’interagir avec Crowdsec.
Il lit les journaux (définis via la configuration d’acquisition)
Ces journaux sont analysés via des parsers et éventuellement enrichis.
Ces journaux normalisés sont ensuite comparés aux scénarios déployés par l’utilisateur.
Lorsqu’un scénario est “déclenché”, Crowdsec-agent génère une alerte et éventuellement une ou plusieurs décisions associées.
L’alerte est ici principalement pour la traçabilité, et demeurera même après l’expiration de la décision.
La décision, quant à elle, est de courte durée et indique les mesures à prendre contre l’adresse IP/plage/utilisateur incriminé…
Ces informations (le signal, les décisions associées) sont ensuite envoyées à l’API locale de crowdsec et stockées dans la base de données.
ATTENTION
Il faut bien garder à l’esprit que le package Crowdsec est seulement en charge de la détection et ne va pas bloquer quoi que ce soit. Il faut pour cela installer un agent de remédiation (bouncer)pour prendre cette décision.
Installation
Crowdsec peut s’installer sur d’autre distribution Linux, tout est documenté sur la page d’installation
# apt-get install crowdsecReading package lists... Done
Building dependency tree... Done
Reading state information... Done
The following NEW packages will be installed:
crowdsec
0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
Need to get 0 B/36.6 MB of archives.
After this operation, 137 MB of additional disk space will be used.
Preconfiguring packages ...
Selecting previously unselected package crowdsec.
(Reading database ... 33631 files and directories currently installed.)Preparing to unpack .../crowdsec_1.5.2_amd64.deb ...
You can always run the configuration again interactively by using '/usr/share/crowdsec/wizard.sh -c
Unpacking crowdsec (1.5.2) ...
Setting up crowdsec (1.5.2) ...
Updating hub
INFO[09-07-2023 11:43:48] hub index is up to date
INFO[09-07-2023 11:43:48] Wrote new 787710 bytes index to /etc/crowdsec/hub/.index.json
Created symlink /etc/systemd/system/multi-user.target.wants/crowdsec.service → /lib/systemd/system/crowdsec.service.
You can always run the configuration again interactively by using '/usr/share/crowdsec/wizard.sh -c
Enrollment de l’agent
Pour pouvoir avoir accès facilement aux alertes remontées par l’agent installé sur votre serveur, il faut l’enregistrer sur le site de Crowdsec et donc se connecter à la Console
Et avoir accès au menu principal:
Ensuite, il faut sélectionner Engines, puis Add security engine
Il faut maintenant récupérer la commande permettant d’ajouter votre nouvelle sonde sur votre compte.
Une fois connecté à la console il suffit de lancer la commande précédente:
cscli console enroll <Identiant Crowdsec>
# cscli capi registerWARN[09-07-2023 12:47:20] can't load CAPI credentials from '/etc/crowdsec/online_api_credentials.yaml' (missing field)
INFO[09-07-2023 12:47:20] push and pull to Central API disabled
WARN[09-07-2023 12:47:20] You are using sqlite without WAL, this can have a performance impact. If you do not store the database in a network share, set db_config.use_wal to true. Set explicitly to false to disable this warning.
WARN[09-07-2023 12:47:20] can't load CAPI credentials from '/etc/crowdsec/online_api_credentials.yaml'(missing field)INFO[09-07-2023 12:47:20] push and pull to Central API disabled
INFO[09-07-2023 12:47:20] Successfully registered to Central API (CAPI)INFO[09-07-2023 12:47:20] Central API credentials dumped to '/etc/crowdsec/online_api_credentials.yaml'WARN[09-07-2023 12:47:20] Run 'sudo systemctl reload crowdsec'for the new configuration to be effective.
On relance Crowdsec
# systemctl reload crowdsec
# cscli console enroll <Identiant Crowdsec>WARN[09-07-2023 12:48:40] You are using sqlite without WAL, this can have a performance impact. If you do not store the database in a network share, set db_config.use_wal to true. Set explicitly to false to disable this warning.
INFO[09-07-2023 12:48:42] manual set to trueINFO[09-07-2023 12:48:42] context set to trueINFO[09-07-2023 12:48:42] Enabled tainted&manual alerts sharing, see 'cscli console status'.
INFO[09-07-2023 12:48:42] Watcher successfully enrolled. Visit https://app.crowdsec.net to accept it.
INFO[09-07-2023 12:48:42] Please restart crowdsec after accepting the enrollment.
Il faut ensuite retourner sur la console WEB pour accepter l’ajout de notre nouveau serveur
Le nouveau serveur apparait normalement dans la liste.
Notre nouveau serveur n’est dans aucune liste d’exclusions, n’a aucun bouncer installés, ni aucun scénario.
Configuration
Ajout dans les listes d’exclusions
Avec un compte de base, on ne peut utiliser que deux des listes disponibles. J’ai fait le choix d’utiliser les deux suivantes:
Pour ajouter des endpoint, il suffit de selectionner sur la droite des listes Manage. Il vous propose le ou les serveurs enregistrés et ne figurant pas dans cette liste.
Cette opération est a répéter pour chaque liste.
# cscli scenario install crowdsecurity/http-backdoors-attemptsWARN[09-07-2023 13:58:51] crowdsecurity/http-backdoors-attempts : overwrite
INFO[09-07-2023 13:58:51] Enabled crowdsecurity/http-backdoors-attempts
INFO[09-07-2023 13:58:51] Run 'sudo systemctl reload crowdsec'for the new configuration to be effective.
Il est possible d’installer plusieurs scénarios en même temps.
# cscli scenario install crowdsecurity/http-backdoors-attempts crowdsecurity/http-bad-user-agentWARN[09-07-2023 13:59:22] crowdsecurity/http-backdoors-attempts : overwrite
INFO[09-07-2023 13:59:22] Enabled crowdsecurity/http-backdoors-attempts
WARN[09-07-2023 13:59:22] crowdsecurity/http-bad-user-agent : overwrite
INFO[09-07-2023 13:59:22] Enabled crowdsecurity/http-bad-user-agent
INFO[09-07-2023 13:59:22] Run 'sudo systemctl reload crowdsec'for the new configuration to be effective.
Intallation des bouncers
La sortie résultant de l’installation est très verbeuse. L’exemple suivant montre uniquement l’installation du Bounceriptables
# apt install crowdsec-firewall-bouncer-iptables
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
The following additional packages will be installed:
ipset libipset13
The following NEW packages will be installed:
crowdsec-firewall-bouncer-iptables ipset libipset13
0 upgraded, 3 newly installed, 0 to remove and 0 not upgraded.
Need to get 3,771 kB of archives.
After this operation, 12.9 MB of additional disk space will be used.
Do you want to continue? [Y/n] y
Get:1 http://mirror.hetzner.com/debian/packages bookworm/main amd64 libipset13 amd64 7.17-1 [67.5 kB]Get:2 http://mirror.hetzner.com/debian/packages bookworm/main amd64 ipset amd64 7.17-1 [45.7 kB]Get:3 https://packagecloud.io/crowdsec/crowdsec/debian bookworm/main amd64 crowdsec-firewall-bouncer-iptables amd64 0.0.27 [3,658 kB]Fetched 3,771 kB in 1s (4,335 kB/s)Selecting previously unselected package libipset13:amd64.
(Reading database ... 33645 files and directories currently installed.)Preparing to unpack .../libipset13_7.17-1_amd64.deb ...
Unpacking libipset13:amd64 (7.17-1) ...
Selecting previously unselected package ipset.
Preparing to unpack .../ipset_7.17-1_amd64.deb ...
Unpacking ipset (7.17-1) ...
Selecting previously unselected package crowdsec-firewall-bouncer-iptables.
Preparing to unpack .../crowdsec-firewall-bouncer-iptables_0.0.27_amd64.deb ...
Unpacking crowdsec-firewall-bouncer-iptables (0.0.27) ...
Setting up libipset13:amd64 (7.17-1) ...
Setting up ipset (7.17-1) ...
Setting up crowdsec-firewall-bouncer-iptables (0.0.27) ...
INFO[0000] crowdsec-firewall-bouncer v0.0.27-debian-pragmatic-8d09f19d69e92a63e63888794af3a57c6ade3489
cscli/crowdsec is present, generating API key
API Key successfully created
Created symlink /etc/systemd/system/multi-user.target.wants/crowdsec-firewall-bouncer.service → /etc/systemd/system/crowdsec-firewall-bouncer.service.
Processing triggers for man-db (2.11.2-2) ...
Processing triggers for libc-bin (2.36-9) ...
Il faut relancer Crowdsec
# systemctl reload crowdsec
Controle de l’installation
Parsers
On peut ensuite contrôler l’installation ainsi que les version des différents parsers présent sur le serveur.
# cscli bouncers list────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
Name IP Address Valid Last API pull Type Version Auth Type
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cs-firewall-bouncer-1688901786 127.0.0.1 ✔️ 2023-07-09T11:39:29Z crowdsec-firewall-bouncer v0.0.27-debian-pragmatic-8d09f19d69e92a63e63888794af3a57c6ade3489 api-key
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
Note:
La remontée des informations sur la console Crowdsec peut prendre un peu de temps mais au final une fois le serveur configuré, vous devriez avoir quelque chose dans le genre.
Il est possible d’installer Crowdsec sur des firewall comme opnsense et ainsi bénéficier d’un firewall NextGen
Console
# cscli console status╭────────────────────┬───────────┬───────────────────────────────────────────────────╮
│ Option Name │ Activated │ Description │
├────────────────────┼───────────┼───────────────────────────────────────────────────┤
│ custom │ ✅ │ Send alerts from custom scenarios to the console │
│ manual │ ✅ │ Send manual decisions to the console │
│ tainted │ ✅ │ Send alerts from tainted scenarios to the console │
│ context │ ✅ │ Send context with alerts to the console │
│ console_management │ ❌ │ Receive decisions from console │
╰────────────────────┴───────────┴───────────────────────────────────────────────────╯
il est possible d’activer ou de désactiver les options avec la commande cscli console enable/disable <Nom de l'option>
Conclusion
Au final, par le biais de cette console centralisée, vous avez un rapport complet des alertes sur votre infrastructure.
Les différentes graphes vous permettrons d’avoir une meilleure appréhension de la sécurité sur vos serveurs, firewalls.