Crowdsec – ispconfig / iptables

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 :

Comparatif stats (munin) avant avec fail2ban et après avec crowdsec

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 :

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 :slight_smile:

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.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.

En continuant à utiliser le site, vous acceptez l’utilisation des cookies (au chocolat) Plus d’informations

Les cookies sont utilisés à des fin de statistique de visite du blog sur une plateforme indépendante que j'héberge moi même. Les statistiques sot faites avec un logiciel libre. Aucune information n'est redistribué à google ou autre. Je suis seul autorisé à lire ces informations

Fermer