Login Logout

HowtoMail/DKIM

Howto DKIM

DKIM (DomainKeys Identified Mail) est une norme visant à signer les entêtes d’un email envoyé, et à vérifier cette signature grâce à une clé publique publiée via un enregistrement DNS associé au nom de domaine expéditeur.

Il existe en fait 2 normes : DomainKey (utilisé à l’origine par Yahoo) et DKIM (successeur de DomainKey plus “standardisé”).

DomainKey est devenu obsolète, nous utilisons que DKIM

Installation

Exemple sous Debian 8 :

# ap install opendkim opendkim-tools
# adduser opendkim ssl-cert

Configuration de opendkim

opendkim est un démon avec lequel on peut communiquer soit via un socket unix, soit via un socket réseau. Dans notre cas, on le fait écouter sur le réseau sur le port 8888.

Dans le fichier /etc/default/opendkim :

SOCKET="inet:8888@localhost"

Pour la suite, on suppose que le selector DKIM vaut default. Pour en savoir plus sur les paramètres : http://opendkim.org/opendkim.conf.5.html

La configuration se fait dans le fichier /etc/opendkim.conf, dans lequel on précise quelques paramètres indispensables :

Domain                  example.com
Mode                    s
KeyFile                 /etc/ssl/private/default.private
Selector                default

InternalHosts           /etc/dkim.peers

Puis on génère la clé DKIM de cette façon :

# opendkim-genkey -D /etc/ssl/private/ -d example.com -s default
# chgrp ssl-cert /etc/ssl/private/default.private
# chmod 640 /etc/ssl/private/default.private

On autorise les machines à utiliser à DKIM :

# echo "127.0.0.1" >> /etc/dkim.peers
# chmod 644 /etc/dkim.peers

À ce stade, on peut lancer opendkim :

# /etc/init.d/opendkim start
# ps auwx | grep dkim
opendkim 26947  0.0  0.0 171904  2488 ?        Ssl  19:40   0:00 /usr/sbin/opendkim -x /etc/opendkim.conf -u opendkim -P /var/run/opendkim/opendkim.pid -p inet:8888@localhost

Configuration de Postfix

Afin que postfix utilise le démons opendkim, on ajoute simplement les instructions suivantes dans le fichier main.cf :

non_smtpd_milters = inet:8888
smtpd_milters = inet:8888

On redémarre Postfix, et on peut ainsi tester via un envoi en local que tout fonctionne bien :

$ telnet 127.0.0.1 25
HELO example.com
MAIL FROM: <noreply@example.com>
RCPT TO: <foo@bar>
DATA
From: <noreply@example.com>
To: Foo <foo@bar>
Subject: test DKIM

Ceci est un test
.

On devrait ainsi recevoir un email avec les entêtes DomainKey-Signature et DKIM-Signature.

Si le mail n’est pas signé, il peut être intéressant d’ajouter l’option suivante dans la configuration de opendkim pour savoir pourquoi :

LogWhy                  yes

Modification de la zone DNS

Il reste ensuite rajouter à la zone DNS du domaine en question l’enregistrement default.domainkey qui contiendra, entre autre, la clé publique. Pour cela, il suffit de copier le contenu du fichier /etc/ssl/private/default.txt dans le fichier de zone_ :

default._domainkey IN TXT "v=DKIM1; g=*; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDNg79uRMmFo0kvi061njNyhjVW8F4u0WxPfSWXEgi65QvUWEntYNuQ9RFN4em4cI7xLQ6zTOPTPjWYHiy0OYfWZbeBnuV97/a86IN4MAlP3G2bnoH9WTQiDjfDSHoixATaXg7ff66nyTOKxBK9n6yO8d3bfBZPpmhvrL8YofRdSQIDAQAB" ; ----- DKIM default for example.com

Si l’on est sûr que tous les mails émis avec le nom de domaine utilisé sont bien signés avec DKIM, on peut l’indiquer via un 2ème enregistrement DNS __adsp.domainkey :

_adsp._domainkey        IN      TXT "dkim=all"

Attention, les mails émis sans signature DKIM seront alors pénalisés par les serveurs mail vérifiant les signatures DKIM.

Vérifications

On peut vérifier que tout est OK comme suit (si la commande ne renvoie rien, c’est que c’est OK) :

# opendkim-testkey -d example.com -s default -k /etc/ssl/private/default.private

On peut accessoirement vérifier que l’enregistrement ADSP est bien pris en compte :

# opendkim-testadsp example.com

Mode multi-domaines

La configuration est légèrement différente.

Exemple de configuration :

/etc/opendkim.conf

#Domain                 example.com
Selector                default
Canonicalization        relaxed/relaxed
ExternalIgnoreList      refile:/etc/opendkim/TrustedHosts
InternalHosts           refile:/etc/opendkim/TrustedHosts
KeyTable                refile:/etc/opendkim/KeyTable
LogWhy                  Yes
Mode                    sv
SigningTable            refile:/etc/opendkim/SigningTable
Syslog                  Yes
SyslogSuccess           Yes
TemporaryDirectory      /var/tmp
UMask                   002

Il faut ensuite créer un dossier pour chaque domaine et se positionner dedans :

mkdir -p /etc/opendkim/keys/otherdomain.com
chmod g+rx /etc/opendkim/keys/otherdomain.com
cd /etc/opendkim/keys/otherdomain.com

chgrp -R opendkim /etc/opendkim/

Attention : il faut bien que /etc/opendkim/ et tout les sous-dossiers appartiennent au groupe opendkim et ils doivent avoir les droits de lecture pour le groupe (g+rx)

On génère les clés pour le domaine :

opendkim-genkey -r -d domaine.com

Et on attribue les droits du fichier default.private a l’utilisateur opendkim :

chown opendkim:opendkim default.private

Il faut ensuite éditer les fichiers suivants :

/etc/opendkim/TrustedHosts

127.0.0.1
domaine1.com
domaine2.com

/etc/opendkim/KeyTable

default._domainkey.domaine1.com domaine1.com:default:/etc/opendkim/keys/domaine1.com/default.private
default._domainkey.domaine2.com domaine2.com:default:/etc/opendkim/keys/domaine2.com/default.private

/etc/opendkim/SigningTable

*@domaine1.com default._domainkey.domaine1.com
*@domaine2.com default._domainkey.domaine2.com

FAQ

Question : j’obtiens ce message en démarrant : Starting OpenDKIM Milter: opendkim: smfi_opensocket() failed

Réponse : la socket réseau est déjà occupée !

Question : j’obtiens ce message en démarrant : Starting DomainKeys Filter: dk-filter: /etc/ssl/private/default.private: open(): Permission denied

Réponse : il y a un problème de permission pour accéder à la clé privée, dk-filter a une gestion bizarre des droits (cf astuce donnée plus haut)

Utilisation de dk_filter (obsolète, valable sur Debian 5 et 6)

dk_filter n’est plus utilisé depuis Debian 6, voici quand même l’installation et la configuration, pour d’ancien serveur.

Installation de dk-filter

# aptitude install dk-filter
# adduser dk-filter ssl-cert

Configuration de dk-filter

dk-filter (pour DomainKey) est très similaire à opendkim, il utilisera les mêmes fichiers cryptographiques. Il se configure juste un peu différemment.

Dans le fichier /etc/default/dk-filter :

DAEMON_OPTS="-l -i /etc/dkim.peers"
DAEMON_OPTS="$DAEMON_OPTS -d example.com \
             -s /etc/ssl/private/default.private \
             -S default"
SOCKET="inet:8889@localhost"

Attention, dk-filter vérifie les droits bizarrement, on doit faire des modifications un peu “limite” :

# chown dk-filter /etc/ssl/private /etc/ssl/private/default.private
# chmod 110 /etc/ssl/private

On peut enfin (re)démarrer dk-filter :

# /etc/init.d/dk-filter restart
Restarting DomainKeys Filter: dk-filter.
# ps auwx | grep dk-
116       3852  0.0  0.0  64172  1340 ?        Ssl  19:57   0:00 /usr/bin/dk-filter -u dk-filter -P /var/run/dk-filter/dk-filter.pid -p inet:8889@localhost -l -i /etc/dkim.peers -d example.com -s /etc/ssl/private/default.private -S default

Configuration de Postfix

Afin que postfix utilise le démon dk-filter, on ajoute simplement les instructions suivantes dans le fichier main.cf :

non_smtpd_milters = inet:localhost:8889
smtpd_milters = inet:localhost:8889