Cette article est un peu obsolète, il sera bientôt up daté pour pouvoir lutter un maximum contre le spam et de pouvoir lire son courrier via n'importe quel client IMAP. (SASL, greylisting, règle de reception du courrier pour postfix, toussa….)

Installation de Postfix et Maildrop avec des Comptes Virtuels gérés par Mysql

Cet article est un aide mémoire des étapes pour l'installation d'un Serveur mail (ici Postfix) avec un ajout simplifié d'utilisateur à travers une base mysql. J'ai consulté des fichiers de configurations d'un peu partout pour aboutir à ce que je voulais, j'ai donc trouvé utile de tout rassembler ici.

J'utilise Postfix(Mail Transport Agent) , Maildrop (Mail Delivery Agent), Dovecot (Serveur IMAP) et Mysql pour la gestion des Adresses, domaine et redirection mail. Je considère pour la suite que vous avez un serveur mysql qui tourne et qui est fonctionnel.

Postfix

Vous aurez Besoin d'installer Postfix et Postfix-mysql Sous Debian :

 apt-get install postfix postfix-mysql   

Rendez-vous ensuite dans la configuration basique de Postfix Éditez le fichier : /etc/postfix/main.cf Et modifiez les valeurs comme suit :

myhostname = {VOTRE HOSTNAME}   
mydestination = {HOSTNAME}, localhost.localdomain, localhost   
mynetworks = 127.0.0.0/8    
home_mailbox = Maildir/   

Après chaque changement sur main.cf, il faut redémarrer Postfix.

 postfix reload

OU :

 /etc/init.d/postfix reload

Vous pouvez allez jeter un œil dans le fichier /etc/aliases (pas le même fichier sous toute les distributions, enfin cela dépent d'où pointe par défaut la valeur de alias_maps dans le main.cf )

Attention: A chaque changement de fichier tel que /etc/aliases, vous devez régénérer le fichier de db :

 postmap /etc/aliases

Normalement, vous en avez fini avec la configuration basique de Postfix et vous devriez pouvoir recevoir des mails pour les utilisateurs possédant des comptes UNIX sur le serveur. (Si ce n'est pas le cas, mieux vaut résoudre le problème avant de passer à la suite. Petit coup d'oeil dans /var/log/mail.log/ )

Création des Tables Mysql

Vous aurez besoin de créer des Tables mysql renseignant toute les informations pour chaque utilisateur. Je vous propose de suivre cette structure : http://blog.beneth.fr/upload/mailsql.sql

  • Une table `alias` correspondant au fichier /etc/aliases
  • Une table `transport` pour chaque domaine on utilise quel transport de courier (on mettra en général maildrop)
  • Une table `users` permettant d'avoir les informations utilisateur. On s'en servira pour le serveur IMAP
  • Une table `virtual` pour faire simplement de la redirection de mail

Maildrop

Il vous faut maintenant installer maildrop pour le transport du courrier. J'utiliserai ici le paquet courier-maildrop ( Il vous faut également l'authentification par mysql)

 apt-get install courier-maildrop courier-authlib-mysql

Éditez maintenant le fichier authdaemonrc dans /etc/courier/ et rajouter à la ligne 'authmodulelist=' authmysql

 vi /etc/courier/authdaemonrc 
 authmodulelist="authmysql authpam"

Éditez maintenant le fichier authmysqlrc et renseignez-y les informations d'accès à votre base de donnée (je vous conseille fortement de créer un utilisateur qui a accès seulement à la Base mailsql) Voici quelques paramètres à changer :

 MYSQL_SERVER            localhost
 MYSQL_USERNAME          {votreLogin}
 MYSQL_PASSWORD          {votrePass}
 MYSQL_DATABASE          mailsql
 MYSQL_USER_TABLE        users
 MYSQL_CLEAR_PWFIELD     password
 MYSQL_UID_FIELD         uid
 MYSQL_GID_FIELD         gid
 MYSQL_LOGIN_FIELD       email
 MYSQL_HOME_FIELD        maildir
 MYSQL_NAME_FIELD        name

Les autres configurations doivent être Commentées.

J'ai ici été confronté à un problème. J'ai mis maildir sur le champ MYSQL_HOME_FIELD car c'est la seul solution que j'ai trouvé pour obtenir la variable $HOME à mettre dans le /etc/maildroprc [Cela permet d'avoir la Maildir dans le bon répertoire].Il faudrait trouver en fait la variable correspondant à la ligne MYSQL_MAILDIR_FIELD si quelqu'un à une solution je serai très heureux qu'il m'en fasse part, ça simplifierait grandement les règles de filtrages par la suite.

Éditez le fichier /etc/maildroprc afin d'avoir seulement la ligne :

 DEFAULT="$HOME/"

Up: Suite aux commentaires de Seb, vous aurez besoin de vérifier qu'il existe un lien symbolique dans /etc/courier/ pointant vers /etc/maildroprc. (Par défaut sous debian, apparemment ce n'est pas le cas sous Ubuntu Server.)

Suite de mon problème : j'aimerai ici pouvoir définir deux variables la DEFAULT pour le transport du courrier au bon endroit et une autre avec un home qui soit le même pour tout un groupe d'utilisateur afin de créer des règles de filtrages de mail pour tout le monde. Si quelqu'un à une solution merci de poster en commentaire. Serveur IMAP (Dovecot)

Avant d'installer dovecot, on va créer un nouvel utilisateur système qui gérera les boites aux lettres virtuelles.

 adduser --disabled-login --disabled-password --uid 5000 --gid 5000 vmail

On peut maintenant installer Dovecot

 apt-get install dovecot-imapd

Il faut configurer Dovecot pour passer par Mysql vous devriez avoir un fichier de configuration de cette forme la : /etc/dovecot/dovecot.conf

 protocols = imap imaps
 listen = *
 log_timestamp = “%Y-%m-%d %H:%M:%S”
 mail_extra_groups = vmail
 ssl_disable = yes
 auth_verbose = yes
 mail_debug = yes
 auth_debug_passwords = yes
 base_dir = /var/run/dovecot/
 default_mail_env = maildir:/home/vmail/%d/%n
 first_valid_uid = 1029
 disable_plaintext_auth = no
 protocol imap {
 mail_plugins = quota imap_quota
 }
 auth default {
 mechanisms = plain login digest-md5 cram-md5
 passdb sql {
 args=/etc/dovecot/dovecot-sql.conf
 #args =
 }
 userdb sql {
 args= /etc/dovecot/dovecot-sql.conf
 }
 user = root
 count = 2
 }
 plugin {
 quota = maildir:storage=1000000
 }

ps : La ligne Quota permet de définir la taille des boites mails. Ici, j'autorise 1Go de Stockage.

Vous devez maintenant configurer le fichier de conf pour accéder à mysql : /etc/dovecot/dovecot-sql.conf (Les lignes ci-dessous sont celles à laisser et à configurer, les autres sont à commenter)

 driver = mysql
 connect = host=localhost dbname=mailsql user={votreLogin} password={votrePassword}
 default_pass_scheme = SHA
 password_query = SELECT password FROM users WHERE email = '%u' AND postfix = 'y'
 user_query = SELECT uid, gid FROM users WHERE email = '%u'

Configuration Finale de Postfix

Il faudra que vous créez 5 fichiers dans /etc/postfix/ qui donneront les requêtes sql à effectuer.

Fichier: /etc/postfix/mysql-aliases.cf

 hosts           = 127.0.0.1
 user            = {votre_Login}
 password        = {Votre_Password}
 dbname          = mailsql
 query = SELECT destination FROM alias WHERE alias='%s'

Fichier: /etc/postfix/mysql-relocated.cf

 hosts           = 127.0.0.1
 user            = {Votre Login}
 password        = {Votre Password}
 dbname          = mailsql
 query = SELECT destination FROM relocated WHERE email='%s'

Fichier: /etc/postfix/mysql-transport.cf

 hosts           = 127.0.0.1
 user             = {votre login}
 password        = {Votre Password}
 dbname          = mailsql
 query = SELECT destination FROM transport WHERE domain='%d'

Fichier: /etc/postfix/mysql-virtual.cf

 hosts           = 127.0.0.1
 user            = {votre login}
 password        = {votre password}
 dbname          = mailsql
 query = SELECT destination FROM virtual WHERE email='%s'

Fichier: /etc/postfix/mysql-virtual-maps.cf

 hosts = 127.0.0.1
 user = {votre login}
 password = {votre password}
 dbname = mailsql
 query = SELECT maildir FROM users WHERE email='%s' AND postfix='y'

Éditez maintenant le fichier de configuration de Postfix : /etc/postfix/main.cf Vous devriez avoir un fichier de configuration qui ressemble a celui ci-dessous:

 myhostname = {Votre Hostname}
 alias_maps = mysql:/etc/postfix/mysql-aliases.cf
 relocated_maps = mysql:/etc/postfix/mysql-relocated.cf
 myorigin = /etc/mailname
 mydestination = {votre Hostname}, localhost.localdomain, localhost
 relayhost =
 mynetworks = 127.0.0.0/8
 mailbox_size_limit = 0
 recipient_delimiter = +
 inet_interfaces = all
 home_mailbox = Maildir/
 local_transport = local
 local_recipient_maps = $alias_maps $virtual_mailbox_maps unix:passwd.byname
 maildrop_destination_recipient_limit = 1
 virtual_mailbox_domains = {Liste de vos domaines qui reçoivent du courrier, exemple j'ai @exemple.com et @exemple.net je met : exemple.com exemple.net} 
 transport_maps = mysql:/etc/postfix/mysql-transport.cf
 virtual_transport = $transport_maps
 virtual_mailbox_maps = mysql:/etc/postfix/mysql-virtual-maps.cf
 virtual_minimum_uid = 100
 virtual_uid_maps = static:5000
 virtual_gid_maps = static:5000
 virtual_alias_maps = mysql:/etc/postfix/mysql-virtual.cf
 virtual_mailbox_base = $virtual_mailbox_maps

Pour plus de lisibilité, vous pouvez récupérer mon main.cf ici : http://blog.beneth.fr/public/postfix/main.cf

Vous en avez normalement Fini avec Postfix, N'oubliez pas de Reloader Postfix !

Et maintenant ?

Et bien, vous pouvez ajouter des utilisateurs depuis votre base de donnée. Vous pouvez ajouter des alias: Rappel: j'envoie le courrier à postmaster qui est alias de root qui est alias de l'utilisateur beneth. L'utilisateur beneth recevra donc le courier de postmaster. Vous devez ajouter vos domaines dans la table transport sous la forme : domaine: @domaine.com et Destination: maildrop: .

La partie la plus interressante est la possibilité de créer des utilisateurs virtuels dans la table users. Vous devez dans le champ email renseigner l'adresse email complète de l'utilisateur user@domaine.net. Cela est Important car comme vous avez pu le voir on peut ainsi séparer les emails des différents domaines. L'adresse email complete est %u, le domaine est %d et le nom est %n (pour dovecot tout du moins; c'est un peu différent pour postfix, vous avez du voir les %s…)

Si votre utilisateur vmail créé avec l'uid 5000 et gid 5000, vous aurez toujours à mettre ces valeurs dans la table users (c'est les valeurs par défaut que je vous ai mis dans le fichier de structure sql) Enfin, vous devez spécifier le chemin vers la Maildir. Le serveur IMAP configuré comme ci-dessus voudra un chemin de la forme /home/vmail/DOMAINE(%d)/USER(%n) Le dernier champ Postfix doit être laissé à 'y' pour autoriser la connection de l'utilisateur. Cela est pratique pour désactiver temporairement un utilisateur.

Pour aller Plus loin …. Je vous conseille de télécharger Roundcube un exellent webmail qui vous permettra de gérer facilement vos mails et de la même façon de n'importe quel ordinateur.

Spamassassin et Mailfilter

Vous avez besoin d'installer Spamc (le démon de Spamassassin) et mailfilter pour filtrer vos mails

 apt-get install spamc spamassassin mailfilter

Quelque précision sur la Maildir: vos dossier doivent être précédé d'un point. Je vous conseille de les creer avec Roundcube, et par exemple si vous voulez qu'un dossier apparaisse comme un sous dossier de la INBOX , vous créer un dossier dans roundcube qui s'appelle INBOX.votredossier, et ensuite vous créez vos règles de filtrage de mail. Le fichier de filtrage est à mettre à la racine de la Maildir sous le nom .mailfilter . Voici mon fichier pour vous aider un peu sur la syntaxe :

 xfilter "/usr/bin/spamc"
 if (/^X-Spam-Flag:.*YES/)
 to "$DEFAULT/.Junk/"
 if (/^To:.*debian-user-french\@lists.debian.org.*$/)
 to "$DEFAULT/.INBOX.debian.user-french/"   
 if (/^TO:.*debian-announce\@lists.debian.org.*$/)
 to "$DEFAULT/.INBOX.debian.announce/"
 if (/^TO:.*debian-security-announce\@lists.debian.org.*$/)
 to "$DEFAULT/.INBOX.debian.security/"
 if (/^TO:.*debian-news-french\@lists.debian.org.*$/)
 to "DEFAULT/.INBOX.debian.news/"

Voilà, j'espère vous avoir aider et avoir été assez clair. S'il y a des points obscures, demandez moi, je pourrais peut-être vous aider.

Si certain point ne marche pas, prenez le réflexe de consulter vos fichier de log ( /var/log/mail.log ), en général le problème est bien indiqué.

Et si vous trouvez qu'il y a des problèmes (de sécurité ou autre) dites le moi !

J'utilise ce système depuis presque un mois, et j'en suis très satisfait. Je consulte maintenant mes mails avec Roundcube; Seul petit hic c'est un petit peu lent mais on s'y habitue.

Edit: Comme l'a dit Julien en Commentaire, un projet existe déjà pour gérer Postfix : http://sourceforge.net/projects/postfixadmin/

Pour Allez Plus Loin

Étant maintenant possesseur d'un laptop, je consulte mes mails via evolution. Cependant, le port imap et imaps n'est pas ouvert sur l'interface public pour des raisons de sécurité. C'est pourquoi j'ai mis en place un tunnel VPN avec lequel j'autorise l'accés aux port IMAP et IMAPS et SMTP afin de pouvoir consulter mes mails en local chez moi. Vous devrez pour cela ajouter dans le main.cf de votre postfix à la ligne : mynetworks = 127.0.0.0/8 l'adresse ip de votre réseau de confiance VPN. Imaginons que ce soit des adresses en 10.8.0.0 vous rajouterez :

 
 mynetworks = 127.0.0.0/8 10.8.0.0/24

Ne rajoutez pas l'adresse public, sinon vous risquerez de faire openrelay avec votre serveur mail et avoir des problèmes de Spam !

Si vous ne pouvez faire de tunnel VPN, vous devriez sûrement jetez un œil sur les possibilités offerte par sasl pour pouvoir envoyer des mails seulement si on est authentifié.


Quelques Liens qui m'ont aidés: