PostfixDans un précédent article, nous avons décrit la configuration minimale de Postfix sur un serveur dédié tournant sous Rocky Linux 8. 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 :

# firewall-cmd --permanent --add-service=smtp
success
# firewall-cmd --reload
success
# firewall-cmd --list-services
dns http https smtp ssh

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 :

# dnf install -y mutt

Configuration initiale

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

# /etc/postfix/main.cf
# 
# Postfix mail server

# Disable backwards compatibility
compatibility_level = 2

# Disable IPv6
inet_protocols = ipv4

# Host
myhostname = sd-155842.dedibox.fr

# Domain
mydomain = dedibox.fr

# Append this to headers without domain
myorigin = $myhostname

# Local domains
mydestination = $myhostname, localhost.$mydomain, localhost

# Unauthenticated mail
mynetworks = 127.0.0.0/8

# Relay
relayhost =

# Mail spool
home_mailbox = Maildir/

# Local aliasing
alias_maps = hash:/etc/aliases

# Debugging
debugger_command =
  PATH=/bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin
  ddd $daemon_directory/$process_name $process_id & sleep 5

# Command paths
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/samples
readme_directory = /usr/share/doc/postfix/README_FILES

La plupart des options ont déjà été discutées dans l’article initial sur Postfix. Jetons un œil 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é :

# newaliases

Premier test

Prendre en compte la nouvelle configuration :

# systemctl restart 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 Mon 2024-01-15 08:31:12 CET; 6s ago

Envoyer un mail vers un compte mail externe auquel on a accès. Notez bien le point . tout seul sur une ligne à part qui 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
│   └── 1705304097.V802I18000aM477653.sd-155842
└── tmp

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

$ less Maildir/new/1705304097.V802I18000aM477653.sd-155842
Return-Path: <info@microlinux.fr>
X-Original-To: microlinux@sd-155842.dedibox.fr
Delivered-To: microlinux@sd-155842.dedibox.fr
...
Le 15/01/2024 à 08:34, microlinux@sd-155842.dedibox.fr 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
Blog : https://blog.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
  • wafaa.chenaoui@slackbox.fr
  • fanny.banester@slackbox.fr
  • jean.mortreux@unixbox.fr
  • agnes.maillebouis@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 "Wafaa Chenaoui" -s /sbin/nologin wchenaoui
# useradd -c "Fanny Banester" -s /sbin/nologin fbanester
# useradd -c "Agnès Maillebouis" -s /sbin/nologin amaillebouis
  • 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.

AstucePour ne pas avoir à inventer des mots de passe raisonnablement compliqués pour chaque utilisateur, on peut se servir de 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
theiPa3b

Alternativement, vous pouvez très bien utiliser KeePassXC pour générer les mots de passe de vos utilisateurs et les garder en un endroit sécurisé. C’est la solution que j’ai adoptée au quotidien, et qui fonctionne très bien.

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

# Users
agnes.maillebouis: amaillebouis
fanny.banester: fbanester
jean.mortreux: jmortreux, jmortreux2
wafaa.chenaoui: wchenaoui

À 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-155842.dedibox.fr. On constate alors que ça passe comme une lettre à la poste :

# tree /home/bidon/Maildir/
/home/bidon/Maildir/
├── cur
├── new
│   └── 1705388115.V802I1821e0M930865.sd-155842
└── 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
amaillebouis x
fbanester    x
jmortreux    x
jmortreux2   x
wchenaoui    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
fbanester       x
jmortreux       x
jmortreux2      x
amaillebouis    x
wchenaoui       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 :

# Local aliasing
alias_maps = 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
amaillebouis  agnes.maillebouis@unixbox.fr
fbanester     fanny.banester@slackbox.fr
jmortreux     jean.mortreux@slackbox.fr
jmortreux2    jean.mortreux@unixbox.fr
wchenaoui     wafaa.chenaoui@slackbox.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 :

# Local aliasing
alias_maps = hash:/etc/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.maillebouis@unixbox.fr  amaillebouis
fanny.banester@slackbox.fr    fbanester
jean.mortreux@slackbox.fr     jmortreux
jean.mortreux@unixbox.fr      jmortreux2
wafaa.chenaoui@slackbox.fr    wchenaoui

Là aussi, rendre ce fichier lisible pour Postfix :

# cd /etc/postfix/
# postmap virtual

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

# Local domains
mydestination = $myhostname, localhost.$mydomain, localhost

# Virtual domains
virtual_alias_domains =
  slackbox.fr,
  unixbox.fr

...

# Local aliasing
alias_maps = 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.


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

0 commentaire

Laisser un commentaire

Emplacement de l’avatar

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