Gérer les problématiques d'envoi d'emails


par Pilulu

Vocabulaires barbares

  • MTA - Mail Transfert Agent
  • MUA - Mail User Agent
  • MDA - Mail Delivery Agent
  • SPF - Sender Policy Framework
  • DMARC - Domain-based Message Authentication, Reporting, and Conformance
  • DKIM - DomainKeys Identified Mail
  • DNS - Domain Name Server
  • DNS PTR - PoinTeR

Contenu d'un email type

            
From: tatiana@les-parents-creatifs.com
Subject: test Thu, 14 Nov 2024 14:40:07 +0100
Received: from mailer.les-parents-creatifs.com by mailhog.example (MailHog)
          id 0dQPsqm4SOGFBo2-fsHIdbhPpOl1C_mfsJfK-Mt7I68=@mailhog.example; Thu, 14 Nov 2024 13:40:08 +0000
DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed;	d=les-parents-creatifs.com; s=mail; h=Message-Id:Subject:From:To:Date:Sender:	Reply-To:Cc:MIME-Version:Content-Type:Content-Transfer-Encoding:Content-ID:	Content-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc	:Resent-Message-ID:In-Reply-To:References:List-Id:List-Help:List-Unsubscribe:	List-Subscribe:List-Post:List-Owner:List-Archive;	bh=pdKeZzX4woG0+Z5Tl8wdXYgRk8R5riZg33ZobehB87U=; b=iMYa1cRVtJrEqznVp+9H/YI81N	j6Z3kNcSwYW7asMyIv+9oaZgKILYyolPvcOgcjNdhSl/vRDBPFnO2UV7vTSvkvuwiCCMTGu0LztS3	yse2TiyOZGXR0vpPT7qNBPv41lRFGpjO4mwTC3ypIUaFW/apTmSb4WpDzmnwTKTAuk6w=;
To: test@trash.pilulu.fr
X-Mailer: swaks v20201014.0 jetmore.org/john/code/swaks/
Return-Path: 
Date: Thu, 14 Nov 2024 14:40:07 +0100
Message-Id: <20241114144007.197345@mailer.les-parents-creatifs.com>

Corps de message de l'email de test
            
          
* Header + Body séparé par un caractère NULL * Chaque en-tête avec son nom, : et un espace.

Enveloppe et Body

L'enveloppe fait partie du protocole de communication entre le client et le serveur.

Attention, l'expediteur From annoncé dans l'enveloppe est aussi important que celui du message.
Ils peuvent être distincts, la politique DMARC intervient sur ce point.

L'enveloppe

          
$ swaks -s 127.0.0.1 --from "toto@les-parents-creatifs.com" --to ping@tools.mxtoolbox.com --body "Bonjour, ça va bien" --add-header "Return-Path: "
=== Trying 127.0.0.1:25...
=== Connected to 127.0.0.1.
<-  220 mailer.les-parents-creatifs.com ESMTP Exim 4.96 Wed, 04 Dec 2024 23:09:23 +0100
 -> EHLO mailer.les-parents-creatifs.com
<-  250-mailer.les-parents-creatifs.com Hello mailer.les-parents-creatifs.com [127.0.0.1]
<-  250-SIZE 52428800
<-  250-8BITMIME
<-  250-PIPELINING
<-  250-PIPECONNECT
<-  250-CHUNKING
<-  250-STARTTLS
<-  250-PRDR
<-  250 HELP
 -> MAIL FROM:
<-  250 OK
 -> RCPT TO:
<-  250 Accepted
 -> DATA
<-  354 Enter message, ending with "." on a line by itself
 -> Date: Wed, 04 Dec 2024 23:09:23 +0100
 -> To: ping@tools.mxtoolbox.com
 -> From: toto@les-parents-creatifs.com
 -> Subject: test Wed, 04 Dec 2024 23:09:23 +0100
 -> Message-Id: <20241204230923.2881116@mailer.les-parents-creatifs.com>
 -> X-Mailer: swaks v20201014.0 jetmore.org/john/code/swaks/
 -> Return-Path: 
 ->
 -> Bonjour, ça va bien
 ->
 ->
 -> .
<-  250 OK id=1tIxYh-00C5Vd-2T
 -> QUIT
<-  221 mailer.les-parents-creatifs.com closing connection
=== Connection closed with remote host.
          
        

MTA (Mail Transfer Agent)

  • Un MTA est un relai d'email issu d'un MUA (Mail User Agent, ex: Client mail / application / logiciel / site internet)
  • Le protocole reste le même sur toute la chaine.
  • Le MUA envoi son email à un seul MTA avec ou sans authentification.
  • Le MTA se charge de le transférer aux domaine(s) du/des destinataire(s)

SPF - Sender Policy Framework

          
          $ dig pilulu.fr TXT
          pilulu.fr.		300	IN	TXT	"v=spf1 a mx ip4:51.89.139.165 ~all"
          
        
  • Utilisé pour vérifier la légitimité du serveur d'envoi via son IP
  • Déclaration de l'ip dans une entrée DNS de type TXT
  • L'IP peut être déclarée via :
    • Directement "ip4:x.x.x.x"
    • A travers un domaine "include:example.com" (attention)
    • Selon autres entrée A appartenant au même nom de domaine "a"
    • Selon autres entrée MX appartenant au même nom de domaine "mx"
  • Précision de la politique de score de spam du récepteur selon la règle "-all" "~all" "?all" (à éviter)

Limites du SPF

  • Sur un hébergement mutualité ou PSH, l'ip sortante peut être mutialisée avec d'autres clients
  • Une adresse IP peut être falsifié ou usurpée (IP spoofing)
  • Inclure un CNAME autorise l'ensemble des ips déclarées dans le domaine (ex: eu-west-3.amazonses.com)
  • Trop d'inclusions tue l'inclusion, un serveur de réception est limité sur le nombre de vérifications à effectuer (~10) des services applatissent les ips

DKIM (DomainKeys Identified Mail)

          
            DKIM-Signature: v=1;
            a=rsa-sha256;
            q=dns/txt;
            c=relaxed/relaxed;
            d=les-parents-creatifs.com;
            s=mail;
            h=Message-Id:Subject:From:To:Date:Sender:	Reply-To:Cc:MIME-Version:Content-Type:Content-Transfer-Encoding:Content-ID:	Content-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc	:Resent-Message-ID:In-Reply-To:References:List-Id:List-Help:List-Unsubscribe:	List-Subscribe:List-Post:List-Owner:List-Archive;
            bh=pdKeZzX4woG0+Z5Tl8wdXYgRk8R5riZg33ZobehB87U=;
            b=iMYa1cRVtJrEqznVp+9H/YI81N	j6Z3kNcSwYW7asMyIv+9oaZgKILYyolPvcOgcjNdhSl/vRDBPFnO2UV7vTSvkvuwiCCMTGu0LztS3	yse2TiyOZGXR0vpPT7qNBPv41lRFGpjO4mwTC3ypIUaFW/apTmSb4WpDzmnwTKTAuk6w=;
          
        

  • Appose un signature des en-têtes d'un email via l'ajout d'une en-tête supplémentaire utilisant un chiffrement asymétrique
  • Seul la clé privé sur le serveur d'envoi des mails peut chiffrer le message
  • Les en-têtes chiffrées dans la signature sont précisés dans l'attribut h
  • Le domaine associée à la clé publique de chiffrement est précidé dans l'attribut d
  • Le sélecteur ou sous-domaine de la clé publique de chiffrement est précidé dans l'attribut s

            
              mail._domainkey.les-parents-creatifs.com. 300 IN TXT "v=DKIM1; h=sha256; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDpfBRMbRpbdxwFtADmc6wUUQtPXAFrc4yxthITpdl5QvS2+lUVyuEXRqwQn0B+8QTPvJa5Oe0+tWSZZaQokuId9tCrQeJr+gXlbq/jpDCBt/MHdkYhGjy1ziUfhYfchbHiZim7EvBd2Hu5/pRpLUYsYKGln5es01x3lyY93bOaiQIDAQAB"
            
          

Avantages de DKIM

  • Pas de dépendance à l'ip de la machine qui envoie les mails pour être considéré comme légitime
  • Possibilité de renseigner/invalider une clé de chiffrement par service d'envoi
  • Compléxité plus élevée pour forger un email sans la clé

Attributs DMARC

          
            _dmarc.les-parents-creatifs.com. 300 IN	TXT	"v=DMARC1; p=reject; adkim=s; aspf=s;rua=mailto:lpc@pilulu.fr; ruf=mailto:lpc@pilulu.fr;"
          
        

  • Définit quel politique doit adopter un client mail sur un email reçu par le domaine d'envoi
  • Toujours placé dans _dmarc.[MON DOMAINE]
  • Problématiques traitées :
    • Est-ce que l'enveloppe et le header from doivent correspondre (ASPF / ADKIM) ?
    • Que faire des emails ne correspondant pas à la politique ci-dessus (rejet / quarantaine / laisser passer) ?
    • Quel pourcentage d'email voient être vérifiés ?
    • A qui reporter les erreurs et sous quel forme (individuel / aggrégé) ?
    • Cette politique s'applique t'elle pour ce domaine seulement ou tous les sous-doamines ?

DMARC

          
            _dmarc.les-parents-creatifs.com. 300 IN	TXT	"v=DMARC1; p=reject; adkim=s; aspf=s;rua=mailto:lpc@pilulu.fr; ruf=mailto:lpc@pilulu.fr;"
          
        

Tag Description
Version (v) Le paramètre est requis et représente la version.Un exemple est v=DMARC1
Policy (p) La balise p obligatoire indique la politique pour le domaine (ou la politique de traitement demandée). Elle indique au destinataire de signaler, de mettre en quarantaine ou de rejeter les courriels qui échouent aux contrôles d'authentification. Les options de politique sont les suivantes : 1) Aucune 2) Quarantaine ou 3) Rejet.
Percentage (pct) Cette balise DMARC indique le pourcentage de messages électroniques soumis au filtrage. Par exemple, pct=25 signifie qu'un quart des courriels de votre entreprise seront filtrés par le destinataire.
RUA Report Email Address(s) (rua): Cette balise facultative est conçue pour signaler les URI des données agrégées. Un exemple de rua est rua=mailto:CUSTOMER@for.example.com.
RUF Report Email Address(s) (ruf): Comme la balise rua, la désignation ruf est une balise facultative. Elle indique les adresses auxquelles les informations d'analyse spécifiques au message doivent être communiquées (c'est-à-dire une liste d'URI en texte clair séparée par des virgules). Un exemple de ruf est ruf=mailto:CUSTOMER@for.example.com.
Failure Reporting Options (fo): La balise FO concerne le mooment où les rapports d'analyse sont créés et présentés aux utilisateurs DMARC.
ASPF Tag (aspf): La balise aspf représente le mode d'alignement pour SPF. Une balise optionnelle, aspf=r, est une configuration courante.
ADKIM Tag (adkim): Comme pour l'aspf, la balise facultative adkim est le mode d'alignement pour le protocole DKIM. Un exemple de balise est adkim=r.
Report Format (rf): Le(s) format(s) de rapport forensique est(sont) déclaré(s) par la balise DMARC rf.
Report Interval (ri): La balise ri correspond à l'intervalle de rapport global et fournit un retour d'information DMARC pour les critères décrits.
Subdomain Policy (sp): Cette balise représente la politique de traitement demandée pour les sous-domaines.

PTR (Pointer)

  • Utilisé pour une recherche inversé de l'ip qui retournera le nom de la machine délclarée et associés au sein des DNS
  • Identification de la machine qui a expédié le mail
  • Marqueur de fiabilité supplémentaire pour les mesures anti-spam
  • Aide à la mesure de la réputation des serveurs d'envoi
  • De plus en plus exigé par les acteurs comme Google et Yahoo
          
            $ dig mailer.les-parents-creatifs.com
            mailer.les-parents-creatifs.com. 300 IN	A	51.89.139.165
          
        
          
            $ dig -x 51.89.139.165
            165.139.89.51.in-addr.arpa. 43200 IN	PTR	mailer.les-parents-creatifs.com.
          
        
On peut remarquer que le nom de domaine correspond à l'adresse ip retournée et suffixée de .in-addr-arpa qui est une normalisation

Résumé des méthode de légitimisation

  • SPF - Est-ce que le serveur d'envoi/relai des mails est déclaré par le nom de domaine correspondant à l'expéditeur
  • DKIM - Signature d'un email que seul le serveur d'envoi est en mesure de faire
  • DMARC - Politique du client mail en cas de doute sur la légitimité d'un email
  • PTR - Identification plus officielle aurpès des DNS du serveur d'envoi des mails
DKIM ou SPF sont nécessaires, mais ne sont pas nécessairement demandées ensemble. Cependant plus les mécanismes de légitimités sont correctement configurées, moins il y a de probabilité que l'email soit considéré comme du SPAM.

Comment diagnostiquer

Chaine de diagnostic

  • Mon logiciel ou site dispose d'un module ou librarie d'envoi de mail ?
  • Mon interpréteur de code (ex PHP-FPM) à déjà une configuration pour l'utilisation d'un MTA ?
  • La machine qui envoie les emails dispose bien d'un MTA ? / Le MTA est joignable ?
  • Le MTA réussit l'envoi d'un email ?
  • L'enveloppe et le from sont alignés selon la politique DMARC
  • Le MTA a son IP déclarée dans le nom de domaine de l'expéditeur pour l'entrée TXT SPF ?
  • La signature de mon email (si configurée) est présente et correcte ?
  • Est-ce que le serveur a son IP inversée déclarée ?

Mon logiciel ou site dispose d'un module ou librarie d'envoi de mail ?

Sous Drupal/Symfony, cela se passe via l'utilisation de Symfony Mailer

Mon interpréteur de code (ex PHP-FPM) à déjà une configuration pour l'utilisation d'un MTA ?

          
            $ php -i|grep sendmail
            sendmail_path => /usr/sbin/sendmail -t -i => /usr/sbin/sendmail -t -i
          
        

La machine qui envoie les emails dispose bien d'un MTA ? / Le MTA est joignable ?

          
            $ ls -al /usr/sbin/sendmail
            lrwxrwxrwx 1 root root 5 Sep 28 16:49 /usr/sbin/sendmail -> exim4
          
        
ou
          
            $ nc -zv 127.0.0.1 25
            Connection to 127.0.0.1 25 port [tcp/smtp] succeeded!
          
        

Le MTA réussit l'envoi d'un email ?

          
        
$ tail -f /var/log/exim4/mainlog
et envoi d'un email à ping@tools.mxtoolbox.com avec les résultats sur https://mxtoolbox.com/deliverability avec l'email de l'expéditeur

L'enveloppe et le from sont alignés selon la politique DMARC

Voir la section Relay Information sur le résultat de l'analyse précédent. Possibilité de voir l'entrée DNS via dig

          $ dig _dmarc.les-parents-creatifs.com TXT
          ; <<>> DiG 9.18.28-0ubuntu0.24.04.1-Ubuntu <<>> _dmarc.les-parents-creatifs.com TXT
          ;; global options: +cmd
          ;; Got answer:
          ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 10067
          ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

          ;; OPT PSEUDOSECTION:
          ; EDNS: version: 0, flags:; udp: 65494
          ;; QUESTION SECTION:
          ;_dmarc.les-parents-creatifs.com. IN	TXT

          ;; ANSWER SECTION:
          _dmarc.les-parents-creatifs.com. 300 IN	TXT	"v=DMARC1; p=reject; adkim=s; aspf=s;rua=mailto:lpc@pilulu.fr; ruf=mailto:lpc@pilulu.fr;"

          ;; Query time: 33 msec
          ;; SERVER: 127.0.0.53#53(127.0.0.53) (UDP)
          ;; WHEN: Thu Dec 05 00:34:29 CET 2024
          ;; MSG SIZE  rcvd: 160
        

Le MTA a son IP déclarée dans le nom de domaine de l'expéditeur pour l'entrée TXT SPF ?


          $ dig les-parents-creatifs.com TXT
          ; <<>> DiG 9.18.28-0ubuntu0.24.04.1-Ubuntu <<>> les-parents-creatifs.com TXT
          ;; global options: +cmd
          ;; Got answer:
          ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 40692
          ;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 1

          ;; OPT PSEUDOSECTION:
          ; EDNS: version: 0, flags:; udp: 65494
          ;; QUESTION SECTION:
          ;les-parents-creatifs.com.	IN	TXT

          ;; ANSWER SECTION:
          les-parents-creatifs.com. 300	IN	TXT	"google-site-verification=q3UbdjZmQQhwhiHcsvZPs997WHSLTr6lYRhfa8RSj3A"
          les-parents-creatifs.com. 300	IN	TXT	"google-site-verification=zPFyrLGjSWv8mfKgdd0JJie8ZSSq0YsGp1Haw6RUWz0"
          les-parents-creatifs.com. 300	IN	TXT	"v=spf1 a mx include:mx.ovh.com ip4:79.137.34.52 ip4:51.89.139.165 ~all"

          ;; Query time: 163 msec
          ;; SERVER: 127.0.0.53#53(127.0.0.53) (UDP)
          ;; WHEN: Thu Dec 05 00:36:47 CET 2024
          ;; MSG SIZE  rcvd: 298
        

La signature de mon email (si configurée) est présente et correcte ?

            
              From: tatiana@les-parents-creatifs.com
              Subject: test Thu, 14 Nov 2024 14:40:07 +0100
              Received: from mailer.les-parents-creatifs.com by mailhog.example (MailHog)
                        id 0dQPsqm4SOGFBo2-fsHIdbhPpOl1C_mfsJfK-Mt7I68=@mailhog.example; Thu, 14 Nov 2024 13:40:08 +0000
              DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed;	d=les-parents-creatifs.com; s=mail; h=Message-Id:Subject:From:To:Date:Sender:	Reply-To:Cc:MIME-Version:Content-Type:Content-Transfer-Encoding:Content-ID:	Content-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc	:Resent-Message-ID:In-Reply-To:References:List-Id:List-Help:List-Unsubscribe:	List-Subscribe:List-Post:List-Owner:List-Archive;	bh=pdKeZzX4woG0+Z5Tl8wdXYgRk8R5riZg33ZobehB87U=; b=iMYa1cRVtJrEqznVp+9H/YI81N	j6Z3kNcSwYW7asMyIv+9oaZgKILYyolPvcOgcjNdhSl/vRDBPFnO2UV7vTSvkvuwiCCMTGu0LztS3	yse2TiyOZGXR0vpPT7qNBPv41lRFGpjO4mwTC3ypIUaFW/apTmSb4WpDzmnwTKTAuk6w=;
              To: test@trash.pilulu.fr
            
        
  • Vérifier la présence du header DKIM-Signature.
  • Vérifier le sélecteur utilisé (ici s=mail)
  • Vérifier que l'entrée DNS est présente
    
                  $ dig mail._domainkey.les-parents-creatifs.com TXT
                  mail._domainkey.les-parents-creatifs.com. 300 IN TXT "v=DKIM1; h=sha256; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDpfBRMbRpbdxwFtADmc6wUUQtPXAFrc4yxthITpdl5QvS2+lUVyuEXRqwQn0B+8QTPvJa5Oe0+tWSZZaQokuId9tCrQeJr+gXlbq/jpDCBt/MHdkYhGjy1ziUfhYfchbHiZim7EvBd2Hu5/pRpLUYsYKGln5es01x3lyY93bOaiQIDAQAB"
                
  • Vérifier que la signature est valide dans les résultats de l'analyse précédente sur MXToolbox ou via OpenSSL