ReLoad

Thierry Jaouen ~ WikiBlog
"Rien à foutre d'être lu, tant que je peux me relire."

Outils pour utilisateurs

Outils du site


blog:2013:08:21:dovecot_migration_a_partir_de_courier

Dovecot : Migration a partir de Courier

Soit une configuration "Postfix" pour la livraison des e-mails en local, et "Courier" pour servir les clients qui veulent lire leurs e-mails, en IMAP ou POP3.

On va migrer rapidement sous "Dovecot 2".

La configuration sera affinée ultérieurement.

~~READMORE~~

:!:Dovecot 2” est disponible dans les paquets stables de Debian Wheezy

Etat des lieux

Système

Debian Wheezy AMD64 .

Postfix

Juste pour dire qu'actuellement, c'est “Postfix” qui va livrer directement les mails dans les “HOME” des utilisateurs.

Ainsi, dans la conf /etc/postfix/main.cf , il y a (extraits) :

local_recipient_maps =
home_mailbox = Maildir/
mailbox_transport = 

Sauf quelques cas particuliers (comme un fichier ~/.forward qui donne d'autres directives), pour une livraison locale, Postfix va écrire les mails dans:

${HOME_du_USER}/Maildir/new/

Courier

Actuellement en service:

# netstat -anp --tcp | grep courier
tcp        0      0 0.0.0.0:110             0.0.0.0:*               LISTEN      1856/couriertcpd
tcp        0      0 0.0.0.0:143             0.0.0.0:*               LISTEN      1861/couriertcpd
tcp        0      0 0.0.0.0:993             0.0.0.0:*               LISTEN      1864/couriertcpd
tcp        0      0 0.0.0.0:995             0.0.0.0:*               LISTEN      1853/couriertcpd

Pré-configuration

Le but est de minimiser le temps d'interruption et les interventions auprés des utilisateurs finaux: ces derniers ne devraient pas ressentir de changement ! (ou si peu :-) )

Pré-install

Avant de casser courier, on va simplement installer “dovecot-core” : juste après, on préparera la configuration.

# aptitude install dovecot-core

Dovecot démarre, mais il ne fait encore rien de génant. (il n'ecoute aucun port vers l'extérieur)

Toutefois , nous allons arreter Dovecot maintenant :

# /etc/init.d/dovecot stop

( Parce qu'il semble tenir compte des changements de la conf à l'arrêt aussi…)

Continuons, maintenant, que Dovecot est arrêté.

La configuration de Dovecot est là dedans: /etc/dovecot , et plus particulièrement:

  • /etc/dovecot/dovecot.conf
  • /usr/share/dovecot/protocols.d/*.protocol
  • /etc/dovecot/conf.d/*.conf
  • /etc/dovecot/local.conf

Le fichier local.conf (qui n'existe pas par défaut) est prévu pour recevoir notre configuration.

La conf par défaut est particulièrement vide (hors commentaires!):

!include_try /usr/share/dovecot/protocols.d/*.protocol
dict {
  #quota = mysql:/etc/dovecot/dovecot-dict-sql.conf.ext
  #expire = sqlite:/etc/dovecot/dovecot-dict-sql.conf.ext
}
!include conf.d/*.conf
!include_try local.conf

… et un tout petit peu plus fournit dans conf.d/* .

Lorsqu'on aura des modifications a apporter dans local.conf qui interféreront avec un contenu dans conf.d/* , on renommera le fichier concerné en “*.conf-DISABLED” .

Fichiers SSL

On va importer les certificats SSL utilisés par Courier pour Dovecot.

Dovecot n'utilise pas exactement le même format de fichier.

Dans Courier imapd-ssl et pop3d-ssl j'ai respectivement:

  • TLS_CERTFILE=/etc/courier/ssl-key-imap-tjaouen-fr.pem
  • TLS_CERTFILE=/etc/courier/ssl-key-pop3-tjaouen-fr.pem

Note: Les clefs sont differentes selon le protocole “imap” ou “pop3” .

Pour chaque fichier, on va extraire la clé publique et privée dans 2 fichiers differents.

# cd /etc/dovecot

Le répertoire private/ existe déjà.
IMAP d'abord:

# sed -ne '/BEGIN CERT/,/END CERT/p' /etc/courier/ssl-key-imap-tjaouen-fr.pem > ssl-imap-tjaouen-fr.pem
# sed -ne '/BEGIN RSA PRIV/,/END RSA PRIV/p' /etc/courier/ssl-key-imap-tjaouen-fr.pem > private/ssl-imap-tjaouen-fr.key
# chmod 0600 private/ssl-imap-tjaouen-fr.key

POP3 ensuite:

# sed -ne '/BEGIN CERT/,/END CERT/p' /etc/courier/ssl-key-pop3-tjaouen-fr.pem > ssl-pop3-tjaouen-fr.pem
# sed -ne '/BEGIN RSA PRIV/,/END RSA PRIV/p' /etc/courier/ssl-key-pop3-tjaouen-fr.pem > private/ssl-pop3-tjaouen-fr.key
# chmod 0600 private/ssl-pop3-tjaouen-fr.key

Pré-Configuration

Ipv4 Only

C'est mon choix :-D

Dans local.conf :

# Desactiver ipv6 en ecoutant qu'ipv4
listen = *

Authentification

… avec PAM et plain (c'est la seule chose qui marche avec PAM!)

Par defaut, on voit que les fichiers conf.d/10-auth.conf et conf.d/auth-system.conf.ext (inclu par le premier) sont correct par defaut.

Pour mémoire, ils contiennent:

auth_mechanisms = plain
!include auth-system.conf.ext

… et :

passdb {
  driver = pam
}

userdb {
  driver = passwd
}
:!: Dans un autre Blog-Post , nous verrons que cette configuration devra être changé à cause de “userdb”…

Maildir et NameSpace

Une configuration existe déjà dans conf.d/10-mail.conf :

mail_location = mbox:~/mail:INBOX=/var/mail/%u
namespace inbox {
  inbox = yes
}

… et dans conf.d/15-mailboxes.conf :

namespace inbox {
  mailbox Drafts {
    special_use = \Drafts
  }
  mailbox Junk {
    special_use = \Junk
  }
  mailbox Trash {
    special_use = \Trash
  }
  mailbox Sent {
    special_use = \Sent
  }
  mailbox "Sent Messages" {
    special_use = \Sent
  }
}

On va désactiver ces configurations:

# mv conf.d/10-mail.conf{,-DISABLED}
# mv conf.d/15-mailboxes.conf{,-DISABLED}

Maildir

Dans le fichier local.conf :

mail_location = maildir:~/Maildir

NameSpace

Dans le fichier local.conf :

namespace inbox {
  inbox = yes

  mailbox Drafts {
    auto = no
    special_use = \Drafts
  }

  mailbox Spam {
    auto = no
    special_use = \Junk
  }

  mailbox Junk {
    auto = create
    special_use = \Junk
  }

  mailbox Trash {
    auto = no
    special_use = \Trash
  }

  mailbox Archives {
    auto = no
    special_use = \Archive
  }

  # Thunderbird/Evolution
  mailbox Sent {
    auto = subscribe
    special_use = \Sent
  }

  # Apple Mail
  mailbox "Sent Messages" {
    auto = no
    special_use = \Sent
  }

  # Outlook
  mailbox "Sent Items" {
    auto = no
    special_use = \Sent
  }
}

SSL

Il n'a pas été possible de désactiver SSL globalement, et de l'activer uniquement localement selon les protocoles en activité.
Donc , les clés créés lors de l'installation de Dovecot ( dovecot.pem et private/dovecot.pem ) reste en place et son référencé par la conf via conf.d/10-ssl.conf, mais ne devrait pas être utilisé (sauf si la conf est cassé!)

Donc, quelque part dans local.conf :

ssl = yes

( Si “ssl = no” , alors le SSL ne sera pas utilisé, ni en IMAP ni en POP3 ! )

plain

Dans local.conf :

Parce qu'il y a des vieux comptes mal configurés (PAS RECOMMANDE) :

disable_plaintext_auth=no

IMAP

Dans local.conf :

protocol imap {
  # Imposer notre certificat
  ssl_cert = </etc/dovecot/ssl-imap-tjaouen-fr.pem
  ssl_key = </etc/dovecot/private/ssl-imap-tjaouen-fr.key
}

protocol imaps {
  # Imposer notre certificat
  ssl_cert = </etc/dovecot/ssl-imap-tjaouen-fr.pem
  ssl_key = </etc/dovecot/private/ssl-imap-tjaouen-fr.key
}

service imap-login {
  service_count = 1
  process_min_avail = 2                # CPU core
}

POP3

Dans local.conf :

protocol pop3 {
  # Imposer notre certificat
  ssl_cert = </etc/dovecot/ssl-pop3-tjaouen-fr.pem
  ssl_key = </etc/dovecot/private/ssl-pop3-tjaouen-fr.key
}

protocol pop3s {
  # Imposer notre certificat
  ssl_cert = </etc/dovecot/ssl-pop3-tjaouen-fr.pem
  ssl_key = </etc/dovecot/private/ssl-pop3-tjaouen-fr.key
}

service pop3-login {
  service_count = 1
  process_min_avail = 2                # CPU core
}

Divers

On peut restreindre les comptes (PAM) par uid et gid, par exemple:

# uid des comptes mails uniquement
first_valid_uid = 2000
last_valid_uid = 2999

# gid "users"
first_valid_gid = 100
last_valid_gid = 100

Pour éviter que Dovecot fasse tomber les clients a chaque fois qu'on modifiera la conf:

shutdown_clients = no

Migration

A ce stade on a toujours Courier en fonctionnement, et Dovecot qui est configuré mais pas en service !

On va procédé en 3 étapes:

  1. Arrêt de Courier
  2. Conversion des index Courier en index Dovecot
  3. Installation et demarrage de dovecot-imapd et dovecot-pop3d

Script de conversion

D'abord, découvrons un script de conversion des fichiers “Courier” en “Dovecot”.

Le script: http://www.dovecot.org/tools/courier-dovecot-migrate.pl

Par exemple:

# cd /root
# mkdir tmp
# cd tmp
# wget http://www.dovecot.org/tools/courier-dovecot-migrate.pl
# perl -c courier-dovecot-migrate.pl
courier-dovecot-migrate.pl syntax OK
# chmod a+x courier-dovecot-migrate.pl

Tester *avant* par :

./courier-dovecot-migrate.pl --to-dovecot --recursive /home
...
Total: 2757 mailboxes / 819 users
     0 errors
No actual conversion done, use --convert parameter
WARNING: Badly done migration will cause your IMAP and/or POP3 clients to re-download all mails. Read http://wiki.dovecot.org/Migration carefully.

Desactiver les utilisateurs vers Dovecot

Pour que Dovecot puisse démarrer sans laisser entrer les clients (a part peut être un client de test), on peut:

  • soit mettre en place un firewall
  • soit changer les “uid” et/ou “gid” valident
  • soit mettre ENABLED=0 dans /etc/default/dovecot
  • soit … FIXME ?

Nous, on va juste changer /etc/default/dovecot pour avoir:

ENABLED=0
:!: On avait déjà arrété Dovecot

Arret de l'IMAP et du POP3

Arret courier

Le fait d'installer les paquets Dovecot va arreter Courier, mais pas les sessions en cours des utilisateurs !

# aptitude install dovecot-imapd dovecot-pop3d
...
       Supprimer les paquets suivants :
1)     courier-imap                  
2)     courier-imap-ssl              
3)     courier-pop                   
4)     courier-pop-ssl

YES!!!!

Rappel: On a fait en sorte que Dovecot ne demarre pas et/ou les clients ne peuvent pas ce connecter.

Pour mémoire, lors de l'installation:

Creating config file /etc/dovecot/conf.d/20-imap.conf with new version
Creating config file /etc/dovecot/conf.d/20-pop3.conf with new version

A part des commentaires, les 2 fichiers sont vides.
Par contre, il y a 2 nouveaux protocoles là /usr/share/dovecot/protocols.d/ pour imap et pop3 bien sur.

Virer les utilisateurs

Attendre quelques secondes…

Pour les utilisateurs résistants, faire à la main:

# ps aux | egrep "(courier|imap|pop)"

….

# killall -u <USER_RESISTANT>

… jusqu'a ce qu'il n'y ait plus personne… en dehors de soi-même !

Conversion

Maintenant que les fichiers sont stables dans les HOMEs, on peut appliquer la conversion :

./courier-dovecot-migrate.pl --to-dovecot --recursive --convert /home
...
Total: 2757 mailboxes / 819 users
       0 errors
1553 dovecot-uidlist files written

Et enfin.

On va démarrer Dovecot, mais avec finesse …

Commenter la ligne “ENABLED=0” dans /etc/default/dovecot .

Vérifier la configuration actuelle avant de démarrer:

# /etc/init.d/dovecot status

S'il y a des erreurs , en dehors de simplement “[FAIL] dovecot is not running … failed!”, il faut corriger.

Si tout va bien:

# /etc/init.d/dovecot start
Starting IMAP/POP3 mail server: dovecot.

Dans les logs, on voit juste un timide:

Apr 12 06:04:10 mail dovecot: master: Dovecot v2.1.7 starting up (core dumps disabled)

Les services sont UP:

# netstat -anp --tcp | grep dovecot
tcp        0      0 0.0.0.0:110             0.0.0.0:*               LISTEN      9444/dovecot    
tcp        0      0 0.0.0.0:143             0.0.0.0:*               LISTEN      9444/dovecot    
tcp        0      0 0.0.0.0:993             0.0.0.0:*               LISTEN      9444/dovecot    
tcp        0      0 0.0.0.0:995             0.0.0.0:*               LISTEN      9444/dovecot

Un bilan

L'interruption de service n'aura duré que “quelques” minutes .

Visuellement rien ne change… sauf la présentation des dossiers dans Thunderbird .

Voila. 8-)

A suivre...

La configuration de Dovecot n'est pas terminée.

En l'état, la livraison des e-mails n'étant pas assuré par Dovecot, mais réalisé par Postfix, les outils comme “Sieve” et la gestion des “Quotas” ne peuvent pas être fonctionnel de façon optimale.

Sources

blog/2013/08/21/dovecot_migration_a_partir_de_courier.txt · Dernière modification : 2013/08/24 00:18 de thierry