🌐 Postfix, Dovecot — SPF, DKIM et délivrabilité

C2.2.4 3h30 M2.2 — Séance 2
FormationBTS SIO option SISR — IRIS Mediaschool
BlocB2 — Administration Systèmes & Réseaux
ModuleM2.2 — Services réseau et systèmes
CompétencesB2.2 / B2.3
Durée3h30
PrérequisAvoir complété la Séance 1 (Apache/Nginx/TLS)

Introduction (10 min)

🎯 Accroche

Une PME française a récemment subi une campagne de phishing ciblée où des courriels apparaissaient provenir de son propre domaine. L'absence de mécanismes d'authentification d'origine (SPF, DKIM, DMARC) a permis aux attaquants d'usurper l'identité de l'entreprise, entraînant perte de confiance et incidents opérationnels.

Cette séance montre comment déployer un serveur mail complet (Postfix + Dovecot) et garantir la délivrabilité via SPF, DKIM et DMARC, pour réduire l'usurpation d'identité et améliorer la réputation de domaine.

🎯 Objectifs de la séance

À l'issue de cette séance, vous serez capable de :

  • Installer et configurer Postfix en MTA pour le domaine innovattech.fr, gérer la file d'envoi et les services (postfix check, postqueue/mailq, postsuper).
  • Configurer Dovecot comme MDA/IMAP (Maildir) et comme fournisseur SASL pour l'authentification SMTP, en vérifiant les fichiers de conf (conf.d/10-auth.conf, 10-mail.conf, 10-ssl.conf).
  • Mettre en place SPF, DKIM (génération de paire de clés opendkim-genkey et configuration du milter) et DMARC dans BIND9, puis tester l'envoi via mail/telnet/openssl.

📖 1. Postfix — Architecture et configuration principale (70 min)

Postfix est un MTA (Mail Transfer Agent) robuste qui gère l'envoi et la réception des messages via SMTP. Sa configuration principale se trouve dans /etc/postfix/main.cf et /etc/postfix/master.cf. Les paramètres clefs contrôlent l'identité du serveur (myhostname/mydomain), les réseaux autorisés à relayer (mynetworks), le relais sortant éventuel (relayhost) et les fichiers de certificat TLS.

Configuration de /etc/postfix/main.cf

Exemple de réglages pertinents pour InnovatTech :

# Identité
myhostname = mail.innovattech.fr
mydomain = innovattech.fr
myorigin = $mydomain
inet_interfaces = all
inet_protocols = all

# Réseaux considérés fiables (DMZ et localhost)
mynetworks = 127.0.0.0/8, 192.168.10.0/24, 192.168.30.0/24

# TLS
smtpd_tls_cert_file = /etc/letsencrypt/live/mail.innovattech.fr/fullchain.pem
smtpd_tls_key_file = /etc/letsencrypt/live/mail.innovattech.fr/privkey.pem
smtpd_tls_security_level = may
smtp_tls_security_level = may

# SASL via Dovecot
auth_mechanisms = plain login
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_auth_enable = yes

# Milter (DKIM) - à compléter si opendkim installé
smtpd_milters = unix:/opendkim/opendkim.sock
non_smtpd_milters = $smtpd_milters
💡 Commandes d'administration

postfix check vérifie la cohérence des fichiers de configuration, postqueue -p ou mailq affiche la file d'attente, et postsuper -d permet de supprimer des messages problématiques.

# Vérifier la configuration
sudo postfix check

# Afficher la file d'attente
postqueue -p

# Supprimer tous les messages en file (ATTENTION : irréversible)
sudo postsuper -d ALL

# Relancer postfix après modifications
sudo systemctl restart postfix

Exemple de sortie de postqueue -p

-Queue ID- --Size-- ----Arrival Time---- -Sender/Recipient-------
A1B2C3D4E  1234 Wed Apr 20 10:15:00  sender@innovattech.fr
        recipient@example.com

-- 1 Kbytes in 1 Request.

Service submission (port 587) dans master.cf

master.cf définit les services et permet d'exposer le service submission pour l'envoi authentifié (port 587) :

submission inet n       -       y       -       -       smtpd
  -o syslog_name=postfix/submission
  -o smtpd_tls_security_level=encrypt
  -o smtpd_sasl_auth_enable=yes
💡 Port 587

Le port 587 (submission) doit être disponible pour que les clients (Outlook, Mutt, Thunderbird, etc.) puissent envoyer en authentifié via TLS. Ne pas confondre avec le port 25 (SMTP serveur-à-serveur) ni le port 465 (SMTPS historique).

Récapitulatif des commandes Postfix

CommandeRôle
postfix checkVérifie la cohérence de la configuration
postqueue -p / mailqAffiche la file d'attente (messages en attente d'envoi)
postsuper -d <id>Supprime un message précis de la file
postsuper -d ALLPurge l'intégralité de la file (avec précaution)
postconf -e "param=val"Modifie un paramètre dans main.cf en ligne de commande
systemctl restart postfixRecharge le service après modification de la conf

📖 2. Dovecot — MDA, IMAP/POP3 et fournisseur SASL (60 min)

Dovecot est à la fois un serveur IMAP/POP3 et un MDA (Mail Delivery Agent) capable de livrer localement dans des répertoires Maildir. De plus, Dovecot expose une socket d'authentification utilisée par Postfix pour effectuer la SASL (authentification SMTP), ce qui simplifie la gestion des comptes.

Fichiers de configuration importants

FichierRôle
/etc/dovecot/conf.d/10-auth.confMécanismes d'authentification et sources (system users, passwd-file, etc.)
/etc/dovecot/conf.d/10-mail.confmail_location — définit le format des boîtes (ex. maildir:~/Maildir)
/etc/dovecot/conf.d/10-ssl.confActivation SSL/TLS et chemins des certificats
/etc/dovecot/conf.d/10-master.confListeners — notamment la socket Postfix (unix_listener)

Extraits de configuration essentiels

# /etc/dovecot/conf.d/10-mail.conf
mail_location = maildir:~/Maildir

# /etc/dovecot/conf.d/10-auth.conf
auth_mechanisms = plain login
!include auth-system.conf.ext

# /etc/dovecot/conf.d/10-ssl.conf
ssl = required
ssl_cert = </etc/letsencrypt/live/mail.innovattech.fr/fullchain.pem
ssl_key = </etc/letsencrypt/live/mail.innovattech.fr/privkey.pem

Socket d'authentification pour Postfix

Pour que Postfix délègue l'authentification à Dovecot, il faut exposer la socket avec les permissions adaptées :

# /etc/dovecot/conf.d/10-master.conf (extrait)
service auth {
  unix_listener /var/spool/postfix/private/auth {
    mode = 0660
    user = postfix
    group = postfix
  }
}
⚠️ Attention

Le chemin /var/spool/postfix/private/auth doit correspondre à la valeur de smtpd_sasl_path = private/auth dans main.cf de Postfix. Un écart de chemin provoque une erreur d'authentification silencieuse.

Commandes Dovecot utiles

# Vérifier la configuration (n = non-default settings)
sudo doveconf -n

# Lister les infos d'un utilisateur
doveadm user alice

# Tester l'authentification
doveadm auth test alice 'son-mot-de-passe'

# Lister les boîtes aux lettres d'un utilisateur
doveadm mailbox list -u alice

# Lister les messages dans INBOX
doveadm fetch -u alice mailbox "INBOX" all

Création de boîtes Maildir pour 5 utilisateurs

for u in alice bob carol dave eve; do
  sudo adduser --disabled-password --gecos "" $u
  sudo -u $u mkdir -p /home/$u/Maildir/{cur,new,tmp}
  sudo chown -R $u:$u /home/$u/Maildir
done
💡 Format Maildir

Le format Maildir stocke chaque message dans un fichier séparé, dans trois sous-répertoires : new/ (non lus), cur/ (lus), tmp/ (en cours de livraison). Contrairement à mbox (un seul fichier), Maildir est résistant à la corruption et peut être accédé en parallèle.

📖 3. Délivrabilité — SPF, DKIM et DMARC (30–40 min)

SPF, DKIM et DMARC sont complémentaires : SPF permet de déclarer les IP autorisées à envoyer pour un domaine, DKIM signe cryptographiquement les messages sortants pour vérifier l'intégrité et l'origine, et DMARC permet au propriétaire du domaine de donner une politique (none/quarantine/reject) et de recevoir des rapports.

MécanismeCoucheProtège contreEnregistrement DNS
SPFEnveloppe SMTP (MAIL FROM)IP non autorisées à envoyerTXT @
DKIMContenu du message (headers)Modification du message en transitTXT selector._domainkey
DMARCPolitique & reportingAlignement SPF/DKIM + visibilitéTXT _dmarc

SPF — Enregistrement DNS

@ IN TXT "v=spf1 ip4:91.208.45.12 -all"

La directive -all signifie que tout expéditeur non listé est rejeté (hard fail). Utiliser ~all pour un soft fail (marquage sans rejet) en phase de test.

DKIM — Génération de la paire de clés

sudo apt install -y opendkim opendkim-tools
cd /etc/opendkim/keys
sudo mkdir -p innovattech.fr
cd innovattech.fr
sudo opendkim-genkey -s mail -d innovattech.fr
# Crée 'mail.private' (clé privée) et 'mail.txt' (entrée DNS publique)
sudo chown opendkim:opendkim mail.private

Le fichier généré mail.txt contient la ligne à coller dans la zone DNS sous le sélecteur mail._domainkey :

mail._domainkey IN TXT ( "v=DKIM1; k=rsa; p=MIIBIjANBgkq..." )

Configuration d'OpenDKIM

# /etc/opendkim/KeyTable
mail._domainkey.innovattech.fr innovattech.fr:mail:/etc/opendkim/keys/innovattech.fr/mail.private

# /etc/opendkim/SigningTable
*@innovattech.fr mail._domainkey.innovattech.fr

Ajouter également 127.0.0.1 et les IP internes dans /etc/opendkim/TrustedHosts.

Liaison Postfix ↔ OpenDKIM (milter)

# /etc/postfix/main.cf — ajout milter
smtpd_milters = unix:/opendkim/opendkim.sock
non_smtpd_milters = $smtpd_milters
milter_default_action = accept
milter_protocol = 6
⚠️ Propagation DNS

Le TTL et la propagation DNS influent sur la prise en compte des nouveaux enregistrements. Pour DKIM, copier précisément la valeur publique fournie par opendkim-genkey — toute erreur de copier-coller invalide la signature.

DMARC — Enregistrement DNS

_dmarc IN TXT "v=DMARC1; p=quarantine; rua=mailto:admin@innovattech.fr"

La politique p=quarantine demande aux serveurs destinataires de placer les messages non conformes en spam. En production, commencer par p=none pour collecter les rapports sans impacter la délivrabilité.

💻 Travaux Pratiques (70 min)

Contexte

Vous êtes administrateur chez InnovatTech et devez déployer un serveur mail complet sur debian-srv02 (DMZ) pour le domaine innovattech.fr. L'objectif est de pouvoir envoyer et recevoir du courrier, créer 5 boîtes locales et configurer SPF/DKIM/DMARC dans BIND9.

Prérequis techniques

  • Accès root sur debian-srv02 (DMZ), Debian 12.
  • Zone BIND9 du domaine innovattech.fr modifiable.
  • IP publique 91.208.45.12 pointe vers mail.innovattech.fr.

Étapes

Étape 1 — Installation des paquets

sudo apt update
sudo apt install -y postfix dovecot-imapd dovecot-pop3d opendkim opendkim-tools

Étape 2 — Configuration de Postfix

sudo postconf -e "myhostname = mail.innovattech.fr"
sudo postconf -e "mydomain = innovattech.fr"
sudo postconf -e "myorigin = \$mydomain"
sudo postconf -e "mynetworks = 127.0.0.0/8, 192.168.10.0/24, 192.168.30.0/24"
sudo postconf -e "home_mailbox = Maildir/"

# Vérifier
sudo postfix check
postqueue -p

Étape 3 — Configuration de Dovecot

Éditer conf.d/10-mail.conf, 10-auth.conf, 10-ssl.conf et 10-master.conf comme indiqué dans la partie théorique, puis redémarrer :

sudo systemctl restart dovecot postfix
sudo doveconf -n

Étape 4 — Création de 5 utilisateurs et boîtes Maildir

for u in alice bob carol dave eve; do
  sudo adduser --disabled-password --gecos "" $u
  sudo -u $u mkdir -p /home/$u/Maildir/{cur,new,tmp}
done

Étape 5 — Installation et configuration d'OpenDKIM

sudo mkdir -p /etc/opendkim/keys/innovattech.fr
cd /etc/opendkim/keys/innovattech.fr
sudo opendkim-genkey -s mail -d innovattech.fr
sudo chown -R opendkim:opendkim /etc/opendkim/keys

Copier le contenu de mail.txt dans la zone BIND9, puis configurer KeyTable, SigningTable, TrustedHosts et relier Postfix au milter.

Étape 6 — Enregistrements DNS dans BIND9

@    IN  MX 10 mail.innovattech.fr.
mail IN  A  91.208.45.12
@    IN  TXT "v=spf1 ip4:91.208.45.12 -all"
mail._domainkey IN TXT ("v=DKIM1; k=rsa; p=MIIBIjANBgkq..." )
_dmarc IN TXT "v=DMARC1; p=quarantine; rua=mailto:admin@innovattech.fr"
# Recharger BIND9 après modification
sudo rndc reload

Étape 7 — Tests d'envoi et diagnostic

# Envoyer un message en local
echo "Corps du message" | mail -s "Test mail" alice@innovattech.fr

# Vérifier la file d'envoi
postqueue -p

# Tester la conversation SMTP en local via telnet
telnet localhost 25
# HELO mail.innovattech.fr
# MAIL FROM:<admin@innovattech.fr>
# RCPT TO:<alice@innovattech.fr>
# DATA
# Subject: test
# Test message
# .
# QUIT

# Tester STARTTLS sur le port 587
openssl s_client -starttls smtp -crlf \
  -connect mail.innovattech.fr:587 \
  -servername mail.innovattech.fr

Vérifier dans les en-têtes du message reçu : Received-SPF: pass et DKIM-Signature présents, ainsi que les résultats DMARC (rapports envoyés à admin@innovattech.fr).

Livrable attendu

  • Fichiers de configuration Postfix (/etc/postfix/main.cf, /etc/postfix/master.cf) et Dovecot (/etc/dovecot/conf.d/10-*.conf) annotés.
  • Clé DKIM privée sur le serveur (/etc/opendkim/keys/innovattech.fr/mail.private) et enregistrement DNS public collé dans la zone BIND9.
  • Preuve d'envoi/réception : sortie de postqueue -p, en-têtes d'un message reçu montrant SPF/DKIM pass, copie de la sortie openssl s_client.

Critères de réussite

  • ☐ Un envoi interne depuis debian-srv02 vers une boîte locale arrive dans le Maildir et est lisible via mutt/IMAP.
  • postqueue -p n'affiche pas d'accumulation d'erreurs bloquantes (ou les messages en erreur sont compris et documentés).
  • ☐ Les en-têtes d'un message sortant montrent SPF=pass et DKIM=pass (ou, à défaut, explication et correction).
  • ☐ Les enregistrements DNS SPF, DKIM (selector._domainkey) et DMARC sont présents dans la zone et visibles via dig/host.

📝 Synthèse (10 min)

Cette séance a montré la chaîne complète de la messagerie : Postfix pour transporter les messages, Dovecot pour la livraison et l'authentification SASL, et OpenDKIM/BIND9 pour garantir l'authenticité des messages signés. La combinaison SPF+DKIM+DMARC réduit fortement la capacité d'un attaquant à usurper le domaine et améliore la délivrabilité auprès des fournisseurs de boîtes externes.

💡 À retenir
  • Postfix = MTA (transport SMTP) ; Dovecot = MDA + serveur IMAP/POP3 + fournisseur SASL.
  • SPF ≠ DKIM : SPF vérifie l'IP expéditrice, DKIM vérifie l'intégrité et l'origine via signature cryptographique.
  • DMARC orchestre SPF+DKIM et génère des rapports — indispensable pour la visibilité des abus.
  • En production : surveiller régulièrement les rapports DMARC et les files Postfix.
❓ Question de vérification

En une phrase, expliquez la différence fonctionnelle entre SPF et DKIM.

Voir la réponse

SPF contrôle quelles adresses IP sont autorisées à envoyer des e-mails au nom du domaine (vérification de l'enveloppe SMTP), tandis que DKIM appose une signature cryptographique sur les en-têtes du message pour prouver qu'il n'a pas été altéré et qu'il provient bien du domaine signataire.

Cours suivant : C2.2.5 — Virtualisation (VMware, Proxmox, Hyper-V) — création et gestion de machines virtuelles, impact sur la disponibilité des services.

🎮 Quiz — Auto-évaluation (5 questions)

  1. Q1 (QCM) — Quelle commande Postfix affiche la file d'attente des messages en cours d'envoi ?

  2. Q2 (QCM) — Dans Dovecot, quel fichier de configuration définit l'emplacement des boîtes aux lettres (ex. maildir:~/Maildir) ?

  3. Q3 (Vrai/Faux) — SPF et DKIM font exactement la même chose : ils vérifient tous les deux que l'adresse IP expéditrice est autorisée.

  4. Q4 (QCM) — Quel enregistrement DNS faut-il ajouter pour publier la clé publique DKIM du sélecteur mail sur le domaine innovattech.fr ?

  5. Q5 (QCM) — Que signifie la politique DMARC p=quarantine ?

Le plugin de quiz enregistre votre score et vos points pour le leaderboard.

📋 Afficher les corrections détaillées
  1. C — postqueue -p : affiche la file d'attente (équivalent à mailq). postfix check vérifie la config, postsuper -d ALL purge la file.
  2. B — 10-mail.conf : c'est ici que se définit la directive mail_location qui indique le format et l'emplacement des boîtes.
  3. Faux : SPF vérifie que l'IP expéditrice est autorisée pour le domaine (enveloppe SMTP). DKIM appose une signature cryptographique sur les en-têtes du message pour prouver son intégrité et son origine — ce sont deux mécanismes complémentaires, pas identiques.
  4. A — mail._domainkey.innovattech.fr IN TXT … : la clé publique DKIM se publie sous le nom <sélecteur>._domainkey.<domaine>. Ici le sélecteur est mail, donc mail._domainkey.innovattech.fr.
  5. D : p=quarantine demande aux serveurs destinataires de mettre en spam les messages non conformes. p=none = surveillance uniquement, p=reject = rejet définitif.