Serveur mail sous CentOS (1) Postfix

Postfix LogoPostfix 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.

Prérequis

Dans le pare-feu, il faudra ouvrir le port 25 en TCP.

Vérifier si le serveur n’est pas blacklisté quelque part.

Il faut impérativement disposer d’un ou de plusieurs noms de domaines enregistrés et valides.

  • slackbox.fr
  • unixbox.fr
  • etc.

Sur une machine externe, vérifier la configuration DNS des domaines pour lesquels on souhaite gérer le courrier, comme ceci.

$ host -t mx slackbox.fr
slackbox.fr mail is handled by 10 mail.slackbox.fr.
$ host mail.slackbox.fr
mail.slackbox.fr has address 163.172.220.174
$ host slackbox.fr
slackbox.fr has address 163.172.220.174
slackbox.fr mail is handled by 10 mail.slackbox.fr.
$ host 163.172.220.174
174.220.172.163.in-addr.arpa domain name pointer 
sd-100246.dedibox.fr.

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.

# yum install postfix

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

# yum install mailx mutt

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
# mv main.cf main.cf.orig
# grep -h -v '^[[:space:]]*\#' main.cf.orig | \
  grep -v '^[[:space:]]*$' > 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

# 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

# Domaines locaux
mydestination = $myhostname, localhost.$mydomain, localhost

# Envoi de mails sans authentification
mynetworks = 127.0.0.0/8

# Relais
relayhost =

# Format de stockage
home_mailbox = Maildir/

# 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.
  • 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.
  • mydestination fournit la liste des domaines pour lesquels les messages reçus doivent être stockés dans une boîte mail locale. Même si Postfix gère plusieurs domaines, mydestination ne doit spécifier que le domaine principal. Les domaines virtuels seront gérés par la directive virtual_alias_domains, que nous verrons plus loin.
  • mynetworks définit les adresses depuis lesquelles Postfix accepte les mails sans authentification via SMTP. Les plages d’adresses fournies ici désignent donc toutes les machines auxquelles Postfix fait confiance, si l’on peut dire. Sur un serveur dédié public, il est impératif de définir uniquement l’hôte local pour mynetworks, sous peine de se retrouver avec une “pompe à merde”, le terme communément utilisé pour les serveurs mails mal configurés qui sont utilisés par des tiers malintentionnés pour l’envoi massif de spams sans authentification. Les spammeurs du monde entier adorent ce genre de machines.
  • 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.
  • Le format de stockage par défaut de Postfix, c’est mbox. On préférera le format Maildir/, bien plus adapté pour une configuration IMAP.
  • 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:           microlinux

Construire le fichier indexé.

# newaliases

Premier test

Activer et démarrer Postfix.

# systemctl enable postfix
# 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 sam. 2017-06-10 12:51:19 CEST; 
           47s ago
   ...
# cat /var/log/maillog
... starting the Postfix mail system
... daemon started -- version 2.10.1, configuration /etc/postfix

Basculer vers un compte utilisateur normal (microlinux dans l’exemple) et envoyer un mail vers un compte mail externe auquel on a accès. Un point . sur une ligne à part marque la fin du message.

# su - microlinux
Dernière connexion : samedi 10 juin 2017 à 10:18:37 CEST sur pts/0
$ 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é, puis répondre à ce message. Si tout se passe bien, le répertoire utilisateur contient un nouveau répertoire ~/Maildir, qui ressemble à ceci.

$ tree Maildir/
Maildir/
├── cur
├── new
│   └── 1497093622.V802I148M893901.sd-100246.dedibox.fr
└── tmp

3 directories, 1 file

Le nouveau mail est un simple fichier texte, que l’on peut afficher avec less par exemple.

$ less Maildir/new/1497093622.V802I148M893901.sd-100246.dedibox.fr
Return-Path: <info@microlinux.fr> 
X-Original-To: microlinux@sd-100246.dedibox.fr
Delivered-To: microlinux@sd-100246.dedibox.fr
...

Le 10/06/2017 à 13:19, microlinux a écrit :
> Ceci est un test.
> 

Et voici la réponse.

-- 
Microlinux - Solutions informatiques durables
7, place de l'église - 30730 Montpezat
Web  : http://www.microlinux.fr
Mail : info@microlinux.fr
Tél. : 04 66 63 10 32

Gérer les mails en ligne de commande avec Mutt

Mutt est un MUA (Mail User Agent) en ligne de commande. On peut l’utiliser sur des machines dépourvues d’interface graphique.

Avant de lancer Mutt, éditer le fichier de configuration ~/.muttrc.

# ~/.muttrc 
set mbox_type=Maildir
set folder="~/Maildir"
set spoolfile="~/Maildir"
set mbox="+Mailbox"
my_hdr From: microlinux@sd-100246.dedibox.fr (Microlinux)
my_hdr Reply-To: microlinux@sd-100246.dedibox.fr (Microlinux)

Lancer Mutt :

$ mutt

La fenêtre principale de Mutt affiche la boite de réception. Les nouveaux mails sont marqués par un N. Une barre d’état en haut de l’écran affiche les principaux raccourcis. En règle générale, Mutt fonctionne avec les mêmes raccourcis que Vim. Pour lire un message, il suffit de le sélectionner et d’appuyer sur Entrée.

Mutt

Créer les comptes Linux pour la messagerie

Bien sûr, c’est plus élégant de créer des comptes virtuels gérés par une base de données et tout le bling bling. Le Web regorge d’ailleurs de tutos de ce genre, rivalisant de complexité. Pour commencer, nous allons rester fidèles au principe KISS et passer par des comptes Linux traditionnels.

Dans l’exemple qui suit, nous gérons le courrier des deux domaines slackbox.fr et unixbox.fr, avec les adresses mail suivantes.

  • jean.mortreux@slackbox.fr
  • agnes.debuf@slackbox.fr
  • fanny.banester@slackbox.fr
  • jean.mortreux@unixbox.fr
  • franck.teyssier@unixbox.fr

Dans un premier temps, nous allons créer des comptes Linux traditionnels, un par compte mail, en respectant les conventions de nommage classiques.

# useradd -c "Jean Mortreux" -s /sbin/nologin jmortreux
# useradd -c "Jean Mortreux" -s /sbin/nologin jmortreux2
# useradd -c "Agnès Debuf" -s /sbin/nologin adebuf
# useradd -c "Fanny Banester" -s /sbin/nologin fbanester
# useradd -c "Franck Teyssier" -s /sbin/nologin fteyssier

Deux remarques.

  • Les utilisateurs n’ont pas de shell de connexion, c’est-à-dire qu’ils ne pourront pas se connecter directement au serveur.
  • L’utilisateur Jean Mortreux dispose de deux comptes distincts jmortreux et jmortreux2, un pour chaque adresse mail.

Pour ne pas avoir à inventer des mots de passe raisonnablement compliqués pour chaque utilisateur, on peut utiliser l’outil pwgen, disponible dans le dépôt EPEL. Voici un exemple pour créer un mot de passe aléatoire long de huit caractères, composé de chiffres et de lettres majuscules et minuscules.

# pwgen -n -N 1

On va créer notre propre “base de données” sous forme de simple fichier texte mails.txt.

Nom              Mail                         Login       Pass
=================================================================
Agnès Debuf      agnes.debuf@slackbox.fr      adebuf      iesch6Ah
Fanny Banester   fanny.banester@slackbox.fr   fbanester   nai7abYi
Franck Teyssier  franck.teyssier@unixbox.fr   fteyssier   axr2aeNu
Jean Mortreux    jean.mortreux@slackbox.fr    jmortreux   aeFphk3t
                 jean.mortreux@unixbox.fr     jmortreux2  Psaelie3

Étant donné qu’il contient des informations sensibles, on va le stocker dans un
endroit approprié, à l’abri des regards curieux.

# ls -l /root/mails.txt
-rw-------. 1 root root 466 11 juil. 10:07 /root/mails.txt

Les alias

Un alias est un nom supplémentaire pour recevoir du courrier électronique. En réalité, les mails sont acheminés vers un compte qui existe déjà. Les alias sont définis dans le fichier /etc/aliases.

...
# Person who should get root's mail
root: microlinux

# Utilisateurs
agnes.debuf: adebuf
fanny.banester: fbanester
franck.teyssier: fteyssier
jean.mortreux: jmortreux, jmortreux2

À chaque modification de ce fichier, il faut reconstruire /etc/aliases.db, la base
de données des alias.

# newaliases

Définir les destinataires autorisés

Dans la configuration par défaut, tous les comptes Linux peuvent recevoir du courrier, y compris les comptes système comme root, named ou nobody si l’on utilise le fichier /etc/aliases fourni par défaut. Dans notre configuration, c’est l’utilisateur microlinux qui recevra les mails pour les comptes système.

Pour tester ce comportement, on peut créer un utilisateur bidon avec useradd et lui envoyer un mail à l’adresse bidon@sd-100246.dedibox.fr. On constate alors que ça passe comme une lettre à la poste.

# tree /home/bidon/Maildir/
/home/bidon/Maildir/
├── cur
├── new
│   └── 1489396170.V803I1c00037M362342.sd-100246.dedibox.fr
└── tmp

On va donc instaurer quelques restrictions pour éviter de spammer tout ce petit monde. Pour ce faire, on va créer un fichier /etc/postfix/local-recips avec la liste de tous les destinataires autorisés, en suivant la syntaxe suivante.

# /etc/postfix/local-recips
adebuf      x
fbanester   x
fteyssier   x
jmortreux   x
jmortreux2  x
microlinux  x

À partir de ce fichier, on va générer une base de données dans un format lisible pour Postfix.

# cd /etc/postfix
# postmap local-recips

Nous pouvons vérifier si le fichier a été généré correctement.

# postmap -s hash:local-recips
blabevue  x
jdupont   x
fantasio  x
glagaffe  x
glagaffe2 x

À chaque modification de local-recips, il faudra réinvoquer postmap local-recips pour reconstruire le fichier de base de données local-recips.db.

Pour prendre en compte les nouvelles restrictions, éditer /etc/postfix/main.cf et ajouter le paramètre suivant.

# Tables de correspondance
alias_maps = hash:/etc/postfix/aliases
alias_database = hash:/etc/postfix/aliases
local_recipient_maps = hash:/etc/postfix/local-recips $alias_maps

Prendre en compte les modifications.

# systemctl reload postfix

À partir de là, seuls les utilisateurs explicitement définis dans local-recips pourront recevoir du courrier.

Comptes Linux et adresses de messagerie

La prochaine étape consiste à faire correspondre les comptes Linux et les adresses de messagerie. Pour ce faire, on va créer un fichier /etc/postfix/canonical.

# /etc/postfix/canonical
adebuf      agnes.debuf@slackbox.fr
fbanester   fanny.banester@slackbox.fr
fteyssier   franck.teyssier@unixbox.fr
jmortreux   jean.mortreux@slackbox.fr
jmortreux2  jean.mortreux@unixbox.fr

Convertir le tableau en un format lisible pour Postfix.

# cd /etc/postfix
# postmap canonical

Définir le paramètre correspondant dans /etc/postfix/main.cf.

# Tables de correspondance
alias_maps = hash:/etc/postfix/aliases
alias_database = hash:/etc/postfix/aliases
local_recipient_maps = hash:/etc/postfix/local-recips $alias_maps
canonical_maps = hash:/etc/postfix/canonical

Domaines virtuels avec des utilisateurs distincts

Les domaines virtuels (Hosted Domains) sont tous les domaines qui ne correspondent pas au nom d’hôte du serveur, c’est-à-dire au résultat de la commande hostname -d.

Créer un fichier /etc/postfix/virtual avec un tableau qui fait correspondre chaque adresse mail d’un domaine virtuel à un compte Linux.

# /etc/postfix/virtual
agnes.debuf@slackbox.fr      adebuf
fanny.banester@slackbox.fr   fbanester
franck.teyssier@unxibox.fr   fteyssier
jean.mortreux@slackbox.fr    jmortreux
jean.mortreux@unixbox.fr     jmortreux2

Là aussi, rendre ce fichier lisible pour Postfix.

# postmap virtual

Adapter /etc/postfix/main.cf pour prendre en compte les domaines virtuels.

# Domaines locaux
mydestination = $myhostname, localhost.$mydomain, localhost

# Domaines virtuels
virtual_alias_domains = slackbox.fr,
                        unixbox.fr

...

# Tables de correspondance
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
local_recipient_maps = hash:/etc/postfix/local-recips $alias_maps
canonical_maps = hash:/etc/postfix/canonical
virtual_alias_maps = hash:/etc/postfix/virtual

Il ne reste qu’à recharger Postfix pour prendre en compte la nouvelle configuration.

# systemctl reload postfix

Le prochain article traitera de la configuration du serveur IMAP Dovecot.

Ce contenu a été publié dans CentOS, Documentation Microlinux, avec comme mot(s)-clé(s) , , . Vous pouvez le mettre en favoris avec ce permalien.

Laisser un commentaire

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