PostfixDans un précédent article, nous avons décrit la configuration minimale de Postfix sur un serveur dédié tournant sous CentOS 7. Partant de là, nous allons configurer pas à pas un « vrai » serveur mail pour un ou plusieurs domaines.

Prérequis

Si vous n’avez pas lu l’article mentionné en lien ci-dessus, il y a de fortes chances à ce qu’il revienne vous mordre les fesses. Quoi qu’il en soit, songez à effectuer quelques vérifications de base. Le serveur ne doit pas être blacklisté partout, et les DNS doivent être correctement configurés.

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

$ sudo firewall-cmd --permanent --add-service=smtp
$ sudo firewall-cmd --reload
$ sudo firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: eth0
  sources: 
  services: dns ftp http https irc smtp ssh
  ports: 50001-50010/tcp
  protocols: 
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules: 

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

  • slackbox.fr
  • unixbox.fr
  • etc.

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

$ sudo yum install mutt

Configuration initiale

Nous allons modifier notre fichier de configuration /etc/postfix/main.cf pour qu’il ressemble à ceci.

# /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

La plupart des options ont déjà été discutées dans l’article initial sur Postfix. Jetons un oeil sur les quelques directives qui ont changé.

  • 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.
  • 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.

Vérifier si la table de correspondance contient bien notre utilisateur.

# /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

Le cas échéant, construire le fichier indexé.

$ sudo newaliases

Premier test

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 ven. 2019-05-17 11:59:45 CEST; 
           3 weeks 6 days ago
   ...

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é, 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
│   └── 1560490857.V802I3000123M680069.sd-100246
└── 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/1560490857.V802I3000123M680069.sd-100246
Return-Path: <info@microlinux.fr> 
X-Original-To: microlinux@sd-100246.dedibox.fr
Delivered-To: microlinux@sd-100246.dedibox.fr
...

Le 14/06/2019 à 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
Site : https://www.microlinux.fr
Mail : info@microlinux.fr
Tél. : 04 66 63 10 32
Mob. : 06 51 80 12 12

Gérer les mails 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.

$ sudo useradd -c "Jean Mortreux" -s /sbin/nologin jmortreux
$ sudo useradd -c "Jean Mortreux" -s /sbin/nologin jmortreux2
$ sudo useradd -c "Agnès Debuf" -s /sbin/nologin adebuf
$ sudo useradd -c "Fanny Banester" -s /sbin/nologin fbanester
$ sudo 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é que ce fichier contient des informations carrément sensibles, on va éviter de le stocker en clair sur la machine. La gestion des infos confidentielles et notamment des mots de passe est un vaste chapitre. En attendant, voici une solution simple et qui fonctionne parfaitement.

Une fois que j’ai édité mon fichier ~/mails.txt, je peux très bien le chiffrer avec GPG et supprimer le fichier en clair.

$ gpg --encrypt --armor --recipient info@microlinux.fr mails.txt
$ rm mails.txt

À partir de là, les infos sont stockées dans le seul fichier chiffré mails.txt.asc.

$ cat mails.txt.asc
-----BEGIN PGP MESSAGE-----
Version: GnuPG v2.0.22 (GNU/Linux)

hQIMAx8OhrfYGQ/gAQ/+MQmCPS5r8YR2kVDANfvKpM3ZLML3HrPCl6MOvrZ2dbbM
yi1EoWcZmqtApfj37cXkNnPdE709AgvrPkZTTm0+QliP5blQ8TQxHjoIWwyjjI2r
1q0I+pYCPg55IvEs6gHhfPAxPjv647+lK9YOyo63mV43jrc94VTv6LYNasHtAmla
2Iz2HcrkKfEt6smTXdYddFKivht2BhyCwf7OjM6X0ksWd23S+oprutQGYt9zyv8F
PREOm0PdKWwmbnSFnR9U9R6Ujh5xVvYLXqoNtwWQpKFzeCC/EK1xYtHTTyDe0Vcm
jKegSIp1VyvKdOEr3M3ylF1G4k2GcNECmWlmIY+9n43cuy9t4ttVOVADPrXKrrUK
RcEtYTSL7FO7x2Bu9mftvV0LbuSU2oVY2nO27bykqO3FI62L/8WQNM1v9av1qdND
8Bn1Z9tOJ+13kkulRR3Dw8LTYcApT4fTqR2LyAJ96JLWAtxC4shnutW4nB2+kXMp
Q/igU+5YmG5CZudnUwlBI3GONYSrcXihsbv42UV67HsMJ+bJA08gRrPoB8vLCw1h
PmHCe0cuB7tay9d3ZXp0Z9Pe0Hg++bauC+OVs1pYdNdbey+MMIM8i1OuIITRBHVN
RnNAbASHGG7j/HeRLlUACsw5+95NCtmEZYiYV1M3GyMXC2co+jdrIWzSkGIaJn/S
wFgBjr1qryjjKPj4NmfR5nVN+ufj5xfabXqs/r8UZPQCXOY9nVjhUILj3unkmIUt
2zj7QrlWOEEuZn10FwXrS4f9kVBhVuFBbXwqHGZMU+xsn5j8ZAmpWqjUlsNXhrn9
QVUqkUM5FLNO970m6kJfS3VAa/CikNifCNyFIjkiJHcwQpzARruOBmknfX+Nas/5
IIHnpeJSSig0mLJQAs+k55dTp/DPC6LLInzgeiGpwlekDBzpJ3eehsNZ9p/Ewu2i
k0HoHazZ7+s1/z3V+joabQGVx9UmXr+ptClGipnmVCcs7Sz4h2SWvZjLYSDldDCx
wg9Fzz+HKuqBAZfOjcAKy2Br4/dwZ6mgOeaxIoc0jqx3UVh47wR2kBey
=i+AH
-----END PGP MESSAGE-----

Pour rétablir le fichier en clair en vue de le modifier, je peux faire ceci.

$ gpg --output mails.txt --decrypt mails.txt.asc

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.

$ sudo 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.

$ sudo 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
$ sudo postmap local-recips

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

$ postmap -s hash:local-recips
fbanester       x
fteyssier       x
jmortreux       x
jmortreux2      x
microlinux      x
adebuf          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.

$ sudo 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
$ sudo 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.

$ sudo 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.

$ sudo systemctl reload postfix

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


La rédaction de cette documentation demande du temps et des quantités significatives de café espresso. Vous appréciez ce blog ? Offrez un café au rédacteur en cliquant sur la tasse.

 

Catégories : Serveur

4 commentaires

leclerc · 12 octobre 2020 à 16 h 12 min

Petite question

Peut-on mettre plusieurs adresse sur un user canonical ?

comment utilisé l’adresse souhaité si cela fonctionne ?

Merci

    kikinovak · 12 octobre 2020 à 17 h 07 min

    Réponse courte : oui. La configuration se fait au niveau des alias dans le fichier /etc/aliases.

Stéphane · 26 décembre 2020 à 13 h 54 min

Bpnjour,

Lorsque je répond au 1er mail (envoyé de mon serveur dédié) j’ai ce message d’erreur en retour:
retry timeout exceeded
Donc je ne peux aller plus loin.
Une idée svp?
Merci.

Florent · 14 avril 2022 à 11 h 11 min

Bonjour,

Pour répondre à la question ci-dessus (ok, ça date mais ça pourra servir à d’autres), sur une Rocky Linux 8, j’ai dû faire deux trucs pour que Postfix accepte le premier message envoyé en réponse :

1/ Rebooter le serveur. L’ouverture du port 25 et le reload du firewall n’ont pas suffi dans mon cas à ouvrir le port vers l’extérieur

2/ Il faut ajouter une règle du genre de celle-ci dans le fichier de configuration main.cf :

smtpd_relay_restrictions = permit_mynetworks permit_sasl_authenticated reject_unauth_destination

Sans celle-ci, le serveur Postfix fait le sourd

Les commentaires sont fermés.