Ne pas être mis dans les spams (SPF, DKIM...)

En l'état, vous pouvez recevoir et envoyer des messages. Cependant, il se peut que certains serveurs de messagerie considèrent vos mails comme des spams. Heureusement, il existe quelques petites manipulations pour rendre vos messages légitimes. Nous allons les détailler dans les paragraphes suivants. Gardez à l'esprit qu'elles se complètent sans se suffire à elles-mêmes.

Reverse DNS

Chez votre Fournisseur d'Accès à internet, cherchez les options correspondant à votre adresse IP. Vous pourrez configurer un reverse DNS ou en français DNS inverse.

Alors que votre nom de domaine est relié à l'IP du serveur, il faut aussi configurer la réciproque, c'est-à-dire relier à votre IP le nom de domaine.

Un petit mail à votre fournisseur permettra de savoir comment s'y prendre si vous ne trouvez pas 😉.

Si vous ne pouvez pas faire cette manipulation, ce n'est pas une catastrophe, du moment que vous pouvez mettre en place SPF et DKIM (voir paragraphes suivants).

Une autre possibilité consiste à louer un VPN pour obtenir une nouvelle IP dédiée à votre serveur. Les fournisseurs de VPN proposent souvent un reverse DNS configurable.

SPF

Normalement, seul votre serveur est autorisé à envoyer des messages avec vote nom de domaine. Un enregistrement SPF dans votre zone permet de le préciser. Puisque normalement, c'est l'administrateur du serveur de mail qui gère aussi la zone, c'est une preuve de bonne foi. L'absence de champ SPF est très mauvais pour la réputation d'un mail.

Ajoutez un champ DNS de type SPF dans votre zone DNS qui correspond au champ A utilisé pour vos mails (chez votre registrar ou sur votre serveur de noms si vous l'hébergez aussi) tel que celui-ci :

chezmoi.tld.   SPF "v=spf1 a mx ~all"

ou bien sous forme de champ TXT si le SPF n'est pas disponible :

chezmoi.tld. TXT "v=spf1 a mx ~all"

Signature DKIM

Cette technique complète SPF et consiste à signer avec le serveur les messages émis par le serveur à l'aide d'une clé privée. On ajoute ensuite dans un champ DNS la clé publique correspondante qui permettra au destinataire de vérifier que le mail reçu provient bien de votre serveur.

Hum... Pas sûr d'avoir compris.

Je reprends. Nous allons créer une clé privée et une clé publique.

La clé privée servira à signer les messages. On l'appelle "privée" car vous devez être la seule personne capable de signer (comme pour vos chèques ou vos impôts). La clé publique est là pour vérifier que la signature est bien authentique. On peut voir ça comme une pièce de puzzle unique, qui est la seule à pouvoir entrer dans l'empreinte créée par la signature.

On présentera ici deux méthodes pour signer les messages : l'une avec une extension à smtpd, l'autre avec un paquet faisant office de proxy. Le premier est le plus simple 😊. Notez que c'est aussi possible avec rspamd (voir la page correspondante), la méthode de génération des clés restant identique. Si vous choisissez d'utiliser cet antispam, vous voudrez certainement aussi utiliser sa capacité à signer les messages plutôt que mutliplier les outils installés.

Génération des clefs OpenSSL pour dkim

Les commandes suivantes permettent de fabriquer la paire de clés qui servira à signer les mails émis :

On génère les clefs :

# openssl genrsa -out private.key 2048               
# openssl rsa -in private.key -pubout -out public.key

On ajuste les permissions sur les clefs :

# chmod 400 private.key

Enregistrements DNS

Il faut absolument rendre publique une façon de vérifier que la signature DKIM sur les messages envoyés est bien correcte.

Nous allons pour cela ajouter un nouveau champ dans vos DNS auprès de votre registrar ou dans votre zone. Eh oui, encore ! On va en réalité indiquer le nécessaire pour pouvoir vérifier la signature des messages qui auront un drapeau "dkimpubkey".

Il s'agira d'un champ DKIM ou TXT selon ce qui est disponible. Remplissez-le ainsi :

Recopiez à la place des points de suspension le contenu du fichier public.key, que vous pouvez afficher avec la commande cat :

# cat /etc/dkim/public.key

Ce qui nous donnera dans la zone DNS de votre domaine :

dkimpubkey._domainkey    IN TXT    ( "v=DKIM1; k=rsa; t=s;p=v+Fb...vhP/oB")

Avec opensmtpd-filter-dkimsign

Depuis qu'smtpd est équippé de "filtres", il vous est possible de signer vos messages de cette façon. Cela rendra la configuration un peu plus simple.

Tout d'abord, installer le port opensmtpd-filter-dkimsign.

# pkg_add opensmtpd-filter-dkimsign

On modifie les permissions pour que l'outil de signature puisse accéder aux clés:

# chown -R _dkimsign:_dkimsign /etc/dkim/

Si vos clés de signature ont bien été générées auparavant, vous pouvez ajouter en haut de votre fichier de configuration /etc/mail/smtpd.conf la définition du filter "dkimsign":

filter "dkimsign" proc-exec "filter-dkimsign \
    -d <domain> \
    -s <selector> \
    -k /etc/dkim/private.key" \
    user _dkimsign group _dkimsign

Remplacez "<domain>" par votre nom de domaine et "<selector>" par "dkimpubkey" : c'est ce qu'on a mis un peu plus haut dans le champ DNS.

Enfin, il vous suffit de faire passer les mails sortants par ce filtre. On modifie la ligne correspondant à l'envoi des messages dans /etc/mail/smtpd.conf:

listen on all port submission tls-require auth <passwd> filter "dkimsign"

Avec dkimproxy

On peut aussi utiliser dkimproxy pour signer les messages.

On l'installe comme d'habitude :

# pkg_add dkimproxy

Vous rendrez dkimproxy propriétaire du dossier contenant les clés:

# chown -R _dkimproxy:_dkimproxy /etc/dkim/

Afin de configurer la signature des messages envoyés, il faut éditer le ficher/etc/dkimproxy_out.conf ainsi :

listen    127.0.0.1:10027
relay     127.0.0.1:10028
domain    chezmoi.tld
signature dkim(c=relaxed)
signature domainkeys(c=nofws)
keyfile   /etc/dkim/private.key
selector  dkimpubkey
Euh, c'est quoi tout ça?

Quelques menues explications :

Bien, reste à indiquer à opensmtpd de signer les mails. On va donc ajouter dans le fichier /etc/mail/smtpd.conf une ligne pour écouter sur le port 10028 en local, afin d'envoyer les mails que dkimproxy aura signé. On leur colle l'étiquette "DKIM" pour les repérer ensuite.

listen on lo0 port 10028 tag DKIM   

Les messages qui auront l'étiquette "DKIM" peuvent être envoyés. On n'envoie plus les mails s'ils ne sont pas passés par dkimproxy.

match tag DKIM for any action "envoi"
match auth tag DKIM from any for any action "envoi"

Enfin, les messages pas encore signés doivent être envoyés à dkimproxy. On définit l'action correspondante :

action dkimproxy relay host smtp://127.0.0.1:10027 

S'ensuit les règles de correspondance qui vont bien, à placer à la fin du fichier smtpd.conf:

match auth from any for any action dkimproxy
match for any action dkimproxy

Le fichier /etc/mail/smtpd.conf ressemble désormais à ça :

# Configuration generale
## Tables 
table aliases "/etc/mail/aliases"
table passwd "/etc/mail/passwd"
table virtuals "/etc/mail/virtuals"

## Certificats
pki chezmoi.tld key "/etc/ssl/private/chezmoi.tld.key"
pki chezmoi.tld cert "/etc/ssl/chezmoi.tld.crt"

### Ecoute pour messages signes avec dkimproxy
listen on lo0 port 10028 tag DKIM   

### Reception
listen on all tls pki chezmoi.tld 
### Envoi avec client de messagerie
listen on all port submission tls-require pki chezmoi.tld auth <passwd> 


# ACTIONS
action "envoi" relay 
action dkimproxy relay host smtp://127.0.0.1:10027 

action local_mail maildir alias <aliases>
action virtual_maildir maildir "/var/vmail/%{dest.domain}/%{dest.user}/Maildir" virtual <virtuals>

# Correspondances
## Reception
### Message pour les utilisateurs locaux qui lisent avec la commande "mail"
match for local action local_mail
### Message pour les utilisateurs virtuels
match from any for domain "chezmoi.tld" action virtual_maildir

## Envoi
### Mail sortant portant une signature DKIM
match tag DKIM for any action "envoi"
match auth tag DKIM from any for any action "envoi"

### Mail en envoi pas encore signe avec DKIM
match auth from any for any action dkimproxy
match for any action dkimproxy

Ça va? Vous suivez toujours? Je vois à votre regard pétillant que vous attendez la fin avec impatience ! 😁

Courage, c'est presque fini. 😉

Finalement, activez dkimproxy puis rechargez opensmtpd avant de tester si vous avez réussi à configurer correctement l'envoi de vos mails.

# rcctl enable dkimproxy_out
# rcctl start dkimproxy_out
# rcctl restart smtpd

dnswl

Le site suivant permet d'enregistrer votre IP sur une liste blanche, qui pourra être consultée par d'autres serveurs de messagerie :

https://www.dnswl.org/

Vérifications

Pour vérifier que vos messages envoyés ne sont pas considérés comme spam, suivez les indications du site mail-tester. Vous allez envoyer un message à l'adresse donnée, et normalement, vous devriez obtenir au moins une note de 8/10 :

mail-tester
mail-tester 1 mail-tester 2

Il se peut qu'on vous parle d'un enregistrement dmarc. Libre à vous de l'ajouter à vos DNS, mais ce n'est pas obligatoire. En réalité, "ça fait juste bien" d'en avoir un... À vrai dire, le score obtenu est déjà meilleur qu'avec nombre de "grands" services de messagerie (testez avec gmail pour rigoler : 6.1/10 lors de mon dernier test...).

leadership