Paramétrer un serveur mail Postfix, Courier-IMAP avec authentification PostgreSQL et SASL

De e-glop

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,
   address text NOT NULL,
   domain varchar(255) NOT NULL,
   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,
   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,
   password varchar(255) NOT NULL,
   name varchar(255) NOT NULL,
   maildir varchar(255) NOT NULL,
   quota int NOT NULL DEFAULT '0',
   domain varchar(255) NOT NULL,
   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 (n'oubliez pas d'adapter l'UID et le GID à ceux de postfix id postfix) :

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		_UID_
PGSQL_GID_FIELD		_GID_
PGSQL_LOGIN_FIELD	username
PGSQL_HOME_FIELD	'/home/postfix/Maildir'
PGSQL_MAILDIR_FIELD	maildir
PGSQL_WHERE_CLAUSE      active=true

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:_GID_
virtual_uid_maps = static:_UID_
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 = '%s'

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

Configurer l'authentification SMTP avec 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,auto 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 le lancement de SASL dans les fichiers de configuration de votre Debian en paramétrant START=yes dans "/etc/default/saslauthd". Activer également 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 ...

7ème étape : bonuses

FAM/Gamin

Si vous recevez une erreur à la première connexion de votre client email (Thunderbird par exemple) de type "Filesystem notification initialization error -- contact your mail administrator (check for configuration errors with the FAM/Gamin library)", cela est règlable de manière très rapide par :

$ sudo apt-get install gamin

Courier et SSL/TLS (IMAP4/POP3)

Installer courier-imap-ssl pour le support de IMAPs :

sudo apt-get install courier-imap-ssl

Éditez votre fichier "/etc/courier/imapd-ssl" et complétez-le pour qu'il soit de la forme :

SSLPORT=993
SSLADDRESS=0
SSLPIDFILE=/var/run/courier/imapd-ssl.pid
SSLLOGGEROPTS="-name=imapd-ssl"
IMAPDSSLSTART=YES
IMAPDSTARTTLS=YES
IMAP_TLS_REQUIRED=0
COURIERTLS=/usr/bin/couriertls
TLS_PROTOCOL=TLS1
TLS_STARTTLS_PROTOCOL=TLS1
TLS_CERTFILE=/etc/courier/imapd.pem
TLS_VERIFYPEER=NONE
TLS_CACHEFILE=/var/lib/courier/couriersslcache
TLS_CACHESIZE=524288
MAILDIRPATH=/home/postfix/Maildir

Créez maintenant le certificat pour le serveur IMAP avec la commande suivante :

sudo mkimapdcert

Redémarrez Courier :

sudo /etc/init.d/courier-authdaemon restart && sudo /etc/init.d/courier-imap restart && sudo /etc/init.d/courier-imap-ssl restart

SMTP over SSL/TLS

Ajoutez les lignes suivantes à votre fichier "/etc/postfix/main.cf" :

#
# SSL/TLS
smtpd_use_tls = yes
smtpd_tls_cert_file = /etc/postfix/smtpd.cert
smtpd_tls_key_file = /etc/postfix/smtpd.key

Puis exécutez cette commande pour créer le certificat SSL/TLS auto-signé (et répondez aux questions) :

sudo openssl req -new -outform PEM -out /etc/postfix/smtpd.cert -newkey rsa:2048 -nodes -keyout /etc/postfix/smtpd.key -keyform PEM -days 365 -x509

 Country Name (2 letter code) [AU]: <-- Entrez le code de votre pays (ex: "FR").
 State or Province Name (full name) [Some-State]: <-- Entrez votre état ou le nom de votre province (ex: "Bretagne")
 Locality Name (eg, city) []: <-- Entrez votre ville.
 Organization Name (eg, company) [Internet Widgits Pty Ltd]: <-- Entrez le nom de votre société (ex: Libre Informatique).
 Organizational Unit Name (eg, section) []: <-- Entrez le nom de votre Organizational Unit (ex: "mail")
 Common Name (eg, YOUR name) []: <-- Entrez le Fully Qualified Domain Name du système (ex: "smtp.domain.tld").
 Email Address []: <-- Entrez votre adresse email (ex: postmaster@domain.tld).

Maintenant, changez les permissions du fichier "/etc/postfix/smtpd.key" :

chmod o= /etc/postfix/smtpd.key

Rechargez la configuration de Postfix :

sudo postfix reload

Les spams, via spamassassin

Installez spamassassin :

sudo apt-get install spamassassin spamc

sudo groupadd spamd
sudo useradd -g spamd -s /sbin/nologin -d /var/lib/spamassassin spamd
sudo mkdir /var/lib/spamassassin
sudo chown spamd:spamd /var/lib/spamassassin
sudo mkdir /var/log/spamd
sudo chown spamd:spamd /var/log/spamd

Maintenant, vous devez changer quelques paramètres dans "/etc/default/spamassassin" et vous assurer d'avoir les valeurs suivantes :

ENABLED=1
SAHOME="/var/lib/spamassassin/"
OPTIONS="--create-prefs --max-children 5 --username spamd --helper-home-dir ${SAHOME} -s /var/log/spamd/spamd.log"
PIDFILE="${SAHOME}spamd.pid"

Ce que vous avez paramétrer, c'est de permettre au démon spamd de fonctionner sous l'utilisateur spamd, de lui faire utiliser son propre répertoire personnel (/var/lib/spamassassin) et de lui faire sortir ses logs dans "/var/log/spamd/spamd.log".

Nous avons besoin maintenant de donner quelques règles à spamassassin. Editez donc le fichier "/etc/spamassassin/local.cf" pour lui faire ressembler à ça :

rewrite_header Subject [***** SPAM _SCORE_ *****]
required_score           2.0
#to be able to use _SCORE_ we need report_safe set to 0
#If this option is set to 0, incoming spam is only modified by adding some "X-Spam-" headers and no changes will be made to the body.
report_safe     0

# Enable the Bayes system
use_bayes               1
use_bayes_rules         1
# Enable Bayes auto-learning
bayes_auto_learn        1

# Enable or disable network checks
skip_rbl_checks         0
use_razor2              0
use_dcc                 0
use_pyzor               0

Ici, nous avons paramétré spamassassin pour réécrire le sujet des emails à [***** SPAM _SCORE_ *****], où _SCORE_ est le score attribué à l'email par spamassassin après avoir effectué sur lui différents tests, mais seulement sur ce dernier est égal ou dépasse 2.0.

Maintenant, démarrez spamd avec la commande suivante :

/etc/init.d/spamassassin start 

Nous avons également besoin de demander à Postfix d'utiliser spamassassin. Dans notre cas, il ne sera invoqué qu'une fois que Postfix aura fini de traiter l'email. Pour dire à postfix d'utiliser spamassassin, nous allons modifier le fichier "/etc/postfix/master.cf" et changer la ligne :

smtp      inet  n       -       -       -       -       smtpd

pour :

smtp      inet  n       -       -       -       -       smtpd
       -o content_filter=spamassassin

et à la fin du fichier, ajoutez :

spamassassin unix -     n       n       -       -       pipe
       user=spamd argv=/usr/bin/spamc -f -e    
       /usr/sbin/sendmail -oi -f ${sender} ${recipient}

En rechargeant Postfix, tout devrait être prêt :

sudo /etc/init.d/postfix reload 

Sources, licence

Ce tutoriel est une version traduite, simplifiée et corrigée et complétée de celui-ci, en version anglaise : http://theclimber.fritalk.com/post/2009/01/27/Tutorial-:-Setup-your-mail-server-(courier-imap-postfix-postgresql)

Les compléments ont été tirés (principalement), de ce document : http://www.howtoforge.com/virtual-users-domains-postfix-courier-mysql-squirrelmail-ubuntu8.10-p2

Ce document est publié, comme le souhaitent ses auteurs originels, sous licence CC-by-nc-sa 2.0