Je suis passé de fail2ban (que j’utilise depuis lonnngtemps) à Crowdsec pour les raisons suivantes :
- fail2ban est (très) gourmand en ressource serveur (trop)
- Crowdsec dispose d’un volet « scénario » que je trouve bien malin et qui le rend « plus intelligent » et permet de mutualiser les IP frauduleuse.
Au final je bloque certainement plus d’attaques pour bien moins de CPU (surtout) consommés.
C’est plutôt flagrant sur le côté « économie de ressources CPU » sur les graph :
Mise en œuvre
Mon contexte : des serveurs avec le panel ISPconfig (ce dernier écoute sur le port 8080 – important pour la suite) sur Debian 11.
Je ne vais pas détailler ici ce qu’il y a dans la documentation Crowdsec, d’autant que ça peut changer. Pour mon OS (Debian) actuellement c’est :
# Installation du dépôt
curl -s https://install.crowdsec.net | sudo sh
# Installation de crowdsec
apt install crowdsec
Du coup, comme ISPconfig écoute déjà sur le port 8080 et que Crowdsec utilise ce port pour son API il faut modifier celui-ci (moi je passe à 8079) :
sed -i -e "s/8080/8079/g" /etc/crowdsec/config.yaml
sed -i -e "s/8080/8079/g" /etc/crowdsec/local_api_credentials.yaml
systemctl restart crowdsec
ISPconfig n’utilise pas logrotate pour la rotation de log apache, il a son propre processus intégré. Pour que Crowdsec puisse lire tout les logs HTTP (ici apache) il va falloir lui donner le chemin. MAIS. ISPconfig nomme les logs par date et créer un lien symbolique vers « access.log » :
# ls /var/log/ispconfig/httpd/david.mercereau.info/ -la
total 173480
drwxr-xr-x 2 root root 4096 30 juin 12:19 .
drwxr-xr-x 176 root root 12288 21 juin 16:05 ..
[...]
-rw-r--r-- 1 root root 4712747 29 juin 23:59 20240629-access.log
-rw-r--r-- 1 root root 2836678 30 juin 14:08 20240630-access.log
lrwxrwxrwx 1 root root 19 30 juin 12:19 access.log -> 20240630-access.log
lrwxrwxrwx 1 root root 55 30 juin 00:12 yesterday-access.log -> /var/www/clients/client3/web196/log/20240629-access.log
Ceci cause un problème pour la surveillance des changement crowdsec : https://github.com/crowdsecurity/crowdsec/issues/574. On pourrait indiquer /var/log/ispconfig/httpd/*/access.log mais il faudrait modifier le paramètre : https://docs.crowdsec.net/docs/data_sources/file/#poll_without_inotify et les performances (occupation) CPU s’en font directement sentir… C’est dommage. J’ai donc préféré indiquer /var/log/ispconfig/httpd//*[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]*.log à crowdsec :
echo "filenames:
# Vhost
- /var/log/ispconfig/httpd/*/[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]*.log
labels:
type: apache2" > /etc/crowdsec/acquis.d/ispconfig.yaml
Mais pour que le « nouveau » log soit pris en considération je fais un restart du service crowdsec à 0:20 (la rotation ayant lieu à ~0:10) chez moi au vu des date de création des fichiers de logs :
20 0 * * * systemctl restart crowdsec
C’est un peu du bricolage mais c’est le meilleurs compromis que j’ai jusque là.
EDIT : j’ai changé mon fusil d’épaule pour (aussi) ménager le nombre de fichier suivi par crowdsec (j’ai un serveur avec 200 vhost). En effet je me suis rendu compte que /var/log/apache2/other_vhosts_access.log était surveillé via /etc/crowdsec/acquis.yaml donc il y avait double surveillance des access. J’ai donc juste ajouté les « error.log » dans mon /etc/crowdsec/acquis.d/ispconfig.yaml
filenames:
- /var/log/ispconfig/httpd/*/error.log
labels:
type: apache2
J’ajoute d’autres « collection » en fonction des services que j’ai sur ce serveur :
cscli collections install crowdsecurity/base-http-scenarios
cscli scenarios install crowdsecurity/http-bf-wordpress_bf crowdsecurity/http-bf-wordpress_bf_xmlrpc crowdsecurity/http-wordpress_user-enum crowdsecurity/http-wordpress_wpconfig
cscli collections install crowdsecurity/dovecot
echo "filenames:
- /var/log/mail.log
labels:
type: syslog " > /etc/crowdsec/acquis.d/mail.yaml
cscli collections install fulljackz/pureftpd
A ce stade il n’y a aucun ‘effet’ (pas de blocage). De mon côté j’utilise le firewall iptables donc j’ai utiliser le bouncer qui va bien pour lui :
apt install crowdsec-firewall-bouncer-iptables
De la même façon on change le port pour joindre l’API
sed -i -e "s/8080/8079/g" /etc/crowdsec/bouncers/crowdsec-firewall-bouncer.yaml
systemctl restart crowdsec-firewall-bouncer
Des commandes utiles :
cscli decision list
cscli alert list
# Pour voir toutes les IP blacklisté (intégrant les IP renvoyé par l'API centrale crowdsec
ipset list crowdsec-blacklists
# Supprimer une IP bloqué
cscli decisions delete -i x.x.x.x
Il est possible d’aller bien plus loin, avant de blacklisté on peut demander un captcha à l’utilisateur : https://www.it-connect.fr/comment-proteger-son-site-wordpress-avec-crowdsec/ (pas mal…)
Ressources :
- https://docs.crowdsec.net/index.html
- https://aymeric-cucherousset.fr/installer-crowdsec-sur-apache2-debian-11/
- https://connect.ed-diamond.com/linux-pratique/lp-133/securisation-d-un-site-web-de-type-wordpress-a-l-aide-de-crowdsec
- https://www.it-connect.fr/comment-proteger-son-site-wordpress-avec-crowdsec/
- https://forum-debian.fr/viewtopic.php?t=2211
Bémols
Du fait de la « mutualisation » des blacklistes il y a de la data qui est envoyé chez un tiers… bon même si la société est Française le site est hébergé à San Francisco (mention légal) Typiquement le modèle économique est de récupérer de la data (les IP malveillantes) sur les « crowdsec community » pour détecter des intrusions et vendre des bases d’IP à bloquer aux autres… (note : ce partage vers l’API centrale est désactivable : FAQ / Troubleshooting | CrowdSec)
Le dashboard local est déprécié Cscli dashboard deprecation | CrowdSec au profil de l’APP en ligne crowdsec non open source pour le coup… (pour le coup c’est pas indispensable à l’usage de Crowdsec)
J’ai l’impression que le modèle économique se dessine et que ça se ferme un peu…
Toute proportion gardé bien sûr, on parle d’IP malveillante et non de data utilisateur… Je voudrais pas faire mon « libo-terroriste » hein
Plugin Munin
Moi j’aime bien monitorer ce qui ce passe et comme le dashboard local Crowdsec n’est plus maintenu, a minima j’ai fais un plugin pour avoir des graph’ dans Munin :
Il permet d’avoir des graph’s par pays et par scénario.