Dans 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
- Configuration initiale
- Premier test
- Gérer les mails avec Mutt
- Créer les comptes Linux pour la messagerie
- Les alias
- Définir les destinataires autorisés
- Comptes Linux et adresses de messagerie
- Domaines virtuels avec des utilisateurs distincts
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 directivevirtual_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 pourmynetworks
, 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 formatMaildir/
, 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].
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
etjmortreux2
, 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.
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.