PostfixPostfix est un serveur mail, et plus exactement un MTA (Mail Transfer Agent). Il gère l’envoi et la réception de mails par Internet en utilisant le protocole SMTP. Le monde de l’Open Source offre toute une panoplie de MTA, parmi lesquels on trouve Postfix, Exim, Qmail et Sendmail.

Dans ce premier article sur les serveurs mails, nous allons configurer Postfix sur une machine publique tournant sous CentOS 7. Notre premier objectif, ce sera l’envoi des messages du système comme par exemple les notifications de yum-cron. Cette configuration pourra également être utilisée par les applications locales comme OwnCloud ou WordPress.

Prérequis

Avant de mettre la main à la pâte, on pourra vérifier si le serveur n’est pas blacklisté quelque part.

MXToolbox

Installation

Postfix est inclus dans une installation minimale de CentOS. S’il n’est pas présent sur le système, on peut l’installer comme ceci.

$ sudo yum install postfix

On installera également la commande mail (paquet mailx) pour pouvoir tester et gérer les mails en ligne de commande directement sur le serveur.

$ sudo yum install mailx

Configuration initiale

Les fichiers de configuration utilisés par Postfix se situent dans /etc/postfix.

  • Le fichier master.cf gère la configuration du démon master de Postfix. Dans la plupart des configurations de base, on n’aura pas à intervenir sur ce fichier.
  • Le fichier main.cf contient les paramètres de contrôle des démons de Postfix. C’est celui que l’on modifiera le plus souvent.

Le fichier main.cf fourni par défaut fait près de 680 lignes, la plupart étant des commentaires. On peut commencer par aérer ce fichier pour ne garder que les directives.

$ cd /etc/postfix
$ sudo mv main.cf main.cf.orig
$ grep -h -v '^[[:space:]]*\#' main.cf.orig | grep -v '^[[:space:]]*$' | \
  sudo tee main.cf

On obtient un fichier beaucoup plus lisible.

# /etc/postfix/main.cf
queue_directory = /var/spool/postfix
command_directory = /usr/sbin
daemon_directory = /usr/libexec/postfix
data_directory = /var/lib/postfix
mail_owner = postfix
inet_interfaces = localhost
inet_protocols = all
mydestination = $myhostname, localhost.$mydomain, localhost
unknown_local_recipient_reject_code = 550
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
debug_peer_level = 2
debugger_command =
  PATH=/bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin
  ddd $daemon_directory/$process_name $process_id & sleep 5
sendmail_path = /usr/sbin/sendmail.postfix
newaliases_path = /usr/bin/newaliases.postfix
mailq_path = /usr/bin/mailq.postfix
setgid_group = postdrop
html_directory = no
manpage_directory = /usr/share/man
sample_directory = /usr/share/doc/postfix-2.10.1/samples
readme_directory = /usr/share/doc/postfix-2.10.1/README_FILES

Si un paramètre n’est pas présent dans main.cf, Postfix utilisera sa valeur par défaut. Pour la plupart, ces valeurs sont définies « en dur » dans le code source de Postfix, tandis que certaines sont initialisées à la compilation et quelques-unes au moment du lancement du programme.

Le programme postconf est très utile pour examiner les valeurs courantes et par défaut du fichier main.cf. Pour afficher la valeurs de certains paramètres de configuration, il suffit de les fournir en argument.

$ postconf inet_interfaces
inet_interfaces = localhost

L’option -d affichera la valeur par défaut des paramètres demandés.

$ postconf -d inet_interfaces
inet_interfaces = all

Nous allons supprimer la plupart des paramètres redondants ou autrement inutiles, pour commencer avec quelques directives de base.

# /etc/postfix/main.cf

# Désactiver l'IPv6
inet_protocols = ipv4

# Envoi seul
mailbox_size_limit = 0
inet_interfaces = localhost

# Identification
smtpd_banner = $myhostname ESMTP $mail_name (CentOS)

# Nom d'hôte pleinement qualifié du serveur
myhostname = sd-100246.dedibox.fr

# Domaine du serveur
mydomain = dedibox.fr

# Domaine pour qualifier les adresses sans partie domaine
myorigin = $myhostname

# Envoi de mails sans authentification
mynetworks = 127.0.0.0/8

# Relais
relayhost =

# Tables de correspondance
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases

# Commande de débogage
debugger_command =
  PATH=/bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin
  ddd $daemon_directory/$process_name $process_id & sleep 5

# Chemins des commandes
sendmail_path = /usr/sbin/sendmail.postfix
newaliases_path = /usr/bin/newaliases.postfix
mailq_path = /usr/bin/mailq.postfix

# Documentation
manpage_directory = /usr/share/man
sample_directory = /usr/share/doc/postfix-2.10.1/samples
readme_directory = /usr/share/doc/postfix-2.10.1/README_FILES

Quelques remarques :

  • Si l’IPv6 est désactivé au niveau du système, il faudra également le faire ici grâce à la directive inet_protocols.
  • inet_interfaces = localhost limite l’utilisation de Postfix aux applications locales.
  • smtpd_banner définit la chaîne de caractères avec laquelle Postfix s’identifie auprès d’un autre MTA.
  • myhostname est censé contenir le nom d’hôte pleinement qualifié du serveur, c’est-à-dire le résultat de la commande hostname --fqdn.
  • myorigin définit le domaine auquel sont associés des mails envoyés localement. Par défaut, myorigin a la même valeur que myhostname.
  • mynetworks définit les adresses depuis lesquelles Postfix accepte les mails sans authentification via SMTP.
  • relayhost définit le MTA auquel on est censé transférer les mails qui ne doivent pas être acheminés localement. Dans notre configuration, cette directive doit rester vide. On l’utilisera sur un serveur de réseau local pour transférer les mails à un MTA public sur Internet.
  • alias_maps définit l’emplacement de la table de correspondance, et alias_database la base de données correspondante. Certaines informations ne peuvent pas être facilement représentées dans main.cf. Les tables de correspondance permettent de les stocker dans des fichiers externes. Postfix n’utilise pas directement les fichiers texte, ce serait trop lent. Au lieu de cela, les tables de correspondance de type hash (ou “tables de hachage) servent pour construire des fichiers indexés, grâce à la bibliothèque Berkeley DB. Le programme postmap est utilisé pour construire les fichiers indexés. Pour mettre à jour les alias, on utilisera la commande newaliases.

Éditer la table de correspondance.

# /etc/aliases
# Basic system aliases -- these MUST be present.
mailer-daemon:  postmaster
postmaster:     root
# General redirections for pseudo accounts.
bin:            root
daemon:         root
adm:            root
...
# trap decode to catch security attacks
decode:         root
# Person who should get root's mail
root:           info@microlinux.fr

Construire le fichier indexé.

$ sudo newaliases

Premier test

Activer et démarrer Postfix.

$ sudo systemctl enable postfix
$ sudo systemctl start postfix

Vérifier si Postfix tourne correctement.

$ systemctl status postfix
● postfix.service - Postfix Mail Transport Agent
   Loaded: loaded (/usr/lib/systemd/system/postfix.service; 
           enabled; vendor preset: disabled)
   Active: active (running) since Fri 2019-03-29 07:41:11 CET; 
           47s ago
   ...
$ sudo cat /var/log/maillog
... starting the Postfix mail system
... daemon started -- version 2.10.1, configuration /etc/postfix

Envoyer un mail vers un compte mail externe auquel on a accès. Un point . sur une ligne à part marque la fin du message.

$ mail info@microlinux.fr
Subject: Test Postfix
Ceci est un test.
.
EOT

Se connecter au compte mail externe et vérifier si le message a bien été envoyé.

À partir de là, Postfix pourra être utilisé par les applications locales. Voici par exemple un message envoyé par yum-cron.

Notification de mise à jour yum-cron

Téléchargement

Un modèle de fichier de configuration main.cf.minimal pour Postfix est disponible dans mon dépôt Github, dans le répertoire el7/config/postfix.

$ git clone https://github.com/kikinovak/centos


Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.