Le blog de Philippe

Eviter l'usurpation d'adresse email avec Sender Policy Framework (SPF)

P.Leclercq dans Sécurité    2024-03-21   technologie 

article header image

Comment éviter l’usurpation d’adresse email avec Sender Policy Framework (SPF)

Dans un précédent article, nous avons vu qu’un attaquant externe pouvait envoyer un email contenant une adresse appartenant à votre domaine, et comment le détecter via les en-têtes. Sender Policy Framework (SPF) permet de valider la véritable source de l’email, réduisant ainsi le risque d’envoi d’emails par des acteurs malveillants semblant provenir d’une source légitime.

SPF est un protocole d’authentification des emails conçu pour empêcher ce type d’usurpation d’adresse en permettant aux propriétaires de domaine de spécifier les serveurs de messagerie autorisés à envoyer des emails au nom de leur domaine (plus précisément, avec un en-tête d’enveloppe « MAIL FROM: » contenant son domaine).

Attention

SPF valide l’en-tête MAIL FROM: de l’enveloppe, PAS l’en-tête From:, généralement affiché par votre client de messagerie.

Fonctionnement de SPF

Si l’administrateur de messagerie du domaine exemple.com souhaite utiliser SPF pour éviter que des utilisateurs externes n’envoient des emails prétendant provenir de ses serveurs de messagerie, il doit créer et publier un enregistrement DNS TXT SPF répertoriant les serveurs autorisés à envoyer des emails au nom de son domaine.

Ensuite, lui et les autres administrateurs de messagerie des domaines recevant des emails du domaine exemple.com doivent activer la vérification SPF afin que le logiciel de gestion des emails puisse signaler toute usurpation d’identité.

Attention

Si un serveur de messagerie n’est pas configuré pour vérifier le SPF, aucune protection contre l’usurpation d’identité ne sera mise en place, même si l’expéditeur possède un enregistrement SPF.

Supposons que utilisateur1@exemple.com envoie un email à utilisateur2@autredomaine.com. Lorsque la vérification SPF est activée, les vérifications suivantes sont effectuées :

  • Le serveur récepteur (dans le domaine autredomaine.com) extrait la partie domaine de l’en-tête d’enveloppe MAIL FROM: (dans notre cas : exemple.com) ;
  • Il interroge le DNS pour obtenir l’enregistrement SPF du domaine expéditeur (dans notre cas : exemple.com) ;
  • Il peut vérifier si le nom ou l’adresse figurant dans le message SMTP HELO/EHLO figure dans la liste autorisée mentionnée dans l’enregistrement SPF ;
  • Il doit vérifier si l’identité de la machine/du domaine indiqué dans l’en-tête d’enveloppe MAIL FROM: figure dans la liste autorisée mentionnée dans l’enregistrement SPF ;
  • Si la vérification est réussie, le courrier est distribué à son destinataire ;
  • En cas d’échec, l’action mentionnée dans l’enregistrement SPF est appliquée (en général, le courrier est rejeté ou marqué comme spam. Consultez le paragraphe suivant pour connaître la liste des actions possibles).

Configuration de SPF pour un domaine

Un enregistrement SPF est un enregistrement DNS (Domain Name System) TXT contenant des informations sur les serveurs de messagerie autorisés. La syntaxe SPF vous permet de spécifier la liste des serveurs autorisés ou non à envoyer des emails au nom de votre domaine.

Il ne peut y avoir qu’un seul enregistrement SPF par domaine, et sa longueur doit être inférieure à 512 caractères.

La syntaxe complète de l’enregistrement SPF est complexe ; vous pouvez consulter la RFC 7208 pour une définition complète.

La syntaxe générale d’un enregistrement SPF est la suivante :

<domaine> TXT "v=spf1 <action><liste de serveurs>..."

Exemple 1

Supposons que nous créions un enregistrement SPF pour le domaine exemple.com. Supposons que le seul serveur de messagerie valide pour ce domaine soit smtp.exemple.com. L’enregistrement SPF se présentera ainsi :

exemple.com TXT "v=spf1 +a:smtp.exemple.com -all"
  • v=spf1 identifie l’enregistrement comme étant un enregistrement SPF (un enregistrement DNS TXT peut avoir de nombreuses autres utilisations).
  • + signifie que, si l’hôte expéditeur correspond à la liste suivante, il est considéré comme autorisé et le courrier doit être distribué tel quel. Notez que le signe + peut être omis.
  • a: signifie que le nom qui suit est le nom DNS d’un serveur (ou d’un service).
  • smtp.exemple.com est le nom DNS d’un serveur autorisé.
  • - signifie que, si l’hôte expéditeur correspond à la liste suivante, il est considéré comme non autorisé, le statut SPF est fail et le courrier doit être rejeté, placé en quarantaine ou signalé comme spam, selon la politique mise en place au destinataire.
  • all désigne tous les serveurs qui ne respectent pas les entrées précédentes de l’enregistrement SPF. Il doit s’agir de l’entrée la plus récente de l’enregistrement ; toutes les entrées suivantes sont ignorées.

Si le serveur de messagerie n’a pas de nom DNS mais une adresse IP (par exemple 109.88.52.201), l’enregistrement doit être modifié comme suit :

exemple.com TXT "v=spf1 +ip4:109.88.52.201 -all"

Le mécanisme ip4 autorise une adresse IP unique ou une adresse de sous-réseau en notation CIDR (par exemple 109.88.52.0/24 = toutes les adresses IP comprises entre 109.88.52.0 et 108.88.52.255).

Exemple 2

Supposons que fournisseur.com soit un fournisseur d’accès Internet proposant un hébergement de messagerie et qu’il possède un client dont le nom de domaine est exemple.com.
Supposons que l’administrateur système de exemple.com souhaite créer un enregistrement SPF pour son domaine, n’autorisant qu’un seul serveur local et les serveurs de messagerie de son fournisseur. Pour tester son enregistrement, il ne souhaite pas non plus que les emails provenant de serveurs non autorisés soient rejetés, mais il souhaite qu’ils soient marqués comme douteux afin de pouvoir les analyser.
L’enregistrement SPF ressemblera à ceci :

exemple.com TXT "v=spf1 +a:smtp.exemple.com +mx:fournisseur.com ~all"

Comme dans l’exemple précédent, il autorise le serveur smtp.exemple.com et le serveur de messagerie de son fournisseur de services en indiquant à SPF de faire confiance aux serveurs mentionnés dans l’enregistrement MX du domaine fournisseur.com.

La dernière partie comporte une action ~. Cela signifie que les emails provenant d’autres serveurs sont marqués comme softfail. Cela permet au destinataire de marquer les emails comme douteux, sans toutefois les rejeter complètement.

En général, un fournisseur de services possède plusieurs serveurs, qui évoluent au fil du temps et dont les règles peuvent être complexes. Dans ce cas, la meilleure solution consiste simplement à inclure son enregistrement SPF :

exemple.com TXT "v=spf1 +ip4:109.88.52.201 include:spf.fournisseur.com ~all"

Si vous utilisez un fournisseur d’accès à Internet ou un bureau d’enregistrement de noms de domaine, ils vous expliqueront comment configurer votre enregistrement SPF pour inclure leur infrastructure de messagerie.

Trouver l’enregistrement SPF d’un domaine

Comme l’enregistrement SPF est un enregistrement DNS TXT, vous pouvez l’obtenir avec les commandes suivantes :

dig -t txt <domain>
nslookup -ty=txt <domain>

Vous recevrez tous les enregistrements TXT du domaine ; recherchez-en un commençant par v=spf1.
Par exemple, trouvons l’enregistrement SPF du FBI :

nslookup -ty=txt fbi.gov | grep spf
fbi.gov text = "v=spf1 +mx ip4:153.31.0.0/16 -all"

La réponse est assez simple. Les serveurs autorisés sont :

  • tous les serveurs répertoriés par les enregistrements MX du domaine fbi.gov
  • tous les serveurs dont l’adresse IP est comprise entre 153.31.0.0 et 153.31.255.255
nslookup -ty=mx fbi.gov
Serveur : 9.9.9.9
Adresse : 9.9.9.9#53

Réponse non officielle :
fbi.gov mail exchanger = 20 mx-west.fbi.gov.
fbi.gov mail exchanger = 10 mx-east.fbi.gov.

nslookup mx-west.fbi.gov
Serveur : 9.9.9.9
Adresse : 9.9.9.9#53

Réponse non officielle :
Nom : mx-west.fbi.gov
Adresse : 153.31.192.142

nslookup mx-east.fbi.gov
Serveur : 9.9.9.9
Adresse : 9.9.9.9#53

Réponse non officielle :
Nom : mx-east.fbi.gov
Adresse : 153.31.119.142

Vous pouvez également utiliser les sites web gratuits suivants pour trouver des enregistrements SPF :

Vérification des résultats SPF dans les en-têtes d’emails

Le protocole SPF ajoute des en-têtes Received-SPF: aux emails qu’il traite. La syntaxe générale est :

Received-SPF: <commentaire> <résultat> <explication du résultat>

<résultat> correspond à pass, fail, softfail, neutral, none, temperror, permerror.

  • temperror et permerror indiquent que des erreurs se sont produites lors de l’interrogation ou du traitement des requêtes DNS.
  • none signifie généralement que le domaine de l’expéditeur ne possède pas d’enregistrement SPF.
  • neutral ne donne aucune indication positive ou négative.

Vérifions un en-tête d’email réel. Voici une réponse du site flyordie.com à une demande de réinitialisation de mot de passe envoyée par pltrash2@gmail.com.

Delivered-To: pltrash2@gmail.com
Received: by 2002:a05:7412:b412:b0:fa:52c5:c6f5 with SMTP id du18csp2235648rdb;
        Sun, 11 Feb 2024 15:13:47 -0800 (PST)
X-Google-Smtp-Source: AGHT+IGILZFYicIi2vRQIu4ua9M2m20+4BIDGMJFY3O0+4pT2Mv5POsOoU4M/cS+f0IvCoIlCNJt
X-Received: by 2002:a0c:cd13:0:b0:68c:4774:a9ea with SMTP id b19-20020a0ccd13000000b0068c4774a9eamr6013509qvm.46.1707693227575;
        Sun, 11 Feb 2024 15:13:47 -0800 (PST)
ARC-Seal: i=1; a=rsa-sha256; t=1707693227; cv=none;
        d=google.com; s=arc-20160816;
        b=doZ/SOhBSyLRit50ySbs8hHay3NBWzZMYIeSczIBcHt2Y7/NfawG30i9bHIf5EX2pm
         qO+rHrfLcSmaPZYTnUfBM34qzoqDqVx2Osk9eiAX+CR1Ze8zZgJ7z0nsOGgHIAuL+GAR
         p+tHbWmP8s3tcPzXslogNw/VFiSYfD1escun/rkRStM0HrwSavyI2CWCGg+Y/j/7I2/r
         mH4F7UkQQf3Dbma3jvSsdTCFKniWQXg+cEwjJrdwlcg2GYeD6ox9WsSVW4br2243uUah
         QSuu9nBrr8dn4hOqJKrfBvuvt75rySEud60ffjnGYRkyygJMdYvjD9zPDpR8E4NQqGLy
         83vw==
ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816;
        h=content-transfer-encoding:mime-version:subject:message-id:to:sender
         :from:date;
        bh=53dCbGE549Tr46FbHHEtKSI+UEYOOXdSSfVza3t/Jxo=;
        fh=sP5OreUJhcIZXyhB0HrO0m5IvxQIjTB/JbpR2KvlL20=;
        b=z10UPczwmJahzL4qloKQQob79peTUgZDeYrDBdEGA79FjGiPg4ONyXnN1EjO7LQcqZ
         HjJxiEEHz+d2iHwgfo3KhFZTmmFg9goBZpby/LK6Laa0kNxf58t+objp/65mglPHgnKO
         GJScfA+I410qPRuER+RrwqbRIWXOzdQ2O2sUqFS28/TDrIm8/g6c4EoQxgzMm31QbMEC
         jvDoucWgSIreks0JkwMoIG9xZynjdQUe5K+Zpsbsx/C5iD3SwgN8Ds5gsNEEns6myzMR
         HfiyCYuJmjOipXKCi8Tqwm/JCMT49//g6DHCdoVXf+/xB7TaibK4EYYbbDnnOu4eXIu4
         WTwg==;
        dara=google.com
ARC-Authentication-Results: i=1; mx.google.com;
       spf=pass (google.com: domain of no-reply@flyordie.com designates 208.167.241.84 as permitted sender) smtp.mailfrom=no-reply@flyordie.com
Return-Path: <no-reply@flyordie.com>
Received: from regmail2.flyordie.com (regmail2.flyordie.com. [208.167.241.84])
        by mx.google.com with SMTP id gm9-20020a056214268900b0068cb633507asi7586096qvb.575.2024.02.11.15.13.47
        for <pltrash2@gmail.com>;
        Sun, 11 Feb 2024 15:13:47 -0800 (PST)
Received-SPF: pass (google.com: domain of no-reply@flyordie.com designates 208.167.241.84 as permitted sender) client-ip=208.167.241.84;
Authentication-Results: mx.google.com;
       spf=pass (google.com: domain of no-reply@flyordie.com designates 208.167.241.84 as permitted sender) smtp.mailfrom=no-reply@flyordie.com
Received: from pipa1.in.flyordie.com (pipa1 [192.168.100.8])
        by regmail2.flyordie.com
        with SMTP (Mireka 4.0) id LSI57QZN
        for pltrash2@gmail.com;
        Mon, 12 Feb 2024 00:35:02 +0100 (CET)
Received: from pipa1 (localhost [127.0.0.1])
        by pipa1.in.flyordie.com
        with SMTP (Mireka 4.3.0) id LSI4GER2
        for pltrash2@gmail.com;
        Mon, 12 Feb 2024 00:13:46 +0100 (CET)
Date: Mon, 12 Feb 2024 00:13:46 +0100 (CET)
From: FlyOrDie <no-reply@flyordie.com>
Sender: FlyOrDie <no-reply@flyordie.com>
To: plecbe <pltrash2@gmail.com>
Message-ID: <1326803458.3842.1707693226668.JavaMail.tomcat@pipa1>
Subject: FlyOrDie password successfully reset
MIME-Version: 1.0
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: 7bit

L’en-tête SPF est :

Received-SPF: pass (google.com: domain of no-reply@flyordie.com designates 208.167.241.84 as permitted sender) client-ip=208.167.241.84;

Le résultat est pass, et l’explication en est que ce message a été envoyé depuis le serveur dont l’adresse IP est 208.167.241.84.

Vérifions l’enregistrement SPF de flyordie.com :

nslookup -ty=txt flyordie.com| grep spf
flyordie.com text = "v=spf1 ip4:82.192.93.216 ip4:82.192.93.217 ip4:82.192.93.218 ip4:208.167.241.84 -all"

208.167.241.84 figure bien dans la liste des expéditeurs autorisés. Je suis maintenant certain que ce message a été envoyé depuis un serveur de messagerie autorisé par flyordie.

Rappel

SPF vérifie uniquement que le serveur de l’expéditeur est autorisé par le propriétaire du domaine de l’expéditeur, et non l’identité de l’expéditeur lui-même. Le domaine du serveur de l’expéditeur peut être différent de celui de l’expéditeur, indiqué dans le champ « De : » de votre message. Il ne s’agit que d’une validation partielle.

Accueil   Début