Retour : Page Principale > sommaire aide > sommaire aide-mémos

Signature des emails et reverse-DNS


INCOMPLET (2017-07-20) - ces informations mériteraient d'être complétées

Ces procédés permettent à nos emails de ne pas être considérés comme du SPAM par les principaux MTA.
Ce besoin fait suite à plusieurs alertes "bounce" de la part d'ezmlm, (afrique-du-nord@, embauche@) et des avertissements de la part de GMail (l'identité de l'émetteur n'a pu être vérifiée).

Note 2016-04-25 : apparemment il faut regarder du côté de DMARC (Yahoo, Laposte, Gmail) qui nous pose des problèmes depuis mars 2016, et il faudra mettre à jour ezmlm-idx (merci David D) !

D'après ce post sur serverfault, la règle de base semble être de faire concorder les 4 valeurs suivantes :
  • le reverse DNS de l'IP du serveur envoyant le courrier (relais DNS d'Agropolis)
  • l'annonce HELO / EHLO envoyĂ©e par le MTA (qmail, fichier /etc/qmail/me )
  • la bannière SMTP du MTA (qmail)
  • un enregistrement MX dans le fichier de zone DNS (Gandi)
Chez nous, la valeur doit ĂŞtre "sequoia.tela-botanica.org".

Pourquoi sequoia.tela-botanica.org et non tela-botanica.org ?
Même si c'est mieux, il n'est pas important que le domaine des adresses expéditrices des emails (ex: "tela-botanica.org" pour l'adresse "toto@tela-botanica.org") soit le même que le domaine de la machine sur laquelle est installé le MTA.
Dans le cas où les machines (virtuelles) qui gèrent le site Web et les emails sont différentes, on ne peut les nommer toutes les deux "tela-botanica.org"; il est préférable de donner au MTA un sous-nom de domaine.

Reverse DNS

Le DNS associe un nom de domaine à une IP. Le reverse-DNS fait le contraire, et permet de vérifier qu'une machine pointée par un nom est bien "au courant" qu'elle est pointée par ce nom.
Ce machin se gère (au moins dans notre cas) au niveau du proxy DNS, géré par Agropolis (08/2016).

Enregistrement SPF

Cet enregistrement de type TXT à placer dans le DNS indique quelles machines (IPs) sont officiellement autorisées à envoyer du courrier au nom de "tela-botanica.org". Il est important d'ajouter les IPs des MTA externes avec lesquels on envoie du courrier : Numéricable, Gandi et Google.
Actuellement (08/2016) le SPF est le suivant :
@ 10800 IN TXT "v=spf1 a include:_mailcust.gandi.net include:_spf.google.com ~all"

Le a signifie "l'IP courante associée à ce nom de domaine", càd l'IP de notre serveur.
Le ~all signifie "soft-fail", càd "c'est pas autorisé mais c'est pas hyper grave non plus". On a réglé en soft-fail plutôt qu'en hard-fail (-all) car Numerdicable ne nous a pas communiqué les adresses ou le "include" SPF à faire pour leur MTA (ils n'ont même pas l'air de savoir ce que c'est :/ ).

Il faut déclarer également chaque sous domaine autorisé à envoyer du courrier de la même manière. L'usage d'un wildcard est possible voir : http://www.openspf.org/FAQ/The_demon_question

Enregistrement et signature DKIM

L'idée est de "signer" les messages avec une clef privée, et rendre la clef publique accessible dans un enregistrement DNS. C'est plus compliqué car il faut régler son MTA pour qu'il ajoute la signature DKIM à tous les messages sortants.


Pour éviter de recompiler qmail, ce qui est éminemment dangereux, et parce que je n'avais pas encore trouvé la 3e méthode (la lose), on a appliqué la seconde méthode (2016-08-03).

Installer libdomainkeys, dkimsign.pl et le wrapper qmail-remote

Suivre le tuto : https://beingasysadmin.wordpress.com/2013/04/30/dkim-signing-in-qmail/

Oui mais voilĂ  : selon la version de Perl et du module Filter, quand on installe Mail::DKIM::Signer (requis par dkimsign.pl), un test foire sur le module Crypt:: OpenSSL::Random et ça ne s'installe pas. Le bug semble ĂŞtre le suivant : https://rt.cpan.org/Public/Bug/Display.html?id=106090 ; il faut donc mettre Ă  jour (cpan> upgrade) Filter::Util::Call.

Oui mais voilĂ , mĂŞme en le mettant Ă  jour, ça marche pas. Il faut donc forcer l'installation de Crypt:: OpenSSL::Random avec cpan, puis installer Crypt:: OpenSSL::RSA et enfin Mail::DKIM::Signer :
cpan> clean Crypt::OpenSSL::Random
cpan> force install Crypt::OpenSSL::Random
cpan> clean Crypt::OpenSSL::RSA
cpan> install Crypt::OpenSSL::RSA
cpan> clean Mail::DKIM::Signer
cpan> install Mail::DKIM::Signer

Note: il faut aussi installer Pod::Usage, Mail::DKIM:: TextWrap et Getopt::Long pour faire marcher dkimsign.pl.

Dans le wrapper qmail-remote, ajuster le PATH en haut en ajoutant /usr/sbin, et placer dans ce dossier les binaires dktest (compilé dans libdomainkeys) et dkimsign.pl.
Il faut donner les droits d'exécution à dkimsign.pl (un petit chmod +x dkimsign.pl).

Suivre le reste du tuto et ça devrait marcher.

Pour activer le wrapper et la signature, la première fois faire :
cp qmail-remote qmail-remote.orig

Puis ensuite pour l'activer :
mv qmail-remote qmail-remote.old && mv qmail-remote-wrapper qmail-remote

Pour le désactiver, en cas de pb :
mv qmail-remote qmail-remote-wrapper && mv qmail-remote.old qmail-remote


Vérifier la signature DKIM des autres

...

Enregistrement DMARC

DMARC permet, une fois SPF et DKIM mis en place, d'indiquer aux destinataires que faire lorsqu'ils reçoivent un email provenant de "tela-botanica.org" mais qui ne passe pas les tests SPF et DKIM (donc un email frauduleux).

On peut indiquer de : rejeter, mettre en quarantaine, ou ne rien faire.

Dans notre cas, comme Numerdicable ne nous a pas fourni les éléments de config pour le SPF, il vaut mieux dire "ne rien faire". Ça ne sert à rien, mais ça fait chic d'avoir un enregistrement DMARC dans son DNS :-)
@ 10800 IN TXT "v=DMARC1;p=none"


État du DNS après tout ce bazar

Au 2016-08-04 :
@ 10800 IN TXT "v=DMARC1;p=none"
@ 10800 IN TXT "v=spf1 a mx ip4:193.54.123.169 ip4:193.54.123.216 ip4:149.202.178.169 include:_mailcust.gandi.net include:_spf.google.com ip4:149.202.178.169 ~all"
default._domainkey 10800 IN TXT "v=DKIM1;k=rsa;t=y;p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDQuRNuXgJXJuMFypyFPxCjoxCx3GhgrPrm4qbpaATJpi1HpR8cClugRQvb2FG9K5k8KC1IfUcFO+Fv0D4FHyOcOTdFSTocsJQrVH4oIruMhzvrXYbKBpz+p9MCm4/T+VpWiIaydRuHOtOGTptmZ0OAOyFXZBn8v/RLaIch+qrZlwIDAQAB"


Tester le niveau de çafonctionnitude de ces mécanismes

Utiliser les outils suivants :

Pour interroger les DNS et vérifier les enregistrements, notamment TXT, utiliser dig
  • dig tela-botanica.org TXT
  • dig default._domainkey.tela-botanica.org TXT

Pour le reverse DNS aussi :
  • dig -x 193.54.123.169

Annexe : conversation avec Aurélien P, 04/2016

Aurélien : pour le reverse dns il suffit d'avoir une entrée normalement dans les dns de gandi
Aurélien : http://serverfault.com/questions/24943/reverse-dns-how-to-correctly-configure-for-smtp-delivery
Aurélien : moi j'ai postfix mais qqun a fait un tuto pour qmail et dkim http://notes.sagredo.eu/node/92
Aurélien : utilise ce service pour vérifier les emails
Aurélien : https://www.port25.com/support/authentication-center/email-verification/
Aurélien : il suffit d'envoyer un mail à une des adresses indiquées depuis le serveur de tela
Aurélien : et ils te diront si ça passe ou pas
Aurélien : genre en utilisant l'adresse de type check-auth-jsmith=yourdomain.com@verifier.port25.com
Aurélien : et en remplacant jsmith-your-domain.com par mathias=tela-botanica.org
Aurélien : ben il t'enverront un rapport à ton adresse
Aurélien : du genr tu envoie depuis le serveur un mail à check-auth-mathias=tela-botanica.org@verifier.port25.com
Aurélien : et pour ajouter un enregistrement spf http://serverfault.com/questions/523738/how-to-setup-correct-spf-record
Aurélien : franchement commence par le reverse dns et le spf
Aurélien : c très facile
Aurélien : après passe à dkim
Mathias : génial merci !!
Mathias : trop cool
Aurélien : à chaque étape tu pourras tester avec le service de port25 qui te dit quels tests passent et quels ne passent pas
(...)
Aurélien : ah oui le reverse dns
Aurélien : il faut le faire pour ip6 et ipv4
Aurélien : et ton enregistrement spf
Aurélien : il faut pas en faire deux (un pour ipv4 et un pour ip v6) mais mettre les deux dans le meme
Aurélien : genre le mien ressemble à ça
realie.xyz.600TXT"v=spf1 ip4:198.100.144.138 ip6:2607:5300:60:78a::1 ~all"
Aurélien : bon le copier coller m'a niqué les espeace mais tu vois le truc
Aurélien : pour le reverse dns vu que j'ai un kmsufi je l'ai configuré la dedans
Mathias : boulàlà ça m'a l'air compliqué ce truc :)
Mathias : Ah oui voilĂ 
Aurélien : mais vous vu que c'est auto hebergé il faut ptet configurer apache ou bien nginx
Aurélien : mais fait au moins spf ça c facile
Mathias : je lis sur un forum de Gandi que c'est le fournisseur d'IP qui doit gérer le PTR et non Gandi, qui dans notre cas ne fournit que les noms
Mathias : du coup apparemment faut que je demande Ă  RENATER :-/
Mathias : ça te parle ?
Aurélien : oui parce que le fournisseur de nom gandi n' pas accès à ton serveur
Aurélien : en fait le reverse dns interroge direct l'ip du serveur
Aurélien : pour vérifier que qqun n'a pas crée un dns pointant vers ton serveur
Aurélien : genre vatefaireenculermathias.com qui pointerais vers l'ip de tela
Mathias : :)
Aurélien : mais il me semble que tu puex le configurer toi meme pour apache et nginxsme
Mathias : ah ! ok je comprends, merci
Mathias : bé... je vais essayer ça ! merci
Mathias : tu m'aides beaucoup
Aurélien : http://www.shellhacks.com/en/Setting-Up-Reverse-DNS-PTR-Record
Aurélien : la ils l'expliquent pas mal
Mathias : trop cool merci, tu me fais gagner un temps précieux
Mathias : quand j'aurai réglé ça je te paierai une bière :)
Aurélien : ah avec grand plaisir
Aurélien : ça te demandera ptet un peu plus de config pour le faire manuellement mais je pense pas que ça soit trop trop compliqué
Aurélien : tu peux tester ton reverse dns avec dig- x
Aurélien : dig -x
Aurélien : il faut qu'il y ait une section ANSWER dans la réponse
Mathias : Ben apparemment même avec "host" ça suffit
Mathias : Je comprends pquoi ça déconne :
Mathias : mathias@kookaburra:~/web/ezmlm-php$ host tela-botanica.org
tela-botanica.org has address 193.54.123.169
tela-botanica.org mail is handled by 10 tela-botanica.org.
mathias@kookaburra:~/web/ezmlm-php$ host 193.54.123.169
169.123.54.193.in-addr.arpa domain name pointer telaseq.agropolis.fr.
Mathias : les noms ne coĂŻncident pas
Mathias : tu m'étonnes qu'on passe pour des spammeurs :D
Aurélien : après normalement il me semble que le principal c'est que la reverse dns réponse
Aurélien : essaie avec ipv6
Aurélien : je pense que le pb c'est ça
Aurélien : c'est que le serveur n'a pas de reverse dns pour ipv6
Mathias : hmm
Aurélien : et google utilise en priorité ipv6
Mathias : mais je la connais pas moi mon IPv6 :'(
Aurélien : ifcong
Mathias : v voir dans ifconfig
Aurélien : ifconfig
Mathias : :)
Mathias : ça ferait un super rébus
Mathias : un if, un con, une figue
Aurélien : lol
Mathias : mais bon, si le rDNS donne un nom qui ne correspond pas au DNS c'est pas pire ? Ça sent carrément l'usurpation !! :)
Mathias : mathias.fr => 1.2.3.4
1.2.3.4 => daech.com
:-/
(...)
Aurélien : c pour ça que tu as dkim et spf
Mathias : mathias@kookaburra:~/web/ezmlm-php$ host -6 fe80::215:17ff:fe9e:ba9f
;; connection timed out; no servers could be reached
=> tu crois que Agropopaul peut bloquer IPv6 en entrée ? Dans ce cas, peut-on imaginer que Gogol va folle-baquer sur IPv4 et que donc le PB vient bien de la non-concordance des noms ?
Aurélien : hmm posssible mais c naze s'ils gèrent pas ipv6
Aurélien : ils pourraient le faire sans danger
Aurélien : au moins pour tela
Aurélien : et puis il va falloir le faire au bout d'un moment
Mathias : ouais, ou alors c'est le chouitche qu'on a dans l'armoire :-/
Mathias : de toute façon ils vont nous virer alors on va pas s'emmerder... bon en tout cas je vais faire pour IPv4 et voir ce que ça donne. Merci beaucoup encore !
Aurélien : alors pour éviter l'usurpation c la que spf intervient
Mathias : ah
Aurélien : " indiquant quelles adresses IP sont autorisées ou interdites à envoyer du courrier pour le domaine considéré."
Aurélien : mais passe un coup de fil a cerda autan ça lui prends 3secondes
Mathias : hmmmm oui je vois, mais je comprends mal : est-ce que ce n'est pas précisément le rôle du DNS que de faire ça ? Genre tu regardes s'il y a un enregistrement MX sur le nom, et ça te répond une IP associée à ce nom et c'est gagné (OK si tu veux plusieurs IP ça marche pas) - je vois pas en quoi il faut autre chose qu'un DNS :-/ ??
Aurélien : ben en fait tu peux autoriser d'autres domaine que ton ip à envoyer des mails
Aurélien : surtout si tu as un serveur de mail a part
Aurélien : genre tu as culdechouette.fr qui a son serveur de mail sur un hebergeur privé par exemple
Aurélien : hiboumail.com
Mathias : ok, ben c'est pas le cas pour nous, du coup penses-tu que j'ai besoin d'un SPF si le seul bousin qui envoie des emails c'est sequoia et qu'il coïncide exactement avec l'IP associée à ce nom (pas de sous-nom) ?
Mathias : hahaha
Aurélien : oui je pense que oui
Mathias : oui je comprends bien, merci pour les explciations
Aurélien : dans tous les cas il le faut
Mathias : ok
Aurélien : et le spf c super facile à faire
Aurélien : je crois que c une option dans la conf au père de véro
Mathias : haha
(...)
Aurélien : normalement pour le reverse apache avec un truc de ce genre là tu t'en sors http://www.shellhacks.com/en/Setting-Up-Reverse-DNS-PTR-Record
Aurélien : et regarde aussi https://openclassrooms.com/courses/mise-en-place-des-serveurs-apache-et-dns
Aurélien : ça me semble un peu plus clair ici
Aurélien : Chapitre "Configuration du serveur DNS"
Mathias : super !
Aurélien : je crois qu'il faut créer un fichier de zone ou un truc comme ça
Aurélien : ça me semble vraiment etre une tache de szerveur basique
Mathias : ouais bonne nouvelle
Aurélien : donc ça m'étonnerait vraiment que ça soit compliqué