rss logo

Installer et configurer un serveur mail sécurisé sous Debian avec Postfix et Dovecot

Illustration représentant Linux, Postfix et Dovecot comme une équipe de super-héros, symbolisant les Quatre Fantastiques des serveurs de messagerie

Dans ce guide, je vais vous montrer comment mettre en place une architecture complète de serveur de messagerie sous GNU/Linux. L’objectif est de pouvoir envoyer et recevoir des e-mails de manière fluide depuis différents appareils — comme Thunderbird sur PC ou Mac, ou encore des clients de messagerie sur smartphone.

Pour ce tutoriel, nous utiliserons Debian installée sur un serveur privé virtuel (VPS) hébergé chez OVHcloud 🇫🇷 (aucun partenariat ici — mais je ne dirais pas non à un t-shirt 😄).

Cela dit, même si certaines étapes sont spécifiques à OVHcloud, vous pouvez suivre ce guide avec n’importe quel autre fournisseur de VPS. Il suffit simplement d’adapter la configuration à votre environnement d’hébergement.

Avant de commencer, prenons un instant pour évaluer les avantages et les inconvénients d’héberger votre propre serveur mail. Parmi les points positifs : vous pouvez créer un nombre illimité d’adresses, gérer votre espace de stockage, et rester totalement indépendant des prestataires externes et de leurs évolutions tarifaires. En revanche, l’hébergement d’un tel service implique une responsabilité en matière de sécurité et de maintenance. Il est vivement conseillé d’activer les mises à jour automatiques et de planifier des sauvegardes régulières (la plupart des hébergeurs VPS proposent cette option à faible coût), par exemple à l’aide de rsync. Vous aurez également besoin d’un nom de domaine et d’un VPS ou d’un serveur auto-hébergé à maintenir.

Maintenant que vous connaissez les principaux avantages et contraintes, passons à la phase d’installation.

Voici à quoi ressemblera notre architecture finale :

Schéma illustrant un serveur mail Debian utilisant Postfix et Dovecot sur un VPS OVHcloud, avec des utilisateurs distants et des smartphones accédant aux e-mails via IMAP et SMTP.
Architecture d’un serveur de messagerie sous Debian avec Postfix et Dovecot hébergé sur un VPS OVHcloud.

💡 Remarque : ce tutoriel se concentre uniquement sur la configuration du serveur de messagerie. Si vous souhaitez ajouter une interface webmail, consultez mon guide dédié à l’installation et la configuration de Roundcube.

Comprendre Postfix et Dovecot : comment ils fonctionnent ensemble sur un serveur mail

Pour que notre configuration fonctionne correctement, nous devons installer deux applications essentielles sur notre serveur Debian : Postfix pour le SMTP/SMTPS et Dovecot pour le IMAP/IMAPS. En résumé, le protocole SMTP (Simple Mail Transfer Protocol) gère l’envoi et le routage des e-mails entre serveurs, tandis que le protocole IMAP (Internet Message Access Protocol) permet aux clients de messagerie d’accéder à leurs boîtes mail et de les synchroniser sur plusieurs appareils. En plus de gérer la réception des messages, Dovecot assure l’authentification des utilisateurs et peut organiser automatiquement les courriels dans des dossiers. Par exemple, vous pouvez définir une règle pour déplacer tous les messages envoyés à john@std.rocks dans le dossier John.

Postfix et SMTP : envoi d’e-mails depuis votre serveur mail Linux

Lorsque vous envoyez un message depuis votre client SMTP — par exemple Mozilla Thunderbird — celui-ci est d’abord transmis au service Postfix de votre serveur, qui se charge ensuite de l’acheminer jusqu’à sa destination finale.

Schéma illustrant comment un serveur Debian utilisant Postfix envoie des e-mails via les ports SMTP 25 et 587 depuis un client Thunderbird vers un service externe comme Gmail.
Processus d’envoi d’e-mails via Postfix (SMTP) depuis un client Thunderbird vers Gmail sur un serveur Debian.

Dovecot et IMAP : accès et synchronisation sécurisés des boîtes mail

Comme mentionné précédemment, le protocole IMAP est utilisé pour synchroniser les e-mails et les dossiers entre le serveur Dovecot et le client de messagerie. Il permet aux utilisateurs d’accéder à leurs boîtes aux lettres depuis plusieurs appareils tout en conservant la synchronisation en temps réel de tous les messages et dossiers — tels que Boîte de réception, Envoyés ou Brouillons.

Schéma illustrant comment un serveur Dovecot IMAP sous Debian synchronise les e-mails et dossiers via les ports 143 et 993 entre un client de messagerie tel que Thunderbird et le serveur mail.std.rocks.
Synchronisation des boîtes mail via Dovecot (IMAP/IMAPS) entre un serveur Debian et un client de messagerie.

Choisir et configurer votre VPS pour un serveur mail Debian

Maintenant que les concepts de SMTP et IMAP sont clairs, concentrons-nous sur l’hébergement de notre serveur de messagerie. Il est possible de le faire tourner depuis votre domicile, mais sachez que de nombreux fournisseurs d’accès à Internet bloquent le port 25 (SMTP), que certaines plages d’adresses IP domestiques sont souvent blacklistées ou mal réputées, et que la gestion du reverse DNS (rDNS) peut s’avérer complexe. En résumé, l’auto-hébergement à la maison est faisable, mais sa mise en place et sa maintenance peuvent être délicates.

Une meilleure option — et celle que nous utiliserons dans ce tutoriel — consiste à héberger votre serveur mail sur un serveur privé virtuel (VPS). Vous pouvez choisir le fournisseur de votre choix et adapter la configuration à vos besoins. Par exemple, chez OVHcloud, un VPS disposant de 4 vCores, 8 Go de RAM et d’un SSD de 75 Go est largement suffisant pour une architecture mail petite à moyenne.

Capture d’écran d’une configuration VPS OVHcloud affichant Debian 13 avec 4 vCores, 8 Go de RAM, 75 Go de SSD et 400 Mbit/s de bande passante, adaptée à l’hébergement d’un serveur mail Postfix et Dovecot.
Exemple de configuration d’un VPS Debian sur OVHcloud, idéal pour héberger un serveur mail Postfix et Dovecot.

Bien entendu, si vous n’en possédez pas encore, il vous faudra acheter un nom de domaine. Celui-ci servira à configurer les enregistrements DNS de votre serveur mail et à créer des adresses professionnelles telles que utilisateur@votredomaine.com.

Capture d’écran de l’interface OVHcloud utilisée pour rechercher et enregistrer un nom de domaine comme std.rocks pour un serveur mail.
Recherche et enregistrement d’un nom de domaine sur OVHcloud — une étape essentielle avant la configuration du serveur mail.

À ce stade, vous n’aurez pas besoin de dépenser beaucoup plus — seulement un peu de votre temps. 😉

Configurer les enregistrements DNS : SPF, DKIM, DMARC et rDNS

Aujourd’hui, pour lutter contre le spam (même si certains expéditeurs indésirables y parviennent encore 😅), les principaux fournisseurs de messagerie comme Gmail, Microsoft et d’autres effectuent plusieurs vérifications avant d’accepter les e-mails provenant de serveurs externes. Ces contrôles permettent de confirmer que le serveur expéditeur est bien légitime. Les principaux mécanismes de protection impliqués sont SPF, DKIM et le reverse DNS (rDNS). Dans cette section, je vais vous expliquer le fonctionnement de chacun afin que vous puissiez les configurer correctement sur votre propre serveur mail.

Pré-requis DNS et configuration initiale

Pour commencer, nous devons ajouter quelques entrées DNS afin que les autres serveurs de messagerie sachent vers quelle adresse IP envoyer les e-mails destinés à notre domaine. Cela implique de créer un enregistrement A pour l’adresse IPv4, un enregistrement AAAA pour l’adresse IPv6 (si disponible) et un enregistrement MX pointant vers notre serveur de messagerie — dans cet exemple, mail.std.rocks.

  • mail IN A 203.0.113.1 : associe mail.std.rocks à l’adresse IPv4 203.0.113.1.
  • mail IN AAAA 2001:0db8::dead:bee5 : associe mail.std.rocks à l’adresse IPv6 2001:0db8::dead:bee5.
  • IN MX 1 mail.std.rocks. : définit mail.std.rocks comme serveur d’échange de courrier (MX) pour le domaine std.rocks.
mail IN A 203.0.113.1
mail IN AAAA 2001:0db8::dead:bee5
IN MX 1 mail.std.rocks.
Schéma montrant comment les enregistrements DNS MX, A et AAAA dirigent le trafic mail depuis des fournisseurs externes comme Gmail vers un serveur de messagerie Debian utilisant Postfix.
Comment les enregistrements DNS MX, A et AAAA permettent aux serveurs de messagerie externes de localiser et de livrer les e-mails à votre serveur Debian Postfix.

Depuis votre interface DNS, la configuration devrait apparaître comme suit :

Capture d’écran du tableau de bord DNS OVHcloud montrant les enregistrements MX, A et AAAA du domaine std.rocks pointant vers le serveur mail.std.rocks.
Exemple de configuration DNS sur OVHcloud — enregistrements MX, A et AAAA pointant vers le serveur mail mail.std.rocks.
  • Sur votre serveur, définissez le nom d’hôte sur mail :
root@debian:~# hostnamectl set-hostname mail
  • Modifiez ensuite le fichier /etc/hosts afin d’associer le nom d’hôte à votre domaine :
127.0.0.1       localhost
::1     localhost       ip6-localhost   ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters

127.0.1.1	mail.std.rocks	mail
  • Vérifiez que le fichier /etc/hostname contient bien le nouveau nom d’hôte :
mail
  • Enfin, redémarrez votre serveur pour appliquer les changements :
root@debian:~# hostnamectl set-hostname mail

Configurer l’enregistrement SPF pour autoriser votre serveur mail

L’enregistrement SPF (Sender Policy Framework) permet à l’administrateur d’un domaine d’indiquer publiquement quels serveurs de messagerie sont autorisés à envoyer des e-mails en son nom. Ce mécanisme aide les serveurs de réception à vérifier la légitimité des messages entrants et à réduire les risques de spam.

  • Ajoutez les entrées suivantes à votre configuration DNS pour autoriser votre serveur de messagerie :
    • mx : (optionnel) inclut tous les serveurs listés comme MX pour le domaine std.rocks, ici mail.std.rocks.
    • include:mail.std.rocks : (optionnel) autorise explicitement le serveur mail.std.rocks.
    • ip4:203.0.113.1 et ip6:2001:0db8::dead:bee5 : spécifient les adresses IPv4 et IPv6 autorisées à envoyer des e-mails.
    • -all : indique que toutes les autres adresses IP non listées sont interdites et doivent être considérées comme sources de spam.
"v=spf1 mx include:mail.std.rocks ip4:203.0.113.1 ip6:2001:0db8::dead:bee5 -all"
Schéma illustrant comment la vérification SPF permet à un serveur de messagerie de confirmer les adresses IP autorisées pour un domaine à l’aide des enregistrements DNS.
Processus de vérification SPF — le DNS confirme quelles adresses IP sont autorisées à envoyer des e-mails pour le domaine std.rocks.

Une fois l’enregistrement SPF créé, votre tableau de bord DNS devrait afficher une entrée similaire à celle-ci :

Capture d’écran du tableau de bord DNS OVHcloud affichant un enregistrement SPF pour le domaine std.rocks, autorisant certaines adresses IP et serveurs à envoyer des e-mails.
Exemple d’un enregistrement SPF correctement configuré sur le tableau de bord DNS OVHcloud pour le domaine std.rocks.
  • Pour vérifier votre configuration SPF (remplacez std.rocks par votre propre nom de domaine), exécutez la commande suivante :
john@debian:~$ host -t txt std.rocks 
std.rocks descriptive text "v=spf1 mx include:mail.std.rocks ip4:203.0.113.1 ip6:2001:0db8::dead:bee5 -all"

Configurer DKIM pour signer et authentifier vos e-mails

Présentation

DKIM (DomainKeys Identified Mail) peut sembler un peu complexe au premier abord, mais son principe est en réalité très simple. Il permet au serveur d’envoi de signer numériquement chaque message sortant en ajoutant un champ DKIM-Signature dans l’en-tête du courriel, à l’aide d’une clé privée (nous verrons plus loin comment la générer). Le serveur de réception peut ensuite vérifier l’authenticité du message grâce à la clé publique correspondante, publiée dans les enregistrements DNS du domaine. Ce couple de clés publique/privée garantit que le message provient bien du domaine autorisé et qu’il n’a pas été altéré pendant sa transmission.

Schéma illustrant le fonctionnement de la vérification DKIM : le serveur d’envoi signe les e-mails avec une clé privée, et le serveur de réception vérifie la signature à l’aide de la clé publique stockée dans le DNS.
Processus de vérification DKIM — le serveur de messagerie signe les messages sortants avec une clé privée, tandis que le serveur de réception utilise la clé publique DNS pour valider leur authenticité.

Configuration

  • Sur votre serveur, installez OpenDKIM et ses outils :
root@debian:~# apt update && apt install opendkim opendkim-tools

💡 Remarque : vous pouvez personnaliser le nom de votre sélecteur (au lieu d’utiliser simplement selector). Certains administrateurs ajoutent l’année en cours pour plus de clarté, par exemple : -s 2025.

  • Générez ensuite votre paire de clés (clé privée et clé publique) :
root@debian:~# sudo -u opendkim opendkim-genkey -D /etc/dkimkeys -d std.rocks -s selector
  • Créez le répertoire /var/spool/postfix/opendkim/ avec les bonnes permissions pour l’utilisateur opendkim :
root@debian:~# install -d -m 770 -o opendkim -g opendkim /var/spool/postfix/opendkim/
  • Ajoutez l’utilisateur postfix au groupe opendkim :
root@debian:~# usermod -aG opendkim postfix
  • Modifiez le fichier de configuration /etc/opendkim.conf pour définir votre domaine, le sélecteur et les chemins des clés :
Syslog                  yes
SyslogSuccess           yes
Canonicalization        relaxed/simple
OversignHeaders         From
Domain                  std.rocks
Selector                selector
KeyFile                 /etc/dkimkeys/selector.private
Socket                  local:/var/spool/postfix/opendkim/opendkim.sock
UserID                  opendkim
UMask                   007
PidFile                 /run/opendkim/opendkim.pid
TrustAnchorFile         /usr/share/dns/root.key
  • Redémarrez le service OpenDKIM afin d’appliquer les modifications de configuration :
root@debian:~# systemctl restart opendkim
  • Affichez ensuite le contenu du fichier /etc/dkimkeys/selector.txt pour consulter votre clé publique. Cette clé sera nécessaire pour créer votre enregistrement DNS DKIM :
root@debian:~# cat /etc/dkimkeys/selector.txt
selector._domainkey	IN	TXT	( "v=DKIM1; h=sha256; k=rsa; "
	  "p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAlBBJYPEMqBqhBhap27waAwkW4ldwhhzxZErIeOagJSstm1gzExVvVuvRStv+hBk+IIwsNCr5OulWf7nZDThKWzUQs4fo2IBOcijbMcET48hgpnRiApKQvyRnxssuAjl9180u13pA3M5D35FYhGT0tNzEZLgI7YMN/nV00rvGT/RlzP7oa/XjcP73Zk+8R9YQhBviqPpHBjPyPK"
	  "369MP0zgYiVppjVedFive6kR3xciZ1BGbmSyM7tMFqZA3xVgcLtKQNMULdlzO+xz5h7e0u8zQBTPejjuC8fNiEhndbm9kmKIXV3G0PgsFKMd8S0ooH/L6ROM6+3MCrygKBLOcmxwIDAQAB" )  ; ----- DKIM key selector for std.rocks
  • Ajoutez l’entrée suivante à votre configuration DNS. Chaque paramètre définit un élément spécifique de l’enregistrement DKIM :
  • v=DKIM1 : indique la version de DKIM utilisée.
  • h=sha256 : précise l’algorithme de hachage (SHA-256) employé pour la signature.
  • k=rsa : spécifie le type de clé de chiffrement (RSA).
  • p= : contient votre clé publique générée précédemment.
selector._domainkey IN TXT "v=DKIM1; h=sha256; k=rsa; " "p=PUBLIC_KEY"
  • Selon votre fournisseur DNS, la configuration de l’enregistrement DKIM peut légèrement varier. Voici un exemple provenant d’OVHcloud illustrant l’ajout de la clé publique dans la zone DNS :
Capture d’écran du formulaire de configuration DNS OVHcloud montrant comment ajouter un enregistrement DKIM avec le sous-domaine selector._domainkey, la version DKIM1, l’algorithme de hachage sha256 et la clé publique.
Exemple d’ajout d’un enregistrement DKIM dans la zone DNS OVHcloud — précisant le sous-domaine selector._domainkey, la version v=DKIM1, l’algorithme h=sha256 et la clé publique.
  • Une fois l’enregistrement enregistré, vous devriez voir la nouvelle entrée DKIM apparaître dans votre tableau de bord DNS, comme illustré ci-dessous :
Capture d’écran du tableau de bord DNS OVHcloud affichant un enregistrement DKIM avec le sous-domaine selector._domainkey, la version DKIM, le type de clé RSA et la clé publique encodée en base64 pour le domaine std.rocks.
Exemple d’un enregistrement DKIM correctement ajouté dans le tableau de bord DNS OVHcloud pour le domaine std.rocks.
  • Vous pouvez vérifier votre configuration DKIM en interrogeant votre enregistrement DNS (remplacez std.rocks par votre propre nom de domaine) :
john@debian:~$ host -t host -t TXT selector._domainkey.std.rocks
selector._domainkey.std.rocks descriptive text "v=DKIM1;h=sha256;k=rsa;p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAlBBJYPEMqBqhBhap27waAwkW4ldwhhzxZErIeOagJSstm1gzExVvVuvRStv+hBk+IIwsNCr5OulWf7nZDThKWzUQs4fo2IBOcijbMcET48hgpnRiApKQvyRnxssuAjl9180u13pA3M5D35FYhGT0tNzEZLgI7YMN/nV00rvGT/RlzP7oa/Xjc" "P73Zk+8R9YQhBviqPpHBjPyPK369MP0zgYiVppjVedFive6kR3xciZ1BGbmSyM7tMFqZA3xVgcLtKQNMULdlzO+xz5h7e0u8zQBTPejjuC8fNiEhndbm9kmKIXV3G0PgsFKMd8S0ooH/L6ROM6+3MCrygKBLOcmxwIDAQAB;t=s;"

Mettre en place DMARC pour protéger votre domaine contre l’usurpation d’e-mails

Présentation

DMARC (Domain-based Message Authentication, Reporting, and Conformance) définit une politique indiquant aux serveurs de messagerie destinataires comment traiter les messages prétendant provenir de votre domaine lorsqu’ils échouent aux vérifications SPF ou DKIM. Même si ces serveurs ne sont pas obligés d’appliquer votre politique, la plupart des grands fournisseurs la respectent. DMARC permet également de spécifier des adresses e-mail de contact pour recevoir des rapports sur les échecs d’authentification ou les tentatives d’usurpation de votre domaine.

Schéma illustrant comment les politiques DMARC définissent les actions à appliquer aux e-mails échouant les vérifications SPF ou DKIM, avec les options de rapports pour le domaine std.rocks.
Paramètres DMARC — définition de la manière dont les serveurs destinataires doivent traiter les e-mails qui échouent les vérifications SPF ou DKIM pour le domaine std.rocks.

Configuration

  • Depuis le tableau de bord OVHcloud, vous pouvez ajouter votre enregistrement DMARC. L’interface présente certaines limites — par exemple, elle ne permet pas toujours de personnaliser complètement des paramètres comme l’alignement DKIM. Dans ce cas, passez en mode éditeur de texte pour modifier manuellement l’enregistrement _dmarc et utilisez la configuration suivante :
_dmarc        IN TXT     "v=DMARC1;p=quarantine;rua=mailto:dmarc-reports@std.rocks;ruf=mailto:dmarc-fails@std.rocks;sp=reject;aspf=s;adkim=s;"
Capture d’écran montrant comment créer un enregistrement DNS DMARC sur OVHcloud, incluant la politique de quarantaine, les adresses de rapports et les modes d’alignement stricts.
Exemple de configuration d’un enregistrement DMARC sur OVHcloud — définissant la politique (p=quarantine), les adresses de rapports et l’alignement strict pour SPF et DKIM.
  • Vous devriez alors voir apparaître cette nouvelle entrée :
Capture d’écran du tableau de bord DNS OVHcloud affichant un enregistrement DMARC pour le domaine std.rocks avec une politique de quarantaine, des adresses de rapport et un alignement strict.
Exemple d’un enregistrement DMARC correctement ajouté dans le tableau de bord DNS OVHcloud pour le domaine std.rocks.
  • Vous pouvez vérifier votre configuration DMARC en interrogeant votre enregistrement DNS (remplacez std.rocks par votre propre nom de domaine) :
john@debian:~$ host -t TXT _dmarc.std.rocks
_dmarc.std.rocks descriptive text "v=DMARC1;p=quarantine;rua=mailto:dmarc-reports@std.rocks;ruf=mailto:dmarc-fails@std.rocks;sp=reject;aspf=s;adkim=s;"

Configurer le reverse DNS (rDNS) pour votre serveur mail

Le reverse DNS (rDNS) est un type particulier d’enregistrement DNS qui associe une adresse IP à un nom de domaine. Lorsqu’un serveur de messagerie reçoit un e-mail, il peut effectuer une requête rDNS pour vérifier que l’adresse IP de l’expéditeur correspond bien au nom d’hôte du serveur — dans notre exemple, mail.std.rocks. Cette vérification permet de confirmer la légitimité du serveur et d’éviter que les messages soient considérés comme suspects ou marqués comme spam.

Schéma illustrant comment le reverse DNS résout une adresse IP vers le nom d’hôte du serveur mail, en vérifiant que 203.0.113.1 correspond à mail.std.rocks.
Vérification reverse DNS — le serveur destinataire confirme que l’adresse IP de l’expéditeur correspond à son nom d’hôte (mail.std.rocks).

Dans la plupart des cas, la configuration du rDNS (reverse DNS) doit être demandée auprès de votre fournisseur d’adresses IP. Cependant, si vous utilisez un VPS, il est généralement possible de la définir directement depuis le tableau de bord de votre hébergeur. Par exemple, sur OVHcloud, vous pouvez configurer l’entrée reverse DNS depuis l’interface d’administration, comme illustré ci-dessous :

Capture d’écran de l’interface OVHcloud montrant comment configurer le reverse DNS pour une adresse IP de VPS en la reliant au nom d’hôte mail.std.rocks.
Configuration du reverse DNS sur OVHcloud — association de l’adresse IP du VPS avec le nom d’hôte du serveur mail mail.std.rocks.
  • Vous pouvez vérifier votre configuration rDNS pour vous assurer qu’elle est correcte (remplacez l’adresse IP par la vôtre) :
john@debian:~$ host -t PTR 203.0.113.1
1.113.0.203.in-addr.arpa domain name pointer mail.std.rocks.

Installer et configurer Postfix sur Debian

Maintenant que nos paramètres DNS sont correctement configurés, nous pouvons passer à l’installation de notre serveur SMTP, Postfix ! Pour mieux comprendre son fonctionnement, Postfix écoute sur trois ports différents, chacun ayant un rôle spécifique. Le premier, le port 25/tcp, est utilisé pour la communication entre serveurs de messagerie — par exemple pour recevoir des messages provenant de serveurs externes ou pour délivrer des e-mails vers d’autres domaines. Les deux autres, 465/tcp (TLS implicite) et 587/tcp (STARTTLS), sont réservés aux clients authentifiés, tels que les applications de messagerie ou les appareils mobiles, afin d’envoyer des e-mails de manière sécurisée via notre serveur.

Schéma montrant comment Postfix sous Debian gère les connexions SMTP sur les ports 25, 465 et 587 pour les serveurs externes et les clients authentifiés utilisant TLS et STARTTLS.
Configuration des ports SMTP de Postfix — les ports 25, 465 et 587 servent respectivement aux serveurs externes et aux clients authentifiés avec chiffrement TLS.

Installer Postfix

  • Installez le paquet Postfix :
root@debian:~# apt update && apt install postfix
  • Lors de l’installation, lorsque le programme vous demande de choisir le type de configuration, sélectionnez l’option Aucune configuration. Cela vous permettra de configurer manuellement Postfix par la suite selon la structure personnalisée de votre serveur de messagerie.
Capture d’écran de l’assistant d’installation Postfix sur Debian montrant l’option 'Aucune configuration' sélectionnée pendant l’installation.
Assistant d’installation de Postfix — sélectionnez Aucune configuration pour effectuer ensuite une configuration manuelle adaptée à votre serveur mail.

Configurer le fichier main.cf de Postfix

💡 Remarque : nous allons utiliser la fonctionnalité de boîtes aux lettres virtuelles (via le paramètre virtual_alias_maps), ce qui signifie que les adresses e-mail ne seront pas liées à des comptes utilisateurs Linux dans /etc/passwd.

  • Créez le fichier /etc/postfix/main.cf et adaptez la configuration avec votre propre nom d’hôte et nom de domaine :
# See /usr/share/postfix/main.cf.dist for a commented, more complete version


# Debian specific:  Specifying a file name will cause the first
# line of that file to be used as the name.  The Debian default
# is /etc/mailname.
myorigin = /etc/mailname
myhostname = mail.std.rocks

smtpd_banner = $myhostname ESMTP $mail_name (Debian/GNU)
biff = no

# appending .domain is the MUA's job.
append_dot_mydomain = no

# See http://www.postfix.org/COMPATIBILITY_README.html -- default to 3.6 on
# fresh installs.
compatibility_level = 3.6

# ---- TLS (server side, SMTP port 25) ----
# Opportunistic TLS on SMTP (port 25). This is the right default for MX traffic.
smtpd_tls_security_level=may

# Self-signed certs for now; swap to Let's Encrypt later.
smtpd_tls_cert_file= /etc/ssl/certs/mail-selfsigned.crt
smtpd_tls_key_file= /etc/ssl/private/mail-selfsigned.key

# Disable legacy protocols; allow TLSv1.2/1.3.
smtpd_tls_protocols = !SSLv2,!SSLv3,!TLSv1,!TLSv1.1
smtpd_tls_mandatory_protocols = !SSLv2,!SSLv3,!TLSv1,!TLSv1.1

# Small, safe TLS hardening and visibility.
smtpd_tls_loglevel = 1
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache

# ---- TLS (client side, outbound) -----
smtp_tls_security_level=may
smtp_tls_CApath=/etc/ssl/certs
smtp_tls_loglevel = 1
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache

# ---- Relay policy ----
# Allow SASL-authenticated users to relay; reject others (prevents open relay).
smtpd_relay_restrictions = permit_sasl_authenticated, reject_unauth_destination

# ---- Local delivery & networking -----
mydestination = $myhostname, localhost.localdomain, localhost
relayhost = 
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
mailbox_size_limit = 0
#recipient_delimiter = +
inet_interfaces = all
inet_protocols = all

# ---- Virtual domains & Dovecot LMTP ----
alias_maps = 
alias_database = 
virtual_mailbox_domains = std.rocks
virtual_alias_maps = hash:/etc/postfix/virtual
virtual_mailbox_base = /mails/
# IMPORTANT: verify recipients; use a map (hash/sql/ldap) or you'll accept unknown users.
# might be worth activating in the future:
# virtual_mailbox_maps = hash:/etc/postfix/virtual_mailbox
virtual_uid_maps = static:7200
virtual_gid_maps = static:7200
virtual_minimum_uid = 7200

# Hand off mail to Dovecot via LMTP (fast and robust).
virtual_transport = lmtp:unix:private/dovecot-lmtp

# ---- Authentication (SASL via Dovecot) ----
smtpd_sasl_auth_enable = yes
smtpd_sasl_security_options = noanonymous
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
# Only allow AUTH over TLS (good hygiene).
smtpd_tls_auth_only = yes

# ---- SMTP hygiene (early rejections reduce spam and load) ----
# Require a proper HELO and do basic sender/recipient sanity checks.
smtpd_helo_required = yes
smtpd_recipient_restrictions = 
    reject_unauth_pipelining,
    reject_non_fqdn_sender,
    reject_non_fqdn_recipient,
    reject_unknown_sender_domain,
    reject_unknown_recipient_domain,
    permit_mynetworks,
    permit_sasl_authenticated,
    reject_unauth_destination

# Hide user enumeration via SMTP VRFY.
disable_vrfy_command = yes

# ---- DKIM via milter ----
milter_default_action = accept
smtpd_milters = unix:opendkim/opendkim.sock
non_smtpd_milters = $smtpd_milters

# ---- Misc ----
# ~25 MB per message (reasonable default).
message_size_limit = 25480000

Configurer le fichier master.cf de Postfix

Le démon Postscreen agit comme première couche de sécurité pour les connexions de messagerie entrantes. Il écoute sur le port 25/tcp et effectue plusieurs vérifications préliminaires, telles que le contrôle de la réputation de l’adresse IP de l’expéditeur ou la détection d’adresses présentes sur des listes noires. Si toutes les vérifications sont réussies, Postscreen transmet la connexion au démon smtpd pour le traitement SMTP standard.

Schéma montrant Postscreen agissant comme couche de sécurité sur le port 25, filtrant les connexions SMTP provenant de serveurs externes avant de les transmettre au démon smtpd de Postfix sous Debian.
Processus de filtrage Postscreen — vérifie la réputation IP des connexions SMTP entrantes avant de les transmettre à smtpd.
  • Modifiez le fichier /etc/postfix/master.cf pour configurer les services actifs de Postfix :
# ========== Public SMTP (port 25) ==========
smtp      inet  n       -       y       -       1       postscreen
smtpd      pass  -       -       y       -       -       smtpd
#smtpd     pass  -       -       y       -       -       smtpd
dnsblog   unix  -       -       y       -       0       dnsblog
tlsproxy  unix  -       -       y       -       0       tlsproxy
# Choose one: enable submission for loopback clients only, or for any client.
#127.0.0.1:submission inet n -   y       -       -       smtpd

# ========== Submission (port 587) ==========
submission inet n       -       y       -       -       smtpd
  -o syslog_name=postfix/submission
  -o smtpd_tls_security_level=encrypt
  -o smtpd_tls_protocols=!SSLv2,!SSLv3,!TLSv1,!TLSv1.1
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_helo_required=yes
  -o milter_macro_daemon_name=ORIGINATING
  -o smtpd_relay_restrictions=permit_sasl_authenticated,reject
  -o smtpd_client_restrictions=
# ========== SMTPS (port 465) ==========
smtps     inet  n       -       y       -       -       smtpd
  -o syslog_name=postfix/smtps
  -o smtpd_tls_wrappermode=yes
  -o smtpd_tls_protocols=!SSLv2,!SSLv3,!TLSv1,!TLSv1.1
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_helo_required=yes
  -o milter_macro_daemon_name=ORIGINATING
  -o smtpd_relay_restrictions=permit_sasl_authenticated,reject
  -o smtpd_client_restrictions=
  • Créez l’utilisateur virtuel vmail qui sera propriétaire de tous les répertoires et fichiers de messagerie :
root@debian:~# groupadd -g 7200 vmail
root@debian:~# useradd -r -u 7200 -g 7200 -d /mails -m -s /usr/sbin/nologin vmail
  • Ajoutez votre nom de domaine dans le fichier /etc/mailname :
root@debian:~# echo "std.rocks" > /etc/mailname
  • Générez un certificat SSL/TLS auto-signé pour sécuriser la transmission des e-mails :
root@debian:~# openssl req -new -x509 -days 365 -nodes \
  -out /etc/ssl/certs/mail-selfsigned.crt \
  -keyout /etc/ssl/private/mail-selfsigned.key \
  -subj "/C=US/ST=Washington/L=Seattle/O=std.rocks/OU=Mail/CN=mail.std.rocks"
root@debian:~# chmod 600 /etc/ssl/private/mail-selfsigned.key
root@debian:~# chown root:root /etc/ssl/private/mail-selfsigned.key
  • Créez le répertoire principal /mails/std.rocks destiné à stocker toutes les boîtes aux lettres virtuelles, puis appliquez les bons droits d’accès :
root@debian:~# mkdir -p /mails/std.rocks
root@debian:~# chown -R vmail:vmail /mails/std.rocks

Installer et configurer Dovecot sur Debian

Il est maintenant temps d’installer et de configurer Dovecot, qui assurera à la fois les services IMAP et l’authentification des utilisateurs sur notre serveur de messagerie.

Installer Dovecot

  • Installez les paquets nécessaires à Dovecot :
root@debian:~# apt update && apt install dovecot-imapd dovecot-lmtpd dovecot-core dovecot-sieve

Configurer Dovecot

  • Lors de l’installation de Dovecot, plusieurs fichiers de configuration sont créés par défaut. Pour rendre la configuration plus claire et plus facile à maintenir, vous pouvez supprimer ces fichiers par défaut et créer un seul fichier de configuration centralisant tous les paramètres nécessaires.
root@debian:~# ls /etc/dovecot/conf.d/
10-auth.conf	 10-master.conf   15-lda.conf	     20-lmtp.conf	  90-fts.conf		     90-sieve.conf	   auth-oauth2.conf.ext      auth-static.conf.ext
10-logging.conf  10-metrics.conf  15-mailboxes.conf  30-dict-server.conf  90-quota.conf		     auth-deny.conf.ext    auth-passwdfile.conf.ext  auth-system.conf.ext
10-mail.conf	 10-ssl.conf	  20-imap.conf	     90-acl.conf	  90-sieve-extprograms.conf  auth-master.conf.ext  auth-sql.conf.ext
root@debian:~# rm /etc/dovecot/conf.d/*
  • Créez ensuite le fichier principal de configuration à l’emplacement /etc/dovecot/conf.d/dovecot.conf :
#/etc/dovecot/conf.d/10-ssl.conf
ssl = yes
# Preferred permissions: root:root 0444
ssl_server_cert_file = /etc/dovecot/private/dovecot.pem
# Preferred permissions: root:root 0400
ssl_server_key_file = /etc/dovecot/private/dovecot.key

ssl_server_dh_file = /usr/share/dovecot/dh.pem

ssl_min_protocol = TLSv1.2
ssl_server_prefer_ciphers = client

#/etc/dovecot/conf.d/10-master.conf
protocols = lmtp imap

service lmtp {
        unix_listener /var/spool/postfix/private/dovecot-lmtp {
                mode = 0600
                user  = postfix
                group = postfix
        }
}

listen = 0.0.0.0
service imap-login {
        inet_listener imaps {
                port = 993
        }
        inet_listener imaps-v6 {
                port = 64993
                ssl = yes
        }
}
#Authentification postfix :
service auth {
  unix_listener /var/spool/postfix/private/auth {
    mode = 0666
    user = postfix
    group = postfix
  }
}

#/etc/dovecot/conf.d/auth-passwdfile.conf.ext
passdb passwd-file {
        driver = passwd-file
        passwd_file_path = /etc/dovecot/passwd
        auth_username_format = %{user | username}
}

userdb passwd-file {
        driver = passwd-file
        auth_username_format = %{user | username}
        passwd_file_path = /etc/dovecot/passwd
}

#sieve
protocol lmtp {
  mail_plugins = sieve
}
sieve_script personal {
  path = ~/.dovecot.sieve
}

#/etc/dovecot/conf.d/10-mail.conf
mail_driver = maildir
mail_home = /mails/%{user | domain}/%{user | username}
mail_path = %{home}/Maildir
mail_uid = vmail
mail_gid = vmail

# To further reduce iops on the metacache volume when using zlib or mail_crypt; point the dovecot temp directory to a tmpfs volume. Source : https://doc.dovecot.org/configuration_manual/os/
mail_temp_dir = /dev/shm/
  • Créez le fichier /etc/dovecot/passwd, qui contiendra les informations d’authentification des utilisateurs :
root@debian:~# touch /etc/dovecot/passwd
  • Appliquez ensuite les bonnes permissions afin de sécuriser ce fichier :
root@debian:~# chown root:dovecot /etc/dovecot/passwd
root@debian:~# chmod 640 /etc/dovecot/passwd

Créer un utilisateur de messagerie

Nous devons d’abord générer un mot de passe chiffré pour notre utilisateur de messagerie. Pour cela, nous allons utiliser la commande doveadm, qui intègre un utilitaire de hachage. Le mot de passe chiffré obtenu sera ensuite ajouté au fichier /etc/dovecot/passwd afin de définir les identifiants de l’utilisateur.

💡 Remarque : l’algorithme de hachage ARGON2ID est plus sécurisé que SHA512-CRYPT. Cependant, si votre système ne prend pas en charge Argon2, vous pouvez utiliser doveadm pw -s SHA512-CRYPT sans crainte — cette méthode offre déjà une excellente protection.

  • Utilisez la commande doveadm pw pour générer le hachage de votre mot de passe (évitez d’utiliser un exemple aussi faible que le mien 😉), puis copiez le hachage obtenu :
root@debian:~# doveadm pw -s ARGON2ID
Enter new password:youWon'tfindMyPassWD
Retype new password:youWon'tfindMyPassWD
{ARGON2ID}$argon2id$v=19$m=65536,t=3,p=1$4IPe7Nj3kTZJ54f5sKnc0Q$1rIsKMMkz5wOeuIWZmHmk+aUBBvtiBAZTFtckKKsnfg
  • Modifiez le fichier /etc/dovecot/passwd et ajoutez la ligne suivante pour créer l’utilisateur john@std.rocks :
john:{ARGON2ID}$argon2id$v=19$m=65536,t=3,p=1$4IPe7Nj3kTZJ54f5sKnc0Q$1rIsKMMkz5wOeuIWZmHmk+aUBBvtiBAZTFtckKKsnfg::::::
  • Vous remarquerez les :::::: après le mot de passe chiffré. Ces champs sont optionnels, mais voici ce que chacun représente et comment les utiliser :
  • username : le nom d’utilisateur — dans cet exemple, john.
  • {ARGON2ID}$argon2id : le hachage du mot de passe généré avec la commande doveadm pw.
  • UID:GID : (optionnel) les identifiants utilisateur et groupe Unix. Comme nous utilisons un système de messagerie virtuelle, nous pouvons définir 7200:7200.
  • home : (optionnel) le chemin vers la boîte mail de l’utilisateur, par exemple /mails/std.rocks/john.
  • shell : (optionnel) définit le shell de l’utilisateur, si nécessaire.
  • extra_fields : (optionnel) permet d’ajouter des paramètres supplémentaires, tels que des quotas. Exemple : userdb_mail=maildir:/mails/%d/%n, userdb_quota_rule=*:storage=5G.
  • Créez le fichier /etc/postfix/virtual pour définir les alias de messagerie :
root: john@std.rocks
letsencrypt@std.rocks john@std.rocks
root@debian:~# postmap /etc/postfix/virtual

Avant de créer les dossiers IMAP, il est utile de visualiser la correspondance entre les dossiers du client de messagerie — tel que Thunderbird — et la structure des répertoires sur notre serveur mail.

Schéma montrant comment les dossiers IMAP d’un serveur Dovecot, tels que Inbox, Sent, Drafts, Junk et Trash, correspondent aux dossiers du client de messagerie Thunderbird pour l’utilisateur john@std.rocks.
Correspondance des dossiers IMAP — comment les dossiers stockés dans /mails/std.rocks/john correspondent aux boîtes de messagerie dans un client comme Thunderbird.
  • Une fois la structure des dossiers visualisée, créez le répertoire principal pour l’utilisateur john :
root@debian:~# install -d -m 700 -o vmail -g vmail /mails/std.rocks/john
  • Utilisez ensuite la commande maildirmake.dovecot pour créer la structure Maildir et ses sous-dossiers (Drafts, Sent, Trash et Junk) :
root@debian:~# sudo -u vmail maildirmake.dovecot /mails/std.rocks/john/Maildir
root@debian:~# sudo -u vmail maildirmake.dovecot /mails/std.rocks/john/Maildir/.Drafts
root@debian:~# sudo -u vmail maildirmake.dovecot /mails/std.rocks/john/Maildir/.Sent
root@debian:~# sudo -u vmail maildirmake.dovecot /mails/std.rocks/john/Maildir/.Trash
root@debian:~# sudo -u vmail maildirmake.dovecot /mails/std.rocks/john/Maildir/.Junk
  • Redémarrez enfin les deux services afin d’appliquer la configuration :
root@debian:~# systemctl restart postfix.service
root@debian:~# systemctl restart dovecot.service

Sécuriser votre serveur mail avec un certificat SSL Let’s Encrypt

À ce stade, votre serveur de messagerie devrait être pleinement fonctionnel. Nous allons maintenant installer des certificats SSL Let’s Encrypt afin de sécuriser les services SMTPS et IMAPS. Cette méthode est à la fois pratique et permet d’éviter les messages d’avertissement lors des connexions depuis les clients de messagerie.

Générer les certificats SSL Let’s Encrypt

  • Installez le paquet certbot :
root@debian:~# apt update && sudo apt install certbot
  • Utilisez ensuite certbot pour demander vos certificats SSL. Remplacez mail.std.rocks par votre propre domaine de messagerie et letsencrypt@std.rocks par votre adresse e-mail d’administration :
root@debian:~# certbot certonly --standalone -d mail.std.rocks --email letsencrypt@std.rocks --agree-tos --noninteractive
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Requesting a certificate for mail.std.rocks

Successfully received certificate.
Certificate is saved at: /etc/letsencrypt/live/mail.std.rocks/fullchain.pem
Key is saved at:         /etc/letsencrypt/live/mail.std.rocks/privkey.pem
This certificate expires on 2026-02-09.
These files will be updated when the certificate renews.
Certbot has set up a scheduled task to automatically renew this certificate in the background.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
If you like Certbot, please consider supporting our work by:
 * Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
 * Donating to EFF:                    https://eff.org/donate-le
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

💡 Remarque : surveillez la date d’expiration de votre certificat. Certbot configure automatiquement le renouvellement, mais vous pouvez également mettre en place une tâche cron ou un minuteur systemd pour garantir le bon déroulement du processus.

Intégrer les certificats Let’s Encrypt dans Dovecot et Postfix

  • Modifiez le fichier /etc/postfix/main.cf et mettez à jour les chemins afin d’utiliser les certificats Let’s Encrypt à la place des certificats auto-signés :
# Self-signed certificates (previous configuration)
#smtpd_tls_cert_file = /etc/ssl/certs/mail-selfsigned.crt
#smtpd_tls_key_file = /etc/ssl/private/mail-selfsigned.key

# Let’s Encrypt certificates (active configuration)
smtpd_tls_cert_file = /etc/letsencrypt/live/mail.std.rocks/fullchain.pem
smtpd_tls_key_file = /etc/letsencrypt/live/mail.std.rocks/privkey.pem
  • Redémarrez ensuite le service Postfix afin d’appliquer la nouvelle configuration SSL :
root@debian:~# systemctl restart postfix.service
  • Modifiez également le fichier /etc/dovecot/conf.d/dovecot.conf pour indiquer les chemins vers les fichiers de certificats et de clés Let’s Encrypt :
# Preferred permissions: root:root 0444
#ssl_server_cert_file = /etc/ssl/certs/fullchain.pem
ssl_server_cert_file = /etc/letsencrypt/live/mail.std.rocks/fullchain.pem

# Preferred permissions: root:root 0400
#ssl_server_key_file = /etc/ssl/private/privkey.pem
ssl_server_key_file = /etc/letsencrypt/live/mail.std.rocks/privkey.pem
  • Redémarrez enfin le service Dovecot pour charger les certificats mis à jour :
root@debian:~# systemctl restart dovecot.service

Configuration des clients de messagerie

Notre serveur mail est maintenant entièrement opérationnel ! Nous pouvons à présent configurer nos clients de messagerie — tels que Thunderbird sur ordinateur et K-9 Mail sur smartphone — pour se connecter en toute sécurité via IMAP et SMTP.

Thunderbird

Dans la fenêtre de configuration du compte, cliquez sur Configurer manuellement afin de saisir les paramètres du serveur vous-même.

Capture d’écran de la fenêtre de configuration d’un compte dans Thunderbird, affichant les champs nom complet, adresse e-mail john@std.rocks, mot de passe et le bouton Configurer manuellement.
Configuration du compte dans Thunderbird — saisissez votre nom complet, votre adresse e-mail et votre mot de passe, puis cliquez sur Configurer manuellement pour définir les paramètres du serveur.

Configurez ensuite le compte avec votre nom d’utilisateur, votre mot de passe et le nom du serveur. Pour IMAP, vous pouvez également utiliser STARTTLS sur le port 143 si vous le souhaitez.

Capture d’écran de la configuration manuelle dans Thunderbird montrant IMAP sur le port 993 avec SSL/TLS et SMTP sur le port 587 avec STARTTLS pour le compte john@std.rocks.
Configuration manuelle dans Thunderbird — IMAP configuré sur le port 993 avec SSL/TLS et SMTP sur le port 587 avec STARTTLS, en utilisant john@std.rocks comme identifiant.

K-9 Mail

Sur Android, vous pouvez utiliser l’application K-9 Mail pour vous connecter à votre serveur de messagerie. Comme pour Thunderbird, remplacez les valeurs d’exemple par vos propres identifiants et paramètres de serveur. Lors de la dernière étape de configuration, associez manuellement les dossiers spéciaux — Envoyés, Brouillons, Indésirables et Corbeille — afin de garantir une synchronisation correcte.

Captures d’écran de l’application K-9 Mail sur Android montrant la configuration IMAP avec mail.std.rocks sur le port 993 en SSL/TLS, SMTP sur le port 587 en STARTTLS, et le mappage manuel des dossiers Envoyés, Brouillons, Indésirables et Corbeille.
Configuration de K-9 Mail sur Android — IMAP sur le port 993 avec SSL/TLS, SMTP sur le port 587 avec STARTTLS, et mappage manuel des dossiers spéciaux pour une synchronisation optimale.

Félicitations ! 🎉 Vous disposez désormais d’un serveur de messagerie entièrement fonctionnel. Vous pouvez poursuivre votre chemin vers une véritable indépendance numérique en installant un calendrier partagé avec Baïkal sur le même serveur.