7 août 2008
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 restartDovecot
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 restartTout 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.
Derniers Commentaires