Aller au contenu
Réussir mon BTS SIO

Tape une notion, une commande ou le nom d'une épreuve.

Par exemple

Chapitre 1115 minIntermédiaire

Messagerie sous Linux : relais Postfix et IMAP avec Dovecot

Par Josselyn C., prof de BTS SIO. Mis à jour le .

À la fin de ce chapitre, tu sauras

  • distinguer les rôles et les ports de la messagerie ;
  • configurer Postfix en relais pour les notifications d'un serveur ;
  • lire un journal Postfix et gérer la file d'attente ;
  • éviter un relais ouvert ;
  • monter une maquette de messagerie avec Postfix et Dovecot.

3 exercices corrigés1 schéma

Postfix est un serveur de messagerie SMTP (un MTA, Mail Transfer Agent) : il envoie les courriels vers d'autres serveurs et reçoit ceux qui arrivent pour ses domaines. Dovecot est un serveur IMAP : il permet aux logiciels de messagerie de lire les boîtes aux lettres stockées sur le serveur. Ce chapitre explique les rôles et les protocoles de la messagerie, configure Postfix en relais pour que les serveurs envoient leurs alertes et leurs notifications, puis monte, pour un TP, une messagerie complète avec Postfix et Dovecot.

Les rôles et les protocoles

Un courriel traverse plusieurs logiciels, chacun avec son rôle :

RôleNomExemplesProtocole
Écrire et lireMUA, le client de messagerieThunderbird, Outlook, un webmail, GLPI qui envoie une notificationSoumission en SMTP (587), lecture en IMAP (993)
TransporterMTA, le serveur SMTPPostfix, Exchange, les serveurs de Microsoft 365 ou de GmailSMTP (25) entre serveurs
Déposer dans la boîteMDALe livreur local de Postfix, LMTP de DovecotLocal
Donner accès aux boîtesServeur IMAP ou POPDovecotIMAP (993), POP3 (995)
srv-glpiGLPI vers Postfix127.0.0.1:25Relais du fournisseursmtp.sorbier.example587, authentifiéTLSServeur dudestinataireSPF, DKIM, DMARCSMTP25DNSMX du destinataireoù livrer ?Client demessagerieIMAP 993Postfix n'écoute qu'en local : aucune autre machine ne peut s'en servir comme relais.
Postfix en relais : le serveur ne parle qu'au relais du fournisseur, qui assure la distribution
PortUsageChiffrement
TCP 25SMTP entre serveursSTARTTLS, opportuniste
TCP 587Soumission : un client ou un serveur authentifié dépose un courriel à envoyerSTARTTLS, obligatoire en pratique
TCP 465Soumission en TLS impliciteTLS dès la connexion
TCP 993IMAP en TLSTLS dès la connexion
TCP 143IMAP, avec STARTTLSÀ éviter

Les enregistrements DNS de la messagerie (MX, SPF, DKIM, DMARC) disent quel serveur reçoit les courriels d'un domaine et quels serveurs ont le droit d'en envoyer. Ils sont présentés dans le cours Services réseau. Retiens leur conséquence pratique : un serveur qui envoie directement des courriels au nom de sorbier.example, sans figurer dans l'enregistrement SPF du domaine, verra ses messages classés comme indésirables ou refusés. C'est la raison pour laquelle les serveurs passent par le relais du fournisseur de messagerie.

Un relais pour les notifications des serveurs

Chez Sorbier, les boîtes aux lettres sont chez un fournisseur de messagerie en ligne. Les serveurs Linux ont pourtant besoin d'envoyer des courriels : notifications de GLPI, alertes de la supervision, rapports des tâches planifiées. Sur chacun, un Postfix minimal, dit satellite, accepte les courriels des programmes locaux et les relaie vers le serveur de soumission du fournisseur, smtp.sorbier.example, port 587, avec un compte dédié, alertes@sorbier.example.

Sur srv-glpi :

bash
sudo apt install postfix libsasl2-modules mailutils

L'installation pose deux questions : choisis le type Système satellite (Satellite system), puis indique le nom de courrier srv-glpi.ad.sorbier.example et le relais [smtp.sorbier.example]:587. Complète ensuite /etc/postfix/main.cf avec postconf -e, qui modifie une valeur sans risque de faute de frappe dans le fichier :

bash
sudo postconf -e 'inet_interfaces = loopback-only'
sudo postconf -e 'mydestination ='
sudo postconf -e 'relayhost = [smtp.sorbier.example]:587'
sudo postconf -e 'smtp_sasl_auth_enable = yes'
sudo postconf -e 'smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd'
sudo postconf -e 'smtp_sasl_security_options = noanonymous'
sudo postconf -e 'smtp_tls_security_level = encrypt'
sudo postconf -e 'smtp_generic_maps = hash:/etc/postfix/generic'
ParamètreRôle
inet_interfaces = loopback-onlyPostfix n'écoute que sur 127.0.0.1 : aucune autre machine ne peut lui confier un courriel. Ce n'est pas un relais ouvert
mydestination =Le serveur ne reçoit de courriel pour aucun domaine : tout part vers le relais
relayhost = [smtp.sorbier.example]:587Le serveur de soumission ; les crochets interdisent la recherche d'un enregistrement MX
smtp_sasl_*Authentification auprès du relais, avec le compte du fichier sasl_passwd
smtp_tls_security_level = encryptRefuse d'envoyer si la connexion au relais n'est pas chiffrée : le mot de passe ne part jamais en clair
smtp_generic_mapsRéécrit les adresses internes (root@srv-glpi.ad.sorbier.example) en une vraie adresse avant l'envoi

Le compte du relais, dans /etc/postfix/sasl_passwd :

text
[smtp.sorbier.example]:587  alertes@sorbier.example:Mot-De-Passe-Du-Compte

La réécriture des adresses, dans /etc/postfix/generic : tout ce qui vient de srv-glpi ou lui est adressé devient alertes@sorbier.example, une boîte lue par l'équipe :

text
@srv-glpi.ad.sorbier.example  alertes@sorbier.example
bash
sudo chmod 600 /etc/postfix/sasl_passwd
sudo postmap /etc/postfix/sasl_passwd /etc/postfix/generic
sudo postfix check
sudo systemctl restart postfix

postmap compile chaque fichier texte en une table indexée (sasl_passwd.db), la seule que Postfix lit : après chaque modification du fichier texte, relance postmap. Le fichier .db contient aussi le mot de passe et hérite des droits du fichier texte.

Le test.

bash
echo "Test du relais depuis srv-glpi" | mail -s "Test relais srv-glpi" amercier@sorbier.example
sudo journalctl -u postfix@- -n 20 --no-pager
# … postfix/smtp[2214]: 4F2A1C0412: to=<amercier@sorbier.example>, relay=smtp.sorbier.example[203.0.113.40]:587,
#     delay=1.2, dsn=2.0.0, status=sent (250 2.0.0 OK queued as …)

status=sent : le relais a accepté le courriel. Les autres états à connaître : status=deferred (échec temporaire, Postfix réessaiera, souvent un problème de réseau ou d'authentification) et status=bounced (refus définitif, un avis de non-remise est produit).

bash
mailq                     # file d'attente : les courriels pas encore partis
sudo postqueue -f         # réessayer tout de suite
sudo postsuper -d ALL deferred   # vider les courriels en attente (après avoir compris pourquoi)

Dans GLPI, Configuration > Notifications : active les suivis par courriel, puis, dans la configuration des courriels, choisis l'envoi par SMTP vers 127.0.0.1, port 25, sans authentification ni chiffrement (la connexion ne sort pas de la machine), avec l'adresse d'expéditeur alertes@sorbier.example, et envoie le courriel de test.

Une messagerie complète en maquette : Postfix et Dovecot

Pour comprendre la messagerie de bout en bout (et pour l'épreuve, où l'on peut te demander de lire une configuration), monte en TP un serveur qui reçoit des courriels et les sert en IMAP. Sur une VM de laboratoire mail.sorbier.example, isolée, avec des comptes Linux locaux (adduser jlefevre) :

bash
sudo apt install postfix dovecot-imapd

Choisis Site Internet à l'installation de Postfix, avec le nom de courrier sorbier.example. Puis :

bash
sudo postconf -e 'myhostname = mail.sorbier.example'
sudo postconf -e 'mydomain = sorbier.example'
sudo postconf -e 'myorigin = $mydomain'
sudo postconf -e 'mydestination = $myhostname, $mydomain, localhost'
sudo postconf -e 'mynetworks = 127.0.0.0/8 [::1]/128'
sudo postconf -e 'home_mailbox = Maildir/'
sudo postconf -e 'smtpd_tls_cert_file = /etc/ssl/mail/mail.crt'
sudo postconf -e 'smtpd_tls_key_file = /etc/ssl/mail/mail.key'
sudo postconf -e 'smtpd_tls_security_level = may'
sudo postconf -e 'smtpd_sasl_type = dovecot'
sudo postconf -e 'smtpd_sasl_path = private/auth'
sudo postconf -e 'smtpd_relay_restrictions = permit_mynetworks, permit_sasl_authenticated, defer_unauth_destination'
ParamètreRôle
mydestinationLes domaines dont ce serveur reçoit les courriels et les livre en local
mynetworksLes réseaux autorisés à relayer sans authentification : ici, la machine seule
home_mailbox = Maildir/Chaque courriel devient un fichier dans ~/Maildir/ de l'utilisateur, le format que Dovecot lira
smtpd_tls_*Le certificat présenté aux clients et aux autres serveurs (autosigné ou interne en maquette)
smtpd_sasl_type = dovecotLes mots de passe des clients qui veulent envoyer sont vérifiés par Dovecot
smtpd_relay_restrictionsRelayer vers l'extérieur seulement pour la machine locale ou un client authentifié ; tout le reste est refusé

Dans /etc/postfix/master.cf, active le service de soumission sur le port 587, réservé aux clients authentifiés et chiffrés (Debian fournit ces lignes en commentaire) :

text
submission inet n       -       y       -       -       smtpd
  -o syslog_name=postfix/submission
  -o smtpd_tls_security_level=encrypt
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_client_restrictions=permit_sasl_authenticated,reject

Dovecot 2.4, la version de Debian 13, a une syntaxe de configuration nouvelle, incompatible avec celle de la version 2.3 que montrent beaucoup de tutoriels. Debian répartit sa configuration dans /etc/dovecot/conf.d/ et lit en dernier /etc/dovecot/local.conf, où l'on met ses propres réglages :

text
# /etc/dovecot/local.conf
# Boîtes au format Maildir, dans le dossier personnel
mail_driver = maildir
mail_path = ~/Maildir
mail_inbox_path =

# Certificat présenté aux clients IMAP
ssl_server_cert_file = /etc/ssl/mail/mail.crt
ssl_server_key_file = /etc/ssl/mail/mail.key

# Socket d'authentification pour Postfix
service auth {
  unix_listener /var/spool/postfix/private/auth {
    mode = 0660
    user = postfix
    group = postfix
  }
}

Par défaut, Debian authentifie les comptes du système par PAM (passdb pam) et stocke les boîtes au format mbox dans /var/mail : le bloc ci-dessus passe au format Maildir, un fichier par message, plus robuste. La ligne mail_inbox_path = annule le chemin mbox de la boîte de réception défini par Debian.

bash
sudo doveconf -n | head -30       # configuration effective : une erreur de syntaxe s'affiche ici
sudo systemctl restart dovecot postfix
sudo doveadm auth test jlefevre   # vérifie le mot de passe d'un compte

Le test de bout en bout. Envoie un courriel local, vérifie qu'il est livré, puis lis-le en IMAP :

bash
echo "Bonjour" | mail -s "Test local" jlefevre@sorbier.example
ls /home/jlefevre/Maildir/new/
openssl s_client -connect mail.sorbier.example:993 -quiet
# a1 LOGIN jlefevre motdepasse
# a2 LIST "" "*"
# a3 SELECT INBOX
# a4 FETCH 1 BODY[HEADER.FIELDS (SUBJECT FROM)]
# a5 LOGOUT

Dans un client de messagerie (Thunderbird), le compte se configure avec IMAP sur le port 993 en SSL/TLS, et SMTP sur le port 587 en STARTTLS, avec le même identifiant et le même mot de passe.

Exercices

Exercice 1 sur 3 Lire un journal Postfix Réussi À revoir

Les notifications de GLPI ne partent plus. Le journal de Postfix sur srv-glpi contient :

text
postfix/smtp[3121]: 7B1D2C0455: to=<amercier@sorbier.example>, relay=smtp.sorbier.example[203.0.113.40]:587, delay=0.9, dsn=4.7.0, status=deferred (SASL authentication failed; server smtp.sorbier.example[203.0.113.40] said: 535 5.7.8 Error: authentication failed)

Explique ce qui se passe, ce que deviennent les courriels, et comment corriger.

Voir la réponseMasquer la réponse de l'exercice 1

Postfix joint bien le relais et chiffre la connexion, mais le relais refuse l'authentification (code 535) : le mot de passe du compte alertes@sorbier.example a changé, a expiré, ou le fournisseur a désactivé l'authentification par mot de passe pour ce compte. L'état est deferred : les courriels restent dans la file d'attente (mailq) et Postfix réessaiera régulièrement, jusqu'à 5 jours par défaut, avant de les renvoyer en erreur.

Correction : vérifier le compte chez le fournisseur, corriger le mot de passe dans /etc/postfix/sasl_passwd, puis sudo postmap /etc/postfix/sasl_passwd, et sudo postqueue -f pour renvoyer tout de suite les courriels en attente. Vérifier ensuite dans le journal que l'état passe à status=sent. À prévoir : une alerte de supervision sur la taille de la file d'attente, pour ne pas découvrir le problème des jours plus tard.

Tu avais trouvé ?

Exercice 2 sur 3 Relais ouvert ? Réussi À revoir

Sur un serveur de maquette, un étudiant a écrit inet_interfaces = all et mynetworks = 0.0.0.0/0 « pour que les autres VM puissent envoyer ». Quel est le risque si ce serveur est un jour exposé sur Internet ? Propose une configuration qui laisse envoyer les VM du réseau de maquette 10.10.0.0/24 sans ce risque.

Voir la réponseMasquer la réponse de l'exercice 2

mynetworks = 0.0.0.0/0 déclare toute adresse IPv4 comme réseau de confiance : n'importe qui sur Internet peut faire relayer des courriels vers n'importe quelle destination. C'est un relais ouvert : il servira à envoyer du pourriel en masse, et l'adresse du serveur sera inscrite sur les listes noires, ce qui bloquera ensuite tous les courriels légitimes.

Correction : mynetworks = 127.0.0.0/8 [::1]/128 10.10.0.0/24, en gardant smtpd_relay_restrictions = permit_mynetworks, permit_sasl_authenticated, defer_unauth_destination, et le pare-feu local qui n'accepte le port 25 que du réseau de maquette. Mieux encore : que les VM s'authentifient sur le port 587 plutôt que d'être autorisées par leur adresse.

Tu avais trouvé ?

Exercice 3 sur 3 Le bon port Réussi À revoir

Pour chaque connexion, donne le port et le protocole : (a) Thunderbird envoie un courriel par le serveur de l'entreprise ; (b) le serveur de l'entreprise transmet ce courriel au serveur du destinataire ; (c) Thunderbird relève les courriels en les laissant sur le serveur ; (d) Postfix de srv-glpi dépose une notification chez le relais du fournisseur.

Voir la réponseMasquer la réponse de l'exercice 3
  • (a) SMTP de soumission, TCP 587 avec STARTTLS et authentification (ou 465 en TLS implicite).
  • (b) SMTP, TCP 25, de serveur à serveur, le serveur destinataire étant trouvé par son enregistrement MX.
  • (c) IMAP, TCP 993 en TLS : les courriels restent sur le serveur, synchronisés entre les appareils. POP3 (995) les téléchargerait en général pour les supprimer du serveur.
  • (d) SMTP de soumission, TCP 587, authentifié et chiffré (smtp_tls_security_level = encrypt).

Tu avais trouvé ?

Chapitre terminé !

Fais les 3 exercices avant de passer à la suite : c'est en t'entraînant que tout se fixe.

chapitres
–
de série
–
du cours
–
Chapitre suivant : Journaux des services Linux : journald, rsyslog et agent WazuhRevoir le sommaire du cours