Postfix Mysql : Différence entre versions
(→Module Saslauthd) |
(→Général) |
||
Ligne 87 : | Ligne 87 : | ||
==== Général ==== | ==== Général ==== | ||
− | * Pour activer les utilisateurs virtuels et interroger les bases de données adéquates, il faut ajouter les lignes suivantes dans le fichier de configuration '''/etc/postfix/main.cf''' de '''Postfix''' : | + | * Pour activer les utilisateurs virtuels et interroger les bases de données adéquates, il faut ajouter les lignes suivantes dans le fichier de configuration '''/etc/postfix/main.cf''' de '''Postfix''' après la ligne '''broken_sasl_auth_clients = yes''': |
virtual_mailbox_base = / | virtual_mailbox_base = / |
Version du 4 février 2014 à 03:13
Sommaire
Prérequis
Avant de lire les instructions qui vont suivre, il est recommandé de lire la page consacrée à Postfix où au moins les annexes qui reprennent le fichier de configuration /etc/postfix/main.cf finale et qui va servir de base pour cette page.
Afin de faciliter la gestion du serveur de mail ou encore d'automatiser certaine tâche et de développer des fonctionnalités pour les utilisateurs finaux, il est possible de coupler le serveur mail à une base de données Mysql.
Les fonctions de cette bases seront les suivantes :
- assurer l'authentification des utilisateurs;
- stocker les comptes mails;
- établir une table de correspondance login / adresse émetteur autorisée.
Ainsi, Mysql va agir sur 4 services :
- le service SMTP assuré par Postfix (quota, alias, émetteurs autorisés, ...);
- l'authentification SMTP via sasl;
- l'authentification IMAP et la localisation du répertoire mail de l'utilisateur;
- l'authentification POP3 et la localisation du répertoire mail de l'utilisateur.
Vous devez disposer d'un serveur Mysql fonctionnel. Dans cet article le serveur mysql et le serveur mail sont hébergés sur une même machine. Si ce n'est pas le cas de votre configuration, pensez à changer la valeur du hosts. |
Installation
- Pour fonctionner avec une base de données MySQL, il faut installer les paquets postfix-mysql, libsasl2-modules-sql (module saslauthd) et courier-authlib-mysql (modules courier POP/IMAP) :
|
Création de la base de données
- Création de l'utilisateur mysql postfix avec le mot de passe motdepassebasemysqlpourpostfix et sa base de données nommée postfix avec les droits nécessaires.
|
Authentification
Module Saslauthd
- Postfix utilise le module saslauthd pour l'authentification des utilisateurs qui est basée sur pam. Voici le contenu du fichier de configration /etc/pam.d/smtp :
auth required pam_mysql.so user=postfix passwd=motdepassebasemysqlpourpostfix host=127.0.0.1 db=postfix table=postfix_users usercolumn=username passwdcolumn=cleard crypt=0 account sufficient pam_mysql.so user=postfix passwd=motdepassebasemysqlpourpostfix host=127.0.0.1 db=postfix table=postfix_users usercolumn=username passwdcolumn=clear crypt=0
Si le fichier existe déjà, remplacer-le. |
- Redémarrer le service saslauthd :
|
Module authdaemonrc pour POP / IMAP
- Pour activer l'authentification mysql, dans le fichier /etc/courier/authdaemonrc remplacer :
authmodulelist="authpam"
- Par :
authmodulelist="authmysql"
- Créer le fichier de connexion à la base de données mysql /etc/courier/authmysqlrc :
MYSQL_SERVER 127.0.0.1 MYSQL_USERNAME postfix MYSQL_PASSWORD motdepassebasemysqlpourpostfix MYSQL_PORT 0 MYSQL_OPT 0 MYSQL_DATABASE postfix MYSQL_USER_TABLE postfix_users MYSQL_CRYPT_PWFIELD crypt MYSQL_CLEAR_PWFIELD clear MYSQL_UID_FIELD 5000 MYSQL_GID_FIELD 5000 MYSQL_LOGIN_FIELD CONCAT(username,'@',domain) MYSQL_HOME_FIELD "/var/mail/vmail" MYSQL_NAME_FIELD name MYSQL_MAILDIR_FIELD maildir
- On redémarre le service courier-authdaemon :
|
Configuration de Postfix
Général
- Pour activer les utilisateurs virtuels et interroger les bases de données adéquates, il faut ajouter les lignes suivantes dans le fichier de configuration /etc/postfix/main.cf de Postfix après la ligne broken_sasl_auth_clients = yes:
virtual_mailbox_base = / virtual_mailbox_maps = mysql:/etc/postfix/mysql-virtual-maps.cf virtual_mailbox_domains = mysql:/etc/postfix/mysql-virtual-domains.cf virtual_minimum_uid = 5000 virtual_uid_maps = static:5000 virtual_gid_maps = static:5000 virtual_transport = virtual
Ici, nous indiquons à Postfix où se trouve la liste des boîtes mails hébergées virtual_mailbox_maps ainsi que l'utilisateurs UNIX qui a les permissions nécessaires pour accéder aux dossiers et fichiers de ces boîtes mails.
Les noms de domaine contenus dans cette table ne devront pas apparaître dans le paramètre mydestination du fichier de configuration /etc/postfix/main.cf de Postfix. |
Fichiers de configurations
- Le fichier de configuration /etc/postfix/mysql-virtual-maps.cf qui permet de récupérer la liste des utilisateurs virtuels de Postfix :
user = postfix password = motdepassebasemysqlpourpostfix dbname = postfix hosts = 127.0.0.1 query = SELECT maildir FROM postfix_users where CONCAT(username,'@',domain)='%s' and postfix = 'y'
- Le fichier de configuration /etc/postfix/mysql-virtual-domains.cf permet de vérifier les domaines locaux de Postfix :
user = postfix password = motdepassebasemysqlpourpostfix dbname = postfix hosts = 127.0.0.1 query = SELECT destination FROM postfix_virtual_domains WHERE domain = '%s'
Comptes mails et utilisateurs
Utilisateur générique vmail
- Les messages des utilisateurs virtuels seront stockés dans le dossier /var/mail/vmail qui sera crée spécialement à cet effet. On créera aussi l'utilisateur et le groupe vmail qui pourront accéder à ce dossier et ses sous-dossiers.
|
Création de la Table
- Maintenant, il faut créer la table contenant les utilisateurs virtuels de Postfix :
CREATE TABLE postfix_users ( id int(11) unsigned NOT NULL auto_increment, username varchar(64) NOT NULL default , domain varchar(64) NOT NULL default , clear varchar(128) NOT NULL default , crypt varchar(128) NOT NULL default , name tinytext NOT NULL, uid int(11) unsigned NOT NULL default '5000', gid int(11) unsigned NOT NULL default '5000', homedir tinytext NOT NULL, maildir tinytext NOT NULL, quota tinytext NOT NULL, access enum('Y','N') NOT NULL default 'Y', postfix enum('Y','N') NOT NULL default 'Y', disablepop3 char(1) NOT NULL default '0', disableimap char(1) NOT NULL default '0', disablewebmail char(1) NOT NULL default '0', sharedgroup varchar(128) NOT NULL default '0', smtpaccess enum('Y','N') NOT NULL default 'Y', PRIMARY KEY (id), UNIQUE KEY email (email) )
- Ainsi que celle contenant les noms de domaine locaux :
CREATE TABLE postfix_virtual_domains ( id int(11) unsigned NOT NULL auto_increment, domain varchar(128) NOT NULL default , destination varchar(128) NOT NULL default , PRIMARY KEY (id), UNIQUE KEY domain (domain) )
Création d'un utilisateur
- Nous allons ajouter l'utilisateur cacheln avec le mot de passe cacheln et pour adresse mail cacheln@mail.glx dans la table mysql postfix_users :
INSERT INTO `courriel`.`postfix_users` ( `id` , `username` , `domain` , `clear` , `crypt` , `name` , `uid` , `gid` , `maildir` , `quota` , `access` , `postfix` , `disablepop3` , `disableimap` , `disablewebmail` , `sharedgroup` , `smtpaccess` ) VALUES ( NULL , 'cacheln', 'mail.glx', 'cacheln', , 'Nicolas CACHELOU', '5000', '5000', '/var/mail/vmail/mail.glx/cacheln/', '10000000', 'Y', 'Y', '0', '0', '0', '0', 'Y' );
- Pour que l'utilisateur cacheln puisse envoyer des mails via le smtp en utilisant son adresse mail cacheln@mail.glx, nous allons insérer l'enregistrement suivant :
INSERT INTO `courriel`.`postfix_senders` ( `id` , `username` , `email` ) VALUES ( NULL , 'cacheln', 'cacheln@mail.glx' );
- Nous allons créer le répertoire mail de l'utilisateur :
|
Restriction émetteur / sender
Si vous avez mis en place un contrôle de l'adresse de l'émetteur en fonction de son login (c.f Postfix#Restriction_.C3.A9metteur.2Fsender, cette partie est donc obligatoire. Le cas échant, le SMTP refusera d'envoyer les mails des utilisateurs locaux. |
Création de la table
- Création de la table postfix_senders :
CREATE TABLE postfix_senders ( id int(11) unsigned NOT NULL auto_increment, username varchar(64) NOT NULL default , email varchar(128) NOT NULL default , PRIMARY KEY (id) )
Cette table liste les adresses mails autorisées à être présentées en fonction du login (username) de l'utilisateur.
Configuration de Postfix
- Dans le fichier /etc/postfix/main.cf, remplacer :
smtpd_sender_login_maps =hash:/etc/postfix/sender_login
- Par :
smtpd_sender_login_maps = mysql:/etc/postfix/mysql-virtual-senders.cf
Fichier de configuration
- Créer le fichier de configuration /etc/postfix/mysql-virtual-senders.cf qui permettra d'interroger la table des adresses d'émetteurs autorisés :
user = postfix password = motdepassebasemysqlpourpostfix dbname = postfix hosts = 127.0.0.1 query = SELECT email FROM postfix_senders where username='%s'
Restreindre les services courier
- Il est possible de limiter l'accès aux services POP3 / IMAP selon les utilisateurs. Pour cela, la table postfix_users dispose de deux colonnes :
- disablepop3 pour limiter l'utilisation du service POP3 (0 : activé - 1 : désactivé);
- disableimap pour limiter l'utilisation du service IMAP (0 : activé - 1 : désactivé).
Configuration de courier-authdaemon
- Éditer le fichier de configuration /etc/courier/authmysqlrc puis ajouter à la fin du fichier la ligne suivante :
MYSQL_AUXOPTIONS_FIELD CONCAT("disableimap=",disableimap,",disablepop3=",disablepop3,",disablewebmail=",disablewebmail,",sharedgroup=",sharedgroup)
- Redémarrer le service courier-authdaemon pour appliquer les changements :
|
Blocage de IMAP
- Nous souhaitons bloquer l'accès au serveur IMAP pour l'utilisateur cacheln. Pour cela, nous allons mettre à jour la valeur du champs disableimap pour l'enregistrement de l'utilisateur cacheln dans la table postfix_users :
UPDATE `postfix_users` SET `disableimap` = '1' WHERE `postfix_users`.`id` = '2' AND `postfix_users`.`postfix` = 'Y' LIMIT 1
- Maintenant, essayons de nous connecter au serveur IMAP avec le compte cacheln@mail.glx :
|
Le serveur nous indique que nos identifiants sont correctes mais que IMAP a été désactivé pour notre compte.
Blocage de POP3
- Nous souhaitons bloquer l'accès au serveur POP3 pour l'utilisateur cacheln. Pour cela, nous allons mettre à jour la valeur du champs disablepop3 pour l'enregistrement de l'utilisateur cacheln dans la table postfix_users :
UPDATE `courriel`.`postfix_users` SET `disablepop3` = '1' WHERE `postfix_users`.`id` =2;
- Maintenant, essayons de nous connecter au serveur POP3 avec le compte cacheln@mail.glx :
|
Sécurité
- D'après la configuration étudiée ci-dessus, les mots de passe des utilisateurs transitent en clair entre le serveur Postfix' et la base de données Mysql. Si ces deux services sont hébergés sur des machines différentes, la faille de sécurité est d'autant plus dangereuse.
- La base de données Mysql peut stocker les mot de passe en les cryptant. Lors de l'authentification, c'est le mot de passe crypté qui est comparé et non le mot de passe en clair. Ainsi, que le mot de passe soit récupéré lors de la phase d'authentification ou directement dans la base de données, cela n'a plus d'importance : le mot de passe est crypté et donc illisible par un humain.
- Notre table postfix_users contient deux colonnes :
- clear : pour le mot de passe stocké en claire (configuration actuelle);
- crypt : pour le mot de passe stocké après avoir été crypté (configuration étudié par la suite).
- Il faudra également spécifié à pam la méthode de cryptage souhaitée.
Cryptage du mot de passe
Configuration de pam
- Éditer le fichier de configuration /etc/pam.d/pam et remplacer :
auth required pam_mysql.so user=postfix passwd=motdepassebasemysqlpourpostfix host=127.0.0.1 db=postfix table=postfix_users usercolumn=username passwdcolumn=clear crypt=0 account sufficient pam_mysql.so user=postfix passwd=motdepassebasemysqlpourpostfix host=127.0.0.1 db=postfix table=postfix_users usercolumn=username passwdcolumn=clear crypt=0
- Par :
auth required pam_mysql.so user=postfix passwd=motdepassebasemysqlpourpostfix host=127.0.0.1 db=postfix table=postfix_users usercolumn=username passwdcolumn=crypt crypt=1 account sufficient pam_mysql.so user=postfix passwd=motdepassebasemysqlpourpostfix host=127.0.0.1 db=postfix table=postfix_users usercolumn=username passwdcolumn=crypt crypt=1
- Appliquer les paramètre en redémarrant le service d'authentification saslauthd :
|
Configuration de authdaemon
- Éditer le fichier de configuration /etc/courier/authmysqlrc et commenter la ligne :
#MYSQL_CLEAR_PWFIELD = clear
- Puis décommenter la ligne :
MYSQL_CRYPT_PWFIELD = crypt
- Appliquer les paramètre en redémarrant le service d'authentification courier-authdaemon :
|
Mise à jour du mot de passe
- Nous allons mettre à jour le mot de passe de notre utilisateur cacheln dans la base de données pour utiliser la méthode de cryptage ENCRYPT :
UPDATE `courriel`.`postfix_users` SET `clear` = , `crypt` = ENCRYPT( 'cacheln' ) WHERE `postfix_users`.`id` =2;
Vérification
- On valide le login -u cacheln et le mot de passe -p cacheln avec la commande testsaslauthd :
|
- Visualisation d'une trame échangée entre le serveur Postfix et celui de la base de données MySQL sans cryptage :
- Visualisation d'une trame échangée entre le serveur Postfix et celui de la base de données MySQL avec cryptage ENCRYPT() :
Chiffrement des échanges Postfix / Mysql
MYSQL_SSL_KEY = /etc/courier/ssl/authdaemon.key MYSQL_SSL_CERT = /etc/courier/ssl/authdaemon.cert
mkdir -p /etc/courier/ssl cd /etc/courier/ssl openssl req -new -outform PEM -out authdaemon.cert -newkey rsa:2048 -nodes -keyout authdaemon.key -keyform PEM -days 365 -x509
Vérification
- Bien que les méthodes vues précédemment permettent de ne plus voir le mot de passe qui transite en claire, il est quand même possible de voir le reste de la conversation entre les serveurs de courier et celui de la base de données. Pour sécuriser ces échanges, la méthode la plus sûre reste le chiffrement via SSL.
- Visualisation d'une trame échangée entre le serveur Postfix et celui de la base de données MySQL sans ssl :
- Visualisation d'une trame échangée entre le serveur Postfix et celui de la base de données MySQL avec ssl :