Les services de messagerie sont devenus indispensables dans notre quotidien. Mais ce que les utilisateurs ignorent, c’est que mettre en place un tel service en entreprise est relativement complexe.
Cet article va nous permettre d’avoir une première vision sur la façon de déployer la messagerie dans notre environnement et comment les différents protocoles (SMTP pour l’envoi et IMAP pour la réception) travaillent ensemble.
Alors c’est parti pour un gros tuto aujourd’hui : l’installation d’un serveur de messagerie sous Linux Debian avec les logiciels Postfix et Dovecot. Et en bonus, l’installation du webmail Rainloop !
Installation d’un serveur de messagerie sous Debian Linux
Info ++ : Avertissement : cet article commence a dater et n’est peut être plus 100% fonctionnel avec les versions récentes des éléments utilisés ici. Une mise à jour de l’article aura lieu prochainement. La mise en place de ce type d’infra ne doit être faites que pour des laboratoires de tests, il n’y a aucune sécurité active, ne pas utiliser tel quel en prod ! |
De nos jours, tout le monde connaît la messagerie et utilise une ou plusieurs adresses mails. Mais peu de gens connaissent réellement le fonctionnement global d’une messagerie. C’est un projet particulièrement complexe à comprendre et à mettre en place que nous allons tenter de réaliser ensemble aujourd’hui.
Ce tuto est assez complexe et plutôt long je le sais, je me suis efforcée de mettre un maximum d’informations ou de point de repères pour vous aider. Restez concentrés et attentifs, surtout au niveau de la syntaxe des commandes et dans les fichiers et tout devrait bien se passer !
1. Introduction
La messagerie n’étant pas un système interactif, comme par exemple un service web qui affiche instantanément une page, il faut un service responsable de l’envoi et de la réception/stockage des mails, et un autre responsable de la transmission du mail au destinataire lorsqu’il va se connecter. C’est pourquoi la messagerie utilise plusieurs protocoles, les plus connus étant SMTP et IMAP (ou POP).
Voici pour information un tableau récapitulatif des ports associés aux protocoles des services de messagerie :
Le protocole SMTP sert à échanger des messages entre serveurs de messagerie. Il va permettre l’envoi et la réception de mails quand l’utilisateur n’est pas connecté en stockant les messages dans une boîte mail.
Ensuite, pour récupérer les mails quand on se connecte à sa messagerie via un logiciel de type Outlook ou un webmail comme Gmail, le protocole utilisé sera alors le protocole IMAP (ou POP qui est son ancêtre). C’est lui qui va se connecter au serveur de messagerie où sont stockés les messages et qui pourra ainsi les récupérer.
Pour cette procédure, j’ai choisi d’utiliser le logiciel Postfix, qui va nous permettre de faire du SMTP, couplé à une interface web Postfixadmin pour aider à la gestion des comptes de messagerie sur le domaine. Les utilisateurs seront « virtuels » et stockés en base de données.
Pour la partie récupération et classement des mails (IMAP), nous allons utiliser le logiciel Dovecot.
Et enfin, pour que les utilisateurs puissent accéder à leur messagerie, nous utiliserons un webmail simple et léger : Rainloop. Un webmail est un serveur web qui permet de lire et envoyer des messages directement via un navigateur plutôt qu’en utilisant une application comme Thunderbird par exemple.
Un logiciel anti-spam est grandement préconisé sur un serveur de messagerie. Cette partie ne sera pas détaillée ici mais je vous conseille SpamAssassin qui s’adapte parfaitement à Postfix.
Info ++ : Petite précision tout de même avant de commencer ! Ce tuto a été fait dans un cadre privé sur une plateforme de tests interne non accessible depuis l’extérieur, je ne vais donc pas utiliser un « vrai » nom de domaine, c’est-à-dire un nom déposé chez un registrar etc et je ne pourrai par conséquent pas « réellement » délivrer un mail à une adresse existante. Ceci n’est qu’une illustration ! |
Ceci étant dit, voyons un peu l’infrastructure utilisée dans le contexte de ce tutoriel :
J’utilise deux machines virtuelles Debian Stretch (9.5), une ayant le rôle de serveur sans interface graphique et une cliente avec l’interface KDE. Mon infrastructure a un accès à Internet grâce à un routeur NAT Cisco simulé sous GNS3 (vous pouvez tout à fait utiliser une tierce machine virtuelle sous Linux ou Windows qui devra posséder 2 cartes réseaux en guise de routeur NAT).
Je pars du principe que vous avez déjà dans votre infrastructure un serveur DNS paramétré et fonctionnel pour votre domaine. Dans mon cas, mon serveur de messagerie est également mon serveur DNS. Voici les entrées créées dans mon DNS (bind9) pour le bon fonctionnement des services de messagerie :
Les bases sont placées, maintenant, il y a un peu de boulot sur le serveur…
2. Installation des paquets et préparation du système
Info ++ : soyez vigilants en saisissant les contenus qui vont suivre, une simple indentation ou un caractère en plus ou un moins dans un fichier de configuration peut aboutir au dysfonctionnement d’un service. Servez-vous des logs du serveur qui vous donneront des pistes sur les fichiers posant problème. |
On commence toujours par une petite vérification (et application) d’éventuelles mises à jour :
apt-get update && apt-get upgrade -y |
Ensuite on va installer les services de base de ce qu’on appelle une pile « LAMP » (Linux Apache Mysql PHP) :
apt-get install apache2 mariadb-server php7.0 -y |
On continue par installer toutes les dépendances de php7.0 dont nous allons avoir besoin par la suite et on redémarre le service apache2 pour la prise en compte de ces dépendances :
apt-get install php7.0-mysql php7.0-mbstring php7.0-imap php7.0-xml php7.0-curl -y service apache2 restart |
On poursuit avec deux petits utilitaires qu’on utilisera pour le test final :
apt-get install tree mailutils -y |
On installe Postfix :
apt-get install postfix postfix-mysql -y |
Pendant l’installation, choisissez le mode « Site Internet » et saisir le nom de votre domaine ou encore le nom complet du serveur de messagerie (nom+domaine) en tant que « Nom de courrier ».
Et enfin, on installe Dovecot :
apt-get install dovecot-mysql dovecot-pop3d dovecot-imapd dovecot-managesieved -y |
On va également créer sur le serveur un groupe+utilisateur local nommé ici « vmail » qui sera chargé de gérer les emails. Son « home directory » sera défini sur /var/vmail et contiendra par la suite l’ensemble des mails reçus par le serveur.
groupadd -g 5000 vmail useradd -g vmail -u 5000 vmail -d /var/vmail -m |
On va passer à l’installation et la configuration de Postfixadmin.
3. Installation et configuration de Postfixadmin
Comme exposé en introduction, les comptes de messagerie seront virtuels. Pour administrer ses comptes de façon graphique, nous allons utiliser l’interface web du service Postfix appelée PostfixAdmin.
Avant de procéder à l’installation, nous allons préparer la base de données nécessaires au bon fonctionnement. Avant tout, si ce n’est pas déjà le cas, on va sécuriser mysql en définissant au compte root un mot de passe pour s’y connecter :
mysql_secure_installation |
Une série de question vous sera alors posée. La 1ère vous demandera de saisir le mot de passe actuel pour root. Nous n’en avons pas, appuyez juste sur la touche Entrée.
Ensuite on vous demande « Set root password ? [Y/n] ». Appuyez de nouveau sur la touche Entrée pour répondre « Oui » (Y = Yes) et définir un mot de passe pour l’utilisateur root (2 fois).
Pour toutes les questions qui suivront, appuyez sur Entrée pour valider.
Connectez-vous à mariadb et saisissez le mot de passe fraîchement défini pour root :
mariadb -u root -p |
On commence par créer une base de données que j’ai appelé ici « postfix » :
CREATE DATABASE postfix; |
Ensuite, on crée un utilisateur, appelé postfix, et on lui attribue un mot de passe.
Info ++ : Tout au long de cette procédure, n’oubliez pas de remplacer les parties « choose_a_password » par le mot de passe que vous avez choisi. |
CREATE USER 'postfix'@'localhost' IDENTIFIED BY 'choose_a_password'; |
Et ensuite, je donne à mon nouvel utilisateur « postfix », les pleins pouvoirs sur la base de données qui porte son nom.
GRANT ALL PRIVILEGES ON `postfix` . * TO 'postfix'@'localhost'; |
Pour des raisons de sécurité, nous utiliserons (plus tard dans ce tuto) plutôt un autre utilisateur pour accéder à la base de données « postfix » et qui n’aura que le droit de lecture. Ce compte se nommera « mailuser ». Je le crée et lui donne les droits nécessaires :
CREATE USER 'mailuser'@'localhost' IDENTIFIED BY 'choose_a_password'; GRANT SELECT ON `postfix`.* TO 'mailuser'@'localhost'; |
La base de données est prête. On applique les nouveaux privilèges et nous pouvons quitter mariadb :
FLUSH PRIVILEGES; QUIT ; |
On peut désormais installer Postfixadmin. Se placer dans le répertoire /srv/, télécharger l’archive nécessaire et la décompresser :
cd /srv/ wget -O postfixadmin.tgz https://github.com/postfixadmin/postfixadmin/archive/postfixadmin-3.2.tar.gz tar -zxvf postfixadmin.tgz |
Déplacez le contenu de l’archive décompressée dans un dossier appelé « postfixadmin ». S’il n’existe pas déjà dans /srv, il sera créé :
mv postfixadmin-postfixadmin-3.2 postfixadmin |
Créez un lien symbolique de notre dossier postfixadmin dans /var/www/html/postfixadmin :
ln -s /srv/postfixadmin/public /var/www/html/postfixadmin |
Maintenant, on va définir notre configuration. Créez un fichier nommé « config.local.php ».
nano /srv/postfixadmin/config.local.php |
Insérer dans ce fichier le texte suivant sans oubliez d’adapter selon l’utilisateur que vous avez créé, le mot de passe que vous lui avez attribué et le nom de base de données défini :
<?php $CONF['database_type'] = 'mysqli'; $CONF['database_host'] = 'localhost'; $CONF['database_name'] = 'postfix'; $CONF['database_user'] = 'postfix'; $CONF['database_password'] = 'choose_a_password'; $CONF['configured'] = true; ?> |
Toujours dans notre dossier postfixadmin, créez un dossier nommé « templates_c » et rendez l’utilisateur « www-data » (user spécifique du service web) propriétaire de ce dossier et de tout ce qu’il s’y trouvera. Ce répertoire est nécessaire pour la bonne exécution du setup de Postfixadmin.
mkdir -p /srv/postfixadmin/templates_c chown -R www-data /srv/postfixadmin/templates_c |
On peut maintenant lancer le setup. Depuis le navigateur internet d’un poste client sur le même réseau, rendez-vous à l’adresse suivante (en adaptant le nom serveur.domaine bien sur) :
http://srv-mail.ent.lan/postfixadmin/setup.php
Une série de tests sera alors lancée et si vous avez des erreurs, vous devrez les corriger pour poursuivre.
La plupart des erreurs que j’ai eu sont dues à des dépendances de php7.0 oubliées (multibyte string, IMAP functions etc…) ou bien le service apache qui n’a pas été redémarré et n’a donc pas pris en compte les modifications, des erreurs d’écriture dans le dossier template_c, ou l’ajout de « mysql » au lieu de « mysqli » dans le fichier config.local.php…
Les indications données par le setup en cas d’erreurs sont plutôt claires (quoi que l’on peut se poser des questions pour certaines alertes ou on demande une dépendance de php5 alors que le setup a bien détecté l’utilisation de la version 7.0… ne pas tenir compte de php5 si vous utilisez du 7.0 ou du 7.2 etc… installez les dépendances de la version que VOUS utilisez).
Lorsque que tous les tests seront validés, descendez tout en bas de la page. On vous demandera de définir un mot de passe pour l’installation. Ce mot de passe doit être assez fort. Une fois fait, Cliquez sur Generate […].
Le mot de passe que vous avez défini sera alors crypté.
Il faut copier TOUTE LA LIGNE FOURNIE et la coller dans le fichier config.local.php du serveur entre les 2 balises de php (grosse pensée pour ceux qui ne se sont pas connectés en ssh au serveur depuis le client et qui vont devoir tout saisir à la main… attention risque d’erreur maximal !)
Ensuite on va vous demander de créer un compte pour se connecter à l’interface phpmyadmin.
Saisissez de nouveau le mot de passe du setup que vous avez défini juste avant. Créer un compte du type admin@votredomaine, lui attribuer un password et cliquez sur Ajouter un administrateur.
Une fois le compte d’administration créé, vous aurez le message suivant :
Vous pouvez désormais vous connectez à l’interface web Postfixadmin à l’adresse suivante :
http://srv-mail.ent.lan/postfixadmin/login.php
Voici un aperçu de la console d’administration :
Nous allons ajouter notre domaine. Cliquez sur « Liste des domaines » et « Nouveau domaine » dans les onglets en haut de la page :
Ajoutez votre domaine et définir le nombre d’alias et de comptes courriers sur 0 pour pouvoir en créer en illimité.
On peut maintenant créer nos adresses de messagerie. Cliquez sur « Liste des virtuels » et « Ajouter un compte courrier » dans les onglets en haut de la page.
Créer 2 boîtes utilisateurs qui devront s’échanger des mails. Le nom d’utilisateur sera celui utilisé dans l’adresse mail devant le @domaine. Le nom sera celui affiché pour les échanges entre utilisateurs. Vous pouvez définir une limite de taille pour la boîte de l’utilisateur (oui j’ai mis 10Mo car je suis super radine !). Veillez à bien cocher la case Actif et cliquez sur Ajouter le compte courriel. Refaites la manipulation pour un second utilisateur.
Voilà pour la partie gestion des adresses mails ! Maintenant, nous allons procéder à la configuration de Postfix sur le serveur.
4. Configuration de Postfix
Pour rappel, Postfix est le logiciel de messagerie chargé de la livraison des emails. Il faut lier Postfix à la base de données afin que les utilisateurs puissent échanger des messages.
On va commencer par donner accès au domaine à postfix. Dans /etc/postfix, créez un fichier nommé « mysql-virtual-mailbox-domains.cf » et y insérer le contenu suivant :
user = mailuser |
Ce fichier va permettre à Postfix, quand il reçoit un mail destiné à user@ent.lan, de déterminer si notre serveur est bien en charge du domaine ent.lan. Il faut qu’en exécutant la requête (définie à la ligne “query”), un élément quelconque soit retourné.
Si rien n’est retourné à l’exécution de la requête, cela signifie que le domaine n’est pas présent et que le serveur devra transmettre la demande à un autre serveur de messagerie.
Activez la configuration avec la commande suivante :
postconf -e virtual_mailbox_domains=mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf |
On va tester si la recherche du domaine « ent.lan » fonctionne bien avec la commande ci-dessous :
postmap -q ent.lan mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf |
Son retour devra afficher la valeur 1 pour indiquer que le domaine « ent.lan » est bien trouvé.
Ensuite on va vérifier si la boîte mail existe, comme pour le domaine. Créez cette fois-ci le fichier « mysql-virtual-mailbox-maps.cf » dans /etc/postfix et y insérer les lignes suivantes :
user = mailuser |
On active avec la commande :
postconf -e virtual_mailbox_maps=mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf |
Et on teste, comme pour le domaine, si la boîte « informatique@ent.lan » créé précédemment existe.
postmap -q informatique@ent.lan mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf |
Son retour devra afficher la valeur 1 pour indiquer que l’adresse mail est bien trouvée.
Postfix trouve bien le domaine ent.lan et également les boîtes mails créées. Passons à la configuration de Dovecot.
5. Configuration de Dovecot
Maintenant qu’on arrive à faire circuler les mails sur notre serveur, et qu’on les arrête quand ils sont pour nous, il faut pouvoir les récupérer pour les mettre dans des dossiers. C’est le rôle de Dovecot.
Placez-vous dans le dossier /etc/dovecot/conf.d/. Le premier fichier à modifier est « 10-auth.conf ». La ligne « auth_mechanisms » doit avoir comme valeur « plain login ».
Ensuite, tout à la fin de ce même fichier, il faut dire à Dovecot qu’il doit utiliser des utilisateurs en base de données et non ceux du système. Il faut pour cela « commenter », c’est-à-dire ajouter le symbole # devant la ligne « ! include auth-system » et « décommenter », supprimer le symbole # donc, devant la ligne « ! include auth-sql »
Modifiez le fichier « auth-sql.conf.ext ». Recherchez le bloc « userdb » et remplacez les informations par celles-ci :
userdb { driver = static args = uid=vmail gid=vmail home=/var/vmail/%d/%n } |
Éditez le fichier « 10-mail.conf ». Modifiez la ligne « mail_location » actuelle par celle ci :
mail_location = maildir:/var/vmail/%d/%n/Maildir |
Vous pouvez commenter (#) l’ancienne ligne et ajouter la nouvelle juste dessous.
Modifiez le fichier « 10-master.conf ». Dans le bloc de configuration « service auth », cherchez la partie « # Postfix smtp-auth » et y ajouter les lignes suivantes :
unix_listener /var/spool/postfix/private/auth { mode = 0666 user = postfix group = postfix } |
On va maintenant indiquer à Dovecot comment se connecter à la base de données. Placez-vous dans le dossier /etc/dovecot.
Modifier le fichier « dovecot-sql.conf.ext ». Tout à la fin de ce fichier, ajouter les 3 lignes suivantes en adaptant avec vos informations :
driver = mysql connect = host=127.0.0.1 dbname=postfix user=mailuser password=choose_a_password password_query = SELECT username,domain,password FROM mailbox WHERE username= '%u' ; |
Modifiez les droits sur le fichier « dovecot.conf » situé dans /etc/dovecot pour que Dovecot soit lancé en tant qu’utilisateur « vmail » :
chgrp vmail /etc/dovecot/dovecot.conf chmod g+r /etc/dovecot/dovecot.conf |
Et pour terminer pour cette configuration de Dovecot, redémarrez le service :
service dovecot restart |
6. Mise en place de la liaison Postfix <-> Dovecot
Maintenant qu’on a d’un côté Postfix, qui sait quand un mail passe s’il est pour lui ou s’il doit le transmettre à un autre serveur mails, et Dovecot qui sait où les stocker, il faut donc que Postfix relaie les mails a Dovecot.
Pour cela, ajouter les 2 lignes suivantes à la fin du fichier /etc/postfix/master.cf. Attention, la deuxième ligne “flags” commence par deux espaces qui sont OBLIGATOIRES !
Info ++ : Il est plus que vivement conseiller de saisir à la main ces deux lignes (ne pas faire de copier/coller) car c’est CE fichier qui risque le plus de générer des erreurs par la suite. Dans la 1ère ligne, les champs sont séparés les uns des autres par une tabulation, la seconde ligne commence par 2 indentations (espace) et les champs sont séparés par un espace. |
dovecot unix – n n – – pipe flags=DRhu user=vmail:vmail argv=/usr/lib/dovecot/dovecot-lda -f ${sender} -d ${recipient} |
Si vous avez par la suite dans les logs des insultes de ce type…
…ne cherchez pas plus loin et revenez dans ce fichier, l’erreur est ici et il y a 99% de chance que ce ne soit qu’un problème de syntaxe.
Redémarrez le service postfix :
service postfix restart |
Et appliquez les modifications que l’on vient d’effectuer avec les 2 commandes suivantes :
postconf -e virtual_transport=dovecot postconf -e dovecot_destination_recipient_limit=1 |
Maintenant, nous allons tester la configuration actuelle.
Pour l’instant, le dossier /var/vmail est vide. Nous pouvons le vérifier avec la commande :
tree /var/vmail |
Tentons d’envoyer un mail de test à l’utilisateur « informatique » en ligne de commande :
echo test | mail informatique@ent.lan |
Cette commande ne produira aucun retour. Pour vérifier l’état de notre mail, il faut consulter les logs :
tail -f /var/log/mail.log |
Les dernières lignes des logs devraient ressembler à celles-ci :
Nous voyons qu’un mail à destination de informatique@ent.lan a été bien envoyé. Le statut doit être à l’état « sent » sinon cela signifie qu’une erreur s’est glissée dans votre configuration.
Relancer la commande suivante pour vérifier qu’une arborescence a bien été créée :
tree /var/vmail |
On voit qu’un dossier au nom du domaine a été créé, qu’il contient un dossier au nom de notre utilisateur « informatique » et que ce dernier à un fichier, un message, dans le dossier « new ».
Le serveur de messagerie est donc bien paramétré et désormais fonctionnel !
7. Installation et configuration de Rainloop
Nous allons, pour conclure ce long tuto, installer le webmail Rainloop pour que les utilisateurs consultent leurs messages en « graphique », ce qui est quand même plus sympa…
Info + : Le webmail Rainloop a été choisi pour sa simplicité d’installation et son utilisation simplifiée pour les utilisateurs finaux. Je l’ai installé sur le serveur de messagerie car ce dernier dispose déjà de la pile LAMP nécessaires mais c’est purement dans un soucis pratique, vous pouvez tout à fait l’installer sur un serveur tiers. Si vous ne souhaitez pas utiliser un webmail, vous pouvez également utiliser un client de messagerie. Ce tuto a été testé sur Thunderbird et est fonctionnel. |
Créez un répertoire « rainloop » dans /var/www /html et placez-vous à l’intérieur :
mkdir /var/www/html/rainloop cd /var/www/html/rainloop |
Récupérez la dernière version de Rainloop :
wget -qO- https://repository.rainloop.net/installer.php | php |
Toujours dans le dossier /var/www/html/rainloop, appliquez les droits nécessaires et préconisés par Rainloop :
find . -type d -exec chmod 755 {} \; |
Allez dans /etc/apache2/sites-available et copiez le fichier « 000-default.conf » en le renommant « rainloop.conf »:
cp 000-default.conf rainloop.conf |
Éditez ce nouveau fichier rainloop.conf. Remplacez la ligne « DocumentRoot » actuelle par « DocumentRoot = /var/www/html/rainloop »
Activez le site de rainloop et redémarrez apache2 pour appliquer les changements :
a2ensite rainloop.conf service apache2 restart |
Depuis le navigateur internet d’un client, allez à l’adresse suivante (sans oubliez le ?) :
http://srv-mail.ent.lan/rainloop/?admin
Les identifiants de connexion par défaut (qui peuvent et même DOIVENT être modifiés) sont :
- Login : admin
- MDP : 12345
Vous pouvez modifier la langue de l’interface en cliquant sur le langage défini et sélectionnant celui souhaité dans la liste.
On va déclarer notre domaine « ent.lan ». Allez dans le menu « Domaines » sur la droite et cliquez sur « + Ajouter un domaine ».
Renseignez le nom complet (nom+domaine) du serveur qui gère la messagerie dans la partie IMAP et SMTP. Les ports peuvent être laissés par défaut sur 143 pour IMAP et 25 pour SMTP.
Les 2 parties « Secure » doivent être définies sur « None » car nous n’avons pas abordé ce point. Et enfin, décochez toutes les cases éventuellement cochées.
Cliquez sur le bouton « i Test » pour vérifier la configuration. Si aucune erreur n’apparaît, cliquez sur « + Ajouter ».
Le client webmail est prêt ! On le teste ? OK ! Allez à l’adresse suivante :
http://srv-mail.ent.lan/rainloop/
Connectez-vous en utilisant l’adresse mail et le mot de passe d’un des 2 utilisateurs que vous avez créés dans Postfixadmin.
Une fois connecté, on retrouve dans la boîte de réception le mail envoyé tout à l’heure en ligne de commande.
Allez, on va envoyer un mail à notre 2nd utilisateur créé avec Postfixadmin ! Cliquez sur Nouveau en haut à gauche et envoyez le message souhaité au destinataire (ça, pas besoin de vous dire comment faire je suis sûre 😀 )
Et pour vérifier, et bien c’est simple, on se connecte sur la seconde boîte mail, c’est-à-dire celle du destinataire !
Nous avons bien reçu le message de informatique@ent.lan !
Nous disposons d’un serveur de messagerie fonctionnel grâce à Postfix et Dovecot et du webmail Rainloop pour que nos utilisateurs puissent consulter leurs mails !
Cette première approche est arrivée à son terme (ah ben c’est pas trop tôt !)! Evidemment, le mieux serait de sécuriser nos échanges grâce à des certificats et surtout l’utilisation des ports sécurisés et pour cela, ce n’est pas compliqué il suffit de…
Eh je ne vais pas faire tout le boulot pour vous quand même ! Je vous laisse un peu faire vos propres recherches…
See U !