Ziirish's Home :: Blog

Ziirish's Pub

 
 

Ça fait des mois, voire des années que je vous promets un billet sur mon architecture de messagerie...

Malheureusement, ça n'est pas encore pour aujourd'hui !

Mais cet article, que vous pourrez rapprocher de celui-ci compose une partie d'explication.

Un peu d'histoire pour commencer. J'ai mis en place mon premier serveur de messagerie personnel il y a tout juste 2 ans. Cependant, je n'ai commencé à l'utiliser réellement qu'à partir de mars 2013. Le temps de procéder à quelques tests et de vérifier que j'aurai un service disposant de la plus grande disponibilité possible. J'ai subit une panne de mon serveur de mail principal durant mes congés de l'été dernier, mais je n'ai perdu aucun mail malgré une indisponibilité du serveur principal de quasiment deux semaines ! Vous pouvez retrouver des détails de cet incident dans cet article.

Mais voilà, comme indiqué plus haut, je ne vais pas vous détailler ici l'ensemble de mon architecture. Je vais plutôt vous parler ici de délivrabilité. C'est à dire, comment maximiser mes chances d'arriver dans la boîte de réception de mes destinataires et non dans leur dossier SPAM.

Je parle des personnes qui utilisent un fournisseur de messagerie gratuit tels que GMail ou encore Hotmail. Ces derniers, de part le volume de mails qu'ils ont a traité ont des règles anti-spam relativement efficaces/contraignantes.

Bien entendu, il existe des astuces (bien connues des agences de com') afin de bypasser ces antispam. Par exemple, si le destinataire ajoute l'adresse de l'émetteur dans son carnet d'adresse. Ou bien si le destinataire consulte (par hasard) son dossier SPAM afin de marquer comme légitimes certains messages.

Mais dans mon cas, j'aimerai pouvoir envoyer un mail à n'importe qui afin qu'il tombe dans sa boîte de réception sans intervention de sa part.

Il ne s'agit malheureusement pas d'une science exacte et il est bien difficile de garantir à 100% que notre mail sera délivré correctement, mais de toute façon, une fois le mail parti de chez nous, nous n'avons plus aucun pouvoir dessus.

Un antispam est quelque chose d'assez complexe qui se base sur pas mal de critères.

Le phénomène de SPAM est pour moi principalement lié au fait que la messagerie electronique a été construite en se basant sur un modèle réél : le courrier. En effet, n'importe qui peut envoyer n'importe quoi à n'importe qui en se faisant passer pour n'importe qui, depuis n'importe où ! (Ça fait beaucoup de n'importe qui, je sais, mais ça n'est pas du tout lié à Rémi Gaillard )

Du coup, pour limiter un maximum ce cas de figure, un ensemble de techniques sont apparues. Pour ne citer qu'elles, je vais vous parler de DKIM , SPF et DMARC .

Ces spécifications ont les rôles suivants :

  • DKIM : Signe numériquement un message pour certifier que le nom de domaine de l'expéditeur lui appartient effectivement
  • SPF : Permet de certifier que le message a été envoyé depuis une machine appartenant au propriétaire du nom de domaine
  • DMARC : Permet de définir une politique à appliquer en cas de non respect des normes ci-dessus

L'implémentation de ces différentes normes permet de maximiser nos chances d'être considéré comme legit.

DKIM

Pour DKIM, il existe le projet OpenDKIM . Des packages sont disponibles sur debian.

Ensuite, on crée un couple de clé publique/privée avec la commande suivante :

opendkim-genkey -d example.com -s mail -a example.com -a
  • -d permet de spécifier le domaine pour lequel on crée la clé
  • -s permet de spécifier un identifieur pour la clé (afin d'utiliser potentiellement plusieurs clés pour un domaine)
  • -a permet d'ajouter le domaine spécifié avec l'option -d à l'enregistrement DNS généré

Cette commande nous génère deux fichiers : mail.key qui contient la clé privée et mail.txt qui contient l'enregistrement DNS à publier.

Si l'on souhaite gérer plusieurs domaines, je conseil de placer ces fichiers dans une arborescence du type :

/etc/mail
├── dkim
│   ├── example.com
│   │   └── dkim.key
│   └── example.org
│       └── dkim.key
├── keytable
└── signingtable

Le fichier keytable permet d'associer un domaine à une clé. Tandis que le fichier signingtable permet d'associer une ou plusieurs adresses émetrices à un domaine.

Exemple :

$ cat /etc/mail/keytable
mail._domainkey.example.com example.com:mail:/etc/mail/dkim/example.com/dkim.key
mail._domainkey.example.org example.org:mail:/etc/mail/dkim/example.org/dkim.key
#<DNS record> <domain>:<selector>:<key>
$ cat /etc/mail/signingtable
*@example.com mail._domainkey.example.com
*@example.org mail._domainkey.example.org

Enfin, on configure le démon OpenDKIM avec le fichier /etc/opendkim.conf :

# Log to syslog
Syslog          yes 
# Required to use local socket with MTAs that access the socket as a non-
# privileged user (e.g. Postfix)
UMask           002 

KeyTable                refile:/etc/mail/keytable
SigningTable    refile:/etc/mail/signingtable

# Commonly-used options; the commented-out versions show the defaults.
Canonicalization    relaxed
Mode            sv

# Always oversign From (sign using actual From and a null From to prevent
# malicious signatures header fields (From and/or others) between the signer
# and the verifier.  From is oversigned by default in the Debian pacakge
# because it is often the identity key used by reputation systems and thus
# somewhat security sensitive.
OversignHeaders     From

Enfin, sur debian, on peut préciser dans le fichier /etc/default/opendkim la ligne suivante :

SOCKET="inet:8891@localhost"

Il reste désormais à indiquer à notre MTA de dialoguer avec OpenDKIM pour signer nos mails.

Exemple pour postfix, on ajoute les lignes suivantes au fichier /etc/postfix/main.cf :

# DKIM
milter_default_action = accept
milter_protocol = 2 
smtpd_milters = inet:127.0.0.1:8891
non_smtpd_milters = inet:127.0.0.1:8891

SPF

Pour utiliser SPF, il s'agit d'ajouter un enregistrement DNS. Je vous laisse lire la documentation du site du projet pour plus de renseignements.

Si vous souhaitez vérifier que les mails qui vous arrivent respectent bien SPF, voici la configuration à adopter pour Postfix.

On commence par installer le paquet postfix-policyd-spf-perl, puis on ajoute les lignes suivantes au fichier /etc/postfix/master.cf :

policy  unix  -       n       n       -       -       spawn
    user=nobody argv=/usr/bin/perl /usr/sbin/postfix-policyd-spf-perl

Puis celles-ci au fichier /etc/postfix/main.cf :

smtpd_recipient_restrictions =
    check_policy_service unix:private/policy

DMARC

Enfin, pour DMARC, il s'agit également d'un enregistrement DNS qui vous sera détaillé sur le site du projet.

Et pour finir

Enfin, assurez-vous d'avoir une configuration DNS au poil notamment en ce qui concerne les enregistrement PTR sur vos MX.

Avec tout ça, vous devriez maximiser vos chances d'être lu à condition de ne pas être un bot spammeur.