:.     Home     .:.     Cours     .:.     Faits divers     .:.     Blagues     .:.     Liens     .:.     Perso     .:

 

SPF + DKIM + DMARC

 

DMARC, c'est Domain-based Message Authentication, Reporting and Conformance.

Ça permet de protéger les autres (ainsi que vous même) contre les spams pouvant venir de vos domaines (mais qui ne proviennent pas de votre réseau) et d'assurer une bonne réputation de vos domaines de courriels.

Ca vous permet aussi de recevoir un feedback pour vos domaines de messagerie.

Techniquement, DMARC = SPF + DKIM + Politique qui dicte ce que les serveurs récepteurs doivent faire des emails non-conformes de vos domaines.

Donc, on ne peut pas définir DMARC sans parler de SPF et DKIM.


1 - SPF

Sender Policy Framework (SPF) était à l'origine Sender Permitted From.

SPF est donc une méthode d'authentification des emails destinée à détecter les adresses de courriel sources forgées dans un courriel.

Cependant, SPF ne s'applique qu'à l'enveloppe du message (donc le champ MAIL-FROM ou RETURN-PATH d'un courriel), et non au contenu du message (le champ FROM).

SPF fonctionne en déclarant un enregistrement spécial de type TXT dans le DNS qui liste les serveurs autorisés à envoyer du courriel pour la zone/domaine en question.

Avec SPF, je pourrai par exemple dire que l'IP 184.107.112.64 est autorisée à envoyer les emails du domaine yerbynet.com, et interdire toute autre IP.

Ainsi, si un serveur (qui respecte SPF) reçoit un courriel qui a un champ MAIL-FROM de la forme email@yerbynet.com devra vérifier que le courriel a comme origine 184.107.112.64 avant de l'accepter.

1.1 - Enregistrement SPF

Exemple 1:

"v=spf1 ip4:184.107.112.64  -all"

  • L'IPv4 184.107.112.64 est autorisée à envoyer des emails pour le domaine yerbynet.com.
  • -all : signifie que toutes les autres IPs échouent à ce test (donc ne sont pas autorisées).

Exemple 2 :

"v=spf1 redirect=_spf.google.com"

  • C'est l'exemple de gmail.com qui redirige son SPF vers celui de google.

Exemple 3 :

"v=spf1 include:_netblocks.google.com include:_netblocks2.google.com include:_netblocks3.google.com ~all"

  • C'est l'exemple de google.com qui fait des includes.

Exemple 4 :

"v=spf1 ip4:35.190.247.0/24 ip4:64.233.160.0/19 ip4:66.102.0.0/20 ip4:66.249.80.0/20 ip4:72.14.192.0/18 ip4:74.125.0.0/16 ip4:108.177.8.0/21 ip4:173.194.0.0/16 ip4:209.85.128.0/17 ip4:216.58.192.0/19 ip4:216.239.32.0/19 ~all"

  • C'est un des includes de google.com. Ils ont listé toutes les IPs autorisées (pour éviter les requêtes DNS supplémentaires) et ont interdit le reste.
Exemple 5 :

"v=spf1 ip4:66.220.144.128/25 ip4:66.220.155.0/24 ip4:66.220.157.0/25 ip4:69.63.178.128/25 ip4:69.63.181.0/24 ip4:69.63.184.0/25" " ip4:69.171.232.0/24 ip4:69.171.244.0/23 -all"
  • C'est du facebook.com. Ils sont beaucoup plus strictes (-all).

Explications des termes clés

Les mécanismes :
  • all : correspond à tout le monde. On le met à la fin de l'enregistrement pour qu'il est le sens "tout le reste".
  • a : correspond à lIP (v4 ou v6) associé au domaine
  • mx : correspond aux MX du domaine
  • ip4: permet de spécifier un CIDR IPv4 accepté (exemple : ipv4:69.63.184.0/25)
  • include : include d'autres enregistrements SPF valides
  • redirect : redirect vers un autre enregistrement SPF valide
  • ptr : permet de tricher avec le PTR (exemple : ptr:yahoo.com - si le reverse de l'IP du serveur emetteur est dans le domaine yahoo.com, c'est validé).

Les quantificateurs :

  • - : appliqué à un mécanisme nous donne l'échec du mécanisme en question (exemple : -all - signifie que tout le reste échoue et que le mail doit être rejeté)
  • + : implicite (quand il n'est pas là)
  • ~ : presque égal à -, c'est un softfail. Le courriel échoue mais peut être taggué ou retardé au lieu d'être rejeté.
  • ? : pffff (comme si il n y avait pas de SPF pour eux).
  • Noter que quasiment tout le monde utilise le ~ et non le -.

1.2 - Alignement SPF pour DMARC

En SPF, on n'a pas encore accès au contenu du message, on se sert donc des entêtes et notamment des champs MAIL FROM et RETURN-PATH de l'enveloppe.

Il y a 2 modes d'alignement :

  • Strict (s) : Dans le mode strict, il faut que le domaine dans le "MAIL FROM" soit exactement le même que le domaine déclaré dans l'enregistrement SPF.
  • Relatif (r) : Dans le mode relatif, le domaine dans le "MAIL FROM" peut être exactement le même que le domaine déclaré dans l'enregistrement SPF ou un sous domaine.

1.3 - Authentification SPF

L'authentification SPF passe (ou est valide) lorsque l'IP du serveur du courriel est déclarée dans l'enregistrement SPF.

Exemple de succès d'authentification SPF :

	Adresse source = 184.107.112.64
	MAIL FROM = yerbynet.com
	Enregistrement SPF = "v=spf1 +a +mx +ip4:184.107.112.64 ~all"

Exemple d'échec d'authentification SPF :

	Adresse source = 184.107.112.6
	MAIL FROM = yerbynet.com
	Enregistrement SPF = "v=spf1 +a +mx +ip4:184.107.112.64 ~all"

Important : Lorsque le nombre de requêtes DNS nécessaires pour valider SPF dépasse 10 (des tonnes de includes et des redirects ...) l'évaluation est abandonnée.

1.4 - Mise en place SPF sous Linux

Il s'agit juste de bien configurer l'enregistrement SPF dans le DNS. Ceci n'est pas spécifique à Linux.

Il y a un validateur SPF dans SpamAssassin. Mais les scores proposés par défaut de SA sont très bas.

Vous pourriez envisager de relever ces scores si vous constatez que ça pourrait faire du bien.

Dans Sendmail, on peut ajouter un validateur SPF via un milter, mais c'est natif dans Exim4.


2 - DKIM

DomainKeys Identified Mail (DKIM) est tout comme SPF, une technique d'authentification des expéditeurs de courriels contribuant à détecter les adresses d'expéditeur forgées.

Avec DKIM, un serveur récepteur de courriel aurait les moyens de valider qu'un courriel reçu provient bien d'un serveur qui a l'autorisation de le transmettre.

Le serveur émetteur du message signe le message ou partie du message avec une clé privée, le récepteur décrypte la signature avec une clé publique publiée dans le DNS.

Il faut donc un enregistrement DNS qui contient cette clé publique.

À noter que la paire de clé peut être générée avec les commandes ssh-keygen ou openssl. Il y a aussi plein de générateurs présents sur Internet.

openssl genrsa -out dkimexemple.com-priv.pem 2048 -outform PEM
openssl rsa -in dkimexemple.com-private.pem -out dkimexemple.com-pub.pem -pubout -outform PEM

2.1 - Enregistrement DKIM

Avant de continuer, il faut regarder le concept de sélecteur (s).

Pour un domaine, on peut avoir plusieurs serveurs qui sont autorisés à envoyer des emails du domaine, donc plusieurs signataires pour le domaine.

On pourrait même imaginer des partenaires externes qui ont le droit d'envoyer des emails pour notre domaine.

On ne voudrait pas partager une clé privée entre tous les acteurs, il nous faut donc pouvoir déclarer plusieurs enregistrements pour notre DKIM.

Par exemple, un pour notre serveur d'envoi principal, un pour notre partenaire de marketing, un autre pour ...

Le sélecteur permettra donc d'avoir autant de _domainkey qu'on souhaite.

Exemple 1:

default._domainkey.yerbynet.com. 14400 IN TXT    "v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA9Lv8vkC1nkz/vP6qOSAQiiEgvHg/bPKMA7uHiYvgPRuIaUCIqHQ5ExKI1VqWAcif+mETze8e+gaWcFQ6fQfgjqpBR5BZbHDOMiReDkIOYQAak84xIJKfHBX5kiBHm/o5ufk9idKjRhmH6/Um651J8MmgruSm+E0dB3IwhjX6q8S28FkGAPyM8kRelpbPGrg0B" "OAa9UWFSygNqIHQcxpniNOQ0oVflwRBECNmVgiBPlfYqrODRGfHa1YF3b0IxK6c/m5JOGb2G2qBS33VxySVQiKgdCmuELgWNqJDC7HtCMkVJL8wyuq29rKx+I1T6qmWlxfyimoBda1Kzf3QuMCZywIDAQAB;"

  • Dans cet exemple, le selecteur est default, et la clé publique est toute la chaine qui suit le caractère p.

Exemple 2:

200608._domainkey.engage.windows.com. 3600 IN TXT "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDGoQCNwAQdJBy23MrShs1EuHqK/dtDC33QrTqgWd9CJmtM3CK2ZiTYugkhcxnkEtGbzg+IJqcDRNkZHyoRezTf6QbinBB2dbyANEuwKI5DVRBFowQOj9zvM3IvxAEboMlb0szUjAoML94HOkKuGuCkdZ1gbVEi3GcVwrIQphal1QIDAQAB"

  • Sélecteur = 200608

Explications des paramètres

  • p : Le plus important des paramètres puisque c'est lui qui conserve la clé publique
  • v : la version actuelle qui DKIM (facultatif)
  • k : le type de clé (RSA par défaut)
  • h : algorithmes de HASH acceptés (tous par défaut)

2.2 - Alignement DKIM pour DMARC

Avec DKIM, on a accès au corps du courriel (FROM).

Comme pour SPF, il y a 2 modes d'alignement :

  • Strict (s) : Dans le mode strict, il faut que le domaine dans le champ d de la signature DKIM soit exactement le même que le domaine du FROM.
  • Relatif (r) : Dans le mode relatif, ces deux domaines peuvent être exactement les même ou bien l'un est un sous domaine de l'autre.

Exemple d'alignement qui est valide dans le mode strict et dans le mode relatif :

DKIM-Signature: v=1; a=rsa-sha256; ... d=yerbynet.com; ...
From: dmarc@yerbynet.com
To: roger.yerbanga@out.com

Exemple d'alignement qui passe le mode relatif mais pas strict :

DKIM-Signature: v=1; a=rsa-sha256; ... d=liste.yerbynet.com; ...
From: dmarc@yerbynet.com
To: roger.yerbanga@out.com

Exemple d'alignement qui ne passe aucun mode :

DKIM-Signature: v=1; a=rsa-sha256; ... d=yerbynet.com; ...
From: dmarc@other.com
To: roger.yerbanga@out.com

2.3 - Authentification DKIM

Return-Path: <bounce-15_HTML-1504463008-800977-7279955-70@bounce.engage.windows.com>
Received: from mta3.engage.windows.com (mta3.engage.windows.com. [136.147.186.54])
        by mx.google.com with ESMTPS id z11si12558663qvm.116.2020.09.16.13.53.56
        for <xyz@yerbynet.com>
        (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128);
        Wed, 27 Mar 2019 13:53:57 -0700 (PDT)
Received-SPF: pass (google.com: domain of bounce-15_html-1504463008-800977-7279955-70@bounce.engage.windows.com designates 136.147.186.54 as permitted sender) client-ip=136.147.186.54;
Authentication-Results: mx.google.com;
       dkim=pass header.i=@engage.windows.com header.s=200608 header.b=lcunZVqq;
       spf=pass (google.com: domain of bounce-15_html-1504463008-800977-7279955-70@bounce.engage.windows.com designates 136.147.186.54 as permitted sender) smtp.mailfrom=bounce-15_HTML-1504463008-800977-7279955-70@bounce.engage.windows.com;
       dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=engage.windows.com
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; s=200608; d=engage.windows.com;
 h=From:To:Subject:Date:MIME-Version:Reply-To:List-ID:X-CSA-Complaints:
 Message-ID:Content-Type; i=email@engage.windows.com;
 bh=EehLaLunvBo17WnrX4bGFrWtLrrgvqSsHeOwNAPIO0I=;
 b=lcunZVqqn77wO3ZIhU4LDR3PwUdZKSyifj1r3Eg+A6DkrjFvnpkKSaIW43O2roBfAnWW0FRhwnWe
   Kq4vupEcVErHUvfuYvMaG1IgUzZXb7k6uLZ+3b0xQRPWFiMansw/9CShGbs2neH9aEEnaznqB++h
   3piwcvUMXq5MQe/XcK0=
Received: by mta3.engage.windows.com id hc9tma2fmd47 for <xyz@yerbynet.com>; Wed, 27 Mar 2019 20:53:46 +0000 (envelope-from <bounce-15_HTML-1504463008-800977-7279955-70@bounce.engage.windows.com>)
From: "Microsoft Account Team" <email@engage.windows.com>

Ce message porte une signature DKIM valide.

  • L'authentification DKIM consiste alors à :
    • récupérer l'enregistrement DNS 200608._domainkey.engage.windows.com
    • extraire la clé publique de cet enregistrement
    • déchiffrer la signature
    • et s'assurer que le texte signé par la source est pareil au texte déchiffré (par la destination).
  • En gros, il s'agit de s'assurer que le message a été signé et que la signature est bien authentifiée.

2.4 - Mise en place DKIM sous Linux

Sendmail ne supporte pas nativement DKIM, il faut lui adjoindre un milter pour cette fonction.

Il existe Opendkim sous Linux qui s'installe facilement (paquet RPM et DEB).

Toute la config se fait dans /etc/opendkim.conf.

Un logiciel tel que Exim4 n'a pas besoin de Opendkim pour signer les messages sortants.

Un logiciel tel que SpamAssassin a un plugin qui permet de checker DKIM, mais encore une fois, les scores proposés par défaut sont assez bas.


3 - DMARC

Lors de l'envoi du courriel, on applique les règles de conformité DMARC (signature DKIM, et envoi à partir d'une source autorisée) pour que le courriel soit conforme DMARC.

À la réception du courriel, DMARC est analysé pour s'assurer que le courriel est bien conforme DMARC (vérification de la signature, vérification du serveur d'envoi).

Lorsque le courriel est conforme, il passe, et lorsqu'il n'est pas conforme, on applique ce qui est défini dans l'enregistrement (soit rien, soit mise en quarantaine, soit rejet)

3.1 - Enregistrement DMARC

Les paramètres du RR DMARC :

  • v : version de DMARC (DMARC1)
  • p : politique de filtrage (none, quarantine, reject)
  • sp : pareil que p mais pour les sous-domaines
  • pct : pourcentage de courriels sur lesquels est appliquée la politique définie par p et sp (défaut = 100)
  • aspf : alignement SPF (peut être strict (s) ou relatif (r), le défaut étant r, voir les sections alignement pour les détails)
  • adkim : alignement DKIM
  • fo : peut avoir 0, 1, s ou d et sert à la génération des rapports en cas d'échec (s=rapport en cas d'échec spf, d=rapport en cas d'échec dkim, 1=d||s, 0=d&s).
  • rua : adresse de courriel où envoyer les rapports

Exemples d'enregistrements DMARC :

  • Politique à none, ils sont en mode observation

"v=DMARC1; p=none; rua=mailto:d@rua.agari.com;ruf=mailto:d@ruf.agari.com;fo=1:s:d"

  • Politique à reject et à 100%. Google et Microsoft sont très très sûrs de leur coup.

_dmarc.engage.windows.com. 3600    IN    TXT    "v=DMARC1; p=reject; pct=100; rua=mailto:d@rua.agari.com,mailto:sdc-dmarc-rua@microsoft.com;fo=1"

_dmarc.google.com.    300    IN    TXT    "v=DMARC1; p=reject; rua=mailto:mailauth-reports@google.com"

  • Dans le SPF, on s'assure qu'aucune IP n'est autorisée pour ce domaine, et dans le DMARC, on rejette tout ce qui échoue (or tout va échoue).

interdit.net. TXT "v=spf1 -all" ; SPF
_dmarc.interdit.net.   TXT "v=DMARC1;p=reject;sp=reject;pct=100;aspf=s" ; DMARC

    Pour ce cas, aucun email ne devra être accepté pour le domaine interdit.net.

3.2 - Validations DMARC

Les mails sortants doivent être signés DKIM et être émis depuis un serveur qui a le droit parce qu'il est déclaré dans un SPF.

Delivered-To: yerbynet@gmail.com
Received: by 2002:a17:906:c053:0:0:0:0 with SMTP id bm19csp725743ejb;
        Wed, 27 Mar 2019 13:53:57 -0700 (PDT)
X-Google-Smtp-Source: ABdhPJwHJ9ainivb4IrUuD7ekGDAUFvQYhjbbMHvuD84xJgPVhwkCOmjYtyl5uGY9OgqRtTR6m2k
X-Received: by 2002:a37:9b88:: with SMTP id d130mr25306374qke.66.1600289637342;
        Wed, 27 Mar 2019 13:53:57 -0700 (PDT)
Return-Path: <bounce-15_HTML-1504463008-800977-7279955-70@bounce.engage.windows.com>
Received: from mta3.engage.windows.com (mta3.engage.windows.com. [136.147.186.54])
        by mx.google.com with ESMTPS id z11si12558663qvm.116.2019.03.27.13.53.56
        for <yerbynet@gmail.com>
        (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128);
        Wed, 27 Mar 2019 13:53:57 -0700 (PDT)
Received-SPF: pass (google.com: domain of bounce-15_html-1504463008-800977-7279955-70@bounce.engage.windows.com designates 136.147.186.54 as permitted sender) client-ip=136.147.186.54;
Authentication-Results: mx.google.com;
       dkim=pass header.i=@engage.windows.com header.s=200608 header.b=lcunZVqq;
       spf=pass (google.com: domain of bounce-15_html-1504463008-800977-7279955-70@bounce.engage.windows.com designates 136.147.186.54 as permitted sender) smtp.mailfrom=bounce-15_HTML-1504463008-800977-7279955-70@bounce.engage.windows.com;
       dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=engage.windows.com
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; s=200608; d=engage.windows.com;
 h=From:To:Subject:Date:MIME-Version:Reply-To:List-ID:X-CSA-Complaints:
 Message-ID:Content-Type; i=email@engage.windows.com;
 bh=EehLaLunvBo17WnrX4bGFrWtLrrgvqSsHeOwNAPIO0I=;
 b=lcunZVqqn77wO3ZIhU4LDR3PwUdZKSyifj1r3Eg+A6DkrjFvnpkKSaIW43O2roBfAnWW0FRhwnWe
   Kq4vupEcVErHUvfuYvMaG1IgUzZXb7k6uLZ+3b0xQRPWFiMansw/9CShGbs2neH9aEEnaznqB++h
   3piwcvUMXq5MQe/XcK0=
Received: by mta3.engage.windows.com id hc9tma2fmd47 for <yerbynet@gmail.com>; Wed, 27 Mar 2019 20:53:46 +0000 (envelope-from <bounce-15_HTML-1504463008-800977-7279955-70@bounce.engage.windows.com>)
From: "Microsoft Account Team" <email@engage.windows.com>
To: <yerbynet@gmail.com>

Ce courriel envoyé de engage.windows.com vers gmail.com a bien passé les validations SPF, DKIM, et DMARC.

Opendmarc peut être greffé à Sendmail pour faire les validations DMARC.

Le paquet existe aussi bien sous Debian que Redhat.

Pour que la politique DMARC définie par l'enregistrement DMARC du domaine expéditeur soit appliquée, il y a un paramètre qu'il ne faut pas oublier d'activer : RejectFailures.

Par défaut il est à false. Il faut le mettre à true dans /etc/opendmarc.conf.

Un logiciel tel que SpamAssassin (cette fois-ci, non non) ne fait pas de validation DMARC. Il va falloir se contenter de OpenDMARC.


4- SRS (Sender Rewriting Scheme)

DMARC/DKIM/SPF viennent avec des limites et d'autres problèmes à résoudre.

Notamment, on aura de gros souci avec tout ce qui est redirection, ou même des listes de discussions.

Je ne vais pas trop m'atarder sur le sujet, le lecteur intéressé pourra trouver de la lecture sur Internet et discuter avec Stuart D. Gathman.

Pour résoudre ce problème, on va utiliser SRS.

SRS permet de la réécriture des entêtes de courriel pour rendre conforme à SPF tout courriel qui est transféré.

J'ai fait des tests avec la solution pysrs, on peut dire que les tests étaient concluants.


Sources :



L'information, n'est-elle pas précieuse ? Partageons la tous ensemble !

 © Juillet 2019
Roger YERBANGA
www.yerbynet.com