diff --git a/HowtoMail/DKIM.md b/HowtoMail/DKIM.md deleted file mode 100644 index da2c9b25..00000000 --- a/HowtoMail/DKIM.md +++ /dev/null @@ -1,269 +0,0 @@ -# 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 - -Pour vérifier que le tout fonctionne: mail-tester.com ou dkimvalidator.com - -## Installation - -Exemple sous Debian 8 : - -~~~ -# apt 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: -RCPT TO: -DATA -From: -To: Foo -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 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)* - - -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 -~~~ \ No newline at end of file diff --git a/HowtoOpenDKIM.md b/HowtoOpenDKIM.md new file mode 100644 index 00000000..a385e782 --- /dev/null +++ b/HowtoOpenDKIM.md @@ -0,0 +1,238 @@ +--- +categories: email spam +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. + +[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). + + +## Installation + +~~~ +# apt install opendkim opendkim-tools +# adduser opendkim ssl-cert +~~~ + +On ajoute la ligne suivante dans `/etc/default/opendkim` : + +~~~ +SOCKET="inet:8888@localhost" +~~~ + +> *Note* : on peut également utiliser une socket Unix. + +La configuration principale se trouve dans le fichier `/etc/opendkim.conf` : + +~~~ +Syslog yes +#SyslogSuccess yes +#LogWhy yes +UMask 002 +KeyTable refile:/etc/opendkim/KeyTable +SigningTable refile:/etc/opendkim/SigningTable +InternalHosts /etc/opendkim/dkim.peers +Mode s +OversignHeaders From +~~~ + +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. + +~~~ +*@example.com foo._domainkey.example.com +*@example.org bar2018._domainkey.example.org +~~~ + +Le fichier `KeyTable` contient les chemins vers les clés privées : + +~~~ +foo._domainkey.example.com example.com:foo:/etc/ssl/private/dkim_example.com.key +bar2018._domainkey.example.org example.org:bar2018:/etc/ssl/private/dkim_example.org.key +~~~ + +Pour générer les clés, on utilise la commande : + +~~~ +# opendkim-genkey -D /etc/ssl/private/ -d example.com -s foo -v +opendkim-genkey: generating private key +opendkim-genkey: private key written to foo.private +opendkim-genkey: extracting public key +opendkim-genkey: DNS TXT record written to foo.txt + +# mv /etc/ssl/private/foo.private /etc/ssl/private/dkim_example.com.key +# chown opendkim:opendkim /etc/ssl/private/dkim_example.com.key +# chmod 640 /etc/ssl/private/dkim_example.com.key +~~~ + +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 : + +~~~ +foo._domainkey IN TXT "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDcJOD4s/XyvarbBPTyzIKaAsm4BWv9jd/brLdIOBxq177CN17GTQP6eJgAVpEFnMvxVgRNXYQzVJZF5FvownJxHjmma0seVRs8vSwwRbD1OlhSRCjlBWvI3zmyqf8MQVU0K6Zs6NJT5rHEeW3nz6e6c5UtpIjKogshawwMnTvtfwIDAQAB" ; ----- DKIM key foo for example.com +~~~ + +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) : + +~~~ +127.0.0.1 +192.0.2.142 +192.0.2.0/25 +~~~ + +On ajuste les droits ainsi : + +~~~ +# chown -R opendkim:opendkim /etc/opendkim* +# chmod 640 /etc/opendkim.conf /etc/opendkim/* +# chmod 750 /etc/opendkim/ +~~~ + +Et l'on peut enfin démarrer le démon : + +~~~ +# systemctl start opendkim + +# opendkim -V | head -4 +opendkim: OpenDKIM Filter v2.9.2 + Compiled with OpenSSL 1.0.1t 3 May 2016 + SMFI_VERSION 0x1000001 + libmilter version 1.0.1 + +# systemctl status opendkim +● opendkim.service - LSB: Start the OpenDKIM service + Loaded: loaded (/etc/init.d/opendkim) + Process: 12832 ExecStop=/etc/init.d/opendkim stop (code=exited, status=0/SUCCESS) + Process: 12837 ExecStart=/etc/init.d/opendkim start (code=exited, status=0/SUCCESS) + CGroup: /system.slice/opendkim.service + └─12842 /usr/sbin/opendkim -x /etc/opendkim.conf -u opendkim -P /var/run/opendkim/opendkim.pid -p inet:8888@localhost +~~~ + +## Configuration avec Postfix + +Pour configurer avec [Postfix](HowtoPostfix) on ajoute simplement les instructions suivantes dans le fichier `/etc/postfix/main.cf` : + +~~~ +non_smtpd_milters = inet:8888 +smtpd_milters = inet:8888 +~~~ + +## Vérifications + +### Vérifier sa 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) : + +~~~ +# opendkim-testkey -d example.com -s foo -k /etc/ssl/private/dkim_example.com.key -v +opendkim-testkey: /etc/ssl/private/dkim_example.com.key: WARNING: unsafe permissions +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 + +Il faut envoyer un email de test avec un expéditeur d'entête correct ; par exemple en ligne de commande : + +~~~ +$ telnet 127.0.0.1 25 +HELO example.com +MAIL FROM: +RCPT TO: +DATA +From: +To: Foo +Subject: test DKIM + +Ceci est un test +. +~~~ + +L'email devrait avoir un entête supplémentaire du type : + +~~~ +DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=example.com; s=foo; + t=1541094902; bh=xj6JF8HXzDkYeJ72cJNmx7FnTp5CeDo6y+MwRwIeNC4=; + h=Date:From:To:Subject:From; + b=lJ8oU+KkUBWEWVl/HpztFx5Hdv2rhqLP03JfJ1yqp3+TR3aZX+uOCI4MKqvonYzXM + kHl4YYsYT7fSnuSaF48feGbGQ1AauGKd2x9UKcBEBQq2cGLG7ahfXph/SF5eh7/psL + 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. + +### Vérifier via des services externes + +* Vérifier (notamment) son enregistrement DNS pour DKIM : (2 premiers résultats à ignorer) + +* Vérifier en envoyant un email vers un service externe : ou + + +## Monitoring + +Il est important de s'assurer que le démon *opendkim* tourne en permanence. + +### Nagios + +Voici un check basique pour vérifier que le port TCP d'*opendkim* répond bien : + +~~~ +$ /usr/lib/nagios/plugins/check_tcp -H 127.0.0.1 -p 8888 +~~~ + +### log2mail + +Pour être alerté en cas de *warning: connect to Milter service inet:8888: Connection refused +on ajoute la configuration suivante au logiciel [log2mail](https://wiki.evolix.org/HowtoLog2mail) : + +~~~ +file = /var/log/syslog + pattern = "warning: connect to Milter service inet:8888: Connection refused" + mailto = alert@example.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 ! + +### ADSP (Author Domain Signing Practices) + +**ADSP est désormais obsolète, et remplacé par la spécification [DMARC](https://fr.wikipedia.org/wiki/DMARC) + +[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. + +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 : + +~~~ +_adsp._domainkey IN TXT "dkim=all" +~~~ + +On peut vérifier que l'enregistrement ADSP est bien pris en compte avec la commande suivante : + +~~~ +# opendkim-testadsp example.com +~~~ + +### Pas d'entê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 : + +~~~ +Syslog yes +SyslogSuccess yes +LogWhy yes +~~~ +