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
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.
> *Note* : pour les fichiers listés dans `postscreen_access_list`, tout mot clé différent de `permit` rejette les adresses IP listées (y compris `OK` !).
[Postgrey](http://postgrey.schweikert.ch/) 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: 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: all.s5h.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.
La spécification [DMARC](https://fr.wikipedia.org/wiki/DMARC) permet de rejeter ou mettre des messages en quarantaine si ils ne sont pas conformes aux vérifications SPF et/ou DKIM.
Pour implémenter cela, il faut utiliser le package **opendmarc** : <https://packages.debian.org/opendmarc>
Opendmarc est un service qui permet de faire une verification DMARC et / ou DKIM.
Il rajoute l'entête "Authentication-Results", il peux juste notifié le résultat dans les entêtes du mail, ou alors rejeter les mails si le résultat est négatif, selon comme on le configure.
### Intégration d'Opendmarc à Postfix
Pour commencer il faut installé le paquet opendmarc :
~~~
# apt install opendmarc
~~~
Il faut ensuite configurer le fichier _/etc/opendmarc.conf_ comme ceci :
~~~
AuthservID mail.example.com
PidFile /var/run/opendmarc/opendmarc.pid
PublicSuffixList /usr/share/publicsuffix
Socket inet:12345@localhost
Syslog true
UMask 0002
UserID opendmarc
~~~
Dans cette configuration on veux qu'Opendmarc écoute sur le port 12345 en local, si on veux qu'il ecoute sur un fichier .socket on ajuste la variable `Socket` comme ceci :
~~~
Socket local:/var/run/opendmarc/opendmarc.sock
~~~
`AuthservID` doit avoir pour valeur le hostname du serveur, par default il prend la valeur du MTA du serveur.
`RejectFailures` : true ou false. Si défini a `true` alors les mails qui ne passerons pas la vérification DMARC seront rejetés. Défini a false par défaut.
`TrustedAuthservIDs` : Liste des `AuthservIDs` necessitant la validation DMARC, utile lorsque plusieurs MX sont présent sur le même serveur.
`SoftwareHeader` : Ajoute une entête 'Dmarc-Filter' avec la version opendmarc dans chaque mail, utile pour une phase de test.
On peux définir aussi une liste de 'Host' (IPs) à ignoré dans le fichier _/etc/opendmarc/ignore.hosts_
On démarre Opendmarc et on l'active au démarrage
~~~
# systemctl start opendmarc
# systemctl enable opendmarc
~~~
Ensuite on doit ajouté opendmarc en tant que Milter à Postfix.
Si l'on veux d'Opendmarc récupère les informations de signature d'OpenDKIM, on le positionne juste après le milter 54321 d'Opendkim comme ceci :
On peux vérifié si la configuration DMARC du domaine est correcte avec l'outil dmarc-inspector : <https://dmarcian.com/dmarc-inspector/>
Puis on envoi un mail sur le domaine concerné, et l'on doit voir les entêtes 'Authentication-Results' une pour DKIM si on a mis le milter DKIM avant celui d'Opendmarc, puis une deuxième pour DMARC :
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)
Vérifier que votre pare-feu autorise `db.local.clamav.net` et `database.clamav.net` puis supprimer le fichier de mirroirs `/var/lib/clamav/mirrors.dat`.
### J'ai ajouté des CIDRs à une liste blanche mais elles ne semblent pas prises en compte
Bien que la vérification de configuration ne signalera pas de probleme, mettre des CIDRs dans `/etc/postfix/client.access` ou `/etc/postfix/client.access_local` ne sera pas pris en compte car ce sont des tables de type `access(5)`. Pour specifierer des CIDRs il faut utiliser une table `cidr_table(5)` et verifier que l'option accepte ce genre de table ; `/etc/postfix/postscreen_access.cidr` est un fichier de ce type.