Si un utilisateur détecte d'un coup d'œil si un message est un spam ou non... c'est compliqué d'automatiser cette décision par un ordinateur.
Voici les principes qui sont généralement mis en œuvre :
* Vérification de l'adresse email de l'expéditeur
* Vérification de l'adresse IP de l'expéditeur
* Vérification des entêtes et du contenu du message
* Vérification des pièces jointes
* Vérification des éventuelles signatures (DKIM)
* Vérification du client SMTP qui transmet le message
Au niveau d'un serveur, un ensemble d'outils vont se charger de ces vérifications.
On distingue souvent :
* Les filtres de 1er niveau : vérifications *avant* d'accepter un message par le serveur SMTP
* Les filtres de 2ème niveau : vérifications *après* l'avoir accepté mais *avant* de délivrer dans la boîte de l'utilisateur
* Les filtres de 3ème niveau : vérifications faites par l'utilisateur (antivirus sur son poste, filtres sur son client POP/IMAP) => non traité dans ce Howto
## Postfix
<http://www.postfix.org/>
Postfix est un serveur SMTP. Il est la base d'un antispam car c'est lui qui reçoit les messages via le protocole SMTP.
Il permet déjà un grand nombre de vérifications basiques :
* rejet à partir d'une liste "statique" d'adresses email / d'adresses IP
* rejet à partir de termes simples dans les entêtes et le contenu
* rejet des noms de domaine inexistants ou invalides utilisés dans l'adresse email de l'expéditeur
* rejet des adresses IP qui ont un reverse DNS inexistant ou invalide
* rejet à partir d'une RBL
Voici un exemple de restrictions à mettre dans le main.cf :
if md5sum -c $tmp_file > /dev/null && [ -s spamd.cidr ] ; then
cp spamd.cidr /etc/postfix/spamd.cidr
fi
rm spamd.cidr
rm $tmp_file
rm -rf $tmp
~~~
### Postscreen
<http://www.postfix.org/POSTSCREEN_README.html>
Postscreen est un démon de Postfix qui permet de renforcer les filtres de 1er niveau.
Il permet principalement de combiner la vérification auprès de plusieurs RBL.
Avec l'option "reject_rbl_client", Postfix vérifie la présence d'une IP auprès de plusieurs RBLs : si l'IP est présente au moins une fois, Postfix rejette le message.
Postscreen permet de ne rejeter le message que si l'adresse IP est présente au moins N fois.
### Postgrey
<https://fr.wikipedia.org/wiki/Greylisting>
<http://postgrey.schweikert.ch/>
Postgrey fait du Greylisting : il retarde volontairement un message reçu pour vérifier le client SMTP qui envoie le message.
Cela a une certaine efficacité, d'autant plus que cela permet de faire d'autres vérifications plus tard... qui seront de meilleures qualité car plus à jour !
Mais si l'on fait cela pour tous les messages reçus, la plupart des messages seront retardés de quelques minutes... ou heures.
Souvent, on ne tolère donc pas une activation globale du Greylisting.
Cela reste néanmoins intéressant : on peut s'en servir pour retarder des messages incertains et attendre d'avoir des vérifications de meilleure qualité.
### Whitelister
<https://tracker.debian.org/pkg/whitelister>
Whitelister est un logiciel écrit en OCAML par Pierre Habouzit.
Il permet de faire du Greylisting conditionnel, c'est-à-dire qu'il permet de ne faire du Greylist que si l'adresse IP est louche.
Pour cela il teste principalement sa présence dans des RBL : si elle est listée par au moins une RBL, le message est greylisté !
~~~
# aptitude install whitelister postgrey
~~~
Dans `/etc/whitelister.conf` :
~~~
sock: /var/spool/postfix/private/whitelister.ctl
rbl: zen.spamhaus.org
rbl: bl.spamcop.net
rbl: b.barracudacentral.org
rbl: cbl.abuseat.org
rbl: dnsbl.sorbs.net
rbl: ix.dnsbl.manitu.net
rbl: psbl.surriel.com
rbl: truncate.gbudb.net
rbl: dnsbl-1.uceprotect.net
rbl: db.wpbl.info
rbl: all.spamrats.com
rbl: bl.spamcannibal.org
rbl: block.stopspam.org
rbl: badhost.stopspam.org
rbl: dnsbl.stopspam.org
rbl: dul.pacifier.net
rbl: dnsbl.dronebl.org
rbl: dnsbl.inps.de
rbl: bl.blocklist.de
rbl: srnblack.surgate.net
rbl: all.s5h.net
rbl: rbl.megarbl.net
rbl: bl.score.senderscore.com
rbl: rbl.rbldns.ru
rbl: dnsbl.cobion.com
rbl: bl.mailspike.net
rbl: cidr.bl.mcafee.com
rbl: dnsblchile.org
rbl: aspews.ext.sorbs.net
rbl: l2.spews.dnsbl.sorbs.net
rhbl_client: dsn.rfc-clueless.org
rhbl_client: postmaster.rfc-clueless.org
rhbl_client: abuse.rfc-clueless.org
rhbl_client: whois.rfc-clueless.org
rhbl_client: bogusmx.rfc-clueless.org
rhbl_sender: dsn.rfc-clueless.org
rhbl_sender: postmaster.rfc-clueless.org
rhbl_sender: abuse.rfc-clueless.org
rhbl_sender: whois.rfc-clueless.org
rhbl_sender: bogusmx.rfc-clueless.org
rhbl_helo: dsn.rfc-clueless.org
rhbl_helo: postmaster.rfc-clueless.org
rhbl_helo: abuse.rfc-clueless.org
rhbl_helo: whois.rfc-clueless.org
rhbl_helo: bogusmx.rfc-clueless.org
dns_client: 1
dns_rev_client: 1
~~~
Ajouter la ligne à la directive `smtpd_recipient_restrictions` du fichier `/etc/postfix/main.cf` :
L'idée est de rejetter un mail qui a un enregistrement SPF invalide. On utilise pour cela un programme en python `postfix-policyd-spf-python` (dispo dans les packages Debian).
La configuration se fait dans /etc/postfix-policyd-spf-python/policyd-spf.conf, on peut se servir de la version commenté : /usr/share/doc/postfix-policyd-spf-python/policyd-spf.conf.commented, c'est celle que l'on va utiliser.
Le but est de créer une base de données contenant des signatures personnelles qui ne sont pas (encore) disponibles dans celles fournis par ClamAV.
On va montrer un exemple pour identifier un virus en PJ de type facture.doc, qui contient une macro Word pour infecter des postes Windows.
La pièce-jointe est identifiable sur VirusTotal : <https://www.virustotal.com/fr/file/a2b0a2348cba02f8de4e87c54969c28cbad68d3c4e7d2a12335be3ecdefdcf35/analysis/> [[BR]]
Elle n'est repéré que par 6 AV. Il est reconnu en tant que W97M/Downloader.akh. On va utiliser ce nom (+evolix) pour le mettre dans notre base de données.
L'idée est d'identifier un endroit précis du fichier en utilisant par exemple hexdump :
~~~
61 69 6e 2e 00 53 6f 63 6b 65 74 2e 43 10 6c 6f |ain..Socket.C.lo|
Dans certains cas, comme un fichier HTML « forgé bizarrement », ClamAV va d'abord décomposer le fichier HTML. Il faudra générer la signature à partir de l'extraction.
~~~
# clamscan --debug --leave-temp facture.doc
> LibClamAV debug: cli_scanhtml: using tempdir /tmp/clamav-606ba4ba8c8504465cba15fc13c93942.tmp
# cd /tmp/clamav-606ba4ba8c8504465cba15fc13c93942.tmp
# sig=$(cat notags.html | sigtool --hex-dump | head -c 2048)