Portail / Mise en place d'un système de messagerie sous Debian 11 (serveur avec accès direct à internet)(Sommaire)

Installation et configuration du serveur Postfix.

Mise à jour du 10/12/2021.

Avant de vous lancer dans cette installation, vous devez être en possession :

Une messagerie (Inter/intra)net permet d'envoyer et de recevoir des courriels. Cela nécessite un MTA (Mail Transfer Agent) et nous utilisons comme MTA le serveur Postfix. Notez que le MTA n'est pas conçu pour faciliter la communication avec un client de messagerie. Pour cela, nous utiliserons un autre serveur (Dovecot) qui collaborera avec notre MTA. A l'origine, les serveurs de messagerie sous Linux comme Postfix sont conçus pour distribuer le courrier uniquement aux utilisateurs locaux (comptes Linux). Toutefois, lorsque le nombre de boîtes-aux-lettres (BAL) devient important, cette approche est contre-productive car elle impose une double administration et consomme inutilement des ressources machine. Ce que nous voulons à la place, c'est un ensemble personnalisé d'adresses courriel pour notre domaine enregistré. C'est là que les utilisateurs "virtuels" entrent en jeu. "Virtuel" signifie ici non associé à un compte Linux. C'est notre base de données PostgreSQL qui sera utilisée pour stocker les adresses courriel de ces comptes virtuels ainsi que leurs paramètres de connexion.

Cet article montre comment installer le serveur Postfix. Il existe 2 grands formats de sauvegarde des messages sur le serveur :

  1. le format d'origine mailbox qui sauvegardent tous les messages dans un même fichier ;
  2. le format plus récent maildir qui attribuent à chaque BAL un répertoire pour stocker ses messages.

Nous choisissons ici le format maildir. Notez que face au volume de travail, cet article est scindé en plusieurs autres. Les liens ci-dessous permettent d'accéder directement à l'étape à réaliser. Les étapes à suivre (dans l'ordre à moins de savoir ce que vous faites) sont :

  1. Configuration du DNS ;
  2. Configuration des règles de pare-feu ;
  3. Création du role de messagerie et de sa base de données ;
  4. Installation du MTA Postfix ;
  5. Configuration de Postfix ;
  6. Liaison de Postfix à la base de données des BAL virtuelles ;
  7. Prise en compte de la configuration de PostgreSQL ;
  8. Modification de l'accès réseau pour le MTA ;
  9. Installation d'un gestionnaire des messages reçus : Dovecot ;

Configuration du DNS.

Un client de messagerie qui émet un message depuis son domaine Internet a besoin de savoir quelle est l'adresse du serveur de messagerie de chaque domaine Internet auquel appartient chacun de ses destinataires. Il est donc nécessaire de préciser à l'Internet où trouver l'adresse de votre MTA. Cela se fait via le DNS (Domain Name Server) de votre propre domaine. Un DNS est chargé, lorsqu'il est interrogé de transformer un nom d'hôte IP en une adresse IP. Pour désigner votre ou vos MTA, il existe un enregistrement particulier du DNS nommé champ MX. Il faut donc paramétrer sur le DNS de votre domaine, l'adresse IP du MTA, sa valeur de priorité, et son nom (FQDN).

  1. La première est l'usage classique du web avec le nom d'hôte www.piapp.fr ;
  2. Le second est destiné au webmail de la messagerie qu'il est plus facile d'identifier avec mail.piapp.fr.

Pour parvenir à ces fins, nous devons déjà paramétrer correctement le DNS. La machine elle-même est repérée par un enregistrement de type A :

A     poste     192.168.0.10    # remplacez l'adresse IP par celle d'accès à l'Internet

Nous créons ensuite un série d'alias :

CNAME mail      poste.piapp.fr.
CNAME smtp      mail.piapp.fr.
CNAME imap      mail.piapp.fr.
CNAME pop       mail.piapp.fr.
CNAME www       poste.piapp.fr.

Nous créons ensuite l'enregistrement de type MX pour déclarer le serveur de messagerie du domaine :

MX    @         10 mail.piapp.fr

Notez que 10 fixe le niveau de priorité du serveur de messagerie. Plus ce nombre est faible, plus importante est la priorité du serveur. Cela est surtout utile lorsqu'il existe plusieurs serveurs pour assurer la tolérance aux pannes.

Avec ces enregistrements, www.piapp.fr et mail.piapp.frpointe sur la même machine d'adresse IP 192.168.0.10.

Vous devez également créer un enregistrement de pointeur DNS inversé (PTR). Assurez-vous que votre PTR ipv4 est défini sur mail.piapp.fr.

Configuration des règles de pare-feu.

Il est indispensable de configurer votre pare-feu (ou celui de votre fournisseur pour accepter en entrée le protocole TCP/IP à tout le monde sur les ports 22 (SFTP) [si vous utilisez SSH], 25 (SMTP clair), 80 (HTTP), 443 (HTTPS), 465 (SMTP TLS), 993 (IMAPS) et 995 (POP3S). Notez que nous recommandons de ne pas ouvrir le port 5432 du serveur postgresqlcar il n'est accédé que sur la machine locale (à moins que vous n'ayez déporté votre base de données sur une autre machine). Là encore la configuration du ou des pare-feux est hors du champ de ces articles. Nous limiterons nos explications au protocole IPv4 (pas de prise en compte d'IPv6).

Installation du MTA Postfix.

Installation avec le gestionnaire de paquets.

Vous devez commencer par mettre à jour les référentiels de paquets Debian et installer ensuite le paquet postfix. Nous inclurons deux paquets supplémentaires. Ceux-ci permettront à Postfix de s'interfacer avec notre base de données PostgreSQL et d'utiliser des expressions régulières compatibles Perl (ou PCRE) afin d'aider à interdire les courriels indésirables. Les commandes sont :

sudo apt update
sudo apt install postfix postfix-pgsql postfix-pcre mailutils

Lorsque la configuration du programme d'installation apparaît, sélectionnez Internet Sitecomme configuration de messagerie. Votre nom de messagerie doit être votre domaine (piapp.fr). Une fois l'installation achevée, sauvegardez les fichiers de configuration de Postfix et créez vos propres fichiers de configuration. Pour cela vous pouvez vous aider du script qui suit à lancer avec des droits root 

#!/bin/bash
# Sauvegarde des fichiers de configuration de Postfix
# et création des fichiers de configuration de la liaison à PostgreSQL
#
MAINCF=/etc/postfix/main.cf
MASTERCF=/etc/postfix/master.cf

DOMAINS=/etc/postfix/pgsql-virtual-mailbox-domains.cf
MAPS=/etc/postfix/pgsql-virtual-mailbox-maps.cf
ALIAS=/etc/postfix/pgsql-virtual-alias-maps.cf
EMAILS=/etc/postfix/pgsql-virtual-email2email.cf

# Sauvegarde
if [ ! -f "$MAINCF.bak" ]
then
  cp "$MAINCF" "$MAINCF.bak"
  echo -e "Fichier $MAINCF sauvegardé sous $MAINCF.bak"
else
  echo -e "Le fichier $MAINCF.bak existe déjà, aucune sauvegarde de $MAINCF effectuée."
fi
if [ ! -f "$MASTER.bak" ]
then
  cp "$MASTERCF" "$MASTERCF.bak"
  echo -e "Fichier $MASTERCF sauvegardé sous $MASTERCF.bak"
else
  echo -e "Le fichier $MASTERCF.bak existe déjà, aucune sauvegarde de $MASTERCF effectuée."
fi

# Création
if [ ! -f "$DOMAINS" ]
then
  touch "$DOMAINS"
  echo -e "Fichier $DOMAINS créé (mais vide)"
else
  echo -e "Le fichier $DOMAINS existe déjà, aucune création effectuée."
fi
if [ ! -f "$MAPS" ]
then
  touch "$MAPS"
  echo -e "Fichier $MAPS créé (mais vide)"
else
  echo -e "Le fichier $MAPS existe déjà, aucune création effectuée."
fi
if [ ! -f "$ALIAS" ]
then
  touch "$ALIAS"
  echo -e "Fichier $ALIAS créé (mais vide)"
else
  echo -e "Le fichier $ALIAS existe déjà, aucune création effectuée."
fi
if [ ! -f "$EMAILS" ]
then
  touch "$EMAILS"
  echo -e "Fichier $EMAILS créé (mais vide)"
else
  echo -e "Le fichier $EMAILS existe déjà, aucune création effectuée."
fi

Ce script vous protège d'une erreur d'exécution lorsque cette étape a déjà été effectuée. Notez que la commande touch ne fait que créer des fichiers vides que nous devrons renseigner par la suite. Voici la sortie console à la première exécution :

Fichier /etc/postfix/main.cf sauvegardé sous /etc/postfix/main.cf.bak
Fichier /etc/postfix/master.cf sauvegardé sous /etc/postfix/master.cf.bak
Fichier /etc/postfix/pgsql-virtual-mailbox-domains.cf créé (mais vide)
Fichier /etc/postfix/pgsql-virtual-mailbox-maps.cf créé (mais vide)
Fichier /etc/postfix/pgsql-virtual-alias-maps.cf créé (mais vide)
Fichier /etc/postfix/pgsql-virtual-email2email.cf créé (mais vide)

Aménagement du fichier de configuration principal.

Le fichier /etc/postfix/main.cf est le fichier de configuration principal. Nous allons le modifier pour que le MTA se comporte comme nous le souhaitons.

Chiffrement du transport des messages.

Nous souhaitons utiliser un certificat (dans notre cas via Certbot de Let's Encrypt) pour nous assurer que nos courriels sont envoyés chiffrés. Dans l'autre sens (réception des courriels d'autres MTA), nous ne pouvons garantir que les connexions à notre serveur seront chiffrées. Avec des droits root ouvrez au moyen de votre éditeur de texte préféré le fichier /etc/postfix/main.cf. Recherchez les paramètres # TLS et remplacez les lignes de ce paragraphe par les lignes ci-dessous. Assurez-vous de substituer les noms et emplacements de votre propre certificat et de votre propre clef privée.

# Paramètres TLS
smtpd_tls_cert_file=/etc/letsencrypt/live/piapp.fr/fullchain.pem
smtpd_tls_key_file=/etc/letsencrypt/live/piapp.fr/privkey.pem
smtpd_use_tls=yes
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
smtpd_tls_auth_only = yes
smtp_tls_security_level = may
smtpd_tls_security_level = may
smtpd_tls_loglevel = 2
smtp_tls_loglevel = 2
smtpd_tls_received_header = yes
smtp_tls_CApath = /etc/ssl/certs
smtpd_tls_CApath = /etc/ssl/certs

# Type de chiffrement TLS
smtpd_tls_protocols = TLSv1.3, TLSv1.2, TLSv1.1, !TLSv1, !SSLv2, !SSLv3
smtp_tls_protocols = TLSv1.3, TLSv1.2, TLSv1.1, !TLSv1, !SSLv2, !SSLv3
smtp_tls_ciphers = high
smtpd_tls_ciphers = high
smtpd_tls_mandatory_protocols = TLSv1.3, TLSv1.2, TLSv1.1, !TLSv1, !SSLv2, !SSLv3
smtp_tls_mandatory_protocols = TLSv1.3, TLSv1.2, TLSv1.1, !TLSv1, !SSLv2, !SSLv3
smtp_tls_mandatory_ciphers = high
smtpd_tls_mandatory_ciphers = high
smtpd_tls_mandatory_exclude_ciphers = MD5, DES, ADH, RC4, PSD, SRP, 3DES, eNULL, aNULL
smtpd_tls_exclude_ciphers = MD5, DES, ADH, RC4, PSD, SRP, 3DES, eNULL, aNULL
smtp_tls_mandatory_exclude_ciphers = MD5, DES, ADH, RC4, PSD, SRP, 3DES, eNULL, aNULL
smtp_tls_exclude_ciphers = MD5, DES, ADH, RC4, PSD, SRP, 3DES, eNULL, aNULL
tls_preempt_cipherlist = yes

Paramètres de base.

Nous personnalisons ensuite le dernier blocs de paramètres :

# Paramètres de base
myhostname = mail.piapp.fr
myorigin = /etc/mailname
mydestination = localhost
mynetworks = 127.0.0.0/8
mailbox_size_limit = 5368709120
recipient_delimiter = +
inet_interfaces = 192.168.0.10, 127.0.0.1
inet_protocols = ipv4
relay_domains =
relayhost =

Nous avons limité ici le quota des BAL à 5 gio. Une valeur nulle signifie aucun quota.

Gestion des courriels.

Les paramètres de gestion des courriels indiqueront à Postfix quels expéditeurs accepter (les courriels from) et quels expéditeurs rejeter. De même, il est possible de préciser quels destinataires accepter ou rejeter (les courriels to) ainsi que d'autres paramètres d'acceptation ou de rejet. Les vérifications d'en-têtes reposent sur un fichier de lignes d'expressions régulières utilisées pour rejeter les modèles de nom de serveur qui envoient des pourriels. Les lignes unlock_rbl_client indiquent à Postfix de rechercher l'expéditeur dans les listes noires mises en place par les serveurs nommés. Les autres paramètres aident à empêcher les spammeurs peu compétents de vous atteindre (ils n'empêcheront pas les plus avertis). Assurez-vous également que, seules les personnes de votre réseau et de votre base de données sont autorisées à utiliser votre MTA. Si vous autorisez tout le monde à accéder à votre MTA, votre fournisseur de services peut vous bloquer et l'adresse IP de votre serveur de messagerie sera probablement mise sur liste noire.

# Gestion des courriels
header_checks = pcre:/etc/postfix/pcre_headers
smtpd_client_restrictions =
  permit_dnswl_client list.dnswl.org
  check_client_access hash:/etc/postfix/client_access
  check_sender_access hash:/etc/postfix/sender_email_access
  reject_unknown_reverse_client_hostname
  reject_rbl_client zen.spamhaus.org
  reject_rbl_client bl.spamcop.net
  reject_rbl_client dnsbl.sorbs.net
smtpd_helo_required = yes
smtpd_helo_restrictions =
  permit_mynetworks
  permit_sasl_authenticated
  reject_invalid_helo_hostname
  reject_non_fqdn_helo_hostname
smtpd_sender_restrictions =
  permit_sasl_authenticated
  reject_unknown_reverse_client_hostname
  reject_unknown_sender_domain
  reject_non_fqdn_sender
smtpd_recipient_restrictions =
  reject_unknown_recipient_domain
  reject_unauth_pipelining
  permit_mynetworks
  permit_sasl_authenticated
  # Une fois que le serveur de courriel émet et reçoit sans problème
  # COMMENTEZ defer_unauth_destination et
  # DECOMMENTEZ reject_unauth_destination
  defer_unauth_destination
  #reject_unauth_destination
smtpd_relay_restrictions =
  permit_mynetworks
  permit_sasl_authenticated
  # Une fois que le serveur de courriel émet et reçoit sans problème
  # COMMENTEZ out defer_unauth_destination and
  # DECOMMENTEZ reject_unauth_destination
  defer_unauth_destination
  #reject_unauth_destination
smtpd_data_restrictions =
  reject_unauth_pipelining
  permit

Créez les fichiers de recherche que nous avons notés dans notre fichier de configuration. Nous les modifierons une fois que nous commencerons à recevoir des courriers indésirables.

sudo touch /etc/postfix/pcre_headers
sudo touch /etc/postfix/client_access
sudo touch /etc/postfix/sender_email_access
sudo postmap /etc/postfix/client_access
sudo postmap /etc/postfix/sender_email_access

Vous pouvez également enrichir le script vu précédemment pour faciliter cette opération. Vous pouvez tester la configuration grâce à la commande postfix check. Pour faire prendre en compte "à chaud" la nouvelle configuration tapez la commande service postfix reload.

Prise en compte de la configuration de PostgreSQL.

Nous avons créé 4 fichiers de configuration qui permettent à Postfix d'accéder aux tables de la base de données qui déclarent les BAL virtuelles. Nous avons également renseigné le contenu de ces fichiers. Il faut maintenant déclarer ces fichiers à la configuration de Postfix de façon à ce qu'il puisse s'en servir. Cela se fait en ajoutant une section de paramètres au fichier /etc/postfix/main.cf :

# Virtual domains, users and aliases
virtual_mailbox_domains = pgsql:/etc/postfix/pgsql-virtual-mailbox-domains.cf
virtual_mailbox_maps = pgsql:/etc/postfix/pgsql-virtual-mailbox-maps.cf
virtual_alias_maps = 
  pgsql:/etc/postfix/pgsql-virtual-alias-maps.cf
  pgsql:/etc/postfix/pgsql-virtual-email2email.cf

Modification de l'accès réseau pour le MTA.

A la base, le port par défaut du MTA est 25. Comme nous voulons utiliser sa capacité de chiffrement du transport nous allons devoir le déclarer à Postfix. Les processus démons de Postfix contrôlent comment ce dernier est appelé et quand. Nous allons modifier le fichier de configuration du processus master qui gère les communications. Ouvrez le fichier /etc/postfix/master.cf. Décommentez les lignes suivantes et assurez-vous qu'elles se lisent comme suit. Ces lignes devraient être 17-20 :

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

Faites la même chose pour la ligne 23 :

  -o smtpd_client_restrictions=permit_sasl_authenticated,reject

Modifiez également les lignes 28 à 32 :

  -o milter_macro_daemon_name=ORIGINATING
smtps     inet  n       -       y       -       -       smtpd
  -o syslog_name=postfix/smtps
  -o smtpd_tls_wrappermode=yes
  -o smtpd_sasl_auth_enable=yes

Modifiez ensuite la ligne 34 :

  -o smtpd_client_restrictions=permit_sasl_authenticated,reject

puis la ligne 39 :

  -o milter_macro_daemon_name=ORIGINATING

Rechargez le MTA via la commande service postfix reload.

Rédaction par Jean-Marie Piatte (1983-2021)