• 15 heures
  • Difficile

Ce cours est visible gratuitement en ligne.

course.header.alt.is_video

course.header.alt.is_certifying

J'ai tout compris !

Mis à jour le 14/09/2023

Maîtrisez le protocole IMAP

Le service IMAP va donc nous permettre d’aller récupérer nos mails sur le serveur. En effet, nous avons vu que, pour l’instant, les mails étaient situés dans des répertoires particuliers sur le serveur (/var/mail/vhosts/mondomaine.local/toto/, par exemple), mais il n’est pas commode de se connecter au serveur en ligne de commande pour lire ses mails. Le protocole IMAP va donc permettre de mettre à disposition des logiciels de messagerie des utilisateurs, leurs mails.

Mettez en oeuvre un serveur IMAP

Principes

Commençons par installer le serveur IMAP, j’ai nommé Dovecot. Il existe d’autres serveurs IMAP, mais Dovecot est considéré aujourd’hui comme l’un des plus sécurisés, robustes, et qui possède le plus de fonctionnalités. De plus, il offre à Postfix une fonctionnalité supplémentaire d’authentification qui pourra vous intéresser par la suite.

Installez le serveur

Vous en avez maintenant l’habitude, nous allons regarder ensemble quels packages sont à notre disposition :

root@Debian02:~# apt-cache search dovecot
argonaut-dovecot - Argonaut − module client pour dovecot
ciderwebmail - service de courriel web IMAP
dovecot-managesieved - serveur sécurisé POP3 et IMAP – serveur ManageSieve
dovecot-pop3d - serveur POP3/IMAP sécurisé – démon POP3
dovecot-sieve - serveur sécurisé POP3 et IMAP – prise en charge des filtres Sieve
mb2md - Convertir les boîtes mail Mbox au format Maildir
postfixadmin - interface web d’administration pour Postfix
vmm - gestion de domaines, comptes et alias pour Dovecot et Postfix
vmm-doc - documentation pour Virtual Mail Manager
dovecot-core - secure POP3/IMAP server - core files
dovecot-dbg - secure POP3/IMAP server - debug symbols
dovecot-dev - secure POP3/IMAP server - header files
dovecot-gssapi - secure POP3/IMAP server - GSSAPI support
dovecot-imapd - secure POP3/IMAP server - IMAP daemon
dovecot-ldap - secure POP3/IMAP server - LDAP support
dovecot-lmtpd - secure POP3/IMAP server - LMTP server
dovecot-lucene - secure POP3/IMAP server - Lucene support
dovecot-mysql - secure POP3/IMAP server - MySQL support
dovecot-pgsql - secure POP3/IMAP server - PostgreSQL support
dovecot-solr - secure POP3/IMAP server - Solr support
dovecot-sqlite - secure POP3/IMAP server - SQLite support
dovecot-antispam - Dovecot plugins for training spam filters
fusiondirectory-plugin-dovecot - dovecot plugin for FusionDirectory
fusiondirectory-plugin-dovecot-schema - LDAP schema for FusionDirectory dovecot plugin
mysqmail-dovecot-logger - real-time logging system in MySQL - Dovecot traffic-logger
phamm - PHP front-end to manage virtual services on LDAP - main package
pysieved - managesieve server
roundcube-plugins-extra - skinnable AJAX based webmail solution - extra plugins

Nous souhaitons installer un serveur IMAP et utiliser une base de données MySQL. Les packages qui vont nous intéresser sont donc :

root@Debian02:~# apt-get install dovecot-core dovecot-imapd dovecot-mysql

Normalement, tout devrait bien se passer. Si vous avez des erreurs, essayez de faire un apt-get update pour mettre à jour la liste des paquets disponibles, puis refaites la commande.

Vérifiez que le service est bien en écoute

Si nous essayons de voir si le service est bien en écoute, comme il devrait l’être :

root@Debian02:~# ss -antp
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 100 *:143 *:* users:(("dovecot",pid=5297,fd=33))
LISTEN 0 128 *:22 *:* users:(("sshd",pid=617,fd=3))
LISTEN 0 100 *:25 *:* users:(("master",pid=929,fd=13))
LISTEN 0 80 127.0.0.1:3306 *:* users:(("mysqld",pid=773,fd=17))
ESTAB 0 0 10.0.0.2:22 10.0.0.254:59898 users:(("sshd",pid=1680,fd=3))
LISTEN 0 100 :::143 :::* users:(("dovecot",pid=5297,fd=34))
LISTEN 0 128 :::22 :::* users:(("sshd",pid=617,fd=4))
LISTEN 0 100 :::25 :::* users:(("master",pid=929,fd=14))

Nous voyons bien que Dovecot est en écoute sur le port 143, qui est le port par défaut du protocole IMAP, donc tout va bien !

Sauvegardez les fichiers de configuration

Nous pouvons passer à la configuration du service, mais d’abord, nous allons faire une sauvegarde des fichiers de configuration pour en conserver un exemplaire d’origine. Comme ça, si nous faisons des bêtises, nous pourrons toujours revenir à un fichier de configuration de base :

root@Debian02:~# cp /etc/dovecot/dovecot.conf /etc/dovecot/dovecot.conf.orig
root@Debian02:~# cp /etc/dovecot/conf.d/10-mail.conf /etc/dovecot/conf.d/10-mail.conf.orig
root@Debian02:~# cp /etc/dovecot/conf.d/10-auth.conf /etc/dovecot/conf.d/10-auth.conf.orig
root@Debian02:~# cp /etc/dovecot/dovecot-sql.conf.ext /etc/dovecot/dovecot-sql.conf.ext.orig
root@Debian02:~# cp /etc/dovecot/conf.d/10-master.conf /etc/dovecot/conf.d/10-master.conf.orig

Configurez le service

Ensuite, la configuration de Dovecot se trouve dans le fichier /etc/dovecot/dovecot.conf. Cependant, la plupart des éléments de configuration ont été séparés dans des fichiers situés dans le répertoire conf.d. Dans notre cas, nous n’aurons rien à retoucher dans le fichier dovecot.conf directement.

Pour pouvoir fournir leurs mails aux utilisateurs, le serveur IMAP a besoin de plusieurs informations :

  1. Savoir où se situent leurs boîtes aux lettres

  2. Savoir quels moyens d’authentification sont autorisés

  3. Savoir où trouver les informations d’authentification (comme les mots de passe)

Editez le fichier de configuration

Nous allons donc configurer ces éléments un par un, en commençant par éditer le fichier /etc/dovecot/conf.d/10-mail.conf dans lequel nous allons éditer deux lignes :

mail_location = maildir:/var/mail/vhosts/%d/%n
...
mail_privileged_group = mail

Voyons en détail ces deux lignes :

  • La première indique là où les mails des utilisateurs vont se trouver, %d représentant le domaine et %n le début de l’adresse mail.

  • La seconde indique avec quel groupe Dovecot a le droit de faire des modifications dans ces répertoires.

Nous pouvons le vérifier :

root@Debian02:~# ls -la /var/mail
total 16
drwxrwsr-x 3 root mail 4096 janv. 16 15:11 .
drwxr-xr-x 13 root root 4096 mars 29 10:58 ..
-rw------- 1 root mail 495 janv. 16 11:31 root
drwxr-xr-x 3 vhosts vhosts 4096 janv. 16 15:42 vhosts

On voit bien ici que le groupe propriétaire du répertoire /var/mail est le groupe mail.

Paramétrez les moyens d'authentification

Il nous faut ensuite indiquer les moyens d’authentification et cela se fait dans le fichier /etc/dovecot/conf.d/10-auth.conf.

Nous commençons par interdire les connexions où le mot de passe circule en clair sur le réseau, en décommentant la ligne suivante :

disable_plaintext_auth = yes

Dans notre cas, nous n’allons faire que des connexions locales, car le webmail qui s’adressera au serveur IMAP sera installé sur la même machine. Cette mesure que nous prenons n’aura donc d’intérêt que pour les personnes qui essaieront de se connecter à distance.

Ensuite, il faut indiquer à Dovecot que les informations d’authentification se trouvent dans une base de données SQL. Pour cela, on commente la ligne d’authentification par le système et l’on décommente celle par SQL :

#!include auth-system.conf.ext
!include auth-sql.conf.ext
#!include auth-ldap.conf.ext
#!include auth-passwdfile.conf.ext
#!include auth-checkpassword.conf.ext
#!include auth-vpopmail.conf.ext
#!include auth-static.conf.ext

Vous pouvez sauvegarder ce fichier modifié. Il nous faut maintenant indiquer à Dovecot quel fichier contiendra les informations permettant de se connecter à la base SQL, en éditant le fichier /etc/dovecot/conf.d/auth-sql.conf.ext :

passdb {
 driver = sql
 args = /etc/dovecot/dovecot-sql.conf.ext
}

userdb {
 driver = static
 args = uid=vhosts gid=vhosts home=/var/mail/vhosts/%d/%n
}

La rubrique passdb indique à Dovecot où se situent les informations d’authentification des utilisateurs, qui sont pour nous dans la base de données MySQL.

La rubrique userdb est un complément à passdb qui permet à Dovecot de savoir quel utilisateur Linux a les droits pour accéder à la boîte aux lettres des utilisateurs de la messagerie, et où celles-ci se situent. Nous devons ajouter cette partie, car ces informations ne sont pas présentes dans la base de données SQL.

Il nous reste maintenant à indiquer les informations pour nous connecter à la base MySQL, et cela se fait dans le fichier indiqué /etc/dovecot/dovecot-sql.conf.ext :

driver = mysql
[...]
connect = host=localhost dbname=messagerie user=messagerieUser password=openclassrooms
[...]
default_pass_scheme = SHA512-CRYPT
[...]
password_query = SELECT email as user, password FROM virtual_users WHERE email='%u'

Détaillons ensemble le contenu de ces lignes :

  • La première ligne indique le type de base SQL utilisé, qui est pour nous une base de type MySQL.

  • La seconde ligne donne les informations pour se connecter à la base. Nous pouvons notamment voir que l’adresse IP utilisée est localhost qui indique bien que la base est sur la même machine que le service IMAP.

  • Ensuite, nous indiquons quel algorithme a été choisi pour chiffrer les mots de passe. Ici, nous avons fait le choix de SHA512 quand nous avons créé notre base avec Postfix, SHA512 étant un algorithme de hash robuste aujourd’hui.

  • Enfin, nous indiquons quelle requête SQL doit être faite pour vérifier le login et le mot de passe des utilisateurs.

Sauvegardez les modifications, et nous sommes maintenant fin prêts pour tester la configuration de notre serveur IMAP !

Testez la configuration de votre serveur IMAP

Pour cela, nous allons utiliser notre bon vieux client Telnet :

root@Debian02:~# systemctl restart dovecot
root@Debian02:~# telnet localhost 143
Trying ::1...
Connected to localhost.
Escape character is '^]'.
* OK [CAPABILITY IMAP4rev1 LITERAL+ SASL-IR LOGIN-REFERRALS ID ENABLE IDLE AUTH=PLAIN] Dovecot ready.
. login toto@mondomaine.local motDePasseDeToto
. OK [CAPABILITY IMAP4rev1 LITERAL+ SASL-IR LOGIN-REFERRALS ID ENABLE IDLE SORT SORT=DISPLAY THREAD=REFERENCES THREAD=REFS THREAD=ORDEREDSUBJECT MULTIAPPEND URL-PARTIAL CATENATE UNSELECT CHILDREN NAMESPACE UIDPLUS LIST-EXTENDED I18NLEVEL=1 CONDSTORE QRESYNC ESEARCH ESORT SEARCHRES WITHIN CONTEXT=SEARCH LIST-STATUS BINARY MOVE SPECIAL-USE] Logged in
. LIST "" *
* LIST (\HasNoChildren \Drafts) "." Drafts
* LIST (\HasNoChildren \Sent) "." Sent
* LIST (\HasNoChildren \Trash) "." Trash
* LIST (\HasNoChildren) "." Spam
* LIST (\HasNoChildren) "." Archive
* LIST (\HasNoChildren) "." INBOX
. OK List completed (0.000 + 0.000 secs).
. SELECT INBOX
* FLAGS (\Answered \Flagged \Deleted \Seen \Draft)
* OK [PERMANENTFLAGS (\Answered \Flagged \Deleted \Seen \Draft \*)] Flags permitted.
* 3 EXISTS
* 0 RECENT
* OK [UNSEEN 2] First unseen.
* OK [UIDVALIDITY 1522316996] UIDs valid
* OK [UIDNEXT 4] Predicted next UID
* OK [HIGHESTMODSEQ 3] Highest
. OK [READ-WRITE] Select completed (0.000 + 0.000 secs).
. logout
* BYE Logging out
. OK Logout completed (0.000 + 0.000 secs).
Connection closed by foreign host.

On commence par relancer le service IMAP, puis on se connecte sur le port 143.

Le serveur nous répond, nous pouvons alors tenter de nous connecter avec la ligne :

. login toto@mondomaine.local motDePasseDeToto

Le serveur nous dit OK, donc la connexion fonctionne. Il faut encore vérifier que nous accédons bien à la boîte aux lettres avec la commande LIST :

. LIST "" *

Nous avons alors le contenu de la boîte aux lettres avec les différents répertoires disponibles.

Notre serveur IMAP est donc fonctionnel. Cependant, avant de continuer, nous devons aussi vérifier qu’une connexion distante à notre serveur sera bien interdite, vu que notre connexion n’est pas chiffrée par SSL et que les mots de passe circuleraient alors en clair.

Une dernière vérification

Pour cela, nous allons tenter une connexion par Telnet depuis une autre machine, de notre réseau local, ou distante. Pour ma part, j’ai choisi une machine située sur le même réseau local :

root@Debian01:~# telnet 10.0.0.2 143
Trying 10.0.0.2...
Connected to 10.0.0.2.
Escape character is '^]'.
* OK [CAPABILITY IMAP4rev1 LITERAL+ SASL-IR LOGIN-REFERRALS ID ENABLE IDLE LOGINDISABLED] Dovecot ready.
. login toto@mondomaine.local motDePasseDeToto
* BAD [ALERT] Plaintext authentication not allowed without SSL/TLS, but your client did it anyway. If anyone was listening, the password was exposed.
. NO [PRIVACYREQUIRED] Plaintext authentication disallowed on non-secure (SSL/TLS) connections.
. logout
* BYE Logging out
. OK Logout completed.
Connection closed by foreign host.

Lors de notre tentative de connexion, le message est clair :

Plaintext authentication not allowed without SSL/TLS, but your client did it anyway. If anyone was listening, the password was exposed.

Puis :

Plaintext authentication disallowed on non-secure (SSL/TLS) connections.

Le serveur nous indique quand même que notre mot de passe a circulé en clair sur le réseau.

Par contre, la connexion a été interdite, comme nous nous y attendions, grâce à la configuration que nous avons mise en place.

En résumé

  • Nous avons utilisé Dovecot pour installer notre serveur IMAP en sélectionnant les packages qui nous intéressent

  • Nous avons vérifié que notre service était bien en écoute avant de poursuivre plus en profondeur

  • Ensuite, nous avons configuré et sécurisé le service en éditant les fichiers dans le répertoire conf.d

  • Pour finir, nous avons testé cette configuration grâce au client Telnet

Ouf, notre solution n’est pas trop mal sécurisée pour l’instant, nous allons pouvoir passer à la configuration du webmail dans le prochain chapitre !

Exemple de certificat de réussite
Exemple de certificat de réussite