SERVEUR DEBIAN : Antispam email suite... et fin ?
Par Seza le samedi 16 février 2008, 19:00 - Serveur Debian - Lien permanent
Devant l'inventivité des spammeurs (je fais un compliment ?). Il faut changer assez souvent ses méthodes pour contrer le spam.
Voilà comment la petite histoire commence :
J'ai un serveur antispam qui fonctionne à merveille : Dspam...
Avec encore une petite centaine de spam par jour sur ma boîte personnelle, Dspam se trompe en moyenne 1 fois ou 2. Des faux négatifs bien sûr, les faux positifs ceci à du m'arriver 4 fois en un an.
Donc à ma petite habitude - expliquée dans le tuto : SERVEUR DEBIAN : Antispam email- j'envoie le faux négatif à spam@domain.tld
et hop il sera détecté la prochaine fois.
Donc ce score très honorable de 98 % méritait toutes les louanges jusqu'au jour où les performances diminuées de 30 %.
Que se passe t-il donc ?
La réponse était très simple et il n'a pas fallu chercher longtemps. Ma première idée était que les mails envoyés à spam@domain.tld
n'était plus transférés ou mal intégrés donc la reconnaissance de spams s'en retrouvait altérée. Rien de cela en fait. Dès que j'ai ouvert le log mail.info
j'ai découvert la mascarade :
Mes chères ennemis spammeurs envoient leurs courriers directement à ham@domain.tld
qui les accepte gracieusement et - en quelque sorte - les whiteliste avant que le spammeur fasse un second envoie dans les boîtes réelles ce coup-ci.
Après la découverte de cette macabre entreprise, je me mis en tête de trouver une solution.
La première idée c'est de changer l'adresse ham@domain.tld
. Pourquoi pas, c'est une idée simple et peu coûteuse. Mais embêtante pour les utilisateurs qui doivent mémoriser cette adresse qui pourrait, de plus, changer de nouveau etc... Si l'adresse ham@domain.tld
à pu être trouver par déduction, en suivant mon tuto ou les autres ressource du web qui utilise cette méthode, comment l'adresse 1234@domain.tld
pourrait-elle être trouvée ? Comme votre adresse personnelle à été trouvée par les spammeurs.
A partir du moment ou vous n'êtes pas le seul client de vos services, vous devez pensez aux utilisateurs. Prenons un utilisateur lambda - ou beta :]...
- Windows
- Outlook Express
- l'adresse 1234@domain.tld dans son carnet d'adresse
- Msn messenger
- une conversation msn
- clique (bêtement ?) sur votre ami(e) souhaite vous envoyer un fichier : photos_chaudes.zip
Qui ne cliquerai pas en fait ? :p
Bon vous avez compris l'utilisateur va être vérolé (s'il ne l'était pas déjà) et le virus fera joujou avec son carnet d'adresse... et 1234@domain.tld
devra être changer vers une nouvelle adresse.
Tout ça pour dire que ma première idée ne va pas être celle que je vais prendre.
Cela faisait un moment que je souhaitais changer de système et c'était l'occasion d'en changer.
En effet transférer un mail ou deux à une adresse mail c'est cool de temps en temps mais quand la boite mail est toute neuve et le Dspam tout frais dessus, vous devez transférer 10 mails , 15 mails ou plus... Ceci devient rebutant.
De plus certains aiment transférer leurs mails en pièces jointes, souvent pour en transférer plusieurs d'un coup, ce qui est donc incompatible avec la méthode employée pour Dspam.
Le second problème de la solution « transférer à xxx » est que le système reste ouvert à l'extérieur donc toujours d'une manière ou d'une autre accessible à l'ennemi.
La solution pour moi est donc :
Pourquoi ne pas avoir un dossier dans la boîte mail ou l'on entreposerai les spams et les hams mal interprétés par Dspam afin qu'il puisse toujours apprendre et corriger ses erreurs.
Cette solution apporterai du confort pour l'utilisateur de la boîte qui n'aurai plus qu'à déplacer ses mails d'un dossier à l'autre et elle apporterai aussi une sécurité supplémentaire puisqu'elle ne serait pas accessible de l'extérieur.
Après n'avoir pu trouvé mon bonheur auprès de Maildrop ou Procmail pour gérer un tel échange avec Dspam (peut être ai-je mal recherché). J'ai donc décidé de faire le petit script ci-dessous pour traiter les mails mal interprétés.
Voici la démarche :
Les utilisateurs doivent créer - pour ceux qui souhaite profiter de Dspam – un dossier Antispam
qui contiendra deux sous-dossiers : spam
et non-spam
.
Les spams non reconnus seront donc entreposés dans le dossier spam et les ham reconnu comme spam seront entreposés dans non-spam.
Il ne reste plus qu'à mettre sur le serveur ce script et d'automatiser la tâche avec Cron. J'ai choisi pour moi toute les 5 minutes.
#!/bin/bash
### Configuration
Dir=/var/mail/virtual
Spam=.Antispam.spam
Ham=.Antispam.non-spam
Trash=.Trash
### Ne plus toucher ici
parseDirToDspam()
{
if [ $1 == "SPAM" ]
then
Type=spam
else
Type=innocent
fi
for Message in `ls $2/$3/$4/$5/cur`
do
echo "find $Type : $Message"
# Vérifie si le message est flaggué
if [ `echo $Message | grep : | wc -l` -lt 1 ]; then
mv $2/$3/$4/$5/cur/$Message $2/$3/$4/$5/cur/${Message},2:
Message=${Message},2:
fi
# Vérifie si le message est marqué comme lu
if [ `echo $Message | cut -d: -f2 | grep S | wc -l` -lt 1 ]; then
mv $2/$3/$4/$5/cur/$Message $2/$3/$4/$5/cur/${Message}S
Message=${Message}S
fi
# Vérifie que le message n'est pas supprimé
if [ `echo $Message | cut -d: -f2 | grep T | wc -l` == 1 ]; then
continue
fi
# récupère la signature du message
Signature=`cat $2/$3/$4/$5/cur/$Message | grep X-DSPAM-Signature | cut -d: -f2 | sed -n 's/ //p'`
# envoie le message à DSPAM pour classification
/usr/bin/dspam --user $4@$3 --class=$Type --source=error --signature=$Signature
# Le nom du message qui va etre déplacé
NewName=`echo $Message | cut -d: -f1`
if [ $1 == "SPAM" ]; then
echo "Suppression"
cp $2/$3/$4/$5/cur/$Message $2/$3/$4/$6/new/${NewName}:2,S
mv $2/$3/$4/$5/cur/$Message $2/$3/$4/$5/cur/${Message}T
else
echo "Restauration"
sed -e 's/\[SPAM\]//' $2/$3/$4/$5/cur/$Message > $2/$3/$4/cur/${NewName}
mv $2/$3/$4/$5/cur/$Message $2/$3/$4/$5/cur/${Message}T
fi
done
}
# Parse les domaines présent dans le $Dir
for Domain in `ls $Dir`
do
# entre dans le domaine
if [ ! -d $Dir/$Domain ]; then
continue
fi
echo "Domaine : $Domain"
for User in `ls $Dir/$Domain`
do
# entre dans l'utilisateur
if [ ! -d $Dir/$Domain/$User ]; then
continue
fi
echo "User : $User"
if [ ! -d $Dir/$Domain/$User/$Spam ]; then
continue
fi
parseDirToDspam SPAM $Dir $Domain $User $Spam $Trash
if [ ! -d $Dir/$Domain/$User/$Ham ]; then
continue
fi
parseDirToDspam HAM $Dir $Domain $User $Ham
done
done
exit 0
Voici ce que ce script fait:
Il inspecte $Dir
- ici : /var/mail/virtual
- afin de trouver toutes les boites mails existantes. Pour chacune d'elle il vérifie la présence du dossier Antispam
et des ses deux sous dossiers.
Si tout est présent il vient chercher les mails présent dans le dossier spam
pour traitement :
- marque le message comme lu
- récupère la signature dans les entêtes du message
- demande à Dspam de reclassifier le mail identifié par sa signature
- déplace le mail dans la corbeille
Ensuite il vient chercher les mails présent dans le dossier non-spam
pour traitement :
- marque le message comme lu
- récupère la signature dans les entêtes du message
- demande à Dspam de reclassifier le mail identifié par sa signature
- supprime la signature [spam] dans le sujet
- replace le mail dans la boite pricipale
Ainsi on peut y voir trois intérêts :
- La signature Dspam dans le contenu du mail devient inutile et l'on peut donc reparamétrer Dspam pour l'enlever.
- Les faux positifs se retrouve après traitement dans la boite email comme s'il avait été correctement reçu. (pas marqué comme transféré, pas de préfixe [spam] dans le sujet)
- La boîte d'envoi ne sera plus remplie des nombreux transferts vers
spam@...
que vous ne ferez plus.
Si toutefois vous avez des choses à apporter à cette solution, si vous avez trouvé des erreurs, n'hésitez pas. Je suis toujours preneur. Notamment s'il existe un moyen de coupler Maildrop ou Procmail à tout ça afin de ne plus utiliser Cron pour lancer le script ce qui diminuerai les ressources consommées.
Le choses à faire sont donc :
- Reparamétré dspam pour qu'il pose la signature dans les entêtes du mail et non plus dans le corps du mail.
- supprimer les deux adresses
spam@domain.tld
etham@domain.tld
. - Copier le script dans un endroit qui vous plaît. par example /usr/local/sbin et appelé le ... dspam-classify ?
- paramétrez le script avec votre environnement.
- Le script est aussi prévu uniquement pour supprimé le préfixe [spam] dans le sujet du mail. Si vous utilisez un aute préfixe, il faudra changer la commande
sed
en conséquence. - Créer un fichier dspam dans /etc/cron.d et mettez ceci dedans :
*/5 * * * * root /usr/local/sbin/dspam-classify > /dev/null
Merci pour la lecture de ce long sujet !
Commentaires