Bermude
Le Spam
Ces petits papiers sont lassants, on peut en remplir une enveloppe T qui sera surtaxée  par surpoids à son destinataire, ce faisant les industriels du courrier auront tôt fait de trouver une solution. Mais pour les petits papiers informatiques ? Comment ne pas avoir sa boite de réception surchargée de ces publicités ?

Ne pas laisser son adresse email sur son site web, bien faire attention à ne pas cocher n'importe quoi lors des inscriptions et veiller à avoir de bonnes rêgles de filtrage.

Cette solution s'apparente tout de même un peu au fait de jeter les petits papiers de la boite vers la poubelle sans agir.
Purée !!
Un SPAM est un courrier inattendu dont vous vous passeriez bien. Il est en général accompagné de plusieurs autres spams et c’est pour ainsi dire parfois les seuls emails que nous recevons dans la journée. En cherchant bien, ça créée des problèmes par l’aveuglement et la crainte d’avoir à attraper en plus un virus; les courriers ne sont plus lus que par leur sujet. 
 
Vous pouvez aussi vous en prémunir.
Plan B
Il s’agit ici de réferer les emails non solicités vers une base de données géante qui rassemble tous ces individus et interdit la transition des emails sur les passerelles principales.

Le problème avec cette solution est qu’elle est hasardeuse, fastidieuse et parfois douteuse. Avant tout la lecture de l’entête par le robot, si robot il y a peut être négative et insérer une adresse IP qui sera un prochain jour la votre ou est déjà celle d’un copain en IP dynamique.
La solution lourde
Pour contribuer à la chasse aux spammeurs, il est nécessaire d'avoir une infrastructure assez lourde et dont la maintenance nécessite des notions différentes de celles du commun des internautes.

Il faut un ordinateur qui serve à ça.

Autant passer tout de suite au plan de guerre qui n’est autre que d’installer un antispam sur un serveur de courrier interne. Le but est d’avoir un courrier trié ou presque mais mieux que rien et de disposer d’un dossier dans lequel on glisse les emails douteux pour qu’ils soient appris pendant la nuit par un processus programmé. 
Avertissement: cette page ne s’adresse peut être qu’aux ordinateur dotés de GNU Linux
Mail::SpamAssassin
Ce programme en Perl éradique la plupart des spams en les plaçant dans deux boites selon des critères. On l’installe facilement avec la commande

install Mail::SpamAssassin dans un shell perl sur cpan (perl -MCPAN -e shell). 
 
Il suffit ensuite d’ouvrir le programme avec un éditeur de texte dans /usr/local/bin/spamd et de regarder où se trouvent les fichiers de configuration dans les variables au début. Ainsi dans /etc/mail/spamassassin/local.cf il est possible d’activer des contrôles suplémentaires à condition bien sûr de les avoir installés. Toujours dans CPAN bien sûr.
Chargeons la mule.
Oui, c’est super spamassassin mais ça met une charge sur le serveur de mails, on le croirait parfois mort. Suffirait il que ce serveur mail soit aussi l'ordinateur sur lequel vous travaillez en le réveillant de sa veille. Vous comprendrez l’ordonnancement des processus et des priorités ainsi que la lenteur d’un deswapping … le ralenti sur le rétablissement des icônes. Bref! 
 
Il suffit dans ce cas de placer spamassassin sur un ordinateur dont on se sert moins dans le réseau et de lui affecter cette tâche en conservant la fluidité sur la machine habituelle.

Il est même possible au serveur courrier de faire passer le mail douteux dans spamassassin qui se trouverait sur encore une autre machine.
Comment ça marche ?
Imaginons un ordinateur connecté sur l’internet et en son sein un Mail Transfert Agent (postfix ou courier-mta). Un système de délivrement de courrier comme pop ou imap. Quelques boîtes à lettres à prélever sur l’Internet, du courrier à trier et ces fameux spams. 
Le Big Picture
Iptables
Pour faire passer le réseau afin que les outils de l’antispam ayant besoin d’informations sur l’Internet puissent aller les chercher. Il faut une masquarade et faire sortir l’IP de cet ordinateur mule en lui donnant celle de ppp0. Ceci n’est pas nécessaire si vous n’utilisez pas les plugins razor2, pyzor et dcc.

Ce n'est pas nécessaire non plus si vous pouvez gérer ceci avec la redirection des ports d'une box.
Installer SpamAssassin
vous avez le choix entre apt-get install ou bien dans un shell CPAN:
perl -MCPAN -e shell 
install Mail::SpamAssassin
Et vous voici presque paré. Il faut faire comprendre à l’ordinateur qui reçoit le courrier d’aller demander à cette autre machine de faire passer le courrier à travers le filtre. Nous verrons ceci dans le paragraphe "Activer Spamassassin" que vous lirez plus bas. 
 
Imaginons d’abord que le courrier arrive sur cette première machine avec fetchmail depuis quelques boites sur l’internet.
Relever le courrier avec fetchmail
Cette façon nécessite qu’il existe une structure en local afin de permette le prélevement du courrier. Pour la plupart des lecteurs de courrier, un répertoire est suffisant. Nous utiliserons procmail. Mais ne plaçons pas la charrue avant les boeufs. Occupons nous d’abord d’aller chercher le courrier. 
 
Créer ou éditer le fichier .fetchmailrc qui se trouve dans votre répertoire
Ce petit tableau pour vous aider du rôle de chacun dans le fichier .fetchmailrc (mots de passe fantaisistes)
Login pop
mdp
Serveur
Utilisateur local
merbudos
z0ubid@
pop.free.fr noob
aka.mira @k!ra pop.laposte.net noob
gaohrn.blouch ^p4ss' pop.laposte.net noob
# Configuration created Tue Apr 4 22:55:07 2000 by fetchmailconf 
set postmaster "postmaster" 
set bouncemail 
set properties "" 
poll pop.free.fr with proto pop3 user merbudos with password z0ubid@ is noob here 
poll pop.laposte.net with proto pop3 user aka.mira with password @k!ra is noob here 
poll pop.laposte.net with proto pop3 user gaohrn.blouch with password ^p4ss is noob here 
Les courriers seront ainsi prélevés des boites à lettres sur l’internet pour être délivrés en local. Ceci se fait à l’aide d’un MTA comme postfix, par exemple. Dans le fichier main.cf, il suffit d’indiquer à postfix de faire passer le courrier par procmail comme indiqué plus haut. Ne lancez pas fetchmail tout de suite. Il convient d’ailleurs de l’arrêter à la moindre alerte (+60 mails par jour, par ex.) et de le lancer en mode utilisateur. Nous verrons ceci plus tard.
Editer /etc/postfix/main.cf
Rajoutez ou vérifiez la présence de la ligne suivante dans le fichier /etc/postfix/main.cf
mailbox_command = /usr/bin/procmail -a "$EXTENSION"
procmail peut aussi s’utiliser pour trier un fichier de type mbox par la commande suivante:
formail -s procmail < fichier.mbox
Le fichier .procmailrc
Il est un autre fichier de configuration qui est le filtre en lui même. Il est le coeur du système. Son fonctionnement est simple. Si une rêgle convient au courrier, le courrier est délivré dans un fichier ou dans un programme. Si c’est un programme, le courrier poursuit son chemin en revenant.
  • Le courrier passe par une liste blanche, il est connu ou non. 
  • Si il n’est pas connu, il passe par SpamAssassin 
  • Il lui est attribué une note. Si celle ci dépasse une valeur requise, il est écarté. 
  • Le courrier n’a pas la note, il continue et passe par une liste noire, il est connu aussi mais en mal. 
  • Le courrier est arrivé au bout de ses peines il est délivré quand même.
Le fichier .procmailrc contient quelques paramètres de configuration et les rêgles sont décrites comme le voudrait ce shéma.
MAILDIR=$HOME/Maildir/ 
DEFAULT=$MAILDIR 
SENDMAIL=/usr/sbin/sendmail 
LOGFILE=$HOME/mail/from 
LOCKFILE=$HOME/.lockmail 
INCLUDERC=$HOME/.whitelistrc 
 
:0wf: spamskeez.lock 
* < 256000 
| /usr/bin/spamc -x -d 192.168.0.152 
 
:0: 
* ^X-Spam-Level: *************** 
almost-certainly-spam 
 
:0: 
* ^X-Spam-Status: Yes 
probably-spam 
 
INCLUDERC=$HOME/Horde.procmailrc
À ce niveau là le courrier est acheminé en passant par la dernière étape qui est Horde.procmailrc (la liste noire). Si il passe cette dernière étape, il est délivré dans la boite de réception. 
 
Pour reprendre depuis le début, le courrier est passé par une liste blanche (.whitelistrc) qui est un fichier dans votre répertoire /home/utilisateur et qui contient les emails des personnes ou des listes de diffusion que vous connaissez. Ça ne sert à rien d’encombrer le SpamAssassin par des emails dont vous connaissez la destination. Si le message ne correspond en rien à ce qui est placé dans .whitelistrc; on voit par la commande précédée d’un pipe ‘|’ que le message va graisser les chenilles de Spamassassin. C’est à ce niveau là que le client s’adresse au serveur délocalisé. Il ne faut pas oublier que celui ci doit fonctionner de la manière décrite dans le paragraphe "Activer Spamassassin" que vous lirez plus bas. 
.whitelistrc 
 
Un exemple de .whitelistrc est présenté ici sous la recherche de la composante "List-Id" qui est présente dans l’entête de l’email et si cette valeur est trouvée, le mail est placé dans une boite sans même passer par spamassassin.
:0: 
* ^List-Id:.*spip\.rezo\.net 
"$DEFAULT/.SPIP/"
Les destinations dans .blacklistrc vont vers /dev/null (la poubelle)
:0: 
* ^From:.*ventevip.* 
/dev/null 
Ensuite, le courrier est envoyé à spamd qui tourne sur 192.168.0.152 et il reviendra avec une note. Cette note n’est pas challengée ici, on regarde juste le status spam avec plein d’étoiles ou son status à Yes. Ces deux rêgles permettent d’écarter environ 95% des spams. Toujours est il qu’il faut que razor2 et pyzor soient en service.
Activer le serveur spamd
Il est temps maintenant de lancer la commande en root qui va activer cette écoute. 
spamd -D -i 0.0.0.0 –allowed-ips=192.168.0.10
Cette commande permet d’écouter tout (0.0.0.0) et d’autoriser 192.168.0.10 qui est une interface de l’ordinateur connecté sur l’internet par le biais d’un NAT dont le fonctionnement n’est pas décrit sur cette page mais ailleurs sur l’Internet.

Et finalement, en tant qu'utilisateur:
fetchmail -d 900
En tant qu’utilisateur possesseur des fichiers de configuration cités dans cet article. Ceci émettra un rappatriement des courriers des différentes boîtes configurées dans .fetchmailrc décrit plus haut.
Apprentissage
Il y a plusieurs façons d’apprendre les mails passés au travers des mailles. La bayes_db ou le spamc -L.
sa-learn
voici mon /etc/crontab pour cette partie
7 7 * * 1 bermudos /home/bermudos/bin/spamskeez.sh 
6 12 * * * bermudos sa-learn –spam /home/bermudos/Maildir/.SPAM/cur && rm -f /home/bermudos/Maildir/.SPAM/cur/*
Avec bien entendu un traitement préalable pour conserver des statistiques de surveillance. Comme vous l’avez compris, je n’ai jamais rien compris d’autre à cron que c’est comme une petite patate, que ça se mange et que ça a la forme de grosse larve. Alors j’ai inséré ces lignes directement dans le fichier /etc/crontab sans aller jusqu’à vous obliger à faire de même si vous l’utilisez à votre façon. 
 
Dans le premier cas, tous les premiers jours de la semaine (lundi) à 7h07, il y a l’exécution du programme spamskeez qui va faire l’analyse des répertoires probably-spam et allmost-certainly-spam et envoyer un email (un autre) à l’administrateur. Il est pas gros et il est à parier qu’il existe un jour sur cette page le moyen d’entrer ces données directement dans une base de données. 
 
Ensuite, tous les jours à 6h12, il y a l’apprentissage des emails contenus dans une boîte SPAM dans laquelle je fais tendrement glisser les messages insolites et passés au travers; avec amour, ma souris et mes petits doigts potelés. sa-learn va constituer une base de données sur l’ordinateur qui n’est pas le serveur. La complexité de la manipulation quelques jours après seulement, ne m’a pas permis de la recommencer. Je n’ai d’ailleurs pas essayé. 
 
Chose qui me permet de dire qu’il y a surement un problème dans l’utilisation d’un tel procédé. Ou bien une initialisation malheureuse de ma part au début de son utilisation il y a fort longtemps, soit dans le principe même d’utiliser sa-learn de cette façon. 
 
Cette méthode est assez efficace si pour autant on en prend soin. Ce n’est pas une chose à oublier et les moyens engendrés pour le déplacement de la base de données sont supérieurs au besoin. Mais bon, il était dommage de ne pas en parler.
Le spamskeez
Ce programme lancé par le cron tous les lundis permet de faire des statistiques sur les spams reçus par rapport aux emails normaux.
#!/bin/bash 
FREQUENCE="hebdomadaire" 
FROM="$HOME/mail/from" 
PROBABLY_SPAM="probably-spam" 
CERTAINLY_SPAM="almost-certainly-spam" 
FIRSTDATE=`tac $FROM | tail -n 3 | grep From | awk '{print $3" "$4" "$5" "$6" "$7}'` 
NBRE_MAIL=`grep From $FROM|wc -l` 
NBRE_PSPAM=`grep $PROBABLY_SPAM $FROM |wc -l` 
RATIO_PSPAM=`dc -e "$NBRE_PSPAM $NBRE_MAIL 2k / 100 * f"` 
NBRE_CSPAM=`grep $CERTAINLY_SPAM $FROM |wc -l` 
RATIO_CSPAM=`dc -e "$NBRE_CSPAM $NBRE_MAIL 2k / 100 * f"` 
NBRE_SPAM=`dc -e "$NBRE_PSPAM $NBRE_CSPAM + f"` 
RATIO_SPAM=`dc -e "$NBRE_SPAM $NBRE_MAIL 2k / 100 * f"` 
echo "Il va être procedé à l'arrêt de fetchmail" 
FETCHMAIL=`ps ax | grep fetchmail|grep -v grep|awk '{print $5" "$6" "$7" "$8" "$9" "$10" "$11}'` 
killall fetchmail 
echo "Rapport $FREQUENCE de spams 
~~~~~~~~~~~~~~~~~~~~~~~~ 
 
Date de depart : $FIRSTDATE 
$NBRE_MAIL mails 
===== 
$NBRE_PSPAM spams probables ($RATIO_PSPAM%) 
$NBRE_CSPAM spams reconnus ($RATIO_CSPAM%) 
En tout : $RATIO_SPAM% de spams 
===== 
$NBRE_SPAM spams ($RATIO_SPAM%) 
Date de fin : `date`"|mail noob 
sleep 5 
echo "" > "$HOME/Maildir/$PROBABLY_SPAM" 
echo "" > "$HOME/Maildir/$CERTAINLY_SPAM" 
echo "" > $FROM 
$FETCHMAIL 
Le forçage
La seconde façon est d’apprendre par spamc -L qui doit être, du côté serveur; supporté par l’option –allow-tell.
exec /usr/local/bin/spamd -d -l -s /var/log/spamd.log –allow-tell -i 0.0.0.0 –allowed-ips=192.168.0.10
Et du côté client; lancé par la commande
spamc -x -d 192.168.0.152 -L spam < /home/bermudos/Maildir/.SPAM/cur/1193331808.M58598P3305V0000000000000303I000509A1_2.bermude.dnsalias.net,S=22920:2,S 
 
Message successfully un/learned
Reste à automatiser ce procédé mais qui nécessite là un programme.
#!/bin/sh 

# module d’apprentissage de spamassassin. 

for i in /home/bermudos/Maildir/.SPAM/cur/* 
do 
echo $i " en cours de traitement …" 
/usr/bin/spamc -x -d 192.168.0.152 -L spam < $i 
/usr/bin/formail -s /usr/bin/procmail < $i 
rm -f $i 
done
Visualisation
Comme il y a des données, autant en faire un graphique. C'est représentatif et ça fait joli.

Les données à récupérer sont dans les emails que spamskeez envoie.
Cet email à la forme suivante:
Rapport hebdomadaire de spams 
~~~~~~~~~~~~~~~~~~~~~~~~ 
 
Date de depart : Mon Apr 7 07:07:06 2014 
168 mails 
===== 
15 spams probables (8.00%) 
0 spams reconnus (0%) 
En tout : 8.00% de spams 
===== 
15 spams (8.00%) 
Date de fin : lundi 14 avril 2014, 07:07:01 (UTC+0200) 

Ce qui est utile est le nombre de spams probables et le nombre de spams reconnus. La date ne servira qu'à trier les données.

Vous avez en effet remarqué qu'en listant le contenu d'un dossier, les fichiers qu'il contient sont dans un ordre dépendant d'options demandées. Sans options, la liste est triée de manière alphanumérique. Ce qui occasionne un ordre non utile.

Une première étape consiste donc à extraire les données, leur affecter une date qui se trie et dans une seconde étape, de trier et placer ces données dans un graphique SVG.

La première étape:
noob@bermude:~$ echo "" > spams.txt;for i in /home/noob/Maildir/.ADMIN.SPAMS/cur/* ; do dateDebut=`cat $i | grep "Date de depart" | awk {'print $6" "$7" "$9'}` ; dateTS=`date -d "$dateDebut" +%s` ; spamProbables=`cat $i | grep "spams probables" | awk {'print $1'}` ; spamReconnus=`cat $i | grep "spams reconnus"|awk {'print $1'}`; echo $dateTS ";" $spamProbables ";" $spamReconnus>>spams.txt;done 
Oui, je sais c'est vache. Succintement :
  • Vider le contenu de spam.txt
  • Pour chaque mail d'admin rangé dans ADMIN/SPAMS
  • Trouver et mettre la date en timestamp dans le fichier spam.txt
  • Trouver et placer la quantité de spams probables et reconnus dans ce fichier
  • Séparer les données par des points virgule
L'étape suivante (aussi brouillon) consiste donc à trier ces données et faire un graphique svg.
noob@bermude:~$ j=1;echo '<?xml version="1.0" standalone="yes"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg width="100%" height="100%" version="1.1" xmlns="http://www.w3.org/2000/svg">'>spam.svg;for i in `cat spams.txt |sort`; do a=$i;spamProbables=`echo $i|sed -e 's/;/ /g'|awk {'print $2'}`;i=$a;spamReconnus=`echo $i|sed -e 's/;/ /g'|awk {'print $3'}`;echo "<rect x="$j" y="`expr 450 - $spamProbables`" width="2" height="2" stroke="blue"/><rect x="$j" y="`expr 450 - $spamReconnus`" width="2" height="2" stroke="red"/><rect x="$j" y="450" width="1" height="1"/>">>spam.svg;j=`expr $j + 2`; done;echo "</svg>">>spam.svg 

Les points rouges correspondent aux spams reconnus et les points bleus sont les spams probables. Il y a ici l'analyse de 281 mails placés avec mes petits doigts potelés dans un dossier de la messagerie. Ce qui correspond à un peu plus de 5 années de 52 lundis chacunes.

La forte hausse des points rouges au début n'est pas seulement due aux nombreux spams de l'époque mais probablement aux apprentissages que j'exerçais à Spamassassin pour lui faire reconnaître le spam tel que je le vois.

J'ai dû ensuite affiner ma liste noire car quand on est blasé on ne cherche pas à faire le superman ou le zorro, on sauve ses fesses.

Toujours est il qu'une date est caractéristique. Là, où il y a 0 spams reconnus. La loi no 2011-267 du 14 mars 2011 d'orientation et de programmation pour la performance de la sécurité intérieure, notamment la mesure pour la lutte contre la cybercriminalité, Informatique et Internet. Le moment où les spams se sont arrêtés correspond au 15 février 2010. Un an avant la loi LOPPSI 2. Ce n'est qu'une observation car on en parlait déjà.

On parlait à l'époque de filtrage par les FAI, certains n'étaient pas d'accord. Qui allait payer les infra-structures ? Peut être les plus faibles ? Ceux qui disaient "bon, j'arrête je viens juste de changer ma serrure une nouvelle fois" ... Peut être un seul robot spammeur. Un peu de respect en tous cas, cette date correspond peut être à celle de la mort d'un type pour lequel c'était le jeu de spammer les gens...



Il me manque. Comme les pubs de pizza Grobidou que je ne reçois plus. Ou bien le carton du serrurier Chris Crack. Même les petits billets du docteur président yamal'la et ses devinettes. Par contre, je reçois toujours des spams.