Installer la signature DKIM sur Postfix avec DKIMproxy
Par Yves Tannier le mercredi, mars 12 2008, 10:00 - Le pingouin - Lien permanent
Je vous propose dans ce billet l'installation de la signature DKIM sur vos mails sortants. Ceci fait suite à mon billet concernant l'implémentation de DomainKeys avec Postfix et Amavis via Dkfilter.
Dkfilter ne gère en effet que le protocole DomainKeys de Yahoo! maintenant remplacé par DKIM (DomainKeys Identified Mail) , un protocole plus avancé et standardisé par la RFC 4871. Très très brièvement, DKIM permet de « renforcer » l'identité des expéditeurs.
En remplacement de dkfilter, l'auteur de ce programme nous propose DKIMproxy pour gérer la signature DKIM et/ou DomainKeys.
Si vous utilisez Amavis, comme c'est mon cas, sachez quelques petites choses :
- Il semble que Amavisd-new gère la signature DKIM des mails sortants à partir de la version 2.6.0. Mais sur Debian Etch, nous en sommes à la version 2.4. C'est donc l'intérêt de ce billet. Je n'ai pas testé la version 2.6.0. je ne peux donc pas vous en dire plus.
- DKIMproxy permet également une vérification des mails entrants. Cette vérification ne nous intéresse pas forcément puisque Amavis propose déjà cette fonctionnalité via Spamassassin qui utilise la librairie perl Mail::DKIM.
Comme pour mon précédent billet, c'est un howto « copié/collé » pour les informaticiens fainéants pressés. J'ai également fais pas mal de copié/collé de l'ancien billet puisque la configuration est sensiblement la même sur de nombreux points.
Installer DKIMproxy
Placez-vous dans /usr/src et téléchargez DKIMproxy
cd /usr/src wget http://kent.dl.sourceforge.net/sourceforge/dkimproxy/dkimproxy-1.0.1.tar.gz
Décompressez l'archive et placez-vous dans le nouveau répertoire
tar zxvf dkimproxy-1.0.1.tar.gz cd dkimproxy-1.0.1
Si vous n'avez pas encore le module perl Mail::Dkim, il faut l'installer via CPAN pour disposer d'une version suffisamment récente la version Debian Etch est trop ancienne).
perl -MCPAN -e shell install Mail::DKIM exit
Préparez l'installation de dkimproxy dans /usr/local/dkimproxy
mkdir /usr/local/dkimproxy ./configure --prefix=/usr/local/dkimproxy
Compilez et installez
make install
Déplacez-vous dans le répertoire dkimproxy et renommez les fichiers de configuration des daemons
cd /usr/local/dkimproxy mv etc/dkimproxy_in.conf.example etc/dkimproxy_in.conf mv etc/dkimproxy_out.conf.example etc/dkimproxy_out.conf
Créer l'utilisateur et le groupe dkim
adduser dkim --no-create-home --disabled-password --disabled-login
Installer le script de démarrage de dkimproxy
Copiez le script de démarrage proposé dans les sources de dkimproxy dans /etc/init.d/
cp /usr/src/dkimproxy-1.0.1/sample-dkim-init-script.sh /etc/init.d/dkimproxy
Editez-le. Normalement, il n'y a rien a changer dans ce fichier si on utilise les paramètres « standards »
vi /etc/init.d/dkimproxy
Créer une clé publique/privée
Chaque domaine possèdera sa propre clé. On crée un dossier dans lequel on stockera les clés.
mkdir /usr/local/dkimproxy/keys cd /usr/local/dkimproxy/keys
On suppose que vous avez le paquet OpenSSL installé et que votre domaine est exemple.tld
La clé privée
openssl genrsa -out exempletld.key 1024
La clé publique
openssl rsa -in exempletld.key -pubout -out exempletld_pub.key
Changer les droits sur la clé privée pour la rendre uniquement accessible à l'utilisateur dkim
chown dkim:dkim exempletld.key chmod 640 exempletld.key
Ajouter l'enregistrement TXT à la zone DNS
Une fois la clé générée, il va falloir ajouter un enregistrement TXT à la zone de chaque domaine. Prenons encore l'exemple du domaine exemple.tld
On édite le fichier de zone /var/cache/bind/exemple.tld.hosts et on ajoute l'enregistrement TXT suivant. La valeur de "p=" correspond à la clé publique sur une seule ligne. Notez également le nom exempletld qui sera utile pour la suite (nous l'appellerons "sélecteur"). Le t=y; signifie que votre installation est en test. Vous pourrez retirer cette information quand tout sera opérationnel
; DKIM _domainkey.exemple.tld. IN TXT "t=y; o=-;" exempletld._domainkey.exemple.tld. IN TXT "k=rsa; t=s; p=ici_la_cle_publique_hyper_longue"
N'oubliez pas d'incrémenter le numéro de série de votre zone pour que les changements soient pris en compte et relancer bind :
/etc/init.d/bind9 restart
Créer le fichier de configuration de DKIM
Il faut maintenant créer le fichier de configuration qu'utilisera DKIMproxy au lancement du service. Celui ci contient les différentes informations pour chacun des domaines signés.
vi /usr/local/dkimproxy/sender_map
Toujours l'exemple avec exemple.tld. Ici, on demande la signature DKIM et la signature DomainKeys. Il est possible de choisir l'un ou l'autre uniquement. Je vous renvois sur les spécifications de DKIM pour les autres paramètres ! Sachez simplement que le paramètre « s » correspond au nom du sélecteur utilisé dans votre fichier de zone.
exemple.tld dkim(c=simple,s=exempletld,a=rsa-sha1,key=/usr/local/dkimproxy/keys/exemple.tld.key), domainkeys(c=nofws,s=exempletld,key=/usr/local/dkimproxy/keys/exempletld.key)
A lire avant de continuer : un « problème » subsiste dans mon howto. En effet, je lance toujours dkimproxy.in qui s'occupe de l'analyse de messages entrants alors que ce travail est déjà effectué par SpamAssasin via Amavis comme je le précise au début de ce billet. Je n'ai simplement pas pris le temps de modifier le script de démarrage et mon implémentation dans Postfix. Je modifierais ce billet dés que j'aurais nettoyé tout ça ! Ami lecteur, si tu l'as fais pour ta configuration, n'hésites pas à me le signaler 
Ceci étant, la signature fonctionne tout de même... alors on continue !
Lancer DKIMproxy
Avant d'envisager la configuration de Postfix, il faut vérifier que DKIMproxy se lance correctement :
/etc/init.d/dkimproxy start
Si il n'y a pas d'erreur on vérifie que le service est fonctionnel :
ps aux | grep dkim
Il doit y avoir des lignes avec dkimproxy.in et des lignes avec dkimproxy.out.
Maintenant que la zone est modifié, DKIMproxy installé et fonctionnel, passons enfin à la configuration de Postfix.
Configurer de Postfix
La configuration n'est pas différente de celle pour dkfilter. Je colle ici le contenu de mon précédent billet.
Dans ma configuration, avant l'installation de DKIM et DomainKeys, j'utilise déjà Amavisd-new pour le filtrage antivirus (clamav) et antispam (spamassassin et dspam). J'ajoute donc DKIMproxy dans le process avant l'analyse par Amavis.
Dans le main.cf, je remplace :
content_filter = amavis:[127.0.0.1]:10024
par :
content_filter = dksign:[127.0.0.1]:12027
[Je ne sais pas pourquoi mais si je ne précise pas le content_filter dans le main.cf, les mails envoyés par des processus locaux (par exemple, la fonction mail de PHP) ne passe pas par amavis et dksign]
Dans le master.cf, voici la configuration :
Au début du fichier
# relayer sur dksign sur le port 10028
smtp inet n - - - 200 smtpd
-o receive_override_options=no_address_mappings
-o content_filter=dksign:[127.0.0.1]:12027
# Le smtp securise SSL
smtps inet n - - - - smtpd
-o smtpd_tls_wrappermode=yes
-o smtpd_sasl_auth_enable=yes
-o content_filter=dksign:[127.0.0.1]:12027
-o receive_override_options=no_address_mappings
-o smtpd_client_restrictions=permit_sasl_authenticated,reject
# envoyer directement a dksign
submission inet n - n - - smtpd
-o smtpd_etrn_restrictions=reject
-o smtpd_sasl_auth_enable=yes
-o content_filter=dksign:[127.0.0.1]:12027
-o receive_override_options=no_address_mappings
-o smtpd_recipient_restrictions=permit_sasl_authenticated,reject
#-o smtpd_recipient_restrictions=permit_mynetworks,permit_sasl_authenticated,reject
A la fin
# Pour amavis
amavis unix - - - - 20 smtp
-o smtp_helo_timeout=300
-o smtp_data_done_timeout=1200
-o smtp_send_xforward_command=yes
-o disable_dns_lookups=yes
127.0.0.1:10025 inet n - - - - smtpd
-o content_filter=
-o local_recipient_maps=
-o relay_recipient_maps=
-o smtpd_restriction_classes=
-o smtpd_client_restrictions=
-o smtpd_helo_restrictions=
-o smtpd_sender_restrictions=
-o smtpd_recipient_restrictions=permit_mynetworks,reject
-o mynetworks=127.0.0.0/8
-o strict_rfc821_envelopes=yes
-o receive_override_options=no_unknown_recipient_checks,no_header_body_checks
-o smtpd_bind_address=127.0.0.1
-o disable_dns_lookups=yes
#
# signature dkim/domainkeys
#
dksign unix - - n - 10 smtp
-o smtp_send_xforward_command=yes
-o smtp_discard_ehlo_keywords=8bitmime
#
# signature dkim/domainkeys
#
127.0.0.1:12028 inet n - n - 10 smtpd
-o content_filter=amavis:[127.0.0.1]:10024
-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
Vous pouvez ensuite relancer postfix
/etc/init.d/postfix restart
Vérifier la signature
Envoyez un mail et regardez dans les logs :
tail -f /var/log/mail.info
Vous devez avoir pour un message envoyé par une adresse de exemple.tld :
... DKIM signing - signed; message-id=<47D7961B.6060505@exemple.tld>, signer=<yves@exemple.tld>, from=<yves@exemple.tld>
Pour les autres :
... DKIM signing - skipped; from=<test@autredomain.tld
Vous pouvez également vérifier votre configuration en envoyant un mail à l'adresse : check-auth ici_le_chez verifier.port25.com. Cette adresse vous renvoi les informations sur l'installation des différents protocoles d'authentification des mails sur votre domaine. Ainsi, si vous avez également configuré correctement SPF vous devez avoir tout bon :
========================================================== Summary of Results ========================================================== SPF check: pass DomainKeys check: pass DKIM check: pass Sender-ID check: pass SpamAssassin check: ham
Vous devez aussi avoir les informations sur DKIM et DomainKeys dans l'entête du message signé :
DKIM-Signature: v=1; a=rsa-sha1; c=simple; d=exemple.tld; h= message-id:date:from:mime-version:to:subject:content-type: content-transfer-encoding; q=dns/txt; s=exempletld; bh=clepublique= DomainKey-Signature: a=rsa-sha1; c=nofws; d=exemple.tld; h=message-id: date:from:mime-version:to:subject:content-type: content-transfer-encoding; q=dns; s=exemple.tld; b=clepublique=
Il me reste encore à comprendre complètement les différentes options de la spécification DKIM mais c'est un bon début 
Commentaires
je crois qu'il y a une coquille dans la ligne:
... TXT "k=rsa; t=s; ...
ca devrait etre t=y au lieu de t=s.
Le "y" est utilisé uniquement dans le cadre du test de l'implémentation de DKIM. Voir la RFC : http://www.dkim.org/specs/rfc4871-dkimbase.html#rfc.section.3.6.1
Ne faut-il pas modifier (comme pour les DomainKeys le fichier) DKIMPROXY et créer un fichier de conf pour qu'il soit utilisé lors du démarrage ?
DKIMPROXY_OUT_ARGS="
Merci pour le tuto, cela m'a bien aidé.
Par contre, quand j'envoie des mails chez Yahoo c'est direction la boite à Spam, et chez Hotmail, le vide sidéral (je ne les recoit jamais).
Je me pose donc l'utilité de DKIM. Est ce que chez vous cela a résolu les problèmes de réception chez Yahoo Google Hotmail etc ?
Salut à tous et également merci pour le tuto.
J'ai pu envoyer un mail signé chez : gmail, voila, orange, wanadoo,laposte, free, ... chez Yahoo j'ai été mis également dans la boîte à Spam et en regardant l'en-tête Mime j'ai vu que j'avais "Authentication-Results: mta254.mail.re4.yahoo.com from=xxxx.net; domainkeys=neutral (no sign)".
Je crois que ma config Dk n'est pas bonne (je n'ai pas à la fois les signatures DKIM et DK).
Un bon forum (sur lequel le concepteur de DKIMProxy Jason Long répond) est sur https://sourceforge.net/forum. Il faut juste s'inscrire et causer un peu anglais.
Chez Hotmail, il est parti dans l'hyperspace mais sur un autre domaine cela fonctionne. Je m'explique mon serveur de messagerie (postfix) gère plusieurs domaines : .fr,.net, .eu, .biz. C'est OK pour les .biz, .fr et .net mais ça ne fonctionne pas pour le .eu. Peut-être que mondomaine.eu est blacklisté chez Hotmail ?
Un bon forum (sur lequel le concepteur de DKIMProxy Jason Long répond) est sur https://sourceforge.net/forum. Il faut juste s'inscrire et causer un peu anglais.
Le mieux pour tester sa configuration est d'envoyer le mail sur check-auth comme indiqué dans mon tuto.
Ceci étant, il faut savoir une chose si vous continuez à avoir des problèmes : les filtres antispam de Yahoo et autres se basent également sur la "popularité" de l'IP du serveur. Il apparait clairement que tous ce qui est IP résidentiel est un peu mis de côté.Sinon, sur un de mes serveurs, j'ai un amavis compilé et c'est beaucoup plus pratique car la dernière version d'amavis gère bel et bien la signature DKIM (pas DK par contre) !
Je ferais prochainement un billet pour expliquer d'autres optimisations à envisager pour maximiser ses chances de finir dans la boite de réception
Très bon tuto ! merci
j'ai un serveur avec postifx, tout roule mais un autre avec qmail.
je n'arrive pas a trouver un guide clair comme le tien pour la config de qmail, as tu des pistes ?
merci d'avance