+++

title = "Passer ses utilisateurs IMAP du système vers Vmail (sans douleur si possible)"
date = 2018-08-20
aliases = [ "post/2018/08/20/Passer-ses-utilisateurs-IMAP-du-système-vers-Vmail-(sans-douleur-si-possible)"]
draft = true
[taxonomies]
tags = [ "système", "mail" ]
+++

Nan parce que c'est sympa et tout hein… mais tout le monde s'en fout !

<!-- more -->

Originellement, j'avais (bêtement) pensé que créer des utilisateurs système pour recevoir des courriels étaient une bonne idée. Dans les faits, il y a quelques années, c'était probablement vrai : tout le monde était propriétaire de ces mails au sens Unix, le dossier était clairement visible et ça permettait d'appliquer très très facilement des quotas.

Sauf qu'aujourd'hui, manager des utilisateurs système est plus un problème qu'autre chose :

1. les gens ne se connectent pratiquement plus à leur compte personnel… C'en est devenu un peu frustrant, mais à une époque proposer 1 ou 2 Gio de stockage accessible en SFTP avec un répertoire HTML public, c'était la classe, aujourd'hui, tout le monde s'en bat les couilles.
2. ça fait que le système et la messagerie sont très très étroitement liés, ce qui peut être problématique dans certains cas : changer de serveur peut poser un vrai problème, migrer sur un autre système également.

L'idéal serait donc d'avoir une configuration plus claire et surtout bien plus segmenté entre les différents services nécessaires :

* Postfix ne fait qu'acheminer les messages. Il n'a pas besoin de savoir qui sont les utilisateurs légitimes en local, ce n'est pas son problème.
* Dovecot devrait être capable d'authentifier les utilisateurs et de remettre les messages au bon endroit pour qu'il soit accessible. Tout devrait d'ailleurs repasser plus ou moins par lui.

On va donc voir ensemble comment on peut migrer ce bordel.

# Passage de Dovecot et Postfix en LMTP

À l'origine, j'avais une configuration très très simple pour la livraison des messages :

~~~
mailbox_command = /usr/lib/dovecot/deliver
~~~

L'idée est que Postfix fasse appel à la commande `deliver` disponible dans Dovecot. Ça marche très bien tant que tout est installé sur la même machine et avec les mêmes « versions » de logiciels. Si on commence à essayer de séparer les services sur des machines différentes, ça va commencer à sentir du cul.

Pour faire simple, lors d'une livraison locale (si Postfix détecte le domaine de messagerie dans le `mydestination` en gros), Postfix va évaluer les choses dans cet ordre :

* alias (en général dans `/etc/aliases`)
* fichiers `.forward`
* `mailbox_transport_maps`
* `mailbox_transport`
* `mailbox_command_maps`
* `mailbox_command`
* `home_mailbox`
* *(et d'autres après mais dont on se fout)*

À l'origine, j'utilisais `home_mailbox` pour que Postfix livre directement les messages dans le *Maildir* des utilisateurs. Postfix servait alors de MDA et de MTA. Au fur et à mesure que ma compréhension et mon expérience de Dovecot se sont améliorées, j'ai utilisé la commande `deliver` : Dovecot devient alors LDA (*Local Delivery Agent*).

On va garder le même état d'esprit mais en connectant Postfix à Dovecot via une socket au lieu d'une commande. On rend ainsi les deux beaucoup plus imperméables et moins interdépendants.

Pour Postfix, la configuration va être très très simple :

~~~
 #mailbox_command = /usr/lib/dovecot/deliver
 mailbox_transport = lmtp:inet:127.0.0.1:24
~~~

Et là normalement, tu devrais saigner du nez : « Putain ! Mais t'as mis une adresse IP en dur BORDAYLE DE MAYRDE !! *unfollow* ».

Oui, bah je sais plus pourquoi mais *localhost*, il avait du mal… Donc voilà, faites pas chier, vous vous adapterez et vous ferez les malins sur votre serveur Postfix à vous.

Dernière petite chose : il faut préciser à Postfix de ne pas accepter les messages avec des entêtes UTF-8. En effet, il se trouve que Dovecot en mode LMTP ne supporte pas les entêtes UTF-8. Si tu ne désactives pas cela, ça va vite partir en cacahouète du coup…

~~~
smtputf8_enable = no
~~~

Côté Dovecot, ça ne va pas être bien compliqué non plus. On ajoute donc le protocole LMTP aux protocoles servis par Dovecot :

~~~
protocols = imap lmtp
~~~

La liste des utilisateurs locaux transmis par Postfix à Dovecot contient l'adresse complète de la personne (vabien@teniquer.com par exemple). Il est donc nécessaire dans notre cas (authentification Unix pour le moment) de virer la partie courriel (donc la partie après le *@*) :

~~~
auth_username_format = %Ln
~~~

Enfin, il faut démarrer le service LMTP sur un port local :

~~~
 service lmtp {
    inet_listener ltmp {
        address = 127.0.0.1 ::1
        port = 24
    }
 }

protocol lmtp {
    mail_location = maidir:~/Maildir
    mail_plugins = sieve
}
~~~

*Note : il n'y a pas de port standard pour LMTP, tu es donc libre de choisir de ce que tu veux…*

On redémarre Postfix et Dovecot et on devrait normalement pouvoir continuer à recevoir des mails sans aucun souci (bon évidemment, vaut mieux tester hein, sinon, ça risque d'être un beau merdier !).

# Migration de la UserDB et de la PasswordDB
