Installer et configurer Postfix et courrier avec l’authentification Mysql

Dans ce tutorial, nous allons procéder à l’installation de postfix et courier en utilisant des bases de données mysql pour les paramètres. Cette configuration n’est pas la meilleure pour la sécurité (au niveau mysql) mais elle est très souple pour l’ajout d’utilisateur ou d’adresse email.

Postfix est un MTA, il permet en autre de récupérer le courrier envoyé à votre serveur (par exemple contact@votredomaine.com). Nous allons donc procéder ici à la configuration de Postfix afin qu’il gère le courrier reçu par le serveur. Courier est un client POP. Nous allons installer ce logiciel afin de lire notre courrier présent sur le serveur par un logiciel de type Outlook express, Eudora, …Les deux logiciels utiliseront des tables Mysql pour leur paramétres.

Nous allons travailler sur une debian woody mais à part l’installation, le reste ne change pas sur les autres systèmes.

Postfix

Pour installer Postfix, avec une debian :

apt-get install postfix postfix-mysql

La version installé de postfix :

postconf mail_version

Quelques différences existent entre la version 1 et 2 de Postfix alors regardez quelle version vous avez ou installez une version spécifique avec apt-get.

Si Postfix vous demande pour quelle utilisation vous voulez vous en servir, choisissez Internet site. Faites Entrée pour tout le reste.

Nous allons créer des boites aux lettres virtuelles. Il faut savoir que par défaut, postfix envoi le courrier sur les comptes unix. Etant donné que nous comptons héberger plusieurs domaines sur un serveur, il devient fastidieux et dangereux de créer de nouveaux utilisateurs unix.

Nous allons donc utiliser la fonction boite virtuelle de Postfix qui va créé automatiquement des répertoires contenant le courrier et divers paramètres. Il suffit juste de lui indiquer ou placer le courrier et aussi quelle boite aux lettres il doit gérer.

Après avoir installer Postfix, créer un compte unix vmail qui servira de base pour la réception de tous les courriers.

groupadd -g 5000 vmail 

useradd -g vmail -u 5000 vmail -d /home/vmail –m

Les tables Mysql

Nous allons créer des tables Mysql qui contiendront tous les paramétrages de Postfix et Courier concernant les boites aux lettres virtuelles.

Tout d’abord, nous pouvons créer une base de donnée « courrier ».

Ensuite seulement trois tables.

CREATE TABLE `domaines` (
 `domaine` varchar(100) NOT NULL default '',
 UNIQUE KEY `domaine` (`domaine`)
) TYPE=MyISAM;

Dans la table domaines, entrez vos domaines qui recevront du courrier, par exemple sos-dedie.com (pas de sous domaine)

CREATE TABLE `forward` (
 `source` varchar(255) NOT NULL default '',
 `destination` varchar(255) NOT NULL default '',
 PRIMARY KEY  (`source`)
) TYPE=MyISAM;

Dans forward, entrez tout vos forwards, par ex contact@sos-dedie.com vers webmaster@sos-dedie.om

CREATE TABLE `compte` (
 `login` varchar(255) NOT NULL default '',
 `motdepasse` varchar(255) NOT NULL default '',
 `emplacement` varchar(255) NOT NULL default '',
 PRIMARY KEY  (`login`)
) TYPE=MyISAM;

Enfin cette dernière table définie vos comptes. Le login est de la forme d’un email (par ex contact@sos-dedie.com), ensuite emplacement contient un chemin relatif au répertoire de base (normalement /home/vmail/) de type contact/ pour un format de boite aux lettres maildir

Initialisation de Postfix & mysql

Allez dans le répertoire /etc/postfix/ editer le fichier main.cf qui contient la configuration de postfix.

cd /etc/postfix/
pico main.cf

Voici un exemple de fichier main.cf épuré de tout commentaire (Postfix 2)

myhostname = votreserveur.com

myorigin = votredomaine.com

mydestination = $myhostname, localhost.$mydomain, localhost

mynetworks = 127.0.0.0/8

best_mx_transport=virtual

virtual_mailbox_domains = mysql:/etc/postfix/virtual_domaine.cf

virtual_maps = mysql:/etc/postfix/virtual_adresse.cf mysql:/etc/postfix/virtual_forward.cf

virtual_mailbox_base = /home/vmail

virtual_mailbox_maps = mysql:/etc/postfix/virtual_emplacement.cf

virtual_uid_maps = static:5000

virtual_gid_maps = static:5000

Nous allons étudier ce fichier. Toute modification de ce fichier doit être confirmé en relançant postfix par la commande

/etc/init.d/postfix reload

Paramètres généraux de Postfix

Nous allons d’abord configurer les paramètres généraux :

myhostname : Contient le nom de votre machine ou à défaut votre nom de domaine, à l’installation postfix a normalement configuré ce champ

myorigin : Ce paramètre contient le nom de domaine qui apparaîtra dans tout courrier sortant de votre serveur. Dans le fichier d’exemple, ce paramètre contient la valeur $myhostname ce qui signifie que myorigin contiendra la valeur défini dans myhostname.

mydestination : Définit le domaine par défaut de destination (qui reçoit donc le courrier). Normalement ce paramètre est à localhost (le courrier est reçu à la machine elle-même)

best_mx_transport : Indique à Postfix de s’occuper d’abord du transport virtuel (gestion des boites aux lettres virtuelles)

Problème du Chroot de Postfix

Postfix s’execute en Chroot et pose un problème d’accès à la socket Mysql (qu’il cherche dans /etc/postfix). Pour contourner ce problème, on doit d’abord dire à Postfix de se connecter via l’adresse IP de notre serveur et non pas en local. Mais pour cela, nous devons encore dire à Mysql qu’il accepte les requêtes venant de l’extérieur. Voici une faille de sécurité.

pico /etc/mysql/my.cnf

Commentez la ligne skip-networking ou cherchez la ligne Bind_adress et permettez l’accès à votre serveur.

Redémarrez mysql.

/etc/init.d/mysql restart

Pour palier au problème de sécurité et dans le cas où le fichier de configuration de Mysql (my.cnf) ne contiennent pas la ligne Bind_adress, on doit simplement limiter par un firewall l’accès à Mysql à notre seule adresse de serveur.

Paramètre pour les boites aux lettres virtuelles

virtual_mailbox_base : Répertoire de base où sont stockés les boites aux lettres et leur courrier.

virtual_maps : Ce paramètre permet de définir toutes les adresses emails acceptés. Par exemple si vous voulez une adresse du genre contact@votredomaine.com il faut l’indiquer dans virtual_maps sinon celle-ci sera éjectée. De plus, vous pouvez faire du forwarding avec ce paramètre. Par exemple : webmaster@votredomaine.com vers contact@votredomaine.com. Pour indiquer toutes les adresses, nous allons utiliser la table user et forward.

Tout d’abord, nous devons créer des fichiers de configuration virtual_adresse.cf et virtual_forward.cf contenant la configuration pour l’accès de Postfix à mysql.

ATTENTION ! Pour la version 1 de Postfix, pas besoin de virtual_maps mais de transport_maps dans lequel vous indiquez un fichier contenant la liste des domaines virtuels suivi de virtual. De plus rajoutez le paramètre relay_domains = mysql:/etc/postfix/virtual_domaine.cf

pico virtual_adresse.cf

Entrez les champs suivant par ligne

user = login mysql

password = mot de passe mysql

dbname = courrier

table = compte

select_field = ‘virtual’

where_field = login

hosts = adresse IP de votre serveur

Ce fichier sert donc à établir une connexion à mysql à la base de donnée dbname et à la table table. Voici la requête mysql que Postfix crée :

select ‘virtual’ from compte where login = '$lookup'

La variable $lookup contient l’adresse de destination qu’a reçu Postfix ou dans le cas général la valeur que veut vérifier postfix (nom de domaine, forward, …) Ici le champ de selection est ‘virtual’ car il s’agit simplement de vérifier si l’adresse email existe. Pour le fichier de forwarding (redirection d’une adresse vers une autre) voici le contenu du fichier virtual_forward.cf

pico virtual_forward.cf

Entrez les champs suivant par ligne

user = login mysql

password = mot de passe mysql

dbname = courrier

table = forward

select_field = destination

where_field = source

hosts = adresse IP de votre serveur

Maintenant que l’on a définit les adresses hébergées sur ce site, il faut tout de même dire où Postfix va stocker le courrier de chaque adresse. C’est le rôle de virtual_mailbox_maps. Ce paramètre contient le chemin d’un fichier nommée virtual_emplacement.cf. Ce fichier contient une liste composée des adresses email suivi d’un chemin (relatif à virtual_mailbox_base).

pico virtual_emplacement.cf
user = login mysql

password = mot de passe mysql

dbname = courrier

table = compte

select_field = emplacement

where_field = login

hosts = adresse IP de votre serveur

Nous organisons nos boites de cette façon. Un dossier « nom de domaine » contenant des sous-dossiers « boite aux lettres ». Attention au / à la fin du chemin qui indique que le format de la boite au lettre sera Maildir au lieu de Mailbox.

Enfin les derniers paramétres

virtual_uid_maps = static:5000

virtual_gid_maps = static:5000

Ces dernières valeurs permettent de spécifier sous quel compte postfix va écrire les messages. Nous avons créé exprès un compte vmail (5000). Donc nous indiquons cette valeur qui est valable pour toutes les adresses (d’où le prefixe static :)

Vérification

Sauvegardez votre main.cf et faite un

/etc/init.d/postfix reload

Si aucun message d’erreur n’apparaît, vous pouvez faire un petit contrôle avec un telnet.

Par exemple : telnet localhost 25 ou depuis l’extérieur telnet www.votredomaine.com 25

Si vous n’arrivez pas à vous connecter, regardez le fichier tail /var/log/syslog

telnet www.votredomaine.com 25

220 myserver ESMTP Postfix (Debian/GNU)

ehlo coucou.com

250-mailtest 250-PIPELINING 250-SIZE 10240000 250-VRFY 250-ETRN 250 XVERP 250 8BITMIME

mail from:<test@coucou.com>

250 Ok

rcpt to:<contact@votredomaine.com>

250 Ok

data

354 End data with <CR><LF>.<CR><LF></LF></CR></LF></CR>

blablabla...
.

250 Ok: queued as ABC1D1C123

quit

221 BYE

Les erreurs possibles

Une erreur peut se produire après la commande rcpt to: Le problème peut être souvent du à plusieurs facteurs :

  1. l’adresse email du destinataire n’est pas reconnue, dans ce cas un problème peut se situer dans virtual_adresse
  2. Postfix ne trouve pas le répertoire de destination, cette fois-ci c’est virtual_emplacement qui peut avoir un problème

Pour en savoir plus, n’hésitez pas à consulter /etc/var/mail.log ou /etc/var/syslog

Courier

L’installation de courier est assez simple, la partie la plus difficile se situe dans la connexion et l’indentification de votre logiciel de messagerie (outlook par exemple) à votre serveur.

apt-get install courier-pop courier-authdaemon  courier-authmysql courier-debug

Nous allons faire l’identification des clients se connectant au serveur de courrier pour relever leur email. Nous avons déjà les tables Mysql, il reste à indiquer à Courier qu’il doit se servir de ces tables.

Configuration de base

cd /etc/courier

Editer le fichier pop3d, décommenter la ligne

pico pop3d
POP3AUTH="LOGIN CRAM-MD5 CRAM-SHA1"

Commentez la ligne

#POP3AUTH=""

Editer ensuite le fichier authdaemonrc

pico authdaemonrc

Mettez le paramètre

authmodulelist="authmysql"

Ce dernier permet de dire à Courier que l’authentification des utilisateurs se fait avec Mysql. Nous allons maintenant indiquer à Courier comment se connecter à Mysql et quelle base utiliser.

pico authmysqlrc
MYSQL_SERVER            localhost
MYSQL_USERNAME          login mysql
MYSQL_PASSWORD          mot de passe mysql
MYSQL_DATABASE          courrier
MYSQL_USER_TABLE        compte

Commentez la ligne

MYSQL_CRYPT_PWFIELD    crypt

Et décommentez

MYSQL_CLEAR_PWFIELD     motdepasse

Ensuite entrez les valeurs

MYSQL_UID_FIELD         5000

MYSQL_GID_FIELD         5000

MYSQL_LOGIN_FIELD       login

MYSQL_HOME_FIELD        "/home/vmail/"

Décommentez la ligne suivante (ou ajoutez là si elle est absente)

MYSQL_MAILDIR_FIELD     emplacement

Commentez la ligne

MYSQL_NAME_FIELD		name

Redémarrez les démons

/etc/init.d/courier-pop restart
/etc/init.d/courier-authdaemon restart

Vérification

Pour vérifier le fonctionnement de l’authentification, on utilise l’outil courierauthtest

courierauthtest contact@votredomaine.com motdepasse

Réponse du prompt

Authenticated: module authdaemon

Home directory: /home/vmail

UID/GID: 5000/5000

Maildir: votredomaine.com/contact/

AUTHADDR=contact@votredomaine.com

AUTHFULLNAME=<none>

Maintenant vérifions la connexion pop au serveur

telnet www.votredomaine.com 110

+OK Hello there.

USER contact@votredomaine.com

+OK Password required.

PASS motdepasse

+OK logged in.

STAT

+OK 4 14434

TOP 1 5

+OK headers follow.

Return-Path: <test@coucou.com>

Delivered-To: contact@votredomaine.com

....

.

QUIT

+OK Bye-bye.

Les erreurs possibles

Le plus souvent les erreurs se situe dans l’authentification (le paramétrage de courier est simple). Il faut donc faire marcher l’authentification mysql en testant avec courierauthtest. Les problèmes sont dû généralement à de mauvaise indication de champ dans le fichier de connection Mysql. Vérifiez bien que vous avez décommenté les lignes ou commentez celles indiquées.

Ensuite vérifier dans les logs ce qu’il se passe s’il y a des problèmes avec le telnet. Une erreur de type

-ERR Maildir: No such file or directory

est classique d’une mauvaise authentification ou d’un mauvais paramétrage dans l’authentification (mauvais chemin ,etc…)