Gestion de SPAM sur prosody
- 505 words
- 3 min
J'avais lancé un serveur XMPP sur militant.es en phase de test pour me familiariser avec Prosody. Je me suis dit "on laisse les inscriptions ouvertes, je gèrerai le SPAM quand il y en aura". Ça n'a pas loupé. LinkMauve m'a signalé du SPAM provenant de mon serveur, et j'ai découvert qu'il y avait 15235 comptes. Étonnant étant donné que je n'avais jamais fait de pub pour ce service et que la page d'accueil annonce clairement que la messagerie est en phase de test.
Première étape : récupérer la liste des comptes. Un simple ls dans le dossier accounts me donnait la liste en ASCII encodé dans le style URL. Pas très pratique pour gérer les points, tirets, lettres accentuées... J'ai donc opté pour une autre approche. Tout d'abord installer le module telnet pour prosody, puis se connecter avec telnet localhost 5582. La commande user:list("militant.es") donne la liste avec le bon encodage, mais comment la récupérer ? C'est simple : répéter l'opération avec netcat -t localhost 5582 > spam.txt. Une fois les lignes stdout de telnet nettoyées, me voilà avec un fichier contenant une adresse XMPP par ligne.
Reste à savoir quels sont les bons comptes et les mauvais. Comme c'était en phase de test, je n'ai eu qu'à enlever les quelques adresse qui parlaient sur le salon général. Ensuite, on passe à la suppression. Tout d'abord un backup avec tar cJf prosody-2020-05-05.tar.xz /var/lib/prosody au cas où je fais des conneries, et pour m'entrainer à restaurer des données.
Ensuite, je me rends compte que je suis nul en bash et que je n'arrive pas à utiliser xargs. La tentative qui m'a donné le plus d'espoir était : xargs -t -d '\n' -a SPAM.txt echo. Si vous notez les majuscules, c'est qu'en procrastinant j'ai découvert qu'on pouvait facilement trier par ordre alphabétique avec sort spam.txt > SPAM.txt. Mais comme je n'y arrivais pas, j'ai utilisé un outil que je connais mieux : python.
import os
with open("SPAM.txt") as f:
a = f.readlines()
for i in a:
os.system("prosodyctl deluser " + i)
Et hop, du premier coup, je commence à voir le nombre d'utilisateurs diminuer, avec ls /var/lib/prosody/militant%2ees/accounts/ | wc -l par exemple. Évidemment, après la suppression, je me rends compte que j'ai oublié quelques comptes de gens qui voulaient tester mais n'avaient jamais rejoint le salon général. Pas de problème, on a une backup :
# extraire l'archive
tar xf prosody-2020-05-05.tar.xz
# se positionner dans le bon dossier
cd var/lib/prosody
# copier les fichiers à leur place
for i in *; do cp -a ${i}/brikabrak.dat /var/lib/prosody/militant%2ees/${i}; done
Opération à répéter pour les fichiers .list et .dat pour chaque utilisateur. Ne pas oublier l'option -a qui permet de conserver les permissions de fichier (vous pouvez deviner que j'ai bien entendu oublié).
Voilà, tout est bien qui finit bien, j'ai supprimé 15229 comptes ! Il ne reste plus qu'à trouver un moyen de réouvrir les inscriptions en se protégeant du SPAM :)