mirroir readonly du Gitit wiki.evolix.org (attention, ne rien commiter/merger sur ce dépôt) https://wiki.evolix.org
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

HowtoOpenDKIM.md 11 KiB

1 year ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305
  1. ---
  2. categories: email spam
  3. title: Howto OpenDKIM
  4. ...
  5. * Documentation : <http://opendkim.org/docs.html>
  6. * opendkim.conf(5) : <http://opendkim.org/opendkim.conf.5.html>
  7. [DKIM (DomainKeys Identified Mail)](https://fr.wikipedia.org/wiki/DomainKeys_Identified_Mail) est une norme pour ajouter une signature cryptographique dans les entêtes d'un email envoyé.
  8. La signature se fait à partir à de l'expéditeur d'entête (`From:` d'un email), des entêtes au choix (sujet, date, etc.) et le corps du message.
  9. Cela utilise aussi une clé publique stockée dans un enregistrement DNS TXT.
  10. La norme DKIM remplace DomainKey (utilisé à l'origine par Yahoo) qui l'on considère désormais comme obsolète.
  11. [OpenDKIM](http://opendkim.org/) est logiciel libre pour vérifier et générer des signatures DKIM. Il implémente un service milter lui permettant notamment d'être utilisé avec [Postfix](HowtoPostfix).
  12. ## Installation
  13. ~~~
  14. # apt install opendkim opendkim-tools
  15. # adduser opendkim ssl-cert
  16. ~~~
  17. On ajoute la ligne suivante dans `/etc/default/opendkim` :
  18. ~~~
  19. SOCKET="inet:8888@localhost"
  20. ~~~
  21. > *Note* : on peut également utiliser une socket Unix.
  22. > *Note 2* : en Debian 9, l'unité systemd charge seulement `/etc/opendkim.conf`, `/etc/default/opendkim` n'est plus utilisé.
  23. La configuration principale se trouve dans le fichier `/etc/opendkim.conf` :
  24. ~~~
  25. UserID opendkim:opendkim
  26. Syslog yes
  27. #SyslogSuccess yes
  28. #LogWhy yes
  29. UMask 007
  30. KeyTable refile:/etc/opendkim/KeyTable
  31. SigningTable refile:/etc/opendkim/SigningTable
  32. InternalHosts /etc/opendkim/dkim.peers
  33. Mode s
  34. OversignHeaders From
  35. #DisableADSP true
  36. Socket inet:8888@localhost
  37. PidFile /var/run/opendkim/opendkim.pid
  38. ~~~
  39. Le fichier `SigningTable` contient la liste des domaines qui vont générer des signatures DKIM, et les sélecteurs associés.
  40. Un **sélecteur** est un mot clé à choisir qui sera associé à la signature DKIM et servira notamment pour l'enregistrement DNS TXT qui stocke la clé publique.
  41. Si l'on a plusieurs serveurs de messagerie, on pourra des sélecteurs différents, et donc des clés et un enregistrement DNS différents également.
  42. ~~~
  43. *@example.com foo._domainkey.example.com
  44. *@example.org bar2018._domainkey.example.org
  45. ~~~
  46. Le fichier `KeyTable` contient les chemins vers les clés privées :
  47. ~~~
  48. foo._domainkey.example.com example.com:foo:/etc/ssl/private/dkim_example.com.key
  49. bar2018._domainkey.example.org example.org:bar2018:/etc/ssl/private/dkim_example.org.key
  50. ~~~
  51. Pour générer les clés, on utilise la commande :
  52. ~~~
  53. # opendkim-genkey -D /etc/ssl/private/ -d example.com -s foo -v
  54. opendkim-genkey: generating private key
  55. opendkim-genkey: private key written to foo.private
  56. opendkim-genkey: extracting public key
  57. opendkim-genkey: DNS TXT record written to foo.txt
  58. # mv /etc/ssl/private/foo.private /etc/ssl/private/dkim_example.com.key
  59. # chown opendkim:opendkim /etc/ssl/private/dkim_example.com.key
  60. # chmod 640 /etc/ssl/private/dkim_example.com.key
  61. ~~~
  62. Il faut ensuite publier l'enregistrement DNS à partir du fichier `/etc/ssl/private/foo.txt` généré, en ajoutant la ligne suivante dans la zone DNS du domaine en question :
  63. ~~~
  64. foo._domainkey IN TXT "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDcJOD4s/XyvarbBPTyzIKaAsm4BWv9jd/brLdIOBxq177CN17GTQP6eJgAVpEFnMvxVgRNXYQzVJZF5FvownJxHjmma0seVRs8vSwwRbD1OlhSRCjlBWvI3zmyqf8MQVU0K6Zs6NJT5rHEeW3nz6e6c5UtpIjKogshawwMnTvtfwIDAQAB" ; ----- DKIM key foo for example.com
  65. ~~~
  66. On utilise le fichier `/etc/opendkim/dkim.peers` pour mettre la liste des adresses IP autorisées à envoyer des messages pour lesquels on va rajouter une signature DKIM (a priori des serveurs SMTP internes uniquement) :
  67. ~~~
  68. 127.0.0.1
  69. ::1
  70. 192.0.2.142
  71. 192.0.2.0/25
  72. ~~~
  73. On ajuste les droits ainsi :
  74. ~~~
  75. # chown -R opendkim:opendkim /etc/opendkim*
  76. # chmod 640 /etc/opendkim.conf /etc/opendkim/*
  77. # chmod 750 /etc/opendkim/
  78. ~~~
  79. Et l'on peut enfin démarrer le démon :
  80. ~~~
  81. # systemctl start opendkim
  82. # opendkim -V | head -4
  83. opendkim: OpenDKIM Filter v2.11.0
  84. Compiled with OpenSSL 1.1.0f 25 May 2017
  85. SMFI_VERSION 0x1000001
  86. libmilter version 1.0.1
  87. # systemctl status opendkim
  88. ● opendkim.service - OpenDKIM DomainKeys Identified Mail (DKIM) Milter
  89. Loaded: loaded (/lib/systemd/system/opendkim.service; enabled; vendor preset: enabled)
  90. Docs: man:opendkim(8)
  91. man:opendkim.conf(5)
  92. man:opendkim-genkey(8)
  93. man:opendkim-genzone(8)
  94. man:opendkim-testadsp(8)
  95. man:opendkim-testkey
  96. http://www.opendkim.org/docs.html
  97. Process: 13917 ExecStart=/usr/sbin/opendkim -x /etc/opendkim.conf (code=exited, status=0/SUCCESS)
  98. Main PID: 13918 (opendkim)
  99. Tasks: 6 (limit: 7372)
  100. CGroup: /system.slice/opendkim.service
  101. └─13918 /usr/sbin/opendkim -x /etc/opendkim.conf
  102. ~~~
  103. ## Configuration avec Postfix
  104. Pour configurer avec [Postfix](HowtoPostfix) on ajoute simplement les instructions suivantes dans le fichier `/etc/postfix/main.cf` :
  105. ~~~
  106. smtpd_milters = inet:127.0.0.1:8888
  107. non_smtpd_milters = inet:127.0.0.1:8888
  108. #milter_default_action=accept
  109. # Pour accélérer les signatures, pas d'attente pour contacter le milter
  110. in_flow_delay = 0s
  111. ~~~
  112. Cela entraînera l'ajout d'un entête `DKIM-Signature:` à tous les messages qui correspondent à la configuration d'OpenDKIM.
  113. Si vous utilisez l'option `Mode sv` ou `Mode v` dans la configuration d'OpenDKIM, cela entraînera une vérification des signatures DKIM des emails reçus, et l'ajout d'un entête du type :
  114. ~~~
  115. Authentication-Results: antispam.example.com; dkim=pass
  116. reason="1024-bit key; unprotected key"
  117. header.d=example.com header.i=@example.com header.b=lJ7oU+Kk;
  118. dkim-adsp=pass; dkim-atps=neutral
  119. ~~~
  120. ## Vérifications
  121. ### Vérifier sa configuration
  122. On peut vérifier que sa configuration est correcte, notamment son enregistrement DNS (si la commande ne renvoie rien, c'est que c'est OK) :
  123. ~~~
  124. # opendkim-testkey -d example.com -s foo -k /etc/ssl/private/dkim_example.com.key -v
  125. opendkim-testkey: /etc/ssl/private/dkim_example.com.key: WARNING: unsafe permissions
  126. opendkim-testkey: key not secure
  127. ~~~
  128. > *Note* : vous pouvez ignorer le warning des permissions si vous avez correctement ajusté les droits comme précisé plus haut
  129. ### Vérifier la présence de DKIM-Signature
  130. Il faut envoyer un email de test avec un expéditeur d'entête correct ; par exemple en ligne de commande :
  131. ~~~
  132. $ telnet 127.0.0.1 25
  133. HELO example.com
  134. MAIL FROM: <noreply@example.com>
  135. RCPT TO: <foo@example.org>
  136. DATA
  137. From: <noreply@example.com>
  138. To: Foo <foo@example.org>
  139. Subject: test DKIM
  140. Ceci est un test
  141. .
  142. ~~~
  143. L'email devrait avoir un entête supplémentaire du type :
  144. ~~~
  145. DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=example.com; s=foo;
  146. t=1541094902; bh=xj6JF8HXzDkYeJ72cJNmx7FnTp5CeDo6y+MwRwIeNC4=;
  147. h=Date:From:To:Subject:From;
  148. b=lJ8oU+KkUBWEWVl/HpztFx5Hdv2rhqLP03JfJ1yqp3+TR3aZX+uOCI4MKqvonYzXM
  149. kHl4YYsYT7fSnuSaF48feGbGQ1AauGKd2x9UKcBEBQq2cGLG7ahfXph/SF5eh7/psL
  150. dXal6gCw6416bJQMBa9sb+zSA/9Avy3zQ0jGCALw=
  151. ~~~
  152. Si vous avez accès à un email GMAIL ou Yahoo, vous pouvez lui envoyer un email,
  153. en affichant le message original vous pourrez vérifier la présence de `DKIM-Signature:`
  154. et cela vous indiquera si la signature est bien correcte et acceptée.
  155. ### Vérifier via des services externes
  156. * Vérifier (notamment) son enregistrement DNS pour DKIM : <https://toolbox.googleapps.com/apps/checkmx/> (2 premiers résultats à ignorer)
  157. * Vérifier en envoyant un email vers un service externe : <https://dkimcore.org/tools/> ou <http://dkimvalidator.com/> ou <https://www.mail-tester.com/>
  158. ## Monitoring
  159. Il est important de s'assurer que le démon *opendkim* tourne en permanence.
  160. ### Nagios
  161. Voici un check basique pour vérifier que le port TCP d'*opendkim* répond bien :
  162. ~~~
  163. $ /usr/lib/nagios/plugins/check_tcp -H 127.0.0.1 -p 8888
  164. ~~~
  165. ### log2mail
  166. Pour être alerté en cas de *warning: connect to Milter service inet:8888: Connection refused
  167. on ajoute la configuration suivante au logiciel [log2mail](https://wiki.evolix.org/HowtoLog2mail) :
  168. ~~~
  169. file = /var/log/syslog
  170. pattern = "warning: connect to Milter service inet:8888: Connection refused"
  171. mailto = alert@example.com
  172. ~~~
  173. ## FAQ
  174. ### opendkim: smfi_opensocket() failed
  175. Si vous obtenez le message suivant au démarrage :
  176. ~~~
  177. Starting OpenDKIM Milter: opendkim: smfi_opensocket() failed
  178. ~~~
  179. C'est que la socket réseau est déjà occupée !
  180. ### ADSP (Author Domain Signing Practices)
  181. **ADSP est désormais obsolète, et remplacé par la spécification [DMARC](https://fr.wikipedia.org/wiki/DMARC)
  182. [ADSP](https://en.wikipedia.org/wiki/Author_Domain_Signing_Practices) est une extension à DKIM permettant d'indiquer le traitement à effectuer en cas de signature DKIM invalide ou absente.
  183. 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 l'enregistrement DNS suivant, ce qui provoquera la pénalisation des emails sans signature :
  184. ~~~
  185. _adsp._domainkey IN TXT "dkim=all"
  186. ~~~
  187. On peut vérifier que l'enregistrement ADSP est bien pris en compte avec la commande suivante :
  188. ~~~
  189. # opendkim-testadsp example.com
  190. ~~~
  191. ### Pas d'entête DKIM-Signature
  192. Si vous ne constatez pas l'ajout de la signature DKIM, vérifiez votre configuration, vérifiez que vous utilisez bien un champ `From:` correct et correspondant à un domaine à signer.
  193. Il peut aussi être intéressant d'activer les options suivantes dans `/etc/opendkim.conf` pour avoir davantage de logs :
  194. ~~~
  195. Syslog yes
  196. SyslogSuccess yes
  197. LogWhy yes
  198. ~~~
  199. ### Logs de vérification
  200. Il peut être intéressant d'activer l'option suivante /etc/opendkim.conf` pour avoir des logs pour chaque signature vérifiée par *opendkim* :
  201. ~~~
  202. LogResults true
  203. ~~~
  204. ### Requêtes DNS externes pour ADSP
  205. Attention, par défaut OpenDKIM effectue ses vérifications ADSP en faisant de multiples requêtes DNS sans utiliser le resolver local,
  206. ce qui qui peut provoquer des ralentissements notamment si cela n'est pas autorisé au niveau firewall.
  207. Nous conseillons de désactiver ces vérifications qui sont obsolètes :
  208. ~~~
  209. DisableADSP true
  210. ~~~
  211. ### GMAIL/Google et DKIM
  212. Informations de GMAIL/Google à propos de DKIM : <https://support.google.com/a/answer/174124?hl=fr>
  213. ### Problème de header (dkim-filter: no sender header found)
  214. Avec dkim-filter, en Debian 7, il se peux que, suite a une règle de ce type dans postfix :
  215. ~~~
  216. /^received:/ IGNORE
  217. ~~~
  218. cela casse dkim-filter, car il ne vois pas si le sender est correct dans le header du mail, et donc il ne sais pas si c'est un domaine qu'il doit signé ou pas.