Installer Sender ID et DomainKeys sur Debian

Lorsque l’on créé et installe soit même son serveur de mail (ce qui n’est pas une mince affaire), il faut ensuite se mouiller au problème des filtres de spam chez les “grands” comme Yahoo! ou Microsoft.

Dans tout cet article, nous allons voir comment mettre en place les services SenderID et DomainKeys pour autoriser le nom de domaine “mes-stats.fr” à envoyer des mails vers les serveurs de mails de chez Microsoft et de chez Yahoo!

Sender ID pour Hotmail

Le système de filtre mail de Microsoft, utilisé pour Hotmail ou Windows Live Mail, s’appelle Sender ID. C’est une spécification signée microsoft, qui n’est pas très acceptée dans le monde du libre

Pour implanter sont système, Windows à donc décider de le rendre obligatoire sur Hotmail/WLMail… Tout mail qui n’est pas indentifié par Sender ID se retrouve dans la boite des spams… Un forcing qui marche…

Sender ID marche sur la vérification via un champ TXT dans les DNS. En effet, en théorie, il suffit d’ajouter un enregistrement dans les DNS pour que le nom de domaine soit accepté par les services de Microsoft. Seulement, en pratique, nous verront que ça peut être un peu plus compliqué…

Création du SPF dans les DNS

Un champ SPF est sous la forme (sur BIND) :

mes-stats.fr. IN TXT “v=spf1 ptr [a[:mail.mon-domaine.fr,mail2.mon-domaine.fr]] [mx[:mon-domaine.fr]] [ip4:11.12.13.14,15.16.17.18] [include:example2.com] ~all”

Cet enregistrement signifie que sont autorisés à envoyer des mails les serveurs :

  • a = Qui sont spécifiés dans les enregistrements A du domaine
  • a:mail.mon-domaine.fr,[…] = Les serveurs spécifiés après “a:”
  • mx = Qui sont spécifiés dans les enregistrements MX du domaine
  • mx:mon-domaine.fr = Serveurs MX du domaine spécifié (ou des)
  • ip4:liste_ips = Les ips des serveurs (où liste_ips est une suite d’adresses IP ou de réseaux (192.0.2.0/24) séparés par des virgules)
  • include:domaine.com = Include l’enregistrement SPF du ou des domaine(s) listé(s)
  • ptr: Qui on un reverse qui se termine par “mes-stats.fr”
    Important: L’option ptr est déconseillée la spécification RFC 4408 pour des questions de performance et de fiabilité. Utilisez en priorité “a”, “mx”, “ip4″ ou “include”.

Et tous les autres ne sont pas légitimes (~all).

Vous pouvez trouver un générateur de SPF soit sur le site de microsoft soit sur openspf.org.

Une fois la ligne créée, mettez-la dans votre configuration DNS pour votre domaine. Redémarrez le serveur BIND, les mails devraient être acceptés sous quelques dixaines d’heures.

Les SPF ne suffisent pas

Quand après plus de 48h d’attente, vous voyez que vos mails sont toujours refusés par les serveurs de MS, un formulaire est à disposition des postmasters pour “forcer” les filtres à accepter vos mails.

https://support.msn.com/eform.aspx?productKey=senderid&ct=eformts

Remplissez le formulaire :

  • *Contact email address
    Inscrivez votre adresse email (tout le temps accessible, celle de votre FAI par exemple) pour que les services de Microsoft vous contact
  • *Domain name(s) to be added to the SenderID program. Please use a new line for each domain
    Indiquez tous les noms de domaines qui doivent être autorisés (un par ligne)
  • *Does the domain have a SPF record?
    Sélectionnez “yes”
  • If Yes, what is the SPF record associated with domain(s) Please separate each SPF record with a semi-colon
    Indiquez les SPF que vous avez mis. Exemple :

    mes-stats.fr. IN TXT “v=spf1 a mx ~all”

Cliquez sur Submit… Vous aurez un message de confirmation. Maintenant, il faut attendre entre 24 et 48h.

Réponse de Microsoft

Après les 1 ou 2 jours d’attente, vous devez recevoir un mail du type :

Hello [VOTRE NOM],

Thank you for writing to the Sender ID Management Team. My name is Isabel and I read that you would like to have your domains to be added to the Sender ID program. It is a privilege to provide you assistance on your concern.

We have added your mes-stats.fr and mes-stats.eu domain to the Sender ID program. This may take up to 2 business days to be fully replicated in our systems. If you have any questions regarding this please let me know.

[We reviewed your SPF record and note that it includes the “ptr” or reverse DNS lookup mechanism. The specification for SPF records (RFC 4408) discourages use of “ptr” for performance and reliability reasons. This is especially important for Windows Live Mail, Hotmail and other large ISPs as a result of the very high volume of mail we receive each day.  We highly recommend you remove the “ptr” mechanism from your SPF record and, if necessary, replace it with other SPF mechanisms that do not require a reverse DNS lookup, such as “a”, “mx”, “ip4″ and “include.” This will help ensure that Sender ID validation is performed as accurately as possible, maximizing your email deliverability while protecting your domain from spoofing.

You do not need to notify us when you make this or any revision to your SPF record since we will automatically pull the current record from the DNS daily. Thanks again for your support in improving online trust and confidence.]

You can find technical information on the Sender ID program at http://www.microsoft.com/senderid.

Sincerely,

Isabel M.
Sender ID Management Team

Les deux paragraphes en italique et entourés de crochets sont là si vous avez mis un enregistrement ptr dans votre SPF.

En résumé, dans ce mail, Microsoft nous dit qu’il as ajouter des noms de domaines “mes-stats.fr” et “mes-stats.eu” au service Sender ID mais que ça peut mettre 2 jours à se mettre en place. Attendez encore quelques jours…

DomainKeys pour Yahoo!

Evidament, ces deux systèmes ne fonctionnent pas pareil. En fait, DomainKeys, utilisé par Yahoo! est beaucoup plus sécurisé (entendez cela dans le sens où il y a plus de “chances” de ne pas avoir de spam) que le Sender ID de Microsoft mais plus compliqué à mettre en place.

Le système DKIM (DomainKeys Identifier Mail) fonctionne grâce à un système de clé publique / clé privée. Une clé publique est fourni dans un enregistrement dans les DNS du nom de domaine en question et la clé privée est “signée” dans le mail.

Si ces deux clés correspondent, l’expéditeur est agréé, et, est donc autoriser à envoyer des mails vers les services protégés par ce système. Si un expediteur n’utilise pas DomainKeys pour envoyer des mails vers les adresses email de Yahoo!, sont mail est automatiquement envoyé dans la boite “Courier Indésirable”.

Pour signer les email avec le système DomainKeys, nous allons utiliser le système DKIM-Proxy.

Installation du module perl Mail-DKIM

Nous allons installer le module perl appellé “Mail-DKIM”.

Téléchargement & Décompression des sources

Commençons par télécharger les sources depuis un serveur (celui de Mes-Stats par exemple) :

wget http://sources.mes-stats.fr/perl/Mail-DKIM-0.32.tar.gz

Une fois sur votre serveur, dé-compressez la source :

tar -xzvf Mail-DKIM-0.32.tar.gz
cd Mail-DKIM-0.32

Installation

Maintenant, nous allons procèder à l’installation du module :

Important: Exécutez les prochaines opérations en tant que super-utilisateur

perl Makefile.PL

Il se peut qu’il y ai quelques erreurs :

Warning: prerequisite Crypt::OpenSSL::RSA 0.24 not found.
Warning: prerequisite Digest::SHA 0 not found.
Warning: prerequisite Mail::Address 0 not found

Si plusieurs erreurs de ce type arrivent, ne continuez-pas, installez les packets demandés (ici, Crypt::OpenSSL::RSA, Digest::SHA et Mail::Address)Warning: prerequisite Crypt::OpenSSL::RSA 0.24 not found.
Warning: prerequisite Digest::SHA 0 not found.
Warning: prerequisite Mail::Address 0 not found

S’il n’y a aucun problème, continuez :

make
make install

L’installation devrait se finir par :

Writing /usr/local/lib/perl/5.8.8/auto/Mail/DKIM/.packlist
Appending installation info to /usr/local/lib/perl/5.8.8/perllocal.pod

Si c’est le cas, l’installation du module PERL s’est exécutée avec succès.

Installation de DKIMProxy

Téléchargement & Décompression des sources

Nous allons télécharger les sources de DKIMProxy depuis le serveur de Mes-Stats :

wget http://sources.mes-stats.fr/dkim-proxy/dkimproxy-1.0.1.tar.gz

Il faut ensuite décompresser l’archive :

tar -xvzf dkimproxy-1.0.1.tar.gz
cd dkimproxy-1.0.1

Compilation et Installation

Une fois dans le répertoire des sources, nous allons préparer la compilation avec configure :

./configure –prefix=/etc/dkimproxy

Il se peut que vous ayez une erreur tu type :

configure: error: requested Perl module ‘Error’ not found

Dans ce cas, il faut que vous installiez le module. Ici, installez le module PERL Error.

Si aucune erreur n’as été détectée, nous allons installer DKIMProxy :

make install

L’installation du système est fait.

Création d’un utilisateur

Pour l’éxécution du DKIMProxy, nous allons créer un nouvel utilisateur système dédié appelé “dkim” :

adduser dkim –disabled-login –disabled-password –no-create-home

Script de démarrage

Si vous n’êtes plus dans le répertoire qui contient les sources de DKIMProxy, retournez-y. Si vous y êtes…restez-y !

Modifier le fichier “sample-dkim-init-script.sh” :

vi sample-dkim-init-script.sh

Et remplacez cette ligne :

DKIMPROXYDIR=/usr/local/dkimproxy

Par celle-ci :

DKIMPROXYDIR=/etc/dkimproxy

Ensuite, copiez ce fichier dans /etc/init.d/ sous le nom “dkimproxy” :

cp ./sample-dkim-init-script.sh /etc/init.d/dkimproxy
chmod u+x /etc/init.d/dkimproxy

Démarrage automatique

Pour que DKIMProxy démarre automatiquement à chaque démarrage du système, il faut simplement l’ajouter aux services. Pour faire ça, exécutez la commande suivante :

update-rc.d dkimproxy defaults

Ajout des données dans les DNS

Une fois DKIMProxy installé, il faut créer les deux clés (publique et privée) qui vont respectivement être distribuées dans les DNS et dans l’entête des mails.

Dans un premier temps, nous allons créer un répertoire dédié pour accueillir ces deux clés :

cd /etc/dkimproxy
mkdir keys
cd keys

Ensuite, nous allons générer notre paire de clé :

openssl genrsa -out private.key 1024
openssl rsa -in private.key -pubout -out public.key

Maintenant, nous allons faire un nouvel enregistrement dans les DNS. Ajoutez cette ligne au fichier de configuration du nom de domaine :

selector1._domainkey IN TXT “k=rsa; t=s; p=MHwwDQYJK[…]OprwIDAQAB”

Où la valeur de p est la clé publique (contenu de public.key) sans les entêtes en une ligne. C’est-à-dire qu’il ne faut pas que la clé soit sur plusieurs lignes comme dans le fichier public.key.

Re-démarrez bind.

Configuration de DKIMProxy

Une fois l’enregistrement DNS effectué, il faut créer un fichier de configuration pour “dire” au logiciel comment est-ce qu’il faut qu’il fonctionne.

Pour celà, créez un fichier /etc/dkimproxy/etc/dkimproxy_out.conf qui contient ces lignes :

# specify what address/port DKIMproxy should listen on
listen    127.0.0.1:10027
# specify what address/port DKIMproxy forwards mail to
relay     127.0.0.1:10028
# specify what domains DKIMproxy can sign for (comma-separated, no spaces)
domain    mes-stats.fr
# specify what signatures to add
signature dkim(c=relaxed)
signature domainkeys(c=nofws)
# specify location of the private key
keyfile   /etc/dkimproxy/keys/private.key
# specify the selector (i.e. the name of the key record put in DNS)
selector  selector1

Remplacez “mes-stats.fr” par votre nom de domaine.

Configuration de Postfix

Pour que le service DKIMProxy soit appellé à l’envoi d’un mail, il faut créer un trigger après queue (after queue) pour que les mails soient envoyés au service DKIMProxy, qu’il ajoute la signature et qu’il les retournes à postfix.

Pour faire cela, malgrès les aparences, ce n’est pas très compliqué, il suffit de modifier le fichier master.cf comme ceci :

  • Modifiez le service submission par celui-là : (s’il n’y as pas encore de service submission ou qu’il est commenté, ajoutez ces lignes au début) :

submission  inet  n     –       n       –       –       smtpd
-o smtpd_etrn_restrictions=reject
-o smtpd_sasl_auth_enable=yes
-o content_filter=dksign:[127.0.0.1]:10027
-o receive_override_options=no_address_mappings
-o smtpd_recipient_restrictions=permit_sasl_authenticated,reject

  • Ajoutez ou modifier à “smtp” et “smtps” l’option “content-filter” comme ceci :

smtps     inet  n       –       –       –       –       smtpd
[…]
-o content_filter=dksign:[127.0.0.1]:10027
[…]

# envoyer directement a dksign
submission  inet  n     –       n       –       –       smtpd
[…]
-o content_filter=dksign:[127.0.0.1]:10027
[…]

  • Ajoutez “dksign” et le service sur le port 10028 :

dksign    unix  –       –       n       –       10      smtp
-o smtp_send_xforward_command=yes
-o smtp_discard_ehlo_keywords=8bitmime,starttls

127.0.0.1:10028 inet  n  –      n       –       10      smtpd
-o content_filter=
-o receive_override_options=no_unknown_recipient_checks,no_header_body_checks
-o smtpd_helo_restrictions=
-o smtpd_client_restrictions=
-o smtpd_sender_restrictions=
-o smtpd_recipient_restrictions=permit_mynetworks,reject
-o mynetworks=127.0.0.0/8
-o smtpd_authorized_xforward_hosts=127.0.0.0/8

Re-démarrez postfix. Démarrez DKIMProxy si ça n’est pas déjà fait.

DKIMProxy signe maintenant vos mails avec la clé privée. Dans les logs de postfix, vous devriez avoir quelque chose comme ça lors de l’envoi d’un mail :

Aug 28 16:30:58 serveur dkimproxy.out[31308]: DKIM signing – signed; message-id=<20080828143058.673AE512@mail.domaine.tld>, signer=<root@domaine.tld>, from=<root@domaine.tld>

Pour tester votre système de mail, envoyer un mail à check-auth{AT}verifier.port25.com. Un répondeur automatique vous envera les résultats des tests. Si vous avez suivi tout l’article, le résultat devrait être :

==========================================================
Summary of Results
==========================================================
SPF check:          neutral
DomainKeys check:   pass
DKIM check:         pass
Sender-ID check:    pass
SpamAssassin check: ham

facebooktwittergoogle_plusredditpinterestlinkedinmail

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">