Table des matières

Configurer un serveur de messagerie libre sous Linux

Ce tutoriel a pour but de mettre en service un serveur de messagerie libre sous Linux, sécurisé contre les utilisations frauduleuses et utilisant le protocole TLS pour chiffrer le transport des mails.

Pour cela, il faut configurer 3 composants logiciels distincs :

Installation des paquets requis

SASLAuthd est le programme qui va permettre d'authentifier les utilisateurs au serveur SMTP. MySQL (ou MariaDB), quant à lui, est un SGBD qui stockera la base de données des comptes de messagerie.

Voici la commande pour installer tous les prérequis :

apt-get install libdb5.1 postfix sasl2-bin procmail libsasl2-modules libsasl2-modules-sql libgsasl7 libauthen-sasl-cyrus-perl sasl2-bin libpam-mysql mysql-server courier-authdaemon courier-authlib-mysql courier-pop courier-imap

:!: Si le paquet mysql-server est indisponible, installer à la place mariadb-server (même chose).

L'assistant de première configuration de PostFix va alors s'ouvrir:

Choisir le réglage Site Internet :

Choix du type de configuration de PostFix

Puis indiquer le domaine de messagerie à utiliser :

Renseignement du nom de courrier

Paramétrage de PostFix avec STARTTLS

Ajouter l'utilisateur postfix au groupe sasl :

adduser postfix sasl

Pour configurer PostFix, relancer l'assistant de configuration complète du paquet :

sudo dpkg-reconfigure postfix

On renseigne les mêmes réglages que précédemment, puis l'assistant nous pose des questions supplémentaires :

Ensuite entrer les commandes suivantes pour activer l'authentification avec sasl dans PostFix :

postconf -e 'smtpd_sasl_local_domain ='
postconf -e 'smtpd_sasl_auth_enable = yes'
postconf -e 'smtpd_sasl_security_options = noanonymous'
postconf -e 'broken_sasl_auth_clients = yes'
postconf -e 'smtpd_recipient_restrictions = permit_sasl_authenticated,permit_mynetworks,reject_unauth_destination'
postconf -e 'inet_interfaces = all'

Créer le fichier des alias PostFix :

postalias /etc/aliases

Maintenant, créer un répertoire, une clé privée, et générer un certificat auto-signé TLS qui permettra de chiffrer les courriels :

mkdir /etc/postfix/ssl
cd /etc/postfix/ssl/
openssl genrsa -des3 -rand /dev/urandom -out smtpd.key 2048
openssl req -new -key smtpd.key -out smtpd.csr
openssl x509 -req -days 3650 -in smtpd.csr -signkey smtpd.key -out smtpd.crt
openssl rsa -in smtpd.key -out smtpd.key.unencrypted
mv -f smtpd.key.unencrypted smtpd.key
chmod 600 smtpd.key
openssl req -new -x509 -extensions v3_ca -keyout cakey.pem -out cacert.pem -days 3650 

Remarque : A certaines étapes et à plusieurs reprises, il faudra indiquer une clé privée à garder secrète et les informations à afficher sur les certificats (Code pays, état, ville, organisation, domaine…).

Après on peut paramétrer le serveur mail pour utiliser TLS avec le certificat généré :

postconf -e 'smtpd_tls_auth_only = no'
postconf -e 'smtp_use_tls = yes'
postconf -e 'smtpd_use_tls = yes'
postconf -e 'smtp_tls_note_starttls_offer = yes' #Active STARTTLS
postconf -e 'smtpd_tls_key_file = /etc/postfix/ssl/smtpd.key'
postconf -e 'smtpd_tls_cert_file = /etc/postfix/ssl/smtpd.crt'
postconf -e 'smtpd_tls_CAfile = /etc/postfix/ssl/cacert.pem' 
postconf -e 'smtpd_tls_loglevel = 1'
postconf -e 'smtpd_tls_received_header = yes'
postconf -e 'smtpd_tls_session_cache_timeout = 3600s'
postconf -e 'tls_random_source = dev:/dev/urandom'
postconf -e 'myhostname = nocterie.local'
postconf -e 'maillog_file = /var/log/postfix.log'
postconf -e 'smtp_tls_policy_maps = hash:/etc/postfix/tls_policy'

Afin que SMTP-TLS vérifie bien le domaine, créer le fichier /etc/postfix/tls_policy contenant :

nocterie.local      verify

:!: nocterie.local doit être remplacé par le nom du domaine à vérifier.

Appliquer les changements avec :

postmap /etc/postfix/tls_policy
chgrp postfix /etc/postfix/tls_policy*

Par défaut, PostFix tente d'envoyer les mails sortants sur Internet, parfois ce n'est pas possible car l'opérateur bloque la livraison directe du courrier, il faut alors configurer soi-même le relais SMTP à utiliser en sortie :

postconf -e 'relayhost = mail.isp.tld'

:!: Remplacer mail.isp.tld par le serveur SMTP de votre fournisseur d'accès à Internet.

Enfin, redémarrer le service postfix pour appliquer les changements :

service postfix restart

S'il n'y a aucun retour cela signifie que la configuration est bonne.

Création des comptes d'utilisateur et paramétrage de PostFix

Dans cette partie, on va créer la base de données qui contiendra les comptes de messagerie du domaine.

Démarrer en générant une nouvelle base de données :

mysqladmin -u root --password='motdepasse' create postfix

:!: Remplacer motdepasse par le mot de passe du compte root.

Ouvrir la console d'administration de MySQL :

mysql -u root -p

Et donner les privilèges sur la base au compte postfix :

GRANT ALL PRIVILEGES ON postfix.* TO "postfix"@"localhost" IDENTIFIED BY 'password';

:!: Remplacer password par un mot de passe pour le compte postfix.

Puis créer les tables de la base :

USE postfix;
CREATE TABLE `alias` (
`address` varchar(200) NOT NULL default '',
`goto` text NOT NULL,
`domain` varchar(255) NOT NULL default '',
`created` datetime NOT NULL default '0000-00-00 00:00:00',
`modified` datetime NOT NULL default '0000-00-00 00:00:00',
`active` tinyint(1) NOT NULL default '1',
PRIMARY KEY  (address)
) ENGINE=MyISAM COMMENT='Postfix Admin - Virtual Aliases';
USE postfix;
CREATE TABLE `domain` (
`domain` varchar(200) NOT NULL default '',
`description` varchar(255) NOT NULL default '',
`aliases` int(10) NOT NULL default '0',
`mailboxes` int(10) NOT NULL default '0',
`maxquota` int(10) NOT NULL default '0',
`transport` varchar(255) default NULL,
`backupmx` tinyint(1) NOT NULL default '0',
`created` datetime NOT NULL default '0000-00-00 00:00:00',
`modified` datetime NOT NULL default '0000-00-00 00:00:00',
`active` tinyint(1) NOT NULL default '1',
PRIMARY KEY  (domain)
) ENGINE=MyISAM COMMENT='Postfix Admin - Virtual Domains';
USE postfix;
CREATE TABLE `mailbox` (
`username` varchar(200) NOT NULL default '',
`password` varchar(255) NOT NULL default '',
`name` varchar(255) NOT NULL default '',
`maildir` varchar(255) NOT NULL default '',
`quota` int(10) NOT NULL default '0',
`domain` varchar(255) NOT NULL default '',
`created` datetime NOT NULL default '0000-00-00 00:00:00',
`modified` datetime NOT NULL default '0000-00-00 00:00:00',
`active` tinyint(1) NOT NULL default '1',
PRIMARY KEY  (`username`)
) ENGINE=MyISAM COMMENT='Postfix Admin - Virtual Mailboxes';
quit;

Maintenant, on crée l'utilisateur vmail et son groupe vmail. Cet utilisateur servira à centraliser les boîtes mail. Son répertoire personnel sera /srv/vmail, c'est à dire l'emplacement des boîtes mail des utilisateurs.

groupadd -g 5000 vmail
useradd -g vmail -u 5000 vmail -d /srv/vmail -m

On continue la configuration de PostFix :

postconf -e 'virtual_alias_maps = proxy:mysql:/etc/postfix/mysql_virtual_alias_maps.cf'
postconf -e 'virtual_gid_maps = static:5000'
postconf -e 'virtual_mailbox_base = /srv/vmail'
postconf -e 'virtual_mailbox_domains = proxy:mysql:/etc/postfix/mysql_virtual_domains_maps.cf'
postconf -e 'virtual_mailbox_limit = 51200000'
postconf -e 'virtual_mailbox_maps = proxy:mysql:/etc/postfix/mysql_virtual_mailbox_maps.cf'
postconf -e 'virtual_minimum_uid = 5000'
postconf -e 'virtual_transport = virtual'
postconf -e 'virtual_uid_maps = static:5000'
postconf -e 'relay_domains = proxy:mysql:/etc/postfix/mysql_relay_domains_maps.cf'

Il faut désormais créer les fichiers de configuration pour MySQL. Il y en a 5 à créer :

/etc/postfix/mysql_virtual_alias_maps.cf contenant :

user = postfix
password = password
hosts = localhost
dbname = postfix
query = SELECT goto FROM alias WHERE address='%s' AND active = 1

/etc/postfix/mysql_virtual_domains_maps.cf contenant :

user = postfix
password = password
hosts = localhost
dbname = postfix
query = SELECT domain FROM domain WHERE domain='%s' and backupmx = '0' and active = '1'

/etc/postfix/mysql_virtual_mailbox_maps.cf contenant :

user = postfix
password = password
hosts = localhost
dbname = postfix
query = SELECT maildir FROM mailbox WHERE username='%s' AND active = 1

/etc/postfix/mysql_virtual_mailbox_limit_maps.cf contenant :

user = postfix
password = password
hosts = localhost
dbname = postfix
query = SELECT quota FROM mailbox WHERE username='%s'

Et enfin /etc/postfix/mysql_relay_domains_maps.cf contenant :

user = postfix
password = password
hosts = localhost
dbname = postfix
query = SELECT domain FROM domain WHERE domain='%s' and backupmx = '1' and active = '1'

Pour que PostFix prenne en compte ces fichiers en tant que table, il faut utiliser les commandes suivantes (cette commande doit être executée à chaque modification des fichiers ci-dessus) :

cd /etc/postfix
postmap mysql_virtual_alias_maps.cf
postmap mysql_virtual_domains_maps.cf
postmap mysql_virtual_mailbox_maps.cf
postmap mysql_virtual_mailbox_limit_maps.cf
postmap mysql_relay_domains_maps.cf

Ne pas oublier de régler les permissions adequates sur les fichiers de configuration :

chown root:postfix /etc/postfix/*
chmod 640 /etc/postfix/*
chmod o+r /etc/postfix/main.cf
chmod +x /etc/postfix/postfix-script

Paramétrage de l'authentification SMTP

Tout d'abord, créer le fichier de configuration de sasl et y indiquer quelques réglages :

touch /etc/postfix/sasl/smtpd.conf

echo 'pwcheck_method: saslauthd' >> /etc/postfix/sasl/smtpd.conf
echo 'mech_list: plain login' >> /etc/postfix/sasl/smtpd.conf 
echo 'allow_plaintext: true' >> /etc/postfix/sasl/smtpd.conf

Puis entrer les commandes suivantes :

mkdir -p /var/spool/postfix/var/run/saslauthd
rm -fr /var/run/saslauthd
ln -s /var/spool/postfix/var/run/saslauthd /var/run/saslauthd
chown -R root:sasl /var/spool/postfix/var/
chmod 710 /var/spool/postfix/var/run/saslauthd

Ensuite éditer le fichier /etc/default/saslauthd pour modifier les 2 lignes suivantes :

Enfin, créer le fichier /etc/pam.d/smtp contenant :

auth       required     pam_mysql.so user=postfix passwd=password host=localhost db=postfix table=mailbox usercolumn=username passwdcolumn=password crypt=2
account    sufficient   pam_mysql.so user=postfix passwd=password host=localhost db=postfix table=mailbox usercolumn=username passwdcolumn=password crypt=2

Tests du protocole SMTP

Démarrer saslauthd, il ne doit pas y avoir d'erreur :

service saslauthd start

Vérifier que SMTP-AUTH et TLS fonctionnent correctement :

telnet localhost 25

Puis faire (remplacer nocterie.local par le domaine de messagerie utilisé) :

EHLO nocterie.local

La commande doit retourner une liste dans laquelle il y a une ligne 250-STARTTLS et une autre 250-AUTH PLAIN LOGIN

Quitter Telnet avec la commande quit.

On peut aussi essayer l'authentification avec un utilisateur local membre du groupe sasl pour voir si elle fonctionne :

testsaslauthd -u utilisateur -p userpassword -s smtp -f /var/spool/postfix/var/run/saslauthd/mux

Cela doit renvoyer ceci : 0: OK “Success.”, autrement il y a un problème quelquepart.

:!: La dernière commande peut ne pas fonctionner ⇒ Ignorer

Configuration de ProcMail

ProcMail gère la livraison des courriels : c'est le facteur.

Commencer par lui créer un fichier de configuration :

MAILDIR=$HOME/Maildir
DEFAULT=$MAILDIR/

:0:
$DEFAULT

Installation de Courrier

Courrier est le programme qui permettra de récupérer les courriels grâce aux protocoles POP et IMAP.

Une question sera posée concernant des répertoires web, y répondre “Non” :

Faut-il créer les répertoires web

Créer l'espace de stockage des mails pour l'utilisateurs courant dans son répertoire /home avec :

maildirmake Maildir
maildirmake -f Envoyé Maildir
maildirmake -f En_attente Maildir
maildirmake -f Spam Maildir
maildirmake -f Brouillons Maildir
maildirmake -f Supprimés Maildir

Redémarrer les processus de Courrier pour appliquer les réglages :

find /etc/init.d/ | grep courier | while read line; do $line restart; done

Création d'un compte mail

Ouvrir la console MySQL et créer l'utilisateur en ajoutant différentes entrées :

use postfix;
INSERT INTO domain (domain,description) VALUES ('domain.tld','Test Domain');
INSERT INTO alias (address,goto) VALUES ('alias@domain.tld', 'test@domain.tld');
INSERT INTO mailbox (username,password,name,maildir)  VALUES ('test@domain.tld',ENCRYPT('userpassword'),'Mailbox User','test@domain.tld/');

Avec ce système, les comptes de messagerie sont les mêmes que ceux de Linux.

On crée tout d'abord le compte :

useradd utilisateur 

On l'ajoute au groupe sasl, c'est à dire le groupe qui peut s'authentifier au serveur SMTP :

adduser utilisateur sasl

On lui crée son espace de stockage pour ses mails, en le rendant propriétaire de son dossier perso :

mkdir -p /home/utilisateur
cd /home/utilisateur
maildirmake Maildir
chown utilisateur:sasl /home/utilisateur

Ne pas oublier de lui définir un mot de passe :

passwd utilisateur

Et c'est terminé !

:!: L'adresse mail de l'utilisateur est composée de son nom d'utilisateur (login) suivi d'un arobase (@) puis du nom de domaine utilisé avec postfix. Ici notre utilisateur aura l'adresse utilisateur@nocterie.local.

Configuration du client mail

Pour configurer un compte de messagerie dans un client mail standard tel qu'Outlook ou Thunderbird, il suffit de renseigner l'adresse mail, l'identifiant et le mot de passe du compte, ainsi que le protocole de boîte à lettre utilisé (IMAP) et l'adresse du serveur mail :

configuration d'un compte mail dans le client de messagerie

On peut faire un test lors de la configuration dans Outlook pour vérifier que cela fonctionne :

Vérification des paramètres de connexion au compte