Dovecot : authentification IMAP

Suite à l'installation du serveur IMAP Dovecot (cf : http://blog.moncoindunet.fr/linux/installer-un-serveur-de-mail-sous-linux-23-dovecot/), je vais ici m'intéresser aux principes d'authentification IMAP offerts par ce serveur.

Cette note sera découpée en deux parties :

  • première partie théorique, où je passerai en revue les notions et méthodes disponibles dans Dovecot
  • deuxième partie pratique, avec la mise en place d'authentifications régulièrement utilisées

Dans cette note sera évoquée la mise en place d'une authentification Dovecot sans utilisation d'une application externe. La mise en place d'une authentification couplée avec SSL ou LDAP par exemple sera traitée dans des notes ultérieures, de même que l'interaction avec Postfix.

Au niveau de la configuration, avant Dovecot 2 toutes les directives de configuration se situées dans le fichier dovecot.conf. A partir de la version 2, ce fichier a été éclaté en plusieurs fichiers situés dans conf.d, par exemple 10-auth.conf. Je parlerai donc de ces nouveaux fichiers, si vous avez une version de Dovecot inférieure à la 2, la directive se trouvera donc dans le fichier dovecot.conf (moyennant parfois quelques modifications de syntaxe).

Logiciel utilisé : Dovecot 2.0.8

1 – La théorie

La mise en place d'une authentification Dovecot passe par le choix de 4 paramètres :

  • un mécanisme d'authentification
  • un format de mot de passe
  • une base de données des mots de passe
  • une base de données des utilisateurs

Je vais donc passé en revue ces 4 paramètres et proposer quelques suggestions (qui n'engagent que moi).

1.1 – Mécanismes d'authentification

Il existe deux types de mécanismes d'authentification :

  • en clair : le mot de passe circule en clair sur le réseau entre le client et le serveur (peut ensuite être encrypté avec SSL)
  • non en clair : le mot de passe est crypté avant d'être envoyé au serveur. Le stockage du mot de passe côté serveur doit se faire en clair si différents mécanismes sont configurés, dans le cas contraire le mot de passe peut être stocké dans le schéma associé au mécanisme

Les mécanismes d'authentification en clair supportés par Dovecot :

  • PLAIN
  • LOGIN : équivalent de PLAIN, notamment utilisé par les anciennes versions d'Outlook

Les mécanismes d'authentification non en clair supportés par Dovecot :

  • CRAM-MD5 : largement supporté par les clients
  • DIGEST-MD5 : plus robuste mais plus rarement supporté que CRAM-MD5
  • APOP : équivalent de CRAM-MD5 uniquement pour le POP. Requiert le stockage en clair du mot de passe
  • NTLM : créé par Microsoft et utilisé par ses clients
  • GSS-SPNEGO : similaire à NTLM
  • GSSAPI : support de Kerberos v5
  • RPA : similaire à DIGEST-MD5, mais le support par les clients est rare
  • ANONYMOUS : pour les accès anonymes, par exemple à une archive IMAP publique
  • OTP et SKEY : mécanismes à mot de passe unique
  • EXTERNAL : mécanisme externe SASL

La liste des mécanismes acceptés par le serveur se fait via la directive auth_mechanisms située dans le fichier de configuration 10-auth.conf.

Par défaut c'est le mécanisme PLAIN qui est le seul activé. Mais d'autres peuvent ajoutés avec un espace comme séparation :

auth_mechanisms = plain login cram-md5

A un mécanisme d'authentification sera associé un format de mot de passe.

Suggestions :

  • authentification en clair : PLAIN (et LOGIN si besoin de compatibilité)
  • authentification non en clair : DIGEST-MD5 si supporté par les clients, sinon CRAM-MD5

1.2 – Formats de mot de passe

Un format de mot de passe désigne la façon dont sera stocké le mot de passe dans la base de données des mots de passe. Il n'y a pas de directives de configuration associées, le choix sera indiquée lors de l'utilisation d'une base de données des mots de passe.

Les formats de mots de passe les plus couramment utilisés sont les suivants :

  • PLAIN : mot de passe en clair
  • CRYPT : mot de passe encrypté en DES (par exemple, les mots de passe dans /etc/passwd)
  • MD5-CRYPT (ou MD5) : mot de passe encrypté en MD5 avec sel (par exemple, les mots de passe dans /etc/shadow)

Mais Dovecot supporte également d'autres formats de mot de passe.

Formats qui sont spécifiques à certains mécanismes d'authentification :

  • LANMAN : cryptage basé sur DES. Parfois utilisé avec le mécanisme NTLM
  • NTLM : somme MD4 stocké en héxadécimal. Utilisé par le mécanisme NTLM
  • RPA : utilisé avec le mécanisme RPA
  • CRAM-MD5 : utilisé avec le mécanisme CRAM-MD5
  • DIGEST-MD5 : utilisé avec le mécanisme DIGEST-MD5

Formats basés sur MD5 :

  • PLAIN-MD5 : somme MD5 stockée en héxadécimal
  • LDAP-MD5 : somme MD5 stockée en base64
  • SMD5 : somme MD5 avec sel stockée en base64

Formats basés sur SHA :

  • SHA : somme SHA1 stockée en base64
  • SSHA : somme SHA1 avec sel stockée en base64
  • SHA256 : somme SHA256 stockée en base64
  • SSHA256 : somme SHA256 avec sel stockée en base64
  • SHA512 : somme SHA512 stockée en base64
  • SSHA512 : somme SHA512 avec sel stockée en base64

La différence entre un encodage hexadécimal et base64 tient au nombre de caractères différents utilisés pour l'encodage (16 en hexadécimal, 64 en base64).

Par exemple, un mot de passe encodé en hexadécimal :

10e06b990d44de0091a2113fd95c92fc905166af147aa7632639c41aa7f26b1620c47443813c605b924c05591c161ecc35944fc69c4433a49d10fc6b04a33611

Le même, encodé en base64 :

EOBrmQ1E3gCRohE/2VyS/JBRZq8UeqdjJjnEGqfyaxYgxHRDgTxgW5JMBVkcFh7MNZRPxpxEM6SdEPxrBKM2EQ==

L'ajout d'un sel permet de compliquer la détermination de la donnée de départ (le mot de passe).

La génération d'un mot de passe dans un format donné se fait très facilement grâce à l'utilitaire doveadm, inclus avec Dovecot :

$ doveadm pw -s cram-md5
{CRAM-MD5}595e6e69809606773671749d005255f59c3c9fdfa030db6d80efc4305ec73bc

$ doveadm pw -s plain-md5
{PLAIN-MD5}f71dbe52628a3f83a77ab494817525c6

$ doveadm pw -s ssha
{SSHA}PZL4MD/X/eyOkjn5NNANPUBeXg0lA/YL

Les mots de passe ainsi générés seront stockés dans une base de données des mots de passe. La partie entre {} ne fait pas partie du mot de passe mais indique le format utilisé pour la génération.

Chaque base de données à un format de mots de passe par défaut qui peut être contourné en indiquant le format dans le mot de passe entre {}, par exemple pour forcer un format SSHA :

{SSHA}PZL4MD/X/eyOkjn5NNANPUBeXg0lA/YL

Suggestions :

  • si les utilisateurs existent déjà : prendre le format déjà utilisé
  • si utilisation d'un mécanisme associé à un format : prendre le format du mécanisme
  • sinon : un format assez fort tel que SSHA256 par exemple (ou SSHA512, mais plus consommateur de ressources)

1.3 – Base de données des mots de passe

La base de données des mots de passe désigne l'endroit où seront stockés les mots de passe. Dovecot supporte un certain nombre de bases de données, détaillées ci-dessous.

Les bases de données oui/non : Dovecot soumet à ce type de base un mot de passe par rapport à un utilisateur, la base répond "oui" ou "non" sur la validité. Dovecot n'a pas directement accès au mot de passe. Ce qui explique que ce type de base ne peut être utilisé avec des mécanismes d'authentification non en clair (Dovecot n'ayant pas accès au mot de passe, il n'y a pas de gestion du format de mot de passe).

  • PAM : utilisé pour les connexions Unix par exemple, en lien avec le fichier /etc/shadow par exemple
  • BSDAuth : équivalent de PAM pour BSD
  • CheckPassword : programme externe

Les bases de données autorisant la recherche pas utilisateur/mot de passe et qui ne retournent pas d'autres informations (le format de mot de passe CRYPT est utilisé par défaut et ne peut être modifié) :

  • Passwd : basé sur le fichier /etc/passwd
  • Shadow : base sur le fichier /etc/shadow (obsolète, plutôt utilisé PAM)
  • VPopMail : programme externe utilisé pour gérer plusieurs domaines

Les bases de données autorisant la recherche par utilisateur/mot de passe et qui peuvent retourner d'autres informations (format de mot de passe par défaut entre parenthèses, peut être modifié) :

  • Passwd-file : fichier basé sur le format du fichier /etc/passwd, placé dans un endroit spécifique (CRYPT)
  • LDAP : données stockées dans un serveur LDAP (CRYPT)
  • SQL : données stockées dans une base SQL (MD5)
  • Static : pour test, connexion possible de tous les utilisateurs avec un seul mot de passe ou sans mot de passe

Une fois le mot de passe vérifié, Dovecot consultera la base de données utilisateur pour récupérer les informations dont il a besoin.

Suggestions :

  • avec une authentification en clair : PAM (configuré par défaut)
  • avec une authentification non en clair : Passwd-file (on choisit le format de mot de passe que l'on veut)

1.4 – Base de données utilisateur

La base de données utilisateur désigne l'endroit où sont stockées les informations utilisateurs dont Dovecot peut avoir besoin une fois que l'utilisateur est authentifié, comme l'UID ou l'emplacement des mails par exemple.

Dovecot supporte les base de données utilisateurs suivantes :

  • Passwd : basé sur le fichier /etc/passwd
  • Passwd-file : fichier basé sur le format du fichier /etc/passwd, placé dans un endroit spécifique
  • NSS : Name Service Switch
  • LDAP : données stockées dans un serveur LDAP
  • SQL : données stockées dans un serveur SQL
  • Static : pour test, informations utilisateurs uniques générées à partir d'un modèle
  • VPopMail : programme externe utilisé pour gérer plusieurs domaines
  • Prefetch : dans ce cas on considère que toutes les données utilisateurs seront remontées lors de l'appel à la base de données des mots de passe

Suggestions :

  • Passwd : contient déjà toutes les informations utilisateurs de base
  • Passwd-file : si besoin d'informations utilisateurs supplémentaires, ou pour passage de paramètres IMAP

2 – La pratique

Après la théorie, la pratique !

Je mettrai ici en pratique 3 combinaisons courantes de paramètres pour l'authentification (mécanisme / format de mot de passe / base de données des mots de passe / base de données utilisateur) :

  • PLAIN / – / PAM / Passwd
  • PLAIN / SSHA512 / Passwd-file / Passwd
  • CRAM-MD5 / CRAM-MD5 / Passwd-File / Passwd

Les chemins des fichiers de configuration seront donnés à partir de l'arborescence /usr/local/dovecot/etc.

2.1 – PLAIN / – / PAM / Passwd

C'est la combinaison par défaut : simple (mais efficace !) parce que utlisant PAM, elle ne nécessite aucune configuration supplémentaire ni gestion de bases de données des mots de passe.

Celle-ci est souvent utilisée lors de l'activation de SSL (pour chiffrer la connexion en clair).

Le mécanisme d'authentification PLAIN est activé dans le fichier conf.d/10-auth.conf via la directive auth_mecanisms :

auth_mechanisms = plain

Les bases de données de mots de passe et utilisateur sont configurés dans le fichier conf.d/auth-system.conf.ext :

passdb {
  driver = pam
}

userdb {
  driver = passwd
}

Une fois la configuration modifiée, il faut recharger Dovecot, tester une connexion depuis un client et vérifier dans les logs que celle-ci est OK :

$ doveadm reload
$ tail /var/log/mail.info

Jun  29 20:17:29 host dovecot: imap-login: Login: user=<test>, method=PLAIN, rip=192.168.0.1, lip=192.168.0.2, mpid=12345

2.2 – PLAIN / SSHA512 / Passwd-file / Passwd

Toujours avec une authentification en clair, mais cette fois elle est entièrement gérée par Dovecot. Il faut donc créer sa propre base de données des mots de passe avec les champs <utilisateur>:<mot de passe>. Pour les informations utilisateurs, celles contenues dans le fichier /etc/passwd suffisent. On choisit ici le format de mots de passe le plus robuste.

Comme précédemment, le mécanisme d'authentification PLAIN est activé dans le fichier conf.d/10-auth.conf via la directive auth_mecanisms :

auth_mechanisms = plain

Les bases de données de mots de passe et utilisateur sont configurés dans le fichier conf.d/auth-system.conf.ext :

passdb {
  driver = passwd-file
  args = /usr/local/dovecot/etc/dovecot.passwd
}

userdb {
  driver = passwd
}

Le fichier indiqué via la directive args représente la base de données des mots de passe. On va donc générer un mot de passe dans le format souhaité et l'insérer dans ce fichier sou la forme <utilisateur>:<mot de passe> :

$ doveadm pw -s SSHA512 -V
Enter new password:
Retype new password:
{SSHA512}WwG9LsWOroHmH3jeSpV9lSuXsRzT89zu7qmbf3H2KuwJpDcayzrvmT0zInyveO94a6j5yWKf1Qt8TsDKffxDAjXOAMA= (verified)

$ vi /usr/local/dovecot/etc/dovecot.passwd

test:{SSHA512}WwG9LsWOroHmH3jeSpV9lSuXsRzT89zu7qmbf3H2KuwJpDcayzrvmT0zInyveO94a6j5yWKf1Qt8TsDKffxDAjXOAMA=

A noter : dans le fichier on précise ici {SSHA512} parce que le format de mots de passe par défaut pour passwd-file est CRYPT. Ce format par défaut peut être modifié en ajoutant l'option scheme=SSHA512 dans la définition de la base de données des mots de passe. De cette manière, on est plus obligé de préciser le format {SSHA512} dans la base de données :

passdb {
  driver = passwd-file
  args = scheme=ssha512 /usr/local/dovecot/etc/dovecot.passwd
}

Une fois la configuration modifiée, il faut recharger Dovecot, tester une connexion depuis un client et vérifier dans les logs que celle-ci est OK :

$ doveadm reload
$ tail /var/log/mail.info

Jun  29 20:17:29 host dovecot: imap-login: Login: user=<test>, method=PLAIN, rip=192.168.0.1, lip=192.168.0.2, mpid=12345

2.3 – CRAM-MD5 / CRAM-MD5 / Passwd-File / Passwd

On passe ici à une authentification non en clair, c'est à dire que le mot de passe ne transitera pas tel quel sur le réseau. Le mécanisme DIGEST-MD5 est plus robuste, mais peu supporté actuellement, alors que l'on retrouve très souvent CRAM-MD5 au niveau des clients.

Le mécanisme d'authentification CRAM-MD5 est activé dans le fichier conf.d/10-auth.conf via la directive auth_mecanisms :

auth_mechanisms = cram-md5

Les bases de données de mots de passe et utilisateur sont configurés dans le fichier conf.d/auth-system.conf.ext :

passdb {
  driver = passwd-file
  args = /usr/local/dovecot/etc/dovecot.passwd
}

userdb {
  driver = passwd
}

Le fichier indiqué via la directive args représente la base de données des mots de passe. On va donc générer un mot de passe dans le format souhaité et l'insérer dans ce fichier sous la forme <utilisateur>:<mot de passe> :

$ doveadm pw -s CRAM-MD5 -V
Enter new password:
Retype new password:
{CRAM-MD5}595e6e69809606773671749d005255f59c3c9fdfa030db6d80efc4305ec73bc4 (verified)

$ vi /usr/local/dovecot/etc/dovecot.passwd

test:{CRAM-MD5}595e6e69809606773671749d005255f59c3c9fdfa030db6d80efc4305ec73bc4

A noter : dans le fichier on précise ici {CRAM-MD5} parce que le format de mots de passe par défaut pour passwd-file est CRYPT. Ce format par défaut peut être modifié en ajoutant l'option scheme=CRAM-MD5 dans la définition de la base de données des mots de passe. De cette manière, on est plus obligé de préciser le format {CRAM-MD5} dans la base de données :

passdb {
  driver = passwd-file
  args = scheme=cram-md5 /usr/local/dovecot/etc/dovecot.passwd
}

Une fois la configuration modifiée, il faut recharger Dovecot, tester une connexion (pensez à bien configurer la méthode d'authentification pour le client !) et vérifier dans les logs que celle-ci est OK :

$ doveadm reload
$ tail /var/log/mail.info

Jun  29 20:17:29 host dovecot: imap-login: Login: user=<test>, method=CRAM-MD5, rip=192.168.0.1, lip=192.168.0.2, mpid=12345

 

Et voilà, la théorie a été mise en pratique ! Il ne vous reste plus qu'à choisir la combinaison qui vous semble la plus adaptée à la situation.

D'autres notes suivront concernant la gestion SSL et LDAP.