Paramétrer un serveur mail Postfix, Courier-IMAP avec authentification PostgreSQL et SASL : Différence entre versions

De e-glop
 
Ligne 318 : Ligne 318 :
 
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)
 
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)
  
== Étape 6 : configurer une interface de gestion pour vos comptes email ==
+
== 6ème étape : configurer une interface de gestion pour vos comptes email ==
  
 
À venir ...
 
À venir ...
 +
 +
== Sources ==
 +
 +
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 à [http://theclimber.fritalk.com/ TheClimber]...

Version du 10 août 2009 à 16:06

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

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...