From b9a4ec4a4540d3e041a0f890f662d65986aa0fc8 Mon Sep 17 00:00:00 2001 From: Gregory Colpart Date: Wed, 24 Apr 2024 00:17:01 +0200 Subject: [PATCH] =?UTF-8?q?relecture=20/=20am=C3=A9lioration=20autour=20de?= =?UTF-8?q?=20DMARC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- HowtoPostfix.md | 60 ++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 49 insertions(+), 11 deletions(-) diff --git a/HowtoPostfix.md b/HowtoPostfix.md index a0a70069..ba4d3272 100644 --- a/HowtoPostfix.md +++ b/HowtoPostfix.md @@ -1297,7 +1297,8 @@ Chez Evolix, on utilise ainsi `include:spf.protection.evolix.net`. Si vous utili #### Vérification SPF -Pour vérifier les enregistrements SPF des emails : +Pour vérifier les enregistrements SPF des emails puis rejeter les emails invalides et marquer le résultat de la vérification +via un entête `Received-SPF` nous utilisons [policyd-spf](https://manned.org/man/debian/policyd-spf) : ~~~ # apt install postfix-policyd-spf-python @@ -1331,12 +1332,23 @@ Mail_From_reject = Softfail # Rejete les mails si le check SPF échoue même en Reject_Not_Pass_Domains = aol.com,hotmail.com # Transoforme un ~all en -all pour des domaines en particuliers. ~~~ +Voir [policy-spf.conf(5)](https://manned.org/man/debian/policyd-spf.conf). + + Cela ajoutera l'entête suivant aux emails : ~~~ Received-SPF: Pass (mailfrom) identity=mailfrom; client-ip=192.0.2.1; helo=mail.example.com; envelope-from=jdoe@example.com; receiver= ~~~ +ou en cas d'échec : + +~~~ +Received-SPF: Softfail (mailfrom) identity=mailfrom; client-ip=192.0.2.1; helo=mail.example.com; envelope-from=jdoe@example.com; receiver= +~~~ + +Note : `receiver=` est une anonymisation pour des raisons de confidentialité, cf l'option par défaut `Hide_Receiver = Yes` + Cet entête pourra notamment être utilisé par des filtres, SpamAssassin, etc. > *Note* : attention, pour les emails locaux, cela n'ajoutera pas l'entête `Received-SPF` ce qui peut poser des soucis avec les outils s'appuyant dessus, notamment SpamAssassin ou OpenDMARC. @@ -1411,7 +1423,7 @@ _dmarc IN TXT "v=DMARC1; p=none; rua=mailto:dmarc@example.com" On pourra spécifier : * `p=none` si l'on ne veut pas que les emails non conformes soient rejetés -* `p=reject` si l'on veut que les emails non conformes soient rejetés +* `p=reject` si l'on veut que les emails non conformes soient rejetés (rarement utilisé) * `p=quarantine` si l'on veut que les emails non conformes soient mis de côté (dans une sous-boîte Spam en général) Attention, si vous spécifiez `rua=mailto:dmarc@example.com` vous recevrez pas mal de rapports @@ -1426,7 +1438,13 @@ _dmarc IN TXT "v=DMARC1;p=reject;rua=mailto:dmarc+aggr@example.com;ruf=mailto:dm #### Vérification DMARC -Pour vérifier la politique DMARC des emails : +Pour vérifier la politique des emails nous utilisons [OpenDMARC](https://github.com/trusteddomainproject/OpenDMARC). + +OpenDMARC s'appuie sur [DKIM](HowtoOpenDKIM) qui ajoute l'entête `Authentication-Results`, +il faut donc au préalable avoir installé et configuré [OpenDKIM](HowtoOpenDKIM). +OpenDKIM s'appuye également sur l'entête `Received-SPF` mais il peut également faire la vérification SPF lui-même. + +On installe : ~~~ # apt install opendmarc @@ -1440,19 +1458,34 @@ On configure via `/etc/opendmarc.conf` : AuthservID mail.example.com PidFile /var/run/opendmarc/opendmarc.pid PublicSuffixList /usr/share/publicsuffix -Socket inet:8892@localhost +Socket inet:8893@localhost #Socket local:/var/run/opendmarc/opendmarc.sock Syslog true UMask 0002 UserID opendmarc IgnoreHosts /etc/opendmarc/ignore.hosts +SPFSelfValidate true +IgnoreAuthenticatedClients true ~~~ -OpenDMARC s'appuie sur l'entête `Received-SPF`, il faut donc avoir installé [la vérification DKIM](#dkim). +Par défaut, OpenDMARC se contente de vérifier et d'ajouter l'entête `Authentication-Results` (AR). +Si l'on veut que les emails avec une politique DMARC invalide soit rejeté (mais c'est rare car `p=reject` +est rarement utilisé), on peut mettre l'option : + +~~~ +RejectFailures true +~~~ + +Voir [opendmarc.conf(5)](https://manned.org/man/debian/opendmarc.conf). Et il faut ajouter un fichier `/etc/opendmarc/ignore.hosts` pour ignorer les emails locaux : ~~~ +# mkdir /etc/opendmarc +# touch /etc/opendmarc/ignore.hosts +# chown -R opendmarc:opendmarc /etc/opendmarc + +# cat /etc/opendmarc/ignore.hosts 127.0.0.0/8 ::1/128 localhost @@ -1461,19 +1494,24 @@ localhost.localdomain 192.0.2.0/24 ~~~ -Et l'on ajoute un milter : +Et l'on ajoute un milter à la suite de celui pour [OpenDKIM](HowtoOpenDKIM) : ~~~ -non_smtpd_milters = inet:127.0.0.1:8892 -smtpd_milters = inet:127.0.0.1:8892 +non_smtpd_milters = inet:127.0.0.1:8891 inet:127.0.0.1:8893 +smtpd_milters = inet:127.0.0.1:8891 inet:127.0.0.1:8893 in_flow_delay = 0s ~~~ -Cela ajoutera les entêtes suivants aux emails : +Cela ajoutera un 2e entête `Authentication-Results` (AR) en plus de celui d'OpenDKIM : ~~~ -Authentication-Results: mail.smsmode.com; dmarc=pass (p=none dis=none) header.from=... -Authentication-Results: mail.smsmode.com; dkim=pass ... +Authentication-Results: antispam.example.com; dmarc=pass (p=none dis=none) header.from=example.com +~~~ + +ou en cas d'échec : + +~~~ +Authentication-Results: antispam.example.com; dmarc=fail (p=none dis=none) header.from=example.com ~~~ Cet entête pourra notamment être utilisé par des filtres, SpamAssassin, etc.