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 :
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 :
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).
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.
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).
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)
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.
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 = yesNous 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.
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.
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
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)