Yunohost : mx backup whitelist (vérification spf)
Qu'est-ce que la vérification SPF ?
Un nom domaine (example.com) est enregistré sur un DNS et comporte plusieurs valeurs : A (hôte ipv4), AAAA (hôte ipv6), MX (serveur où les mails doivent être remis), TXT (divers), etc. Le champ TXT permet de définir des arguments relatifs à la messagerie. Dans notre cas, SPF consiste à indiquer quel serveur a le droit d'envoyer du courrier en utilisant ce domaine comme identité. Concrètement on peut définir que seul le serveur 1.2.3.4 a le droit d'envoyer un mail en tant que @example.com.
Une vérification SPF permet donc à un serveur qui reçoit du courrier de vérifier que celui qui envoie est bien ce qu'il prétend être. On évite ainsi pas mal de spam, usurpation d'identité, phishing et autres joyeusetés. Voici étape par étape comment ça fonctionne :
- Un mail arrive, comme expéditeur il est indiqué machin@example.com
- Le serveur qui reçoit vérifie ce qui est indiqué en SPF dans l'enregistrement DNS de example.com
- Ce SPF dit que seuls les serveurs 1.2.3.4 et 5.6.7.8 sont autorisés à envoyer du courrier pour le domaine example.com
- Le serveur vérifie donc l'IP du serveur expéditeur et rejette le message si cela ne correspond pas aux deux adresses précédentes
Le problème du mx backup
Comme je l'indiquais plus haut, un domaine peut contenir un champ MX qui indique à quel serveur le courrier doit être redirigé. Or on peut avoir plusieurs MX avec un ordre de priorité. Cela présente un intérêt pour assurer la continuité de service si le serveur principal tombe. Un serveur secondaire sera nommé mx backup dans cet article.
J'ai été confronté à un cas spécial. Comme l'ami Etenil j'ai un serveur de messagerie en ligne nous avons donc modifié nos configurations pour faire office de mx backup l'un l'autre. Donc si mon serveur se retrouve offline, les mails entrants seront redirigés vers le serveur de Etenil qui les conservera jusqu'à ce que je revienne online. Un problème s'est posé depuis que j'ai migré mon serveur sur Yunohost. En effet ce dernier fait une vérification SPF quand il reçoit un mail. Et dans le cas où c'est le mx backup qui me transmet un message, voilà ce qui se passe :
- Mon serveur est passé offline
- Un expéditeur machin@example.com m'envoie un mail
- Le mail arrive sur le mx backup (chez etenil) qui le stocke
- Mon serveur revient online
- Le mx backup (etenil) me transfère donc le mail
- Mon serveur fait une vérification SPF et compare avec l'IP du mx backup (etenil)
- Le message est rejeté car le champ SPF de example.com ne liste pas l'IP du mx backup (ce qui est normal)
La vérification SPF est donc problématique dans le cas où le message n'arrive pas directement mais transite par d'autres mx indépendants de l'expéditeur. Notez que par défaut Postfix ne fait pas de vérification SPF, cela est géré par un plugin. Mais YunoHost le propose par défaut.
La solution
Il faut définir une "spf whitelist" pour indiquer à Postfix de ne pas faire de vérification dans le cas où le serveur expéditeur est mon mx backup. J'ai trouvé la solution en lisant cette page de documentation.
Donc on édite notre /etc/postfix/main.cf puis on recherche la section suivante :
# Requirement for the recipient address smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_non_fqdn_recipient, reject_unknown_recipient_domain, reject_unauth_destination, check_policy_service unix:private/policy-spf check_policy_service inet:127.0.0.1:10023 permit
On va donc y insérer la directive permit relay_addresses mx2.example.com :
# Requirement for the recipient address smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, permit relay_addresses mx2.example.com reject_non_fqdn_recipient, reject_unknown_recipient_domain, reject_unauth_destination, check_policy_service unix:private/policy-spf check_policy_service inet:127.0.0.1:10023 permit
Ensuite on recharge Postfix :
# service postfix reload
Et voilà