Email outils
Comment fonctionne réellement l'authentification du courriel : les deux adresses From, ce que prouvent SPF, DKIM et DMARC, comment lire une chaîne Received, et quel outil utiliser sur des en-têtes ou un .eml.
3 outils
Les deux adresses From
Presque toute question d’usurpation de courriel se ramène à la confusion de deux
identités d’expéditeur. L’expéditeur d’enveloppe est l’adresse fournie dans la
commande SMTP MAIL FROM : les rejets y sont dirigés, et les destinataires
l’enregistrent comme Return-Path: ou smtp.mailfrom= à l’intérieur de
Received-SPF:. L’expéditeur d’en-tête est le champ From: à l’intérieur du
message — le seul qu’un humain voie. Rien dans SMTP n’exige que les deux
correspondent.
SPF autorise l’enveloppe : l’IP qui se connecte était-elle autorisée à émettre pour
le domaine du MAIL FROM ? DKIM autorise le contenu : l’expéditeur signe une liste
choisie de champs d’en-tête (h=) plus une empreinte du corps (bh=), et publie la
clé publique dans le DNS. Ni l’un ni l’autre ne dit quoi que ce soit de l’adresse
que le destinataire lit. DMARC comble cet écart en exigeant l’alignement — le
domaine du From: visible doit correspondre au domaine SPF ou au domaine d= de
DKIM. Un spf=pass sur un courriel se réclamant de votre banque est parfaitement
normal pour un hameçonnage ; un dmarc=pass ne l’est pas.
La troisième chose à intégrer : ce n’est pas vous qui vérifiez tout cela. Le MTA
destinataire exécute les contrôles au moment de la remise et inscrit son verdict
dans un en-tête Authentication-Results:. Ensuite, le résultat n’est qu’une
affirmation dans un fichier texte — digne de confiance seulement si le saut qui l’a
écrit appartient à votre propre infrastructure. Un en-tête écrit par le serveur d’un
inconnu a pu être inventé par cet inconnu. Lisez vers l’extérieur à partir de votre
MTA de frontière et traitez tout ce qui est au-delà comme une saisie non fiable.
Ce que chaque mécanisme prouve
| Mécanisme | Publié à | Authentifie | Survit au transfert | Empêche l’usurpation du From: visible |
|---|---|---|---|---|
| SPF | TXT sur le domaine d’enveloppe, v=spf1 … | L’IP qui se connecte pour le MAIL FROM | Non — l’IP du relais n’est pas listée | Non |
| DKIM | TXT à <sélecteur>._domainkey.<d=> | Les en-têtes de h= + l’empreinte du corps bh= | Oui, sauf si le corps ou le Subject est altéré | Seulement s’il y a alignement |
| DMARC | TXT à _dmarc.<domaine> | L’alignement du From: avec SPF ou DKIM, plus la politique | Oui, via le DKIM survivant | Oui — c’est toute sa raison d’être |
| ARC | En-têtes ARC-Seal / ARC-Message-Signature | Préserve les résultats amont à travers un relais | Conçu exactement pour cela | Non — et seuls les scelleurs de confiance comptent |
| MTA-STS / DANE | TXT à _mta-sts.<domaine> / TLSA | Le transport : que TLS était obligatoire | sans objet | Non |
Les jetons de résultat forment un vocabulaire commun aux trois contrôles, et chacun désigne un correctif différent :
| Jeton | Signification | Cause habituelle |
|---|---|---|
pass | Contrôle réussi | — |
fail | Non autorisé, en dur (-all) | Usurpation, ou un relais émetteur absent de l’enregistrement |
softfail | Non autorisé, marquage seulement (~all) | Enregistrement laissé permissif en cours de déploiement |
neutral | Explicitement sans avis (?all) | La politique n’énonce rien d’utile |
none | Aucun enregistrement publié | Le domaine n’a jamais configuré SPF ni DMARC |
temperror | Échec DNS, réessayable | Résolveur ou serveur autoritaire instable |
permerror | L’enregistrement ne peut pas être évalué | Plus de 10 recherches DNS, v=spf1 en double, erreur de syntaxe |
Quel outil pour quel travail
Si vous disposez du bloc d’en-têtes brut — « Afficher l’original » dans Gmail,
« Afficher la source » ailleurs — commencez par
Analyse d’En-têtes. Il déplie les lignes de continuation,
inverse la pile Received: pour que le saut 1 soit le serveur d’origine et le
dernier saut votre fournisseur, et montre les secondes entre sauts adjacents, si
bien que Delay: 1800s désigne le relais qui a gardé le message une demi-heure.
Sous le chemin, il imprime Authentication-Results, Received-SPF,
DKIM-Signature et ARC-Authentication-Results mot pour mot — le verdict DMARC vit
à l’intérieur du premier, sous la forme dmarc=pass (p=REJECT …). L’analyse reste
dans le navigateur, et c’est bien là l’essentiel : ces en-têtes portent des IP
d’expéditeurs et des noms d’hôtes internes.
Avec un fichier .eml entier à la place — un rejet, une pièce jointe enregistrée,
la sortie d’un formulaire d’envoi — utilisez la
Visionneuse EML. Elle sépare les en-têtes du corps, décode les
mots encodés de la RFC 2047 (=?UTF-8?B?…?=) pour que les sujets non ASCII se
lisent comme du texte, et met en avant From, To, Cc, Subject, Date,
Reply-To et Message-ID. Un Reply-To sur un domaine différent du From: est un
signe classique de fraude au président. Le corps est affiché brut, les frontières
MIME restent donc visibles ; passez les parties en base64 dans
Base64 pour en lire une.
Avec seulement un domaine et aucun message, passez au DNS.
DNS Lookup résout TXT (votre chaîne v=spf1), MX
(le routage, avec priorité) et davantage, avec le TTL qui détermine combien de
temps un correctif met à prendre effet — le hub dns traite la mise
en cache en profondeur. C’est un outil serveur : le nom de domaine part vers
api.sitekits.dev pour la résolution et n’est pas conservé. Il n’accepte que des
étiquettes de nom d’hôte, si bien que les noms à tiret bas comme
_dmarc.example.com et selector._domainkey.example.com sont rejetés — lisez ceux-là
avec dig TXT _dmarc.example.com.
Pour les liens à l’intérieur d’un message suspect, le
Parseur d’URL décompose une URL en hôte, chemin et paramètres de
requête décodés sans jamais la charger, et le
Convertisseur IDN expose les domaines homographes en montrant
la forme xn-- réellement résolue. Les deux s’exécutent dans le navigateur, et tous
deux sont rassemblés sur /fr/for/security/ aux côtés de
l’analyseur d’en-têtes et de la visionneuse .eml. Les horodatages de sauts exprimés
dans des décalages étrangers s’alignent plus vite avec le
Convertisseur de Fuseau Horaire — également local au
navigateur, mais rassemblé sur /fr/for/sre/ plutôt que sur la page
sécurité. Avant de joindre des preuves à un ticket, expurgez à la main — le
Nettoyeur HAR couvre les exports HAR, pas les en-têtes de
courriel.
Là où ça dérape habituellement
p=none ne protège rien
p=none ne fait que demander des rapports. Le publier est le bon premier pas, mais
tant que vous n’atteignez pas p=quarantine ou p=reject, les destinataires
n’appliquent aucune politique en cas d’échec. Vérifiez aussi pct= — un déploiement
partiel n’applique la politique qu’à cette proportion du courrier.
Faire sauter le budget de dix recherches
include:, a, mx, ptr et redirect= coûtent chacun des recherches DNS, et
les chaînes d’include: imbriquées venant de prestataires SaaS ajoutent les leurs
récursivement. Dépassez dix et l’enregistrement devient permerror, ce que les
destinataires lisent comme l’absence totale de SPF. Aplatissez-le ou retirez les
prestataires inutilisés.
Lire chaque échec comme une attaque
Les transferts et les listes de diffusion cassent l’authentification de façon
légitime : l’IP du relais échoue au SPF, et un préfixe de sujet [liste] ou un pied
de message ajouté invalide l’empreinte du corps DKIM. Jugez sur l’alignement et sur
le relais scelleur, pas sur un unique fail.
Faire confiance à des sauts qui ne sont pas les vôtres
Seules les lignes Received: et Authentication-Results: ajoutées au niveau de
votre MTA de frontière ou après signifient quelque chose ; les sauts antérieurs sont
du texte contrôlé par l’attaquant. Des délais négatifs ou affichés — sont une
dérive d’horloge ou un horodatage manquant, pas une preuve.
Laisser ouverts les domaines qui n’envoient pas
Les domaines en parking et les sous-domaines qui n’envoient jamais de courriel ont
tout de même besoin de v=spf1 -all, d’un enregistrement DMARC à
_dmarc.<domaine> avec p=reject, et idéalement d’un MX nul (MX 0 .). p= est
l’étiquette de politique obligatoire : un enregistrement ne portant que sp=reject
est invalide, les destinataires n’appliquent donc rien et le domaine en parking
lui-même reste sans protection. Ajoutez sp=reject à côté de p= quand vous voulez
énoncer explicitement la politique des sous-domaines — en l’absence de sp=, les
sous-domaines héritent de toute façon de p=. Laissé ouvert, le domaine est du
matériau d’usurpation gratuit portant votre marque.