wiki/HowtoMail/DKIM.md

269 lines
7.7 KiB
Markdown
Raw Normal View History

2016-12-29 11:25:39 +01:00
# 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
2016-12-29 11:25:39 +01:00
2017-12-26 11:08:45 +01:00
Pour vérifier que le tout fonctionne: mail-tester.com ou dkimvalidator.com
2016-12-29 11:25:39 +01:00
## Installation
Exemple sous Debian 8 :
2016-12-29 11:25:39 +01:00
~~~
2017-12-21 21:32:26 +01:00
# apt install opendkim opendkim-tools
2016-12-29 11:25:39 +01:00
# 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
2016-12-29 11:25:39 +01:00
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
2016-12-29 11:25:39 +01:00
dans le fichier main.cf :
~~~
non_smtpd_milters = inet:8888
smtpd_milters = inet:8888
2016-12-29 11:25:39 +01:00
~~~
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"
~~~
2017-12-26 09:29:41 +01:00
**Attention**, les mails émis sans signature DKIM seront alors pénalisés par les serveurs mail vérifiant les signatures DKIM.
2016-12-29 11:25:39 +01:00
## 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
2017-08-16 10:27:42 +02:00
2016-12-29 11:25:39 +01:00
~~~
2017-08-16 10:27:42 +02:00
#Domain example.com
Selector default
2016-12-29 11:25:39 +01:00
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
~~~
2017-08-16 10:43:50 +02:00
Il faut ensuite créer un dossier pour chaque domaine et se positionner dedans :
2017-08-16 10:27:42 +02:00
~~~
mkdir -p /etc/opendkim/keys/otherdomain.com
chmod g+rx /etc/opendkim/keys/otherdomain.com
2017-08-16 10:27:42 +02:00
cd /etc/opendkim/keys/otherdomain.com
chgrp -R opendkim /etc/opendkim/
2017-08-16 10:27:42 +02:00
~~~
2017-12-26 10:32:45 +01:00
***Attention** : il faut bien récursivement que /etc/opendkim/ et tout ses sous-dossiers appartiennent au groupe opendkim et ils doivent avoir les droits de lecture pour le groupe (g+rx)*
2017-08-16 10:43:50 +02:00
On génère les clés pour le domaine :
2017-08-16 10:27:42 +02:00
~~~
opendkim-genkey -r -d domaine.com
~~~
Et on attribue les droits du fichier default.private a l'utilisateur opendkim :
~~~
chown opendkim:opendkim default.private
~~~
2017-08-16 10:43:50 +02:00
Il faut ensuite éditer les fichiers suivants :
2017-08-16 10:27:42 +02:00
2016-12-29 11:25:39 +01:00
/etc/opendkim/TrustedHosts
2017-08-16 10:27:42 +02:00
2016-12-29 11:25:39 +01:00
~~~
127.0.0.1
2017-08-16 10:27:42 +02:00
domaine1.com
domaine2.com
2016-12-29 11:25:39 +01:00
~~~
/etc/opendkim/KeyTable
2017-08-16 10:27:42 +02:00
2016-12-29 11:25:39 +01:00
~~~
default._domainkey.domaine1.com domaine1.com:default:/etc/opendkim/keys/domaine1.com/default.private
2017-08-16 10:27:42 +02:00
default._domainkey.domaine2.com domaine2.com:default:/etc/opendkim/keys/domaine2.com/default.private
2016-12-29 11:25:39 +01:00
~~~
/etc/opendkim/SigningTable
2017-08-16 10:27:42 +02:00
2016-12-29 11:25:39 +01:00
~~~
*@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"
~~~
2017-12-26 09:29:41 +01:00
**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
~~~