L’idée sous-jacente est d’avoir Crowdsec installé sur tous les servers (Windows ou Linux) et de les faire communiquer pour éviter toute attaque.
C’est-à-dire que si un équipement avec Windows ou Linux est attaqué, le reste des machines de l’organisation peut découvrir l’attaque et bloquer l’adresse IP de l’attaquant avant même qu’il ne puisse frapper. Par défaut, disons que Crowdsec fonctionne localement, chaque agent crowdsec communique avec son propre serveur API local, nous allons faire en sorte qu’ils communiquent tous avec le même serveur LAPI.
Schéma de fonctionnement des divers composant de la solution Crowdsec
1. Serveur local API
Nous allons commencer par configurer la machine que nous voulons comme serveur API pour le reste des agents.
Nous l’activons donc dans votre fichier de configuration /etc/crowdsec/config.yaml, nous indiquons l’IP et le port sur lesquels il écoutera.
Par defaut, le serveur n’écoute que localement 127.0.0.1. Il faut remplacer cette adresse et le port par les valeurs désirées.
api:client:insecure_skip_verify:falsecredentials_path:/etc/crowdsec/local_api_credentials.yamlserver:log_level:infolisten_uri:127.0.0.1:8080<== Remplacer par l adresse externe.profiles_path:/etc/crowdsec/profiles.yamlconsole_path:/etc/crowdsec/console.yamlonline_client:# Central API credentials (to push signals and receive bad IPs)credentials_path:/etc/crowdsec/online_api_credentials.yamltrusted_ips:# IP ranges, or IPs which can have admin API access- 127.0.0.1- ::1# tls:# cert_file: /etc/crowdsec/ssl/cert.pem# key_file: /etc/crowdsec/ssl/key.pem
A changer également dans le fichier /etc/crowdsec/local_api_credentials.yaml
url:http://127.0.0.1:8080 <== Remplacer par l adresse externe.login:<LOGIN ID>password:<PASSWORD>
Note:
Sur un firewall Opnsense les fichiers ne se trouvent pas au même endroit. Ils sont dans le répertoire /usr/local/etc/crowdsec/
Les étapes de configurations sont les mêmes.
On relance ensuite Crowdsec pour prendre en compte les modifications
Linux (Debian)
# systemctl restart crowdsec
Opnsense (BSD)
# service crowdsec restartStopping crowdsec.
Waiting for PIDS: 77187.
2. Configuration des agents Crowdsec
maintenant, Il reste à enregistrer le reste des machines possedant un agent Crowdsec sur le serveur central. Il faudra également désactiver le LAPI de chaque machine Crowdsec car il ne sera pas utilisé. Sur notre infrastructure, c’est un firewall en entrée de zone qui accepte les enregistrements sur son API local.
Enregistrement de l’agent
# cscli lapi register -u http://<IP SERVEUR LAPI>:8080INFO[16-07-2023 11:23:24] Successfully registered to Local API (LAPI)INFO[16-07-2023 11:23:24] Local API credentials dumped to '/etc/crowdsec/local_api_credentials.yaml'WARN[16-07-2023 11:23:24] Run 'sudo systemctl reload crowdsec'for the new configuration to be effective.
Désactivation de l’agent LAPI sur le serveur enregistré.
Par défaut, le serveur api local LAPI est actif sur chaque installation d’agent CrowdSec. Dans cette configuration, nous voulons le désactiver sur le serveur agissant en client. Il faut donc modifier le fichier qui permet d’initialiser le service Crowdsec et d’y ajouter un paramêtre lors du lancement de l’agent Crowdsec
Nous allons ajouter l’option -no-api à la fin de la ligne ExecStart du fichier de configuration du service Crowdsec.
Editer le fichier /lib/systemd/system/crowdsec.service
3. Validation de l’enregistrement sur le server LAPI
On peut consulter la liste des serveurs enregistrés sur notre serveur CrowdsecLAPI, ici notre firewall.
1# cscli machines list2────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
3 Name IP Address Last Update Status Version Auth Type Last Heartbeat
4────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
5 c1ac4dSjeiuG5 192.168.XX.XX 2023-07-16T09:38:33Z ✔️ v1.5.1-freebsd-freebsd-b76e95e3 password 15s
6 828cf8Bke7SfY 192.168.XX.XX 2023-07-16T09:23:25Z 🚫 password ⚠️ 15m24s
7────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
On peut contrôler le bon déroulement de l’enregistrement:
# cscli machines list─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
Name IP Address Last Update Status Version Auth Type Last Heartbeat
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
c1ac4dSjeiuG5 192.168.XX.XX 2023-07-16T09:45:33Z ✔️ v1.5.1-freebsd-freebsd-b76e95e3 password 0s
828cf8Bke7SfY 192.168.XX.XX 2023-07-16T09:45:17Z ✔️ v1.5.2-debian-pragmatic-9d264c0 password 16s
─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
Sans oublier de recharger Crowdsec dans chaque agent une fois que nous l’avons validé, avec :
# systemctl restart crowdsec
Il est possible de contrôler le statut du dialogue de l’agent avec le LAPI:
# cscli lapi statusINFO[16-07-2023 12:11:15] Loaded credentials from /etc/crowdsec/local_api_credentials.yaml
INFO[16-07-2023 12:11:15] Trying to authenticate with username 245d54aVlcdUqboV on http://192.168.XX.XX:8080/
INFO[16-07-2023 12:11:15] You can successfully interact with Local API (LAPI)
4. Mise en oeuvre des mesures de remédiation
Nous allons générer des Tokens(jetons) sur le serveur LAPI.
# cscli bouncers add brzl001Api key for'brzl001':
caa197<deleted>904937eef
Please keep this key since you will not be able to retrieve it!
# cscli bouncers add brzl002Api key for'brzl002':
666a0ce<deleted>0ca1f7fb
Please keep this key since you will not be able to retrieve it!
# cscli bouncers add brzl004Api key for'brzl004':
6e8171<deleted>a72a61176
Please keep this key since you will not be able to retrieve it!
On vient éditer sur chaque serveur se connectant sur notre serveur LAPI le fichier /etc/crowdsec/cs-firewall-bouncer/cs-firewall-bouncer.yaml
api_url: par l’url du serveur LAPI.
api_key: par le token généré ci-dessus.
1mode:iptables 2pid_dir:/var/run/ 3update_frequency:10s 4daemonize:true 5log_mode:file 6log_dir:/var/log/ 7log_level:info 8log_compression:true 9log_max_size:10010log_max_backups:311log_max_age:3012api_url:http://192.168.XX.XX:8080/13api_key:caa197<deleted>904937eef14insecure_skip_verify:false15disable_ipv6:false16deny_action:DROP17deny_log:false18supported_decisions_types:19- ban
On relance ensuite le bouncers
# systemctl restart crowdsec-firewall-bouncer
5. Conclusion
A ce stade tous les serveurs ayant leur agent Crowdsec enregistrés auprés de notre LAPI, en l’occurence ici notre firewall partageront leur blacklist et bloqueront les IPs traitées par le bouncer du Firewall.
L’ajout et validation de nouveaux bouncers. Il est important de noter que les bouncers et agents CrowdSec ne doivent pas forcément être installés sur le même serveur. L’agent CrowdSec doit être installé là où les journaux sont générés, mais la remédiation peut être déportée là où elle est utile.
6. Quelques mises en garde :
Les communications entre les agents se font par HTTP en clair. Ceci est acceptable sur un réseau local, mais pas possible sur Internet. CrowdSec permet l’utilisation de HTTPS pour ces communications. La surveillance ou l’alerte n’est pas non plus couverte dans cet article. CrowdSec permet une surveillance très puissante grâce au scraper Prometheus.
La base de données CrowdSec n’est pas hautement disponible. En outre, l’agent CrowdSec sur le serveur hébergeant LAPI est SPOF.