werk.feub.net

Icon

Mémo de Fabien Amann à propos de Mac, Fedora et caetera

Postfix + Dovecot : utilisateurs virtuels dans une base MySQL

Dans cet article, il a été vu comment mettre en place un serveur de messagerie simple grâce au MTA Postfix et à Dovecot pour l’IMAP. Cet article va ajouter la gestion des utilisateurs virtuels (des adresses emails) dans une base de données MySQL. Cet approche sera beaucoup plus souple dans la gestion du serveur, l’ajout/édition/suppression d’une adresse se fera très simplement en ajoutant un utilisateur dans la base des utilisateurs virtuels, alors qu’auparavant, il fallait ré-éditer des fichiers texte.

L’article suivant de llaumgui m’a bien aidé dans la mise en place du support MySQL : http://www.llaumgui.com/post/Serveur-mail-postfix-/-postfix-mysql-/-Dovecot-/-RoundCube-/-spamassassin-sous-CentOS-5

Postfix

En premier lieu, la configuration du MTA doit être modifiée pour qu’il lise les domaines et utilisateurs virtuels dans la base MySQL et non plus dans un fichier de configuration. Il est supposé que le serveur MySQL est fonctionnel et qu’il existe une base accessible pour ajouter les tables.
Voici le schéma de la table MX_domains des domaines virtuels à créer sur le serveur MySQL :

CREATE TABLE IF NOT EXISTS `MX_domains` (
`id` tinyint(8) NOT NULL auto_increment,
`domain` varchar(128) NOT NULL,
PRIMARY KEY  (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=2 ;

Et la table MX_users qui contiendra les informations des utilisateurs :

CREATE TABLE IF NOT EXISTS `MX_users` (
`id` tinyint(8) NOT NULL auto_increment,
`email` varchar(128) NOT NULL,
`password` varchar(128) NOT NULL,
`name` varchar(128) NOT NULL default '',
`uid` smallint(5) unsigned NOT NULL default '1000',
`gid` smallint(5) unsigned NOT NULL default '1000',
`domain` varchar(128) NOT NULL default '',
`maildir` varchar(255) NOT NULL default '',
`is_imap` tinyint(1) unsigned NOT NULL default '1',
`is_active` tinyint(1) NOT NULL default '1',
PRIMARY KEY  (`id`),
UNIQUE KEY `address` (`email`),
KEY `domain` (`domain`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=4 ;

A noter que le champ email désigne la partie de l’adresse email avant l’arobase, par exemple pour toto@exemple.net, il faudra renseigner seulement toto dans le champ email. Le mot de passe quand à lui sera un hash MD5 dans la base.

Maintenant, il faut éditer le fichier main.cf de configuration de Postfix, en changeant ces deux lignes :

virtual_mailbox_domains = /etc/postfix/domains
virtual_mailbox_maps = hash:/etc/postfix/user_mailboxes_path

Par :

virtual_mailbox_domains = mysql:/etc/postfix/mysql_virtual_domains.cf
virtual_mailbox_maps = mysql:/etc/postfix/mysql_virtual_mailboxes.cf

Le préfixe mysql indique bien que les données vont être extraites de la base de données relationel. Mais les
deux fichiers mysql_virtual_domains.cf et mysql_virtual_mailboxes.cf correspondant contenant les
requêtes SQL ne sont pas encore crées. Les voici :

mysql_virtual_domains.cf

user = dbuser
password = dbpassword
dbname = mailserver
hosts = localhost
query = SELECT id FROM MX_domains WHERE domain='%s'

mysql_virtual_mailboxes.cf

user = dbuser
password = dbpassword
dbname = mailserver
hosts = localhost
query = SELECT maildir FROM MX_users WHERE email='%s' AND is_active=1

Postfix peut être redémarré :

# /etc/init.d/postfix restart

Dovecot

La première chose à faire est d’ajouter le module MySQL pour Dovecot, sous Fedora :

# yum install dovecot-mysql

En ce qui concerne sa configuration, les manipulations sont un peu similaires, à savoir, créer des fichiers de requêtes SQL pour
que le serveur IMAP ramène les bonnes données de la base et non plus d’un fichier plat. Voici la partie qui va être
modifiée du fichier /etc/dovecot.conf pour passer de :

mechanisms = plain
passdb passwd-file {
args = /etc/postfix/dovecot/users.conf
}

A ceci :

mechanisms = plain login digest-md5 cram-md5
passdb sql {
args = /etc/postfix/dovecot/mysql_users.cf
}

On note l’ajout des mécanismes avec hash : digest-md5 (je n’avais mis que la gestion de mot de passe en texte brut dans l’article précédent). Ainsi que la vérification du mot de passe qui ne se fait plus par un fichier mais par une requête SQL dans le fichier mysql_users.cf sous /etc/postfix/dovecot/ (choix arbitraire), comme suit :

driver = mysql
connect = host=localhost dbname=mailserver user=dbuser password=dbpassword
default_pass_scheme = PLAIN-MD5
password_query = SELECT password FROM MX_users \
WHERE email = '%n' AND is_active = 1
user_query = SELECT concat(email, '@', domain) AS user \
FROM MX_users WHERE email = '%n'

Dovecot veut l’adresse complète comme nom d’utilisateur, donc on utilise la fonction concat() de MySQL pour la construire.
A noter que la partie userdb pourrait être dans une table également, mais elle est laissée comme telle en static, car l’emplacement des messages ne bougera pas dans ce cas-ci, ils seront toujours sous /home/vmail/domaine/utilisateur et seront crées automatiquement lors d’ajout de nouvelles boîtes virtuelles :

userdb static {
# Chemin vers les BAL
args = uid=vmail gid=vmail home=/home/vmail/%d/%n/
}

Redémarrage de Dovecot :

# /etc/init.d/dovecot restart

Tout devrait fonctionner maintenant. Pour ajouter/supprimer/éditer un utilisateur, il suffit de le faire dans la base de données, par exemple par l’intermédiaire de phpMyAdmin ou d’un script bash (ou autre langage) qui fera peut-être l’objet d’un prochain article.

Note : les anti-slash \ ne sont pas à taper, ils indiquent que j’ai coupé les lignes pour que ça ne dépasse pas du cadre. Il s’agit d’une seule et même ligne.

Catégories : linux

Mots-clés : , , , , ,

Laisser un commentaire

 

Derniers Commentaires

  • Fabien: De rien :)
  • gus: Très bon tuto qui m’a beaucoup servi ! Merci
  • Fabien: Content de savoir que ça ait pu t’aider. Ce n’est pas toujours une mince affaire un serveur de...
  • NicoP: Yaou ! Merci pour ce tuto, exactement ce que je cherchais, du simple mais proposant quand même la gestion des...
  • Fabien: Merci lohack pour votre commentaire et pour les corrections, bien joué ;} Bonne journée, cordialement.