Serveur mail et webmail – part. 4 – SPF, DKIM, DMARC

Après avoir installé un serveur de messagerie complètement fonctionnel, nous allons installer et configurer deux mécanismes pour permettre à nos correspondants de détecter des usurpations de nos adresses.

Article éditer le 19 septembre : ajout du paragraphe de contrôle d’adresse d’émetteur

Source : Part 4: Set Up SPF & DKIM with Postfix on et c’est la suite de Serveur mail et webmail – part. 3 – postfix admin – Mariadb

SPF et DKIM

SFP, pour Sender Policy Framework, spécifie quels sont les serveurs ou adresses IP autorisés à émettre des mails pour nos domaines de messagerie, en l’occurrence notre serveur. Nous allons écrire ceci dans un enregistrement DNS

DKIM pour DomainKeys Identified Mail est un mécanisme de signature des mails émis. Nous publierons la clé publique dans un enregistrement DNS.

DMARC pour Domain-based Message Authentication, Reporting, and Conformance, permet d’indiquer quoi faire quand les mécanismes ci-dessus échoue

SPF – sortant

A l’apex de notre domaine nous allons ajouter un enregistrement TXT qui contient v=spf1 mx ~all qui signifie que seul les relais de mails sont autorisés à émettre – ou un même serveur sert à recevoir et émettre. Si les mails proviennent d’un autre serveur, ils doivent être considérer douteux. En mettant -all à la place on indique de rejeter les mails.

Je n’ai pas mis les guillemets lors de la saisie, Gandi les a ajoutés. Je ne détail pas la syntaxe plus avant, la littérature sur internet abonde.

SPF – entrant

Nous allons analyser les messages entrant. Installons le module

root@klopmail:~# apt-get install postfix-policyd-spf-python

Pour le lancer avec les autres services postfix cela se passe dans le fichier master.cf

root@klopmail:~# vi /etc/postfix/master.cf

et ajoutons les lignes suivantes à la fin

policyd-spf  unix  -       n       n       -       0       spawn
  user=policyd-spf argv=/usr/bin/policyd-spf

Sauvegardons ce fichier et configurons ce module spf dans main.cf

root@klopmail:~# vi /etc/postfix/main.cf

Ajoutons les lignes suivantes à la fin

policyd-spf_time_limit = 3600
smtpd_recipient_restrictions =
   permit_mynetworks,
   permit_sasl_authenticated,
   reject_unauth_destination,
   check_policy_service unix:private/policyd-spf

Sauvegardons et redémarrons le service

root@klopmail:~# systemctl restart postfix

Désormais, lorsqu’un message provient d’un émetteur avec un enregistrement SPF, l’entête Received-SPF est positionnée.

Installons DKIM

root@klopmail:~# apt-get install opendkim opendkim-tools

Ajoutons l’utilisateur postfix au groupe opendkim

root@klopmail:~# usermod -a -G opendkim postfix
root@klopmail:~# groups postfix
postfix : postfix opendkim

Éditons le fichier de configuration

root@klopmail:~# vi /etc/opendkim.conf

Décommentons les trois suivantes :

Canonicalization        relaxed/simple
Mode                    sv
SubDomains              no

Ajoutons les lignes suivantes à la fin du fichier

# Map domains in From addresses to keys used to sign messages
KeyTable           refile:/etc/opendkim/key.table
SigningTable       refile:/etc/opendkim/signing.table

# Hosts to ignore when verifying signatures
ExternalIgnoreList  /etc/opendkim/trusted.hosts

# A set of internal hosts whose mail should be signed
InternalHosts       /etc/opendkim/trusted.hosts

Créons l’arborescence

root@klopmail:~# mkdir -p /etc/opendkim/keys
root@klopmail:~# chown -R opendkim:opendkim /etc/opendkim
root@klopmail:~# chmod go-rw /etc/opendkim/keys/

Nous créons la table de signature

root@klopmail:~# vi /etc/opendkim/signing.table

Une clé pour tout, ajoutons les lignes

*@dync.fr       default._domainkey.dync.fr
*@*.dync.fr     default._domainkey.dync.fr
*@framboisier.fr        default._domainkey.framboisier.fr
*@*.framboisier.fr      default._domainkey.framboisier.fr

Sauvegardons et créons la table des clés

root@klopmail:~# vi /etc/opendkim/key.table

Avec le contenu suivant

default._domainkey.dync.fr     dync.fr:default:/etc/opendkim/keys/dync.fr/default.private
default._domainkey.framboisier.fr     framboisier.fr:default:/etc/opendkim/keys/framboisier.fr/default.private

Sauvegardons et créons le fichier trusted.hosts

root@klopmail:~# vi /etc/opendkim/trusted.hosts

Avec le contenu suivant, pour expliquer à OpenDKIM que les mails locaux et provenant des domaines listés de signer plutôt que de vérifier la signature.

127.0.0.1
::1
localhost

.dync.fr
.framboisier.fr

Les noms de domaines commence par un point. Sauvegardons le fichier.

Génération de la bi-clé

Générons une bi-clé de 2048 bits (-b) pour le domaine dync.fr (-d) sauvegardée dans le répertoire (-D) avec comme nom/selecteur default (-s)

root@klopmail:~# mkdir /etc/opendkim/keys/dync.fr
root@klopmail:~# opendkim-genkey -b 2048 -d dync.fr -D /etc/opendkim/keys/dync.fr -s default -v
opendkim-genkey: generating private key
opendkim-genkey: private key written to default.private
opendkim-genkey: extracting public key
opendkim-genkey: DNS TXT record written to default.txt
root@klopmail:~# chown opendkim:opendkim /etc/opendkim/keys/dync.fr/default.private 
root@klopmail:~# chmod 600 /etc/opendkim/keys/dync.fr/default.private
root@klopmail:~# ln -s /etc/opendkim/keys/dync.fr /etc/opendkim/keys/framboisier.fr

Le fichier default.txt contient l’enregistrement DNS à créer

root@klopmail:~# cat /etc/opendkim/keys/dync.fr/default.txt
default._domainkey      IN      TXT     ( "v=DKIM1; h=sha256; k=rsa; "
          "p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsxAFlMfR6JEcmeRP8FZQ9zRTRP8xiPVyMMRduFURaLkjA3tqStNMFW6AisXQd5e32T2C2G8K+IiRqsTh9Pk7b4aQ6FS61M2vWdErSN3L/J1KeVeaVMl9IJs/ITRepKFmPE2jpY0+pLttE6h5e1X7Mo1BE9a4dCEv1qj6MbydoMbBh+tbb84Wrn2Pk49CZ372s8PXsYP9vxOH4y"
          "DpWDQbML+r5szX9/J7jHtP0Rp3eDjSjxH4mennv/YxwutnrMh+hlc3jAYv/Q87VA4ch/1PVwDn1T9Na9jzfuEEMLSdCGRibJqsj3g7YYXFS5qgFAc4QfBeC93k0SetRCMAVjtSNwIDAQAB" )  ; ----- DKIM key default for dync.fr

Créons l’enregistrement DNS default._domainkey de type texte dans la zone dync.fr avec l’intégralité du contenu de ce qui est entre parenthèses

et dans la zone framboisier.fr, nous créons un alias

default._domainkey in cname default._domainkey.dync.fr

On peut tester

root@klopmail:~# opendkim-testkey -d dync.fr -s default -vvv
opendkim-testkey: using default configfile /etc/opendkim.conf
opendkim-testkey: checking key 'default._domainkey.dync.fr'
opendkim-testkey: key secure
opendkim-testkey: key OK

Si key not secure apparait, cela signifie que votre zone n’est pas protégé par DNSSEC, ce n’est pas bloquant.

Brancher OpenDKIM sur postfix

Les échanges entre OpenDKIM et postfix se font via une socket Unix usuellement /run/opendkim/opendkim.sock. Mais sous Debian postfix tourne dans un environnement chroot, ie sa racine est /var/spool/postfix et ne peut en sortir.

Créons un répertoire propriété d’opendkim et accessible par postfix.

root@klopmail:~# mkdir /var/spool/postfix/opendkim
root@klopmail:~# chown opendkim:postfix /var/spool/postfix/opendkim

Éditons le fichier de configuration d’OpenDKIM

root@klopmail:~# vi /etc/opendkim.conf 

Et changer la ligne Socket local:… par

Socket                  local:/var/spool/postfix/opendkim/opendkim.sock

Sauvegardons et fermons ce fichier. Éditons /etc/default/opendkim

root@klopmail:~# vi /etc/default/opendkim

Et remplaçons SOCKET=… par

SOCKET="local:/var/spool/postfix/opendkim/opendkim.sock"

Sauvegardons ce fichier et configurons postfix :

root@klopmail:~# vi /etc/postfix/main.cf

Et ajoutons à la fin du fichier

# Milter configuration
milter_default_action = accept
milter_protocol = 6
smtpd_milters = local:opendkim/opendkim.sock
non_smtpd_milters = $smtpd_milters

Sauvegardons ce fichier et redémarrons OpenDKIM et postfix

root@klopmail:~# systemctl restart opendkim postfix

DMARC

DMARC est l’enregistrement DNS _dmarc de type texte (créons le dans la zone dync.fr)

_dmarc in txt "v=DMARC1; p=none; pct=100; rua=mailto:abuse@dync.fr"
  • v= est la version
  • p= est l’action « none » pour rien, cela peut être « reject » ou « quarantine »
  • pct= est le pourcentage des mails auxquels s’applique la politique
  • rua= est l’URL où envoyer les rapports

Pour les autres domaine, je vais créer un alias (ne pas oublier le . à la fin)

_dmarc in cname _dmarc.dync.fr.

Tests

Envoyons un message à une boite gmail et depuis l’interface web cliquons sur les trois points verticaux et « afficher l’original » :

Et en répondant au message, dans Thunderbird dans le menu autre, en sélectionnant « Afficher la source », nous devrions voir Authentication-Results … dkim=pass et Reveived-SPF:Pass

Vous pouvez aussi tester avec Mail Tester, le résultat devrait être de 10/10

Interdire les messages d’internet avec des adresses d’émetteur locaux

Paragraphe ajouter le 19 Septembre

Nous allons ignorer un message en provenance d’internet dont l’adresse d’émetteur est un domaine local. J’ai commencer par les rejeter, mais cela génère un avis de non-remise qui, considéré comme légitime, arrive dans la boite de « l’émetteur ». Commençons par créer la table :

root@klopmail:~# vi /etc/postfix/reject-local

avec le contenu suivant :

framboisier.fr  DISCARD
dync.fr DISCARD 

Transformons le en hash table:

root@klopmail:~# postmap /etc/postfix/reject-local

Intégrons le à la configuration de postfix :

root@klopmail:~# vi /etc/postfix/main.cf

Ajoutons les lignes suivantes après la section smtpd_recipient_restrictions =

smtpd_sender_restrictions =
   permit_mynetworks,
   permit_sasl_authenticated,
   reject_unknown_sender_domain,
   check_sender_access hash:/etc/postfix/reject-local

Redémarrons postfix

root@klopmail:~# systemctl restart postfix

L’article suivant traite de l’installation d’un webmail, c’est optionnel : Serveur mail et webmail – part. 5 – Roundcube

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *