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 7ème étape : bonuses
- 10 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, 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