Serveur mail sous Slackware (1) Postfix

Voici le premier d’une série d’articles sur la mise en place d’un serveur mail sur une Dedibox tournant sous Slackware Linux. 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. La distribution Slackware comprend Sendmail comme MTA par défaut. Nous allons lui préférer Postfix, qui est beaucoup plus facile à configurer.

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.

mxtoolbox

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

  • slackbox.fr
  • unixbox.fr

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

$ host -t MX slackbox.fr
slackbox.fr mail is handled by 10 mail.slackbox.fr.
$ host mail.slackbox.fr
mail.slackbox.fr has address 195.154.65.130
$ host slackbox.fr
slackbox.fr has address 195.154.65.130
slackbox.fr mail is handled by 10 mail.slackbox.fr.
$ host 195.154.65.130
130.65.154.195.in-addr.arpa domain name pointer sd-41893.dedibox.fr.

Installation

Postfix ne fait pas partie d’une installation standard de Slackware. On va donc le compiler à partir des sources, en utilisant le script de SlackBuilds.org.

Au préalable, créer quelques utilisateurs et groupes système pour Postfix.

# groupadd -g 200 postfix
# useradd -u 200 -d /dev/null -s /bin/false -g postfix postfix
# groupadd -g 201 postdrop

Au final, on doit avoir quelque chose comme ceci.

# grep post /etc/passwd
postfix:x:200:200::/dev/null:/bin/false
# grep post /etc/group
postfix:x:200:
postdrop:x:201:

Lancer la compilation de Postfix et installer le paquet résultant.

Si l’on choisit le paquet MLES, la création des utilisateurs et des groupes système est gérée automatiquement par le script de post-installation.

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 presque 700 lignes, la plupart étant des commentaires. On peut éventuellement 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 quelque chose comme ceci.

compatibility_level = 2
queue_directory = /var/spool/postfix
command_directory = /usr/sbin
daemon_directory = /usr/libexec/postfix
data_directory = /var/lib/postfix
mail_owner = postfix
unknown_local_recipient_reject_code = 550
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
newaliases_path = /usr/bin/newaliases
mailq_path = /usr/bin/mailq
setgid_group = postdrop
html_directory = /usr/doc/postfix-3.1.4/html
manpage_directory = /usr/man
sample_directory = /etc/postfix
readme_directory = /usr/doc/postfix-3.1.4/README_FILES
inet_protocols = ipv4
meta_directory = /etc/postfix
shlib_directory = /usr/lib/postfix

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_protocols
inet_protocols = ipv4

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

# postconf -d inet_protocols
inet_protocols = 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 la rétrocompatibilité 
compatibility_level = 2

# Désactiver l'IPv6
inet_protocols = ipv4

# Identification 
smtpd_banner = $myhostname ESMTP $mail_name (Slackware Linux)

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

# Domaine du serveur
mydomain = dedibox.fr

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

# Domaines locaux
mydestination = sd-41893.dedibox.fr, 
                localhost.localdomain, 
                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/postfix/aliases
alias_database = hash:/etc/postfix/aliases
  • Dans la configuration par défaut, Postfix démarre en mode rétrocompatible et affiche une alerte au démarrage (Postfix is running with backwards-compatible default settings). La directive compatibility_level=2 désactive la rétrocompatibilité.
  • 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. Attention : 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. Attention : 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/postfix/aliases
postmaster: root
root: kikinovak

Construire le fichier indexé.

# newaliases 

Activer et démarrer Postfix.

# chmod +x /etc/rc.rc.postfix
# /etc/rc.d/rc.postfix start

Basculer vers un compte utilisateur normal et envoyer un mail vers un compte externe, que l’on terminera par un point « . » sur une ligne à part.

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

Éventuellement, jeter un oeil dans le journal de Postfix pour voir si le mail est bien parti.

# tail /var/log/maillog

Se connecter au compte 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
|   `-- 1360401556.V803I70000bM517366.sd-41893
`-- tmp

C’est un simple fichier texte, que l’on peut afficher avec less.

$ less Maildir/new/1360401556.V803I70000bM517366.sd-41893 
Return-Path: <info@microlinux.fr>
X-Original-To: kikinovak@sd-41893.dedibox.fr
Delivered-To: kikinovak@sd-41893.dedibox.fr
Received: from smtp.nfrance.com (smtp-6.nfrance.com [80.247.225.6])
...

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.

set mbox_type=Maildir
set folder="~/Maildir"
set spoolfile="~/Maildir"
set mbox="+Mailbox"

my_hdr From: kikinovak@sd-41893.dedibox.fr (Niki Kovacs)
my_hdr Reply-To: kikinovak@sd-41893.dedibox.fr (Niki Kovacs)

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.

  • fantasio@slackbox.fr
  • gaston.lagaffe@slackbox.fr
  • jeanne.dupont@slackbox.fr
  • gaston.lagaffe@unixbox.fr
  • bertrand.labevue@unixbox.fr

Dans un premier temps, nous allons créer des comptes Linux traditionnels, un par compte mail, en respectant – plus ou moins – les conventions de nommage classiques. Notons que les utilisateurs n’ont pas de shell de connexion, c’est-à-dire qu’ils ne pourront pas se connecter directement au serveur.

# useradd -m -g users -s /bin/false -c "Fantasio" fantasio
# useradd -m -g users -s /bin/false -c "Gaston Lagaffe" glagaffe
# useradd -m -g users -s /bin/false -c "Gaston Lagaffe" glagaffe2
# useradd -m -g users -s /bin/false -c "Jeanne Dupont" jdupont
# useradd -m -g users -s /bin/false -c "Bertrand Labévue" blabevue

Pour ne pas avoir à inventer des mots de passe raisonnablement compliqués pour chaque utilisateur, on peut utiliser l’outil pwgen, disponible sur SlackBuilds.org. 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
================================================================
Fantasio         fantasio@slackbox.fr         fantasio  LjaLScHa
Gaston Lagaffe   gaston.lagaffe@slackbox.fr   glagaffe  4qe0PsXY
                 gaston.lagaffe@unixbox.fr    glagaffe2 ug8u8Uvf
Jeanne Dupont    jeanne.dupont@slackbox.fr    jdupont   juRqqXsi
Bertrand Labévue bertrand.labevue@unixbox.fr  blabevue  01WedFcV
...

É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 452 19 mars  06:53 /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/postfix/aliases.

...
# Utilisateurs
gaston.lagaffe: glagaffe, glagaffe2 
jeanne.dupont: jdupont
bertrand.labevue: blabevue
...

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

# newaliases

Notons que pour des raisons de sécurité, Postfix n’achemine pas de mails vers root. Dans ce cas, il suffit de définir un alias vers un utilisateur judicieusement choisi qui les recevra à la place de root. Au total, on pourra avoir quelque chose comme ceci.

# /etc/postfix/aliases
postmaster: root
root: kikinovak
gaston.lagaffe: glagaffe, glagaffe2
jeanne.dupont: jdupont
bertrand.labevue: blabevue

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/postfix/aliases fourni par défaut.

Pour tester ce comportement, on peut créer un utilisateur bidon avec adduser et lui envoyer un mail à l’adresse bidon@sd-41893.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-41893
└── 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
fantasio   x
glagaffe   x
glagaffe2  x
jdupont    x
blabevue   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.

# /etc/rc.d/rc.postfix reload

À 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 
blabevue    bertrand.labevue@unixbox.fr
fantasio    fantasio@slackbox.fr
glagaffe    gaston.lagaffe@slackbox.fr
glagaffe2   gaston.lagaffe@unixbox.fr
jdupont     jeanne.dupont@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.

# 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
bertrand.labevue@unixbox.fr        blabevue
fantasio@slackbox.fr               fantasio
gaston.lagaffe@slackbox.fr         glagaffe
gaston.lagaffe@unixbox.fr          glagaffe2
jeanne.dupont@slackbox.fr          jdupont

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 = sd-41893.dedibox.fr, 
                localhost.localdomain, 
                localhost

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

...

# 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
virtual_alias_maps = hash:/etc/postfix/virtual

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

# /etc/rc.d/rc.postfix reload

Utiliser le port 587 pour l’envoi

Certains FAI – comme par exemple Orange – bloquent l’accès au port 25. Dans ce cas, il faut configurer Postfix pour passer par le port 587 pour l’envoi de messages.

Éditer /etc/postfix/master.cf et décommenter la ligne suivante.

smtp       inet  n    -    n    -    -    smtpd
#smtp      inet  n    -    n    -    1    postscreen
#smtpd     pass  -    -    n    -    -    smtpd
#dnsblog   unix  -    -    n    -    0    dnsblog
#tlsproxy  unix  -    -    n    -    0    tlsproxy
submission inet  n    -    n    -    -    smtpd

Relancer Postfix pour prendre en compte la nouvelle configuration.

# /etc/rc.d/rc.postfix restart

Régler les problèmes de permissions

Après une mise à jour, il se peut que l’on ait des problèmes de permissions. Voici ce qu’il faut faire.

# /etc/rc.d/rc.postfix stop
# killall -9 postdrop
# cd /var/spool/postfix
# chown -R root:postdrop public maildrop
# postfix set-permissions
# postfix check
# /etc/rc.d/rc.postfix start

Supprimer Postfix

Arrêter le service :

# /etc/rc.d/rc.postfix stop

Supprimer le paquet :

# removepkg postfix 

Supprimer les fichiers de configuration :

# rm -rf /etc/postfix/ 

Supprimer le script de démarrage :

# rm -f /etc/rc.d/rc.postfix

Supprimer les utilisateurs et les groupes système correspondants :

# userdel -r postfix
# groupdel postdrop

Remarque : userdel -r postfix supprime également le groupe postfix.

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

2 réponses à Serveur mail sous Slackware (1) Postfix

  1. Thomas dit :

    Salut,

    Juste pour partager un ennui que j’ai eu il y a longtemps avec postfix (postfix-2.6 je crois), j’ai eu régulièrement des problèmes en faisant une MAJ à cause de /var/{lib,spool}/postfix. Depuis j’utilise cette méthode pour chaque MAJ :

    1. je vérifie qu’il n’y a pas de mail en attente : mailq
    2. j’éteins postfix : /etc/rc.d/rc.postfix stop
    3. je revérifie qu’il n’y a pas de mail en attente : mailq
    4. s’il n’y a pas de mail, je supprime postfix : removepkg postfix
    5. je supprime /var/{lib,spool}/postfix : rm -rf /var/{lib,spool}/postfix
    6. j’installe la nouvelle version : installpkg postfix-3.2.0-x86_64-1_SBo.txz

    Et ça roule !

Laisser un commentaire

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