====== Partie 1 : Postfix ======
Nous allons voir dans cette série d'article comment monter un serveur de messagerie électronique. Avant de rentrer dans le détail de l'installation et la configuration de Postfix, on va voir comment fonctionne l'envoie d'un courrier électronique, ou courriel.
===== Fonctionnement d'un serveur de messagerie électronique =====
Pour pouvoir envoyer un courriel et le faire parvenir jusqu'à son destinataire, il vous faut 3 choses :
* Un MTA (Mail Transfer Agent ou Agent de Transfert du Courrier en français), Posftix dans notre cas. Il va se charger d'envoyer le courriel. Il utilise le protocole SMTP (Simple Mail Transfer Protocol ou Protocole Simple de Transfert de Courrier en français).
* Un MDA (Mail Delivery Agent ou Agent de Distribution du Courrier en français), Dovecot dans notre cas. Il va se charger de remettre le courriel au destinataire. Il utilise le protocole POP (Post Office Protocol ou Protocole de Bureau de Poste en français) ou IMAP (Internet Message Access Protocol ou Protocole d'Accès au Courrier Électronique en français).
* Un MUA (Mail User Agent ou Agent Utilisateur de Courrier en français littéral), Thunderbird ou un webmail comme Roundcube par exemple. Il va se charger d'afficher le courriel à l'utilisateur.
Un petit schéma valant mieux qu'une longue explication, voici un schéma (simplifié) du fonctionnement de l'envoi d'un courriel. Imaginons qu'une personne, Pierre, ayant une adresse chez Orange pierre@orange.fr, envoie un courrier à Alice, utilisatrice de notre serveur de messagerie domaine.fr, ayant une adresse alice@domaine.fr :
{{:serveur_hebergement:serveur_mail:pasted:20221103-163809.png}}
Pierre envoie donc un courriel via son adresse Orange à Alice qui a une adresse sur notre serveur, domaine.fr. Cet envoi se fait via un client, Thunderbird sur le schéma, qui va se connecter via le protocole SMTP au serveur SMTP d'Orange sur le port 465. Le serveur SMTP d'orange va se connecter à notre serveur SMTP, toujours via le protocole SMTP mais sur le port 25, qui va transmettre le courriel à notre serveur IMAP/POP qui va à son tour transmettre le courriel au client d’Alice via le protocole IMAP, sur le port 993, ou POP, sur le port 995.
Sur le schéma j'ai séparé Postfix et Dovecot dans la zone domaine.fr comme s'ils étaient sur deux serveurs distincts pour que ce soit plus clair, mais ils tourneront sur le même serveur et la communication entre les deux se fera donc en local.
Pour faire une analogie, Postfix est l'équivalent d'un bureau de poste, Dovecot l'équivalent du facteur et Thunderbird l'équivalent de votre boite aux lettres.
Voyons un peu plus en détails les protocoles utilisés.
Le protocole SMTP est utilisé pour la connexion entre le client (Thunderbird) et le serveur SMTP (Postfix) mais également pour la communication entre deux serveurs SMTP.
Pour envoyer un courriel, le client va se connecter au serveur SMTP via le port 465. Les communications client-serveur imposent un mécanisme d'authentification grâce à une extension du protocole SMTP, [[https://fr.wikipedia.org/wiki/Authentification_SMTP|SMTP-AUTH]]. C'est Dovecot qui gèrera les utilisateurs dans notre configuration.
La communication via le port 465 est appelée TLS implicite et toute la communication est chiffrée grâce à [[https://fr.wikipedia.org/wiki/Transport_Layer_Security|TLS]]. À savoir, il existe un autre port utilisé pour la connexion client-serveur, le port 587. La communication via ce port est appelée TLS explicite et utilise StartTLS avec lequel une partie ou toute la communication se fait en clair (on en parlera un peu plus loin).
Petite parenthèse historique sur StartTLS et le port 587. Les protocoles utilisent souvent 2 ports, un pour les communications non-chiffrées et un autre pour les communications chiffrées (par exemple le protocole HTTP utilise le port 80 pour les communications non-chiffrée et le port 443 pour les communications chiffrées). StartTLS est un mécanisme qui permet d'utiliser le même port pour les communications chiffrées et non-chiffrées. Il commence par établir une connexion non-chiffrée afin de voir si le destinataire supporte les communications chiffrées (c'est très simplifié). Si le destinataire supporte les communications chiffrées, le reste de la communication va être chiffré en utilisant TLS. Si ce n'est pas le cas, la communication se fera en clair, non-chiffrée.
Pour revenir au SMTP, lorsque SMTP-AUTH a été mis en place, c'est le port 587 qui a été choisi pour remplacer le port 25 pour les communications client-serveur (les communications serveur-serveur utilisent toujours le port 25). Et lorsque TLS a été implémenté pour les communications client-serveur, le port 587 a été conservé et le mécanisme StartTLS a été choisi par [[https://fr.wikipedia.org/wiki/Internet_Engineering_Task_Force|l'IETF]] afin de ne pas casser la compatibilité client-serveur (si le client ou le serveur ne supporte pas le chiffrement, la communication se fait en clair, aucun souci de refus de connexion). Mais dans le même temps, une autre organisation, [[https://fr.wikipedia.org/wiki/Internet_Assigned_Numbers_Authority|l'IANA]] a décrété que le port 465 serait utilisé pour le SMTPS, SMTP utilisant TLS implicite.
Problème, c'est l'IETF qui fixe les standards et non l'IANA. Donc le port officiel pour le SMTP sécurisé est resté le 587 via StartTLS mais le port 465 et le TLS implicite a continué à être utilisé malgré le fait que ce n'était pas le standard. Son utilisation était donc déconseillée dans de nombreuses documentations car ne respectant pas les bonnes pratiques (qui demandent de respecter les standards). Mais suite à une découverte de problème de sécurité dans le mécanisme StartTLS, l'IETF via la [[https://datatracker.ietf.org/doc/rfc8314/|RFC 8314]] a déclaré le port 465, et donc le TLS implicite, comme port standard à utiliser pour la communication entre le client et le serveur. Ce changement étant relativement récent (2018), vous trouverez énormément de documentations et sites, obsolètes, conseillant d'utiliser le port 587 et non le port 465 pour les communications client-serveur.
Fin de la parenthèse.
Votre serveur va ensuite se connecter au serveur SMTP de destination, via le port 25 avec une connexion StartTLS, pour transmettre le courriel.
Postfix transfère ensuite le courriel à Dovecot. Ce dernier va stocker le message en attendant que le client, Thunderbird dans notre exemple, le récupère. Le client va se connecter à Dovecot soit via le protocole IMAP soit via le protocole POP. Les deux utilisent TLS pour chiffrer la connexion. La différence est que le protocole POP récupère les courriels pour les copier en local et les efface du serveur (comportement par défaut) là où le protocole IMAP les consultent directement sur le serveur et créé un miroir en local (si vous supprimez un courriel en local il sera supprimé sur le serveur également). Pour ma part j'utilise IMAP plutôt que POP.
Voilà pour le fonctionnement. Passons donc à l'installation de Postfix.
===== Pré-requis =====
Vous avez besoin d'un certain nombre de choses pour faire tourner un serveur de messagerie électronique :
* un serveur (serveur dédié, Raspberry Pi, etc) sous Linux (Debian dans mon cas)
* un nom de domaine
* un reverse DNS en IPV4 et IPV6
* une entrée DNS MX
* un certificat TLS pour ce domaine (via Let's Encrypt par exemple)
Je ne vais pas détailler ces points et partir du principe que vous avez tout ceci de configurer.
===== Installation =====
Installez postfix en lançant la commande suivante :
sudo aptitude install postfix postfix-mysql ca-certificates
Choisissez les réponses comme ci-dessous :
{{:serveur_hebergement:serveur_mail:pasted:20220830-204308.png?800|}}
Entrer le nom de domaine (memodugeek.info par exemple)
{{:serveur_hebergement:serveur_mail:pasted:20220830-204452.png?800|}}
Vous aurez besoin d'ouvrir les ports 25 et 465 :
sudo ufw allow 25/tcp comment SMTP
sudo ufw allow 465/tcp comment SMTP_TLS
Fini pour l'installation, passons à la configuration.
===== Configuration =====
Ouvrez le fichier main.cf :
sudo nano /etc/postfix/main.cf
Changez la ligne "myhostname" et mettre comme valeur votre FQDN
Pour afficher le FQDN, tapez la commande suivante :
hostname -f
Si vous avez besoin de changer votre FQDN, vous pouvez le faire à l'aide de la commande suivante :
sudo hostnamectl set-hostname FQDN
Changez la ligne "mydestination" et mettre comme valeur localhost.$mydomain, localhost, FQDN (remplacez FQDN par le FQDN de votre serveur)
Si pas de reverse DNS IPV6 ou pas d'IPV6, changer la ligne inet_protocols = all par inet_protocols = ipv4
Configurez la partie TLS parameters comme suit :
# Paramètres TLS
#Postfix server. Activation du support du chiffrement lors de la réception des e-mails (depuis le client ou un autre serveur e-mail)
smtpd_tls_security_level=may
smtpd_tls_loglevel = 1
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
smtpd_tls_cert_file=/etc/letsencrypt/live/siebert.ovh/fullchain.pem
smtpd_tls_key_file=/etc/letsencrypt/live/siebert.ovh/privkey.pem
smtpd_tls_CApath = /etc/ssl/certs
smtpd_tls_CAfile = /etc/letsencrypt/live/siebert.ovh/cert.pem
#Postfix client. Activation du support du chiffrement lors de l'envoi des e-mails vers un autre serveur e-mail
smtp_tls_security_level=may
smtp_tls_loglevel = 1
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
smtp_tls_cert_file=/etc/letsencrypt/live/siebert.ovh/fullchain.pem
smtp_tls_key_file=/etc/letsencrypt/live/siebert.ovh/privkey.pem
smtp_tls_CApath = /etc/ssl/certs
smtp_tls_CAfile = /etc/letsencrypt/live/siebert.ovh/cert.pem
#Force l'utilisation des protocoles TSLv1.3 et TSLv1.2 uniquement (depuis Postfix 3.6, la syntaxe à utiliser est >=TLSv1.2)
smtpd_tls_protocols = !SSLv2, !SSLv3, !TLSv1, !TLSv1.1
smtp_tls_protocols = !SSLv2, !SSLv3, !TLSv1, !TLSv1.1
Les lignes smtpd_tls_mandatory_protocols et smtpd_tls_mandatory_protocols ne servent que si smtpd_tls_security_level et smtp_tls_security_level ont pour valeur "encrypt".
Si smtpd_tls_security_level et smtp_tls_security_level ont pour valeur "encrypt", l'utilisation de StartTLS est rendu obligatoire pour la communication serveur-serveur (dans les deux sens) en cas d'envoi ou réception de courriels mais cette configuration est déconseillée car il y a encore de nombreux serveurs configurés sans support de TLS. Ce qui fait qu'avec l'option "encrypt" vous ne pourrez ni recevoir ni envoyer de courriels depuis/vers ces serveurs. La [[https://www.rfc-editor.org/rfc/rfc2487|RFC 2487]] spécifie d'ailleurs qu'un serveur SMTP public (dans le sens exposé à Internet) ne doit pas forcer l'utilisation de StartTLS.
Notez que même à mettant smtpd_tls_security_level à "may", la communication avec le client sera toujours chiffrée avec TLS implicite.
Ajoutez les lignes suivantes :
# Envoie les courriels reçus à Dovecot
virtual_transport = lmtp:unix:private/dovecot-lmtp
# Emplacement où seront stockés les courriels
virtual_mailbox_base = /var/vmail
Ouvrez le fichier master.cf :
sudo nano /etc/postfix/master.cf
Ajoutez les lignes suivantes :
smtps inet n - y - - smtpd
-o syslog_name=postfix/smtps
-o smtpd_tls_wrappermode=yes
-o smtpd_sasl_auth_enable=yes
-o smtpd_relay_restrictions=permit_sasl_authenticated,reject
-o smtpd_recipient_restrictions=permit_mynetworks,permit_sasl_authenticated,reject
-o smtpd_sasl_type=dovecot
-o smtpd_sasl_path=private/auth
Explication de ces lignes :
* smtps inet n - y - - smtpd : active SMTPS
* syslog_name : change le nom du processus dans les logs. Par défaut c'est smtpd.
* smtpd_tls_wrappermode : active TLS implicite au lieu de StartTLS
* smtpd_sasl_auth_enable : active l'authentification [[https://fr.wikipedia.org/wiki/Simple_Authentication_and_Security_Layer|SASL]]
* smtpd_relay_restrictions : on restreint l'envoi de courriels via notre serveur qu'aux utilisateurs authentifiés et on rejette les autres. Ça évite que notre serveur se transforme en machine à spam
* smtpd_recipient_restrictions : on restreint l'acceptation des courriels uniquement à destination des utilisateurs interne et des utilisateurs enregistrés, on rejette le reste.
* smtpd_sasl_type & smtpd_sasl_path : on utilise Dovecot pour l'authentification des utilisateurs.
Vous aurez besoin d'ouvrir les ports 25 et 465 en TCP. Avec UFW :
sudo ufw allow 25/tcp comment SMTP
sudo ufw allow 465/tcp comment SMTP_TLS
On peut maintenant installer [[serveur_hebergement:serveur_mail:partie_2_dovecot|Dovecot]]
Source :
https://www.linuxbabe.com/mail-server/build-email-server-from-scratch-debian-postfix-smtp
https://postfix.traduc.org/
https://workaround.org/ispmail