215 lines
6.5 KiB
Markdown
215 lines
6.5 KiB
Markdown
**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.**
|
|
|
|
# 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é").
|
|
Les 2 normes étant encore utilisées, le mieux est de les utiliser toutes les deux !
|
|
|
|
## Installation
|
|
|
|
Exemple sous Debian 6 :
|
|
|
|
~~~
|
|
# aptitude install opendkim dk-filter opendkim-tools
|
|
# adduser opendkim ssl-cert
|
|
# adduser dk-filter 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_.
|
|
|
|
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 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 nos démons opendkim et dk-filter, on ajoute simplement les instructions suivantes
|
|
dans le fichier main.cf :
|
|
|
|
~~~
|
|
non_smtpd_milters = inet:8888 inet:localhost:8889
|
|
smtpd_milters = inet:8888 inet:localhost:8889
|
|
~~~
|
|
|
|
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
|
|
|
|
*Brouillon à finaliser.*
|
|
|
|
La configuration est légèrement différente.
|
|
|
|
Exemple de configuration :
|
|
|
|
/etc/opendkim.conf
|
|
~~~
|
|
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
|
|
~~~
|
|
|
|
/etc/opendkim/TrustedHosts
|
|
~~~
|
|
127.0.0.1
|
|
~~~
|
|
|
|
/etc/opendkim/KeyTable
|
|
~~~
|
|
default._domainkey.domaine1.com domaine1.com:default:/etc/opendkim/keys/domaine1.com/default.private
|
|
default._domainkey.domeina2.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)
|