24-11
2009

Installation de DKIMProxy sur Postfix

DKIMProxy vous permet de signer numériquement vos mails. Ce n'est pas une solution pour éviter la boite à Spam, mais elle permet de prouver au receveur que vous êtes bien l'émetteur de l'email. Yahoo! et Gmail utilise cette technologie depuis un petit moment et à été développé par Yahoo! à l'origine.

Installation des paquets

Commencez d'abord par installer les paquets de base. (PostFix doit déjà être installé).
# Si vous précisez uniquement les deux premiers
# Apt-Get vous proposera d'installer le reste
apt-get install dkimproxy libnet-dns-perl \
libcrypt-openssl-rsa-perl libmail-dkim-perl libmilter1.0.1 libio-stringy-perl
Apt-Get se charge d'installer les paquets et vous génère une clé publique par défaut. Tout est lancé et préconfiguré (plutôt succinctement).

Configuration de PostFix pour utiliser DKIMProxy

Rendez-vous dans le répertoire de configuration de PostFix.
cd /etc/postfix/
Configurez votre main.cf pour utiliser le Filter DKIMProxy.
nano /etc/postfix/main.cf
# Si la clé de configuration content_filter n'est pas présente
# Rajoutez-la.
# On indique à PostFix de filtrer le contenu sur le port
# 12028 en local.
content_filter = dksign:[127.0.0.1]:12028
PostFix renverra à partir de maintenant tous les mails vers le service (défini dans master.cf) nommé dksign, sur le port 12028. Les crochets indiques à PostFix de ne pas faire de vérification MX. Configuration du master.cf pour rajouter les filtres adéquates.
nano /etc/postfix/master.cf
# Rajout d'un filter en sortie
# Modifier le SMTP
smtp      inet  n       -       n       -       250       smtpd
         -o smtpd_proxy_ehlo=no
         -o content_filter=dksign:[127.0.0.1]:12028
# Création du service dksign
# Rajoutez à la fin
dksign  unix    -       -       n       -       10      smtp
         -o smtp_send_xforward_command=no
         -o content_filter=
# On souhaite accepter les messages venant de dksign
127.0.0.1:12029 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

Génération des clés

DKIM utilise une authentification par clé, il faut donc les créer à l'aide d'OpenSSL
cd /etc/dkimproxy/
mkdir keys/
cd keys/
openssl genrsa -out private.key 1024
openssl rsa -in private.key -out public.key -pubout -outform PEM
# DKIMProxy doit pouvoir lire ces clés
chown dkimproxy:dkimproxy *
Vos clés sont désormais prêtes, il faut ensuite ajouter les enregistrements TXT à votre serveur DNS.

Ajout des enregistrement DNS à votre serveur DNS

Pour fonctionner, le serveur de mail sur lequel vous envoyez votre mail interroge votre serveur DNS pour vérifier que la clé qu'il reçoit correspond bien à celle que vous avez déclarée. Vous devez créer un enregistrement TXT de la forme [sélecteur]._domainkey.[votre_domaine.com]. Je n'ai jamais bien compris l'utilité du sélecteur, mais il servirait au cas où vous installeriez plusieurs serveurs de mail sur la même machine. Dans notre cas, notre sélecteur sera postfix, mais vous pouvez utilisez "mail" si vous préférez. Notre enregistrement TXT sera donc, pour nous : postfix._domainkey.admin-serv.net. Le format d'ajout du champ DNS est le suivant :
[sélecteur]._domainkey IN TXT "k= ; t=; p=;"
Dans notre exemple, notre clé privée est :
cat /etc/dkimproxy/keys/public.key
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCceTBoACziImQH/gzyuayV6XdN
2417hY5ThOL6YPTSXbAFcMDIPGJLqy9BnB5qXB9h0zJm5e5WqKxQmapNt6cLdU4N
ExLc8fKENk2ohP7oOAM1emecr3xUXdmKNJqJ9MZ0s3C+OgbvdF3uAdznbO8yVBYI
MxJP3xjC6OYsgZu41QIDAQAB
-----END PUBLIC KEY-----
# Notez qu'elle est wrappée. Vous devez donc la remettre en ligne.
Votre enregistrement TXT sera donc :
# Ajoutez une ligne précisant que votre domaine utilise DKIM
# Le t=y est facultatif si vous savez ce que vous faites.
postfix._domainkey.admin-serv.net IN TXT "k=rsa; t=y; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCceTBoACziImQH/gzyuayV6XdN2417hY5ThOL6YPTSXbAFcMDIPGJLqy9BnB5qXB9h0zJm5e5WqKxQmapNt6cLdU4NExLc8fKENk2ohP7oOAM1emecr3xUXdmKNJqJ9MZ0s3C+OgbvdF3uAdznbO8yVBYIMxJP3xjC6OYsgZu41QIDAQAB;"
# Patientez un peu le temps que l'enregistrement
# Soit pris en compte puis vérifiez.
dig -t TXT postfix_domainkey.admin-serv.net
# Si vous souhaitez précisez que votre domaine signe tous les mails
# Vous pouvez aussi rajouter un enregistrement TXT supplémentaire
# Par défaut, uniquement votre domaine
_domainkey.admin-serv.net IN TXT "o=-"
Référence : RFC 4870

Configuration de DKIMProxy

Maintenant que tout est prêt, nous allons pouvoir configurer DKIMProxy pour signer vos emails sortant. Rendez-vous dans le répertoire de configuration de DKIMproxy
cd /etc/dkimproxy/
nano dkimproxy_out.conf
# Nous n'utilisons pas les ports par défaut
listen 127.0.0.1:12028
# Nous avons spécifié un relay sur le port 12029
relay 127.0.0.1:12029
# Spécifiez le domaine que vous souhaitez signer
domain admin-serv.net
# Spécifiez les signatures à rajouter
signature dkim(c=relaxed)
signature domainkeys(c=nofws)
# Indiquez l'emplacement de votre clé privée
keyfile /etc/dkimproxy/keys/private.key
# Votre sélecteur
selector postfix
Redémarrez Postifx et DKIMProxy pour prendre en compte les modifications que nous venons de faire
# DKIMProxy
/etc/init.d/dkimproxy restart
Shutting down inbound DomainKeys-filter: dkimproxy.in.
Shutting down outbound DomainKeys-filter: dkimproxy.out.
Starting inbound DomainKeys-filter: dkimproxy.in.
Starting outbound DomainKeys-filter: dkimproxy.out.
# PostFix
/etc/init.d/postfix restart
Stopping Postfix Mail Transport Agent: postfix.
Starting Postfix Mail Transport Agent: postfix.

Test de la signature des messages sortant

Tentez d'envoyer un mail depuis votre serveur afin de voir si celui-ci signe correctement les messages.
# Choisissez de préférence une adresse Gmail
mail -s "Petit message de test voir si DKIM fonctionne" boris17480@gmail.com
Ceci est un petit message de test.
.
Cc:
# On va rapidement voir dans les logs
cd /var/log/
tail -f mail.info
# On aperçoit la ligne nous montrant que DKIM
# Signe correctement les messages
Nov 24 18:56:39 lucy dkimproxy.out[12097]: DKIM signing - signed; message-id=<20091124175639.04FD986F2@lucy.admin-serv.net>, signer=, from=
Le but d'avoir choisis une adresse Gmail est de pouvoir voir rapidement si oui, ou non, DKIM fonctionne bien. Ouvrez la source du message et regardez dans les headers de votre mail la ligne de test effectuée par GMail
Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of root@lucy.admin-serv.net designates 91.121.169.79 as permitted sender) smtp.mail=root@lucy.admin-serv.net; dkim=pass header.i=@admin-serv.net
Comme vous le voyez, nous avons réussi le test Gmail. Maintenant nous allons pouvoir effectuer un test sur Yahoo qui donne de bien plus jolie résultats
mail -s "Petit message de test voir si DKIM fonctionne chez Yahoo! " borispigeot@yahoo.fr
Ceci est un petit message de test.
.
Cc:
Si vous voyez la petit serrure numérique, c'est que ça fonctionne chez eux.
Yahoo! DKIM vérifié
Voilà, l'installation et la configuration est terminée, il ne vous reste plus qu'à regarder votre taux d'ouverture des messages. Bien que ça ne soit pas utilisé par la plupart comme AntiSpam, le fait d'avoir une signature prouve que l'administrateur du serveur fait ses efforts pour lutter, au mieux, contre le Spam et le Fishing.

 

 

28 Commentaires pour ce billet.

 

 

  1. A noter la création d'un générateur de config DKIM dans la section "outils" du site :
    https://admin-serv.net/tools

  2. Bonjour,
    Merci pour ce tuto qui m'as permis d'installer dkim.
    Cependant, j'ai quelques remarques à faire.

    Pour commencer, une simple petite erreur : là où est affiché la clé publique, il est dit "la clé privé est ...". Je pense donc à une petite erreur d'inattention ^^

    Ensuite, lors de l'installation, j'ai rencontré pas mal de problèmes! Et tout ça parce que ma configuration (en tout cas certaines parties) n'était pas prise en compte (et ça je ne le savais pas).
    Donc, en plus des fichiers de configuration indiqué dans ce tuto, je recommande de faire un tour dans /etc/default/dkimproxy et, soit d'y configurer ce qu'il faut (entre autre le domaine, les chemins vers les clefs, etc..) soit d'utiliser cette configuration.

    Donc attention déjà au domaine : celui par défaut, c'est celui configuré sur votre machine via hostname! et non pas celui du fichier de conf. Ensuite, les clef, dkim va les chercher dans /var/lib/dkimproxy (sous les nom de private.key et public.key) et non dans le chemin indiqué dans la configuration.
    Bref, plein de petit points auquels il faut faire attention, sinon ça ne fonctionne pas!

    Mais en tout cas, merci pour ce tuto :)

  3. @Lowbaka: Normal pour les erreurs/non fonctionnement. L'installation par défaut de DKIM a énormément évolué depuis 2009 (date du tuto) et est devenue un peu plus simple/propre.
    En 2009 c'était un tuto : copier/coller, là ça demande un peu d'adaptation.

    Merci tout de même pour ton retour, cela fait toujours plaisir ;)

  4. Merci pour ce mémo mais il manque une partie non négligeable : la vérification de la signature des mails entrants.

  5. Salut,

    Bon tuto, merci d'avoir pris le temps de le rédiger.

    Je pense cependant avoir relevé une petit coquille dans la syntaxe de la déclaration DNS. En effet, après avoir scrupuleusement suivi et adapté ton tuto à mon architecture, le test http://dkimcore.org/c/keycheck me signalait une erreur dans mon enregistrement DNS de DKIM.

    Après quelques recherches, il semblerais qu'il manque un point, et qu'il y a un point virgule en trop dans ta syntaxe. La bonne semble être :
    ._domainkey... IN TXT "k=rsa; t=y; p="

    J'espère ne pas me tromper.

    ++

  6. Arf, tes commentaires ont mangés mes balises ! ^^

    Re-voici donc ma syntaxe :
    SELECTEUR._domainkey.DOMAIN.TLD. IN TXT "k=rsa; t=y; p=KEY"

  7. @R-No : les deux syntaxes sont valides d'après les RFC (et fonctionnent correctement chez Yahoo par exemple) mais peut-être que l'outils de test n'est pas à jour/configuré pour ce type de configuration.

  8. J'avoue, je ne suis pas allé lire la RFC...
    En tout cas, chez Hotmail, la syntaxe de ton tuto renvoi une erreur dans les headers de mes e-mails. L'autre syntaxe, que je viens d'envoyer dans les commentaires, passe correctement les tes d'Hotmail.

  9. Salut !

    après implémentation et tirage de cheveux je me retrouve avec un problème, mon domaine ne se fait pas signer. En effet, lors d'une interrogation DNS je ne retrouve absolument pas mon domaine mais juste : selecteur._domainkeys.com en gros, mon ndd se fait viré et je me demande si cela ne viendrait pas du fait que j'ai un nom de domaine séparé par un tiret, si oui ça serait con que je ne puisse pas implémenter DKIM sur mon serveur mail :/

    si vous avez une solution je suis preneur ! merci !

  10. @Tetz : A mon avis tu as un soucis dans ton enregistrement DNS. Si tu regardes mon site, il a un tiret et pourtant, il est correctement signé (mon sélecteur est soit mail, soit postfix).
    Sans domaine, je ne peux pas voir ce qui cloche, mais je pense que c'est une toute petite erreur.

  11. J'ai pourtant bien retourné en long en large et en travers mes records DNS sans aucune erreur (c'est pratiquement du copier coller d'ici :x) et je me retrouve avec deux problèmes :

    - le record TXT qui ne ressort pas
    - le header dans le mail qui me ressort juste ".com" et pas mon nom de domaine alors que mes configurations sont bonnes


    je suppose que tu peux voir mon mail ;p si tu peux me mail, je te ferai suivre mes fichiers de configuration pour que tu puisses check ce que j'ai fait de bon (ou pas :D) merci à toi !

  12. @Tetz, j'ai un mail en gmail pour toi (alors ça m'aide pas pour regarder ça).
    Si dans ton header tu n'as que ".com" sans ton domaine, tu as bel et bien un problème de configuration.

    Si le TXT ne ressort pas même si tu fais un :

    host -t TXT selecteur._domainkey.tondomaine.net

    C'est un soucis niveau config DNS.

    Dans la liste des fichiers à regarder, je te dirais bien :
    /etc/default/dkimproxy
    /etc/dkimproxy/dkimproxy_out.conf

    Normalement pour postfix il y a peu de choses à faire, c'est juste un relay et si les mails sortent, il ne devrait pas y avoir de soucis à ce niveau.

  13. je parlais de mon mail en gmail pour que tu me mail (afin que j'ai ton mail) pour que je te fasse suivre les fichiers :D


    - commande host :

    root [~] > host -t TXT postfix._domainkey.pa-errard.com
    postfix._domainkey.pa-errard.com descriptive text "k=rsa\; t=y\; p=ma_super_clé_publique"


    (pourquoi le retour me met des \ alors que dans bind j'ai pas ce \)

    - fichier de zone :

    postfix._domainkey.pa-errard.com. IN TXT "k=rsa; t=y; p=ma_super_clé_publique"
    _domainkey.pa-errard.com. IN TXT "o=-;"



    - fichier /etc/default/dkimproxy :

    RUN_DKIMPROXY_OUT=1
    RUN_DKIMPROXY_IN=1
    DKIMRPOXY_IN_CONF="/etc/dkimproxy/dkimproxy_in.conf"
    DKIMRPOXY_OUT_CONF="/etc/dkimproxy/dkimproxy_out.conf"

    (d'ailleurs dans ton tutoriel tu n'en parles pas :D)

    - fichier /etc/dkimproxy/dkimproxy_out.conf :

    listen 127.0.0.1:12028
    relay 127.0.0.1:12029
    domain pa-errard.com
    signature dkim(c=relaxed)
    signature domainkeys(c=nofws)
    keyfile /etc/dkimproxy/keys/private.key
    selector postfix

    Voilà pour la conf (et les ligne que j'ai ajouté à postfix !

    et comme j'ai dis, quand je check mes header ils sont de la forme : =@.com :/

  14. Pour les antislash, ils sont complètement normaux.
    Par contre dans tes headers de mail là c'est moins normal...

    Si tu fais un :

    ps aux|grep dkim

    Est-ce que tu as des trucs "bizarres", normalement par défaut tu dois avoir ton hostname dedans, peut-être que l'erreur est là.

    A noter aussi que dkimproxy a eu pas mal de mises à jour dans les dernières versions de Debian, d'où des changements en fonctions de ta version (mon tuto date un peu (il a 2 ans)) mais normalement devrait s'adapter.

  15. wai pas de pbm pour le tuto ^^

    bon alors, à ne rien y comprendre, j'ai lancé un mail sur mon gmail, je le voit signé par mon serveur (??) je me demande donc si la propagation DNS n'a pas été plus longue que prévue (car faut bien prendre en compte la propa DNS aussi :D)

  16. ah bah, j'ai lancé ta commande, on voit mon domaine nul part haha :D

    /usr/bin/perl -I/usr/lib /usr/sbin/dkimproxy.out --domain=com

    -I/usr/lib /usr/sbin/dkimproxy.out --domain=com --method=simple --conf_file /etc/dkimproxy/dkimproxy_out.conf --user=dkimproxy --group=dkimproxy

    et dans dkimproxy.in je vois le domaine : WTF :D

    /usr/bin/perl -I/usr/lib /usr/sbin/dkimproxy.in --hostname=pa-errard.com --conf_file /etc/dkimproxy/dkimproxy_in.conf --user=dkimproxy --group=dkimproxy

    je voudrais bien qu'on m'explique là ^^

  17. N'hésites pas à m'envoyer un mail à contact@domaine_du_blog.net
    Que je matte tes headers sinon tu as : check-auth@verifier.port25.com
    Qui te permet d'avoir un retour de tes headers et leur status.

  18. yep j'utilise aussi le check mais bon, je t'ai envoyé un mail depuis mon root@pa-errard.com (il va ptet passer en spam chez toi)

  19. Comme tu vois tu as un :
    --domain=com
    A toi de modifier le script dans /etc/init.d/dkimproxy
    pour qu'il utilise soit: ton fichier de conf, soit tu le mets en dur.
    Par contre tu as peut-être un soucis ailleurs pour qu'il ait "guess" "com" comme domaine...

  20. Recipient address rejected: User unknown in virtual
    mailbox table (in reply to RCPT TO command)

    Bon, bah je risque pas de pouvoir te contacter sur cette boite...

  21. j'envoie avec root, mais la boite mail n'existe pas, si tu veux envoyer un mail tu as admin@ndd ou paerrard@ndd :D

    j'étais tombé sur le coup de la ligne du domaine dans /etc/init.d une personne dit que c'est un bug debian et qu'il faut virer les variables (donc je rajoute ou j'enlève ?)

    mais le plus étonnant c'est la non réponse des entrées TXT via la commande dig (normal ou pas ?) car avec la commande host pas de soucis

  22. Tu enlèves c'est mieux (ou tu ajoutes, ça marche aussi).

  23. j'ai feinté, j'ai rajouté la même variable que pour le DKIM_IN je vois mes mails signés, tout à l'air de tourner là, je te renvoie un mail tu me diras si tu vois bien comme moi

  24. Tout est bon, mais pas ton SPF ;)

  25. je sais pour le spf, j'ai un champ à rajouter, j'ai pas eu le temps de retourner dessus, mais c'était pas le plus dur ça ^^ :D

    merci quoi qu'il en soit, je vais pouvoir me faire mon propre tuto :p

  26. Bonjour, j'ai suivis le tutorial avec attention mais impossible d'avoir un résultat cohérent sur gmail. Après 3 jours à m'arracher les cheveux sur le problème je désespère. Pour les détails voir ici : http://stackoverflow.com/questions/8880500/dkim-authentification-does-not-pass-in-gmail-debian-6

    Merci !

  27. Attention, la version 1.2-6 de dkimproxy actuellement dispo sur les dépots de Sqeeze a l'air furieusement buguée.

    Si vous avez des soucis avec ce paquet, je vous invite à modifier le fichier /etc/init.d/dkimproxy:

    Au lieu de

    #DKIMPROXY_OUT_ARGS="--domain=${DOMAIN} --method=simple --conf_file ${DKOUT_CONF} --keyfile=${DKIMPROXY_OUT_PRIVKEY} ${COMMON_ARGS} --pidfile=${PIDDKIMPROXY_OUT} --signature=dkim --signature=domainkeys --min_servers=${DKIMPROXY_OUT_MIN_SERVERS}"

    ( vous noterez qu'il manque un signe "=" entre "--conf_file" et "${DKOUT_CONF}" )

    j'ai personnellement remplacé par

    DKIMPROXY_OUT_ARGS="--conf_file=${DKOUT_CONF} ${COMMON_ARGS} --pidfile=${PIDDKIMPROXY_OUT}"


    La même erreur est visible sur les paramètres de DKIMPROXY_IN_ARGS.


    A noter aussi que dans /etc/default/dkimproxy , des variables s'appellent

    DKIMRPOXY_IN_CONF
    DKIMPROXY_OUT_CONF

    ...ça transpire la coquille ( dkimRpoxy au lieu de dkimpRoxy ), et même si a priori ça n'a pas d'impact, ça fait un peu peur quand même.

  28. Bonjour,

    Je suis nouveau dans le monde linux et moi aussi j'ai des problème de mail mail rejeté par Gmail et yahoo.

    Il semble qu'il soit impossible de récupérer le paquet dkimproxy via apt-get.
    Auriez vous une autre procédure ?
    Merci par avance

 

Votre commentaire