From 541ab016f9e1ab364ff7c6ffc71aac6f774744f9 Mon Sep 17 00:00:00 2001 From: Arnaud Daby-Seesaram Date: Fri, 15 Dec 2023 20:52:43 +0100 Subject: [PATCH] [doc, mail] DKIM + petits correctifs. --- critical/mail/normes.org | 76 ++++++++++++++++++++++++++++++++++------ 1 file changed, 66 insertions(+), 10 deletions(-) diff --git a/critical/mail/normes.org b/critical/mail/normes.org index 6131b2b..4f5fdae 100644 --- a/critical/mail/normes.org +++ b/critical/mail/normes.org @@ -13,7 +13,7 @@ Description de plusieurs RFC intéressantes (ou non) autour des protocoles liés aux emails. Lorsque ces normes sont en application au Cr@ns (ou ont -volontairement été repousées à plus tard), les solutions techniques étudiées +volontairement été repoussées à plus tard), les solutions techniques étudiées seront décrites. /Remarques préalables/ : @@ -29,7 +29,7 @@ seront décrites. mails issus de serveurs n'implémentant pas les protocoles les plus importants. Quoi que l'on pense du poids de l'influence des géants, cela permet d'élever les standards qualités des autres. Serons-nous un jour - spam-free ? Les publicités mentionant nos informations personnelles (nom, + spam-free ? Les publicités mentionnant nos informations personnelles (nom, préférences, ...) seront-elles un jour toutes chiffrées ? Je ne sais pas, mais je l'espère haha. @@ -47,7 +47,7 @@ seront décrites. Tous ce qui est discuté ci-dessous fonctionne de la manière suivante : - l'infrastructure émettrice (le Cr@ns) publie des informations la concernant, -- les serveurs réceptionnant les mails (~MX~ des destinateires des mails émis par +- les serveurs réceptionnant les mails (~MX~ des destinataires des mails émis par le Cr@ns) peuvent vérifier les mails à l'aide de ces informations. /NB/ : Je parle d'infrastructure ou d'organisation émettrice et non pas de serveur @@ -81,15 +81,15 @@ d'émettre des mails en ~crans.org~. Pour cela, nous publions un champ ~TXT~ po un autre enregistrement SPF (/e.g./ celui de ~spf.mailjet.com~). Utiliser ~-all~ permet de demander aux serveurs récepteurs de rejeter tout mail - ne satisfiant pas ce test. + ne satisfaisant pas ce test. -D'autres méchanismes et formats existent, mais nous ne les présentons pas +D'autres mécanismes et formats existent, mais nous ne les présentons pas ici. Se référer à la RFC ou la page Wikipédia pour leur description. ** Vérification (côté serveur récepteur) Lorsque ~redisdead~ (~MX~ du Cr@ns) reçoit un mail, nous demandons à un service -externe de vérififer le SPF (via la variable ~smtpd_recipient_restrictions~). Le +externe de vérifier le SPF (via la variable ~smtpd_recipient_restrictions~). Le service externe tourne sur la même VM et est ~postfix-policyd-spf-python~. * TODO SRS @@ -102,6 +102,66 @@ service externe tourne sur la même VM et est ~postfix-policyd-spf-python~. - [[https://www.rfc-editor.org/rfc/rfc6376.html][RFC]]. - [[https://en.wikipedia.org/wiki/DomainKeys_Identified_Mail][Page Wikipedia]]. +DKIM (/Domain Key Identified Mail/) permet au serveur émetteur de signer les +mails, et au serveur récepteur de vérifier cette signature, en utilisant des +méthodes de cryptologie asymétrique. + +** Implémentation (côté émetteur) + +*** Serveur Mail + +Le serveur émetteur possède la clef privée. Il ajoute à tout mail sortant un +champ à l'en-tête de la forme suivante : +#+begin_src mail + DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=crans.org; s=mail; + t=1702660809; bh=NqcDLO2gkZU0IxcV+mE7uZ2NRnN/yfceH73Q1nhaFg4=; + h=From:To:Subject:Date:From; + b=ZjomU0jkljKVwA6sUhUioCemnxh/OhSGgwwr57irEn39Gfbv8/cLF8jmHc3hmv4ly + fLvJdj7iVTkeGlTVeW72H93wEA0qrB6LHHz81YBeHPb8eg63zm+9soDSOaP91Gux8J + UgeY1PWXvfjdfe+MJX9JqnlBKqd4JRgpD8AXaO852Lrq+fLJy4ewLOc/3dAqpNMrTf + swi5y6vV5QH89cuFjpjWqF3UcuD4a20RCQIpU/j5K1sxr1CTbdKjgqlsq5mt9/JSKx + OcvZ5WTmgPwdimKKz0DfjAeXQBMac9d7V9Kb5LvCZx84kSbLQEKboGxpRRhNWGdBsK + f3YZXjmpe8cl8cpbvuvdKYWOE7E6fRGu/CwQEyEQYqmrmljiklSYPaG8IKs5uYWKrA + A2D4VTisIYOwGvdljFTQP5zfhPsi4OnNbiN3RVX475lCHNWbnFMh8OCF/ugLj30dyk + s8MLAzDyYlgaccOD0uZ6VsdGJ0LK8+TCKbsc5H1ynjg0VejmRyVzZJ5TzAjXrzS6CC + Lj9eQQex1IaO6d7uGe4P/ULghjSP90tgBcZVNFLlU3r59ylkVQyAu7THDr4CDaxFO0 + 63QE7/GNDE2vZv0K5gp5Yz2veVC3wyaP1dJzIoAzZc1kZRoWz6QK9cH1Bfmnlx9nUs + j+G+VLDQbxi2NuoYAD/I2naA= +#+end_src + +Le bloc contient une liste de clefs-valeurs : +- ~v~ indique la version du protocole, +- ~d~ le domaine attestant de la validité du mail, +- ~s~ le nom du sélecteur (/Cf/. plus bas), +- ~b~ et ~bh~ contiennent les signatures. + +/Notes/ : +- Il est possible que le mail ne soit pas signé par le domaine correspondant à + l'addresse d'envoi, puisqu'il est possible d'autoriser autrui à envoyer un + mail à notre place (/Cf/. SPF plus haut). +- Se référer à la page Wikipédia, ou à la RFC pour une liste exhaustive des + clefs. + +*** Serveur DNS + +Il faut placer dans le serveur DNS un champ TXT dont la clef est +~sélecteur._domainkey.domain~, où ~domain~ (resp. ~sélecteur~) est la valeur de la +clef ~d=~ (resp. ~s~) définie plus haut. + +Par exemple, pour le champ fourni plus haut, nous pouvons lire : +#+begin_src mail + mail._domainkey.crans.org. 3600 IN TXT "v=DKIM1; k=rsa; " "p=MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtwkNVd9Mmz8S4WcfuPk0X2drG39gS8" "+uxAv8igRILgzWeN8j2hjeZesl8pm/1UTVU87bYcdfUgXiGfQy9nR5p/Vmt2kS7sXk9nsJ/VYENg" "b3IJQ6paWupSTFMyeKycJ4ZHCEZB/bVvifoG6vLKqW5jpsfCiOcfdcgXATn0UPuVx9t93yRrhoEM" "ntMv9TSodjqd3FKCtJUoh5cNQHo0T6dWKtxoIgNi/mvZ92D/IACwu/XOU+Rq9fnoEI8GukBQUR5A" "kP0B/JrvwWXWX/3EjY8X37ljEX0XUdq/ShzTl5iK+CM83stgkFUQh/rpww5mnxYEW3X4uirJ7VJH" "mY4KPoIU+2DPjLQj9Hz63CMWY3Ks2pXWzxD3V+GI1aJTMFOv2LeHnI3ScqFaKj9FR4ZKMb0OW2BE" "FBIY3J3aeo/paRwdbVCMM7twDtZY9uInR/NhVa1v9hlOxwp4/2pGSKQYoN2CkAZ1Alzwf8M3EONL" "KeiC43JLYwKH1uBB1oikSVhMnLjG0219XvfG/tphyoOqJR/bCc2rdv5pLwKUl4wVuygfpvOw12bc" "vnTfYuk/BXzVHg9t4H8k/DJR6GAoeNAapXIS8AfAScF8QdKfplhKLJyQGJ6lQ75YD9IwRAN0oV+8" "NTjl46lI/C+b7mpfXCew+p6YPwfNvV2shiR0Ez8ZGUQIcCAwEAAQ==" +#+end_src + +** Vérification (côté récepteur) + +Côté réception (~redisdead~ pour nous), nous utilisons le milter (filtre pour +mail) fourni par ~opendkim~. Ce milter écoute en local et est appelé par ~postfix~. +Lors de la réception d'un mail, postfix demande à ~opendkim~ quelle décision +prendre. Ce dernier va regarder les en-têtes du mail. S(il trouve une signature +DKIM, il va effectuer la requête DNS décrite plus haut, et vérifier la signature +du mail (valeurs des clefs ~b~ et ~bh~). + * TODO DMARC - [[https://www.rfc-editor.org/rfc/rfc7489][RFC]], @@ -112,10 +172,6 @@ service externe tourne sur la même VM et est ~postfix-policyd-spf-python~. - [[https://www.rfc-editor.org/rfc/rfc8617.html][RFC]], - [[https://en.wikipedia.org/wiki/Authenticated_Received_Chain][Page Wikipedia]]. -* TODO Sender Rewriting Scheme (SRS) - -- [[https://en.wikipedia.org/wiki/Sender_Rewriting_Scheme][Page Wikipédia]]. - * TODO MTA-STS - [[https://datatracker.ietf.org/doc/html/rfc8461][RFC]],