Paramétrer un serveur mail Postfix, Courier-IMAP avec authentification PostgreSQL et SASL
Sommaire
- 1 Objectif
- 2 Versions utilisées pour réaliser ce tutoriel
- 3 1ère étape, préparation du système
- 4 2ème étape, PostgreSQL
- 5 3ème étape, configurer le système d'authentification
- 6 4ème étape : Postfix
- 7 5ème étape : Courier IMAP et le reste
- 8 6ème étape : configurer une interface de gestion pour vos comptes email
- 9 Sources, licence
Objectif
Avoir un serveur mail s'appuyant sur une structure PostgreSQL pour la gestion de ses comptes, afin de ne plus être lié aux sessions utilisateur UNIX.
Versions utilisées pour réaliser ce tutoriel
- GNU/Linux Ubuntu 8.10 ou Debian 5.0.0
- Cyrus-SASL 2.1.22
- Courier-IMAP 4.3.0
- Postfix 2.5.1
- PostgreSQL > 8.2
1ère étape, préparation du système
Installer postfix, courier-imap, courier-authdaemon et postgresql.
sudo apt-get install postfix courier-imap postgresql courier-authdaemon courier-authlib-postgresql postfix-pgsql
Durant l'installation plusieurs questions sur Postfix vous seront posées. Répondez juste par les réponses par défaut, nous en adapterons la configuration plus loin.
2ème étape, PostgreSQL
Configurer PostgreSQL pour l'utilisateur Postfix
echo 'CREATE USER postfix WITH PASSWORD 'postfix'; CREATE DATABASE postfix; GRANT ALL PRIVILEGES ON DATABASE postfix to postfix;' | sudo -u postgres psql template1
Maintenant vous disposez d'un utilisateur Postfix et d'une base de données associée nommée "postfix". N'hésitez pas à changer le mot de passe par défaut et le noter pour le répercuter à chaque fois qu'il sera demandé.
Pour éviter tout problème de permissions avec PostgreSQL, il peut être utile de permetter à l'utilisateur "postfix" d'avoir un fichier d'historique, donc vous devrez donner des droits de lecture et d'écriture au répertoire /var/spool/postfix :
chown -R postfix.postfix /var/spool/postfix
Créer les tables pour les comptes mail
Voici la table qui sera utilisée pour faire correspondre les aliases avec les comptes email réels :
CREATE TABLE aliases ( alias varchar(255) NOT NULL default , address text NOT NULL, domain varchar(255) NOT NULL default , created time with time zone NOT NULL default now(), modified time with time zone NOT NULL default now(), active int NOT NULL default '1', PRIMARY KEY (address) );
Cette table sera utilisée pour stocker les domaines gérés par ce serveur mail :
CREATE TABLE domain( domain varchar(255) NOT NULL default , description varchar(255) NOT NULL default , aliases int NOT NULL default '0', mailboxes int NOT NULL default '0', maxquota int NOT NULL default '0', transport varchar(255) default NULL, backupmx int NOT NULL default '0', created time with time zone NOT NULL default now(), modified time with time zone NOT NULL default now(), active int NOT NULL default '1', PRIMARY KEY (domain) );
Cette table sera utilisée pour stocker les comptes email réels de vos utilisateurs, ainsi que leur leur mot de passe et leur répertoire de stockage des emails :
CREATE TABLE mailbox ( username varchar(255) NOT NULL default , password varchar(255) NOT NULL default , name varchar(255) NOT NULL default , maildir varchar(255) NOT NULL default , quota int NOT NULL default '0', domain varchar(255) NOT NULL default , created time with time zone NOT NULL default now(), modified time with time zone NOT NULL default now(), active int NOT NULL default '1', PRIMARY KEY (username) ) ;
Instancier les tables de la base de données des emails
Cela vous permettra de voir si votre système fonctionne correctement :
INSERT INTO domain (domain,description) VALUES ('example.lan', 'Example domain'); INSERT INTO mailbox (username,password,name,maildir) VALUES ('greg@example.lan','$1$zO3SJ$atwB0hrEgp5KWbrJG.zwE0','Mailbox User','greg@example.lan/'); INSERT INTO aliases (alias,address) VALUES ('gregoire@example.lan', 'greg@example.lan'); INSERT INTO mailbox (username,password,name,maildir) VALUES ('test@example.lan','$1$8evSJ$CC92TOtQQzdull3QNb4AZ0','Mailbox User','test@example.lan/');
Note : les mots de passe utilisés sont respectivement :
- greg@example.lan : secret
- test@example.lan : test
Pour générer d'autres mots de passe, vous pouvez utiliser la commande 'authpasswd' :
authpasswd Password: Reenter password: $1$0h8fJ$w4sbGbaoX487cytcGpmqF1
Create the directory for your mails
sudo mkdir /home/postfix sudo mkdir /home/postfix/Maildir sudo chown -R postfix.postfix /home/postfix
Maintenant créons un répertoire pour chaque utilisateur :
cd /home/postfix/Maildir sudo -u postfix maildirmake greg@example.lan sudo -u postfix maildirmake test@example.lan
Nous sommes maintenant prêts pour aller plus loin dans la configuration de Postfix.
3ème étape, configurer le système d'authentification
Configuration de PostgreSQL pour les sessions authdaemon
Éditer le fichier "/etc/courier/authdaemonrc".
authmodulelist="authpgsql" daemons=5 authmodulelistorig="authuserdb authpam authldap authmysql authcustom authpipe" DEBUG_LOGIN=2 # this can be usefull to get some debug log authdaemonvar=/var/run/courier/authdaemon
Dans le fichier "/etc/courier/authpgsqlrc" vous trouverez la configuration pour accéder aux données de la base :
PGSQL_HOST localhost PGSQL_PORT 5432 PGSQL_USERNAME postfix PGSQL_PASSWORD postfix PGSQL_DATABASE postfix PGSQL_USER_TABLE mailbox PGSQL_CRYPT_PWFIELD password # for the uid and the gid you need to use the right for your installation # use the command 'id postfix' to find it out PGSQL_UID_FIELD 111 PGSQL_GID_FIELD 119 PGSQL_LOGIN_FIELD username PGSQL_HOME_FIELD '/home/postfix/Maildir' PGSQL_MAILDIR_FIELD maildir
Test authdaemon with authtest
Tout d'abord, vous devez redémarrer les démons pour recharger les fichiers de configuration :
sudo /etc/init.d/courier-authdaemon restart
Pour tester si l'authentification fonctionne avec votre base de données, vous pouvez utiliser "authtest" :
authtest greg@example.lan secret Authentication succeeded. Authenticated: greg@example.lan (uid 109, gid 117) Home Directory: /var/spool/postfix Maildir: greg@example.lan/ Quota: (none) Encrypted Password: $1$zO3SJ$atwB0hrEgp5KWbrJG.zwE0 Cleartext Password: secret Options: (none)
Si cela ne fonctionne pas, vous pourrez trouver un grand nombre d'informations dans le fichier "/var/log/mail.log" :
tail -n 10 /var/log/mail.log Dec 18 15:25:25 ubuntu authdaemond: modules="authpgsql", daemons=5 Dec 18 15:25:25 ubuntu authdaemond: Installing libauthpgsql Dec 18 15:25:25 ubuntu authdaemond: Installation complete: authpgsql Dec 18 15:25:40 ubuntu authdaemond: received auth request, service=login, authtype=login Dec 18 15:25:40 ubuntu authdaemond: authpgsql: trying this module Dec 18 15:25:41 ubuntu authdaemond: SQL query: SELECT username, , password, 109, 117, '/var/spool/postfix', Maildir, , , FROM mailbox WHERE username = 'greg@example.lan' Dec 18 15:25:41 ubuntu authdaemond: authpgsql: sysusername=<null>, sysuserid=109, sysgroupid=117, homedir=/var/spool/postfix, address=greg@example.lan, fullname=<null>, maildir=greg@example.lan/, quota=<null>, options=<null> Dec 18 15:25:41 ubuntu authdaemond: authpgsql: clearpasswd=secret, passwd=<null> Dec 18 15:25:41 ubuntu authdaemond: Authenticated: sysusername=<null>, sysuserid=109, sysgroupid=117, homedir=/var/spool/postfix, address=greg@example.lan, fullname=<null>, maildir=greg@example.lan/, quota=<null>, options=<null> Dec 18 15:25:41 ubuntu authdaemond: Authenticated: clearpasswd=secret, passwd=<null>
Ici, vous pouvez voir que tout fonctionne parfaitement dans notre exemple ! :c)
4ème étape : Postfix
Configure postfix + postgresql
Tout d'abord, nous avons besoin de l'id utilisateur et de l'id groupe de "postfix" :
id postfix
Voici les lignes à ajouter à la fin du fichier "/etc/postfix/main.cf" (n'oubliez pas d'adapter le gid et le uid de votre propre utilisateur postfix, sinon vous aurez des problèmes de permission...) :
home_mailbox = mail/ smtpd_banner = $myhostname ESMTP $mail_name (Ubuntu/GNU) # my additions for the virtual domain administration # to use the Postgresql database. virtual_gid_maps = static:117 virtual_uid_maps = static:109 virtual_transport = virtual virtual_mailbox_limit = 51200000 virtual_mailbox_base = /home/postfix/Maildir virtual_alias_maps = pgsql:/etc/postfix/pgsql_virtual_aliases_maps.cf virtual_mailbox_domains = pgsql:/etc/postfix/pgsql_virtual_domains_maps.cf virtual_mailbox_maps = pgsql:/etc/postfix/pgsql_virtual_mailbox_maps.cf
Maintenant, il faut créer les différentes maps pour les aliases, domaines, et mailbox, le tout dans les bons fichiers :
# /etc/postfix/pgsql_virtual_aliases_maps.cf # The hosts that Postfix will try to connect to hosts = localhost # The user name and password to log into the pgsql server. user = postfix password = postfix # The database name on the servers. dbname = postfix query = SELECT alias FROM aliases WHERE address='%s'
# /etc/postfix/pgsql_virtual_domains_maps.cf : user = postfix password = postfix hosts = localhost dbname = postfix query = SELECT domain FROM domain WHERE domain = substring('%s' from '@(.*)')
# /etc/postfix/pgsql_virtual_mailbox_maps.cf : user = postfix password = postfix hosts = localhost dbname = postfix query = SELECT maildir FROM mailbox WHERE username='%s' AND active = 1
Tester Postfix avec "postmap"
Voyons voir si la configuration que nous avons mis en place est correcte et fonctionne bien :
postmap -q greg@example.lan pgsql:/etc/postfix/pgsql_virtual_aliases_maps.cf postmap -q greg@example.lan pgsql:/etc/postfix/pgsql_virtual_domains_maps.cf postmap -q greg@example.lan pgsql:/etc/postfix/pgsql_virtual_mailbox_maps.cf
Ici, si aucune erreur n'a été reportée, et que tous les codes de retour sont à 0, tout fonctionne bien.
Attention : soyez sûr que tout fonctionne bien à cette étape avant d'aller plus loin dans ce tutoriel.
Configure the SMTP authentication with SASL
Créer un répertoire dans le répertoire chrooté de Postfix, pour permettre l'accès à "authdaemon" :
cd /var/spool/postfix sudo mkdir courier-authdaemon-socket
Tout d'abord vérifiez où est installé le socket de "authdaemon". Habituellement sur les systèmes Debian c'est installé dans le répertoire "/var/run/courier/authdaemon". Adaptez la suite si cela est différent pour vous.
Modifier votre fichier "/etc/fstab" pour pouvoir monter le bon répertoire à la bonne place pour accéder au socket de l'"authdaemon" depuis le répertoire chrooté. Ajoutez cette ligne dans le fichier "/etc/fstab" :
/var/run/courier/authdaemon /var/spool/postfix/courier-authdaemon-socket none bind 0 0
Maintenant, montons ce répertoire à la bonne place et testons si cela fonctionne :
sudo mount /var/spool/postfix/courier-authdaemon-socket sudo chown -R postfix.postfix /var/spool/postfix/courier-authdaemon-socket
Maintenant nous avons besoin de configurer Postfix pour authentifier les requêtes SMTP de la même manière que les requêtes IMAP. Pour se faire, nous allons demander à Postfix d'utiliser "authdaemon" pour l'authentification. Le système en question pour Postfix est appelé SASL. Installons-le :
apt-get install sasl2-bin libsasl2-modules
Activer SASL dans le fichier de configuration de Postfix "/etc/postfix/sasl/smtpd.conf" (attention à ce que le répertoire du socket de l'authdaemon soit bon dans l'environnement chrooté :
pwcheck_method: authdaemond mech_list: PLAIN LOGIN authdaemond_path: /courier-authdaemon-socket/socket log_level: 4
Ajouté à la fin du fichier "/etc/postfix/main.cf" les lignes suivantes :
# # The settings for the SASL authentication using the autdaemon. smtpd_sasl_auth_enable = yes smtpd_sasl2_auth_enable = yes smtpd_sasl_security_options = noanonymous broken_sasl_auth_clients = no smtpd_client_restrictions = permit_mynetworks permit_sasl_authenticated smtpd_recipient_restrictions = permit_mynetworks permit_sasl_authenticated reject_unauth_destination
5ème étape : Courier IMAP et le reste
Configure courier-imap
La configuration se fait dans le fichier "/etc/courier/imapd". Nous avons besoin de modifier cette ligne avec le bon répertoire :
MAILDIRPATH=/home/postfix/Maildir
La configuration par défaut est bonne pour le reste.
Maintenant, redémarrons tous les démons pour être sûr que toutes nos modifications seront prises en compte :
sudo /etc/init.d/postfix restart && sudo /etc/init.d/courier-imap restart && sudo /etc/init.d/courier-authdaemon restart
Configurer thunderbird
Vous pouvez juste ajouter un compte. Les informations dont vous aurez besoin sont :
* serveur IMAP : l'IP de votre serveur email * serveur SMTP : la même IP * nom d'utilisateur : greg@example.lan * mot de passe : secret * Utiliser TLS/SSL : no * Port : 143
Les erreurs connues
Si vous avez l'erreur suivante dans votre fichier "/var/log/mail.log" :
postfix/trivial-rewrite[19109]: warning: do not list domain example.lan in BOTH mydestination and virtual_mailbox_domain
Cela signifie que vous avez configuré la variable "mydestination" pour le même nom de domaine que vous avez ajouté dans votre base PostgreSQL, dans le fichier "/etc/postfix/main.cf". Retirez juste "example.lan" de ce dernier et cela devrait fonctionner à présent. :c)
6ème étape : configurer une interface de gestion pour vos comptes email
À venir ...
Sources, licence
Ce tutoriel est une version traduite, simplifiée et corrigée de celui-ci, en version anglaise : http://theclimber.fritalk.com/post/2009/01/27/Tutorial-:-Setup-your-mail-server-(courier-imap-postfix-postgresql)
Merci à TheClimber...
Ce document est publié, comme le souhaite son auteur originel, sous licence CC-by-nc-sa 2.0