diff --git a/HowtoOpenDKIM.md b/HowtoOpenDKIM.md index 92a96d22..a07dfe90 100644 --- a/HowtoOpenDKIM.md +++ b/HowtoOpenDKIM.md @@ -6,12 +6,15 @@ title: Howto OpenDKIM * Documentation : * opendkim.conf(5) : -[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é. -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. -Cela utilise aussi une clé publique stockée dans un enregistrement DNS TXT. -La norme DKIM remplace DomainKey (utilisé à l'origine par Yahoo) qui l'on considère désormais comme obsolète. +[DKIM (DomainKeys Identified Mail)](https://fr.wikipedia.org/wiki/DomainKeys_Identified_Mail) est une norme qui décrit l'ajout d'une signature cryptographique dans les en-têtes d'un email envoyé. -[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). +DKIM signe les mails avec une clé privée stockée sur le serveur. La clé publique est mise à disposition dans un enregistrement DNS TXT et permet au destinataire de vérifier que le domaine contenu dans l'adresse d'expédition appartient bien à l'expéditeur. + +La signature se fait à partir à de l'expéditeur contenu dans l'en-tête (`From:`), d'autres en-têtes au choix (sujet, date, etc.) et du corps du message. + +[OpenDKIM](http://opendkim.org/) est logiciel libre permettant de vérifier et générer des signatures DKIM. Il implémente un service `milter` lui permettant notamment d'être utilisé avec [Postfix](HowtoPostfix). + +La norme DKIM remplace DomainKey obsolète (utilisée à l'origine par Yahoo). ## Installation @@ -21,17 +24,51 @@ La norme DKIM remplace DomainKey (utilisé à l'origine par Yahoo) qui l'on cons # adduser opendkim ssl-cert ~~~ -On ajoute la ligne suivante dans `/etc/default/opendkim` : + +## Configuration + +La configuration principale se trouve dans le fichier `/etc/opendkim.conf`. + +**Note 1 : Attention, `/etc/opendkim.conf` et les fichiers dans `/etc/opendkim/` doivent appartenir à l'utilisateur et au groupe `opendkim`.** + +**Note 2** : Depuis Debian 9, l'unité systemd charge seulement `/etc/opendkim.conf` et non plus `/etc/default/opendkim`. + +Les options de configuration se combinent principalement sur deux modes : + +* Configuration avec une seule clé privée (conseillé) : + * Domain (liste des domaines acceptés) + * KeyFile (clé privée) + * Selector (nom de la clé dans l'enregistrement DNS) + * Pas de KeyTable, ni de SigningTable +* Configuration par adresse ou domaine d'expédition, avec plusieurs clés privées : + * KeyTable (liste des clés privées) + * SigningTable (clés privées à utiliser en fonction de l'adresse `From:`) + * Pas de Domain, ni KeyFile, ni de Selector. + + +### Configuration avec une seule clé privée (conseillé) + +Générer une paire de clés avec le sélecteur `2022` (adapter à l'année de création) dans le répertoire `/etc/opendkim/keys/` : ~~~ -SOCKET="inet:8891@localhost" +mkdir /etc/opendkim/keys +sudo -u opendkim opendkim-genkey -D /etc/opendkim/keys/ -s 2022" ~~~ -> *Note* : on peut également utiliser une socket Unix. +Cela met la clé privée dans `/etc/opendkim/keys/2022.private`, et l'enregistrement DNS TXT contenant la clé publique dans `/etc/opendkim/keys/2022.txt` -> *Note 2* : en Debian 9, l'unité systemd charge seulement `/etc/opendkim.conf`, `/etc/default/opendkim` n'est plus utilisé. +Créer les whitelistes : -La configuration principale se trouve dans le fichier `/etc/opendkim.conf` : +~~~ +# sudo -u opendkim vim /etc/opendkim/domains_whitelist ++ # Indiquez ici les domaines pour lesquels OpenDKIM va signer les mails. +# sudo -u opendkim vim /etc/opendkim/hosts_whitelist ++ # Indiquez ici les IPs/sous-réseaux des serveurs SMTP internes pour lesquels OpenDKIM va signer les mails. ++ 127.0.0.1 ++ ::1 +~~~ + +Ajuster la configuration générale dans `/etc/opendkim.conf` : ~~~ UserID opendkim:opendkim @@ -39,19 +76,76 @@ Syslog yes #SyslogSuccess yes #LogWhy yes UMask 007 -KeyTable refile:/etc/opendkim/KeyTable -SigningTable refile:/etc/opendkim/SigningTable -InternalHosts /etc/opendkim/dkim.peers -Mode s +Mode sv OversignHeaders From #DisableADSP true Socket inet:8891@localhost -PidFile /var/run/opendkim/opendkim.pid +PidFile /var/run/opendkim/opendkim.pid + +# Liste les IPs des serveurs SMTP internes pour lesquels OpenDKIM va signer les mails +InternalHosts refile:/etc/opendkim/hosts_whitelist +ExternalIgnoreList refile:/etc/opendkim/hosts_whitelist + +# Clé privée (générée avec "sudo -u opendkim opendkim-genkey -D /etc/opendkim/keys/ -s 2022") +KeyFile /etc/opendkim/keys/2022.private +# Utilisé dans l'enregistrement DNS utilisé pour récupérer la clé publique ($selector._domainkey.$domain) +Selector 2022 +# Liste des domaines pour lesquels OpenDKIM va signer les mails (accepte les regex) +Domain refile:/etc/opendkim/domains_whitelist +~~~ + +Enfin, lancer le service OpenDKIM : + +~~~ +systemctl start opendkim +systemctl status opendkim +~~~ + + +#### Ajouter un domaine à OpenDKIM + +Ajouter le texte contenu dans le fichier `/etc/opendkim/keys/2022.txt` aux enregistrements DNS du domaine. +Cela va rendre la clé publique accessible via un enregistrement TXT du sous-domaine `2022._domainkey.$domain`. + +On peut vérifier avec : + +~~~ +host -t TXT 2022._domainkey.$domain +~~~ + +Puis, ajouter le domaine à la liste `/etc/opendkim/domains_whitelist` et redémarrer le service : + +~~~ +# /etc/opendkim/domains_whitelist ++ $domain +# systemctl restart opendkim +# systemctl status opendkim +~~~ + + +### Configuration par adresse ou domaine d'expédition, avec plusieurs clés privées + +~~~ +# cat /etc/opendkim.conf +UserID opendkim:opendkim +Syslog yes +#SyslogSuccess yes +#LogWhy yes +UMask 007 +InternalHosts /etc/opendkim/dkim.peers +Mode sv +OversignHeaders From +#DisableADSP true +Socket inet:8891@localhost +PidFile /var/run/opendkim/opendkim.pid + +KeyTable refile:/etc/opendkim/KeyTable +SigningTable refile:/etc/opendkim/SigningTable ~~~ Le fichier `SigningTable` contient la liste des domaines qui vont générer des signatures DKIM, et les sélecteurs associés. 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. -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. +Si l'on a plusieurs serveurs de messagerie, on pourra utiliser des sélecteurs différents, et donc des clés et un enregistrement DNS différents également. ~~~ *@example.com foo._domainkey.example.com @@ -130,7 +224,8 @@ opendkim: OpenDKIM Filter v2.11.0 └─13918 /usr/sbin/opendkim -x /etc/opendkim.conf ~~~ -## Configuration avec Postfix + +## Ajout dans Postfix Pour configurer avec [Postfix](HowtoPostfix) on ajoute simplement les instructions suivantes dans le fichier `/etc/postfix/main.cf` : @@ -142,9 +237,9 @@ non_smtpd_milters = inet:127.0.0.1:8891 in_flow_delay = 0s ~~~ -Cela entraînera l'ajout d'un entête `DKIM-Signature:` à tous les messages qui correspondent à la configuration d'OpenDKIM. +Cela entraînera l'ajout d'un en-tête `DKIM-Signature:` à tous les messages qui correspondent à la configuration d'OpenDKIM. -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 : +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 en-tête du type : ~~~ Authentication-Results: antispam.example.com; dkim=pass @@ -156,9 +251,9 @@ Authentication-Results: antispam.example.com; dkim=pass ## Vérifications -### Vérifier sa configuration +### Vérifier la configuration -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) : +On peut vérifier que la configuration est correcte, notamment l'enregistrement DNS (si la commande ne renvoie rien, c'est que c'est OK) : ~~~ # opendkim-testkey -d example.com -s foo -k /etc/ssl/private/dkim_example.com.key -v @@ -168,9 +263,9 @@ opendkim-testkey: key not secure > *Note* : vous pouvez ignorer le warning des permissions si vous avez correctement ajusté les droits comme précisé plus haut -### Vérifier la présence de DKIM-Signature +### Vérifier la signature DKIM d'un mail -Il faut envoyer un email de test avec un expéditeur d'entête correct ; par exemple en ligne de commande : +Il faut envoyer un email de test avec un expéditeur d'en-tête correct. Par exemple, en ligne de commande : ~~~ $ telnet 127.0.0.1 25 @@ -186,7 +281,7 @@ Ceci est un test . ~~~ -L'email devrait avoir un entête supplémentaire du type : +La source de l'email devrait avoir un en-tête supplémentaire du type : ~~~ DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=example.com; s=foo; @@ -197,15 +292,16 @@ DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=example.com; s=foo; dXal6gCw6416bJQMBa9sb+zSA/9Avy3zQ0jGCALw= ~~~ -Si vous avez accès à un email GMAIL ou Yahoo, vous pouvez lui envoyer un email, -en affichant le message original vous pourrez vérifier la présence de `DKIM-Signature:` -et cela vous indiquera si la signature est bien correcte et acceptée. +Dans Thunderbird, le plugin `DKIM verifier` permet de vérifier les en-têtes DKIM des mails reçus. + +Sinon, si vous avez accès à un email Gmail ou Yahoo, vous pouvez lui envoyer un email. En affichant le message original, vous pourrez vérifier la présence de `DKIM-Signature:`. Cela vous indiquera si la signature est correcte et acceptée. + ### Vérifier via des services externes -* Vérifier (notamment) son enregistrement DNS pour DKIM : (2 premiers résultats à ignorer) +* Vérifier (notamment) son enregistrement DNS pour DKIM : (2 premiers résultats à ignorer). -* Vérifier en envoyant un email vers un service externe : ou ou +* Vérifier en envoyant un email vers un service externe : ou ou . ## Monitoring @@ -231,6 +327,7 @@ file = /var/log/syslog mailto = alert@example.com ~~~ + ## FAQ ### opendkim: smfi_opensocket() failed @@ -243,6 +340,7 @@ Starting OpenDKIM Milter: opendkim: smfi_opensocket() failed C'est que la socket réseau est déjà occupée ! + ### ADSP (Author Domain Signing Practices) **ADSP est désormais obsolète, et remplacé par la spécification [DMARC](https://fr.wikipedia.org/wiki/DMARC) @@ -261,7 +359,8 @@ On peut vérifier que l'enregistrement ADSP est bien pris en compte avec la comm # opendkim-testadsp example.com ~~~ -### Pas d'entête DKIM-Signature + +### Pas d'en-tête DKIM-Signature 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. Il peut aussi être intéressant d'activer les options suivantes dans `/etc/opendkim.conf` pour avoir davantage de logs : @@ -272,6 +371,7 @@ SyslogSuccess yes LogWhy yes ~~~ + ### Logs de vérification 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* : @@ -280,6 +380,7 @@ Il peut être intéressant d'activer l'option suivante /etc/opendkim.conf` pour LogResults true ~~~ + ### Requêtes DNS externes pour ADSP Attention, par défaut OpenDKIM effectue ses vérifications ADSP en faisant de multiples requêtes DNS sans utiliser le resolver local, @@ -290,9 +391,11 @@ Nous conseillons de désactiver ces vérifications qui sont obsolètes : DisableADSP true ~~~ -### GMAIL/Google et DKIM -Informations de GMAIL/Google à propos de DKIM : +### Gmail/Google et DKIM + +Informations de Gmail/Google à propos de DKIM : . + ### Problème de header (dkim-filter: no sender header found) @@ -304,9 +407,10 @@ Avec dkim-filter, en Debian 7, il se peux que, suite a une règle de ce type dan 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. + ### Regenérer la zone DNS -Lors qu'un clé a déjà été généré mais que le fichier contenant la zone DNS n'est plus disponbile, il est possible de la regénérer avec la commande suivante : +Lorsqu'une clé a déjà été générée mais que le fichier contenant la zone DNS n'est plus disponible, il est possible de la régénérer avec la commande suivante : ~~~ opendkim-genzone -F -d example.com /etc/opendkim/KeyTable