Geeek.org 🗲 Blog Geek & High Tech 100% Indépendant

C’est la question que je me suis posée il y a quelques semaines : comment est-il possible, via une licence Cloudflare gratuite, de récupérer les alertes de sécurité du pare-feu afin de les reporter vers la plateforme AbuseIPDB, qui centralise un très grand nombre d’incidents de sécurité ?

L’approche est assez proche de la technique que j’avais présentée dans un précédent article, basée sur Fail2ban et Portsentry.

En analysant plus en détail les API de Cloudflare, on constate qu’il existe de nombreuses fonctionnalités permettant de récupérer des événements ou des journaux (logs)… mais uniquement dans la version Enterprise du produit qui est payante.

Eurêka ! Après une bonne dizaine de minutes de recherche, quelques fausses pistes et pas mal de documentation parcourue, j’ai découvert qu’une API GraphQL était mise à disposition des développeurs pour récupérer précisément les données de leur choix. Bingo.

Développons un script Python pour extraire et analyser les données

Je me suis donc amusé à développer un script Python capable de :

  • récupérer les données du pare-feu Cloudflare via une requête GraphQL ;
  • analyser le nombre d’événements par adresse IP ;
  • vérifier le statut de chaque IP sur AbuseIPDB ;
  • et enfin dénoncer les IP malveillantes auprès d’AbuseIPDB, en s’appuyant sur les attaques détectées.

Le script totalise environ 700 lignes de code. La majorité a été générée à l’aide de GitHub Copilot et il s’utilise de la manière suivante :

python3 cloudflare-abuseipdb-report.py --api-token "xxxx-xxx" --zone-id "xxxxxx" --abuseipdb-key "xxxxxx" --report

Le token API à fournir est celui de Cloudflare. Il doit disposer des droits en lecture sur les journaux ainsi que sur les informations de la zone, afin que le script puisse interroger l’API GraphQL.

L’identifiant de zone correspond à votre site hébergé derrière Cloudflare. Vous pouvez le retrouver très facilement sur la page principale de votre zone dans l’interface Cloudflare.

Enfin, la clé AbuseIPDB est facultative. Elle permet toutefois d’analyser les IP détectées et de les dénoncer automatiquement auprès d’AbuseIPDB via l’option --report.

Deux autres options sont également disponibles et peuvent s’avérer très utiles si vous souhaitez intégrer ce script dans un traitement batch :

  • --minutes : valeur par défaut à 1440 minutes (24 heures), qui correspond à la durée maximale supportée par l’API GraphQL en version gratuite.
  • --limit : nombre maximal d’événements à retourner. Par défaut, la valeur est fixée à 1000 si ce paramètre n’est pas renseigné.

Le rapport d’analyse produit par le script

En lançant le script sans l’option --report, vous obtiendrez un rapport d’analyse de la forme suivante :

cloudflare-report.png

Ce qui est particulièrement intéressant, c’est de constater que la quasi-totalité des adresses IP détectées sont déjà connues d’AbuseIPDB pour des activités malveillantes sur Internet. Le score AbuseIPDB atteint même 100 % pour la majorité d’entre elles.

Si vous ne souhaitez pas analyser les IP ni récupérer leur score AbuseIPDB, vous pouvez exécuter le script sans fournir de clé API AbuseIPDB. Vous obtiendrez alors un rapport plus léger, centré uniquement sur les événements Cloudflare :

cloudflare-report-2.png

Il serait aussi possible d'ajouter un appel à Shodan dans le script pour récupérer les caractéristiques du serveur à la source de l'attaque. Mais dans mon cas, je ne cherche pas à identifier les vulnérabilités des serveurs qui m'attaquent.

Dénonçons les vilains pirates auprès d’AbuseIPDB

Une fois la pertinence des attaques bloquées validée, il est temps de passer à l’étape suivante : la dénonciation auprès d’AbuseIPDB.

Le script est configuré pour utiliser les catégories AbuseIPDB suivantes :

  • 15 : Hacking
  • 21 : Web App Attack

Ces valeurs sont définies sous forme de constantes dans l’en-tête du script et peuvent bien entendu être modifiées selon vos besoins.

En ajoutant l’option --report, le script dénoncera chacune des IP détectées, en envoyant à AbuseIPDB une synthèse claire et exploitable de l’attaque identifiée par Cloudflare. Le message envoyé est évidemment totalement personnalisable dans le code.

abuseipdb-screenshot.png

Lorsque l’option --report est activée, un fichier de log nommé report.log est généré. Il contient l’ensemble des IP dénoncées et permet de conserver un historique complet des signalements effectués.

Vous pouvez également consulter votre profil AbuseIPDB afin de visualiser la liste des dernières adresses IP que vous avez signalées.

Ordonnancer le script avec une tâche Cron

Maintenant que le script est pleinement fonctionnel, vous pouvez l’exécuter à intervalles réguliers directement depuis votre serveur, à l’aide d’une simple tâche Cron.

Je vous recommande une exécution une fois par heure ou une fois par jour, en fonction du trafic et de l’exposition de votre site Internet.

Pour cela, il suffit d’utiliser le fichier cloudflare-abuseipdb-report.cron et de le copier dans le répertoire /etc/cron.d/ afin d’automatiser la tâche de reporting.

En conclusion

J’espère que ce petit script, développé au cours d’une soirée d’automne, vous sera utile. Vous serez sans doute surpris par le nombre d’adresses IP identifiées comme suspectes, en particulier si vous ajoutez des règles personnalisées au pare-feu Cloudflare, par exemple sur des URL de type /wp-. Ces dernières sont en effet très prisées par les attaquants, car étroitement liées à WordPress.

Vous avez des idées pour améliorer ce script ? N'hésitez pas à forker le script et à proposer des pull requests.

N’hésitez pas à passer sur le serveur Discord Geeek pour en discuter : le serveur est ouvert à tous les passionnés.


Vous êtes correctement abonné à Geeek
Bienvenue ! Vous êtes correctement connecté.
Parfait ! Vous êtes correctement inscrit.
Votre lien a expiré
Vérifiez vos emails et utiliser le lien magique pour vous connecter à ce site