From 306ede8d8eec87ff7bc6fd04447981c07e3a88a7 Mon Sep 17 00:00:00 2001 From: Arnaud Daby-Seesaram Date: Sat, 23 Dec 2023 11:46:59 +0100 Subject: [PATCH] [doc, mail] DANE + changements mineurs --- critical/mail/normes.org | 120 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 118 insertions(+), 2 deletions(-) diff --git a/critical/mail/normes.org b/critical/mail/normes.org index 7928149..1c5bede 100644 --- a/critical/mail/normes.org +++ b/critical/mail/normes.org @@ -54,7 +54,7 @@ Tous ce qui est discuté ci-dessous fonctionne de la manière suivante : émetteur car plus d'un service est souvent requis (/e.g./ un serveur DNS autoritaire, un serveur Web, ...). -* TODO SPF +* SPF - [[https://www.rfc-editor.org/rfc/rfc7208][SPF]], - [[https://en.wikipedia.org/wiki/Sender_Policy_Framework][Page Wikipédia]]. @@ -94,6 +94,7 @@ Lorsque ~redisdead~ (~MX~ du Cr@ns) reçoit un mail, nous demandons à un servic 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 - [[https://www.libsrs2.org/srs/srs.pdf][Papier]], @@ -216,7 +217,122 @@ protocole solution pour le moment (ni au Cr@ns, ni personnellement), nous ne pouvons pas commenter sur le sujet. -* TODO DANE +* DANE - [[https://www.rfc-editor.org/rfc/rfc6698][RFC]], - [[https://en.wikipedia.org/wiki/DNS-based_Authentication_of_Named_Entities][Page Wikipédia]]. + +Actuellement, pour vérifier un certificat ~C~ proposé par un serveur mail, il faut +faire confiance à un certificat racine, lequel est utilisé pour signer un autre +certificat (dit /certificat intermédiaire/), lequel est utilisé pour signer le +certificat ~C~. Pour vérifier ~C~, il faut (1) faire confiance au certificat racine +et (2) vérifier les deux signatures sus-mentionnées. + +DANE est une norme permettant aux propriétaires de domaines de déclarer quels +cetificats doivent être acceptés pour quels services. + +/Note/ : Cela n'est pas spécifique aux mails. + +** Implémentation (côté infrastructure émettrice) + +Pour mettre en place DANE, il suffit d'ajouter un champ DNS à sa zone : + +- Il faut que la zone soit signée DNSSEC. + +- Le champ à ajouter est : + + de type TLSA (TLS Authentiction?), + + de clef ~_port._protoL4.domain.tld~. + + de valeur ~x y z t~, où : + * ~x~ est appelé /certificatie usage/, + * ~y~ est appelé /selector/, + * ~z~ est appelé /matching type/, + * ~t~ est appelé /certificate associated data/. + +*** Format du champ TLSA. + +**** /Certificate usage/ + +L'objectif de ce champ est d'indiquer comment vérifier le certificat. + +| *Valeur* | *Signification* | +|--------+----------------------------------------------------------------------------------------------------------------------------------------------------------------| +| 0 | Le certificat doit être valide (root -> intermediate -> "cert"), et /associated data/ décrit l'un des certificats parents de "cert" | +| 1 | /associated data/ décrit "cert", et le certificat doit aussi être valide /wrt/. un certificat racine de confiance. | +| 2 | /associated data/ décrit un parent de "cert". Ce parent est supposé de confiance, et "cert" doit bien être son descendant. | +| 3 | /associated data/ décrit "cert". Le certificat n'a pas besoin d'être valide /wrt/. un certificat racine. Il a simplement besoin de correspondre à /associated data/. | + +**** /Selector/ + +Ce champ décrit ce qui est décrit par /associated data/. + +| *Valeur* | *Signification* | +|--------+-----------------------------| +| 0 | Tout le certificat. | +| 1 | Seulement la clef publique. | + +**** /Matching type/ + +Ce champ indique comment vérifier /associated data/ contre la donnée du certificat +(ou de la clef publique). + +| *Valeur* | *Signification* | +|--------+--------------------------------------------------------| +| 0 | /associated data/ doit être égal à la donnée. | +| 1 | /associated data/ doit être égal au sha256 de la donnée. | +| 2 | /associated data/ doit être égal au sha512 de la donnée. | +où "la donnée" est décrite par le /selector/ et le choix de certificat décrit par +le /certificate usage/. + +**** /Certificate associated data/ + +Chaîne de caractère au format hexadécimal. + + +*** Recommandation pour le Cr@ns + +À titre personnel, j'utilise des champs TLSA en ~3 0 1~. Je pense que le Cr@ns +peut faire la même chose (ou du ~3 0 2~). + +*** Mise en place + +Hypothèses : +- le serveur DNS accepte des mises à jour DNS dynamiques de la part du serveur + mail, +- le renouvellement du certificat utilise ~certbot~. + + +Mise en place : +- Dans la confguration ~certbot~, + + passer en challenge DNS-01 et : + * ~manual_auth_hook~ : un script mettant en place le challenge, + * ~renew_hook~ : script de déploiement du certificat, lequel *ajoute* un champ + TLSA et place le certificat à déployer dans un dossier "staging", + * ~manual_cleanup_hook~ : un script retirant le challenge ~acme~. +- Roll-over scheme : Un champ DNS a une durée de vie (TTL), généralement 1h. De + ce fait, les requêtes de chalmp TLSA peuvent être en retard d'une heure (au + plus). Il est done conseillé d'avoir le nouveau champ TLSA en place pendant + deux TTL avant de (1) mettre en place le nouveau certificat et (2) retirer le + vieux champ TLSA. + + Je propose de mettre en place un timer systemd qui serait activé "après + l'arrêt de certbot pour plus de 2 TTLs". Ce timer lancerait un service, lequel + aurait une condition d'activation "un certificat existe dans le dossier + staging". + + +*** Exemple + +#+begin_src dig + dig +short TLSA _25._tcp.nanein.fr + => 3 0 1 50E9221F066DCD1991ED9D3BA0AD10159F3585780F6FABBAE2942E43 37789FC8 +#+end_src + +** Implémentation (côté serveur mail destinataire) + +Côté serveur mail destinataire, la configuration est très simple (car nous +utilisons Postfix). Cela se fait principalement via les options suivantes : +- ~smtp_dns_supoprt_level~ (valeur ~dnssec~) +- ~smtp_tls_dane_insecure_mx_policy~ (valeur ~dane~) + +D'autres options de Postfix peuvent être utilisées pour permettre un contrôle +plus fin sur le comportement du service.