Mise en oeuvre de Cyrus-IMAPD
Le 1 février 2008, à 10:59 par Ulhume...

Cyrus est un serveur IMAP à peu près aussi puissant que difficile à manipuler. Voici donc ma petit cuisine pour le mettre en oeuvre, le paramétrer, le sécuriser ainsi que quelques astuces pour sortir de quelques galères...

Pourquoi Cyrus ?

Alors donc, pourquoi utiliser Cyrus et pas le simplissime UW IMAP ? En fait les deux outils ne boxent simplement pas dans la même catégorie. UW-IMAP est petit démon d’une mise en œuvre ultra rapide (il suffit de l’installer pour que ça marche), utilisant la structure de stockage des mails natif d’UNIX. Le revers de cette simplicité est déjà son manque de fonctionnalité (gestion des ACL, langage Sieve, dossiers partagés ou multi-niveaux). Ensuite ce démon est très très lent lorsque le volume de courriels stocké devient trop important.

Cyrus quant à lui est un système complet disposant du langage Sieve (traitement automatique des courriels entrant au niveau serveur), l’utilisation d’une base de donnée pour le stockage (db4 en l’instance), le support des ACL, les dossiers multi-niveaux, les dossiers partagés entre utilisateur, etc.

Mais comme je le disais en introduction, Cyrus est aussi puissant que difficile à manipuler, voir même capricieux. Sa base de donnée n’est pas d’une fiabilité inattaquable, loin de là (ce n’est pas pour rien que Subversion a décollé dés qu’il ne l’a plus utilisé)..

En fait tout seul jusqu’à l’arrivée de dovecot qui après 5 ans de développement est arrivé en Avril 2007 à sa version finale 1.0. Dovecot vise la simplicité et la puissance. Et sur le papier c’est un outil très prometteur avec, comme subversion, la possibilité de changer de support de stockage (bases de données, mbox, etc), le support de toutes les fonctions IMAP, et ceci de manière performante. Il y a donc de très fortes chances, vu l’empressement que semble montrer Cyrus à évoluer, que Dovecot devienne LE serveur IMAP. « Devienne », car pour l’instant il est encore un peu tôt pour l’utiliser en production, en tout cas la dernière fois que j’ai pu le tester. Il manquait alors des fonctions importantes pour moi comme le partage des dossiers, le stockage en base de donnée relationnelle et l'implémentation Sieve était encore protozoaire. A suivre de très prés donc, mais en attendant, voyons comment mettre Cyrus en œuvre.

Installation du serveur

Tout d'abord il faut installer les paquets suivants :

urpmi cyrus-imapd cyrus-imapd-utils cyrus-sasl2 libsasl2-plug-plain

L’installation du paquet sasl est une des joyeusetés de Cyrus. Ce démon qu’il faut obligatoirement prend en effet en charge tous les aspects authentification.

Vérification des services

Le serveur cyrus, comme son nom ne l'indique pas, permet de fonctionner selon les protocoles IMAP et IMAPS, mais aussi POP3 et POP3S. Un petite vérification d'usage pour vérifier que les ports associés à ces protocoles existent dans le fichier /etc/services qui doit contenir :

  1. pop3            110/tcp
  2. imap            143/tcp
  3. imaps           993/tcp
  4. pop3s           995/tcp
  5. sieve           2000/tcp

Paramétrage

Deux fichiers sont responsables du paramétrage de cyrus : /etc/imapd.conf et /etc/cyrus.conf. Le premier regroupe les paramètres de fonctionnement :

  1. # L’endroit où sont stockés les indexes (entre autre). A backuper !!!
  2. configdirectory: /var/lib/imap
  3.  
  4. # L’endroit où sont stockés les courriels. A backuper !!!
  5. partition-default: /var/spool/imap
  6.  
  7. # login de l'utilisateur administrateur
  8. admins: cyrus
  9.  
  10. # interdit l'accès anonyme
  11. allowanonymouslogin: no
  12.  
  13. # nous ne voulons pas de script sieve dans les homes utilisateur
  14. sieveusehomedir: no
  15.  
  16. # dossier de stockage des scripts sieve
  17. sievedir: /var/lib/imap/sieve
  18.  
  19. # méthode d'autentification : SASL2
  20. sasl_pwcheck_method: saslauthd
  21.  
  22. # mécanisme d'autentification : PLAIN
  23. sasl_mech_list: PLAIN

Le second fichier de configuration, /etc/cyrus.conf définit les services qui doivent être montés au démarrage (IMAP, POP3, etc...) ainsi que le nombre d’instances à exécuter en parallèle. Vous pouvez ainsi mettre en commentaire les services que vous ne comptez pas utiliser :

  1.     SERVICES {
  2.       imap          cmd="imapd"     listen="imap"   prefork=1
  3. #      imaps         cmd="imapd -s"  listen="imaps"  prefork=2
  4.       pop3          cmd="pop3d"     listen="pop3"   prefork=1
  5.       pop3s         cmd="pop3d -s"  listen="pop3s"  prefork=1
  6.       sieve         cmd="timsieved" listen="sieve"  prefork=1
  7.  
  8.       lmtp          cmd="lmtpd -a" listen="lmtp" prefork=0
  9.     }

Si vous désirez n'écouter que l'adresse local pour un service, il suffit de remplacer, par exemple pour le service IMAP, le listen="imap" par listen="127.0.0.1:imap". Cette astuce est valable pour n'importe quelle adresse disponible. L'omission de l'adresse implique l'écoute de toutes les adresses. Attention à la sécurité !!

Paramétrage de SASL2

On peut maintenant lancer la gestion des mots de passes sasl par

service saslauthd start

Il faut maintenant donner un mot de passe à cyrus :

  1. passwd cyrus
  2. #  rentrer un mot de passe

Et comme nous avons la joie de devoir utiliser sasl, il faut aussi changer le mot de passe qui lui est spécifique

  1. Saslpasswd2 cyrus
  2. #  rentrer un mot de passe

Création des boîtes aux lettres

Pour créer nos premières boites il faut déjà que le serveur soit lancé :

service cyrus-imapd start

Il faut maintenant créer les boites aux lettres. Pour cela, nous allons nous connecter à Cyrus en tant qu'utilisateur Cyrus, créer la boite et changer son mot de passe, l'utilisateur de test sera bien évidement toto :

  • ##cyradm -u cyrus localhost
  • Mot de passe : ****
  •  
  • # A rentrer dans l'interface de cyradmin
  • Cyrus> cm user.toto
  • # sortie de l'interface cyradmin
  • Cyrus> quit
  •  
  • ##useradd toto
  • ##passwd toto
  • # rentrer ici le mot de passe de toto
  • ##Saslpasswd2 toto
  • # et on recommence, cette fois pour sasl
  •  
  •  
  • Voilà c'est fait, toto a maintenant un compte.
  •  
  •  
  • Création d'un dossier partagé

  • Pour illustrer la gestion des droits par cyrus, nous allons créer un dossier accessible à deux utilisateurs. Le client IMAP affichera alors ce dossier en dessous du dossier propre à l’utilisateur. Nous allons donner à un des deux utilisateurs (titi) un droit de lecture seule, et à l'autre (toto) les droits complets.
  •  
  •  
  • Pour commencer, voici déjà, la liste des droits pour cyrus :
  •  
  • l
  • Les dossiers de la boîtes peuvent être vus.
  • r
  • Les messages de la boîtes peuvent être vus.
  • s
  • Les drapeaux Seen et Recent peuvent être modifiés.
  • w
  • Les autres drapeaux peuvent être modifiés.
  • pi
  • Des messages peuvent être ajoutés.
  • c
  • Des sous-dossiers peuvent être créés.
  • d
  • Les messages peuvent être supprimés.
  • a
  • L'utilisateur peut administrer cette boîte (droits).
  • D’après cette liste, toto aura un masque de droit lrswpicda et titi aura quant à lui un simple lr
  • Voyons maintenant comment utiliser l’outil d’administration de cyrus pour créer notre boite partagée et assigner les droits :
  •  
  •  
  • ## cyradm -u cyrus localhost
  • #Taper le mot de passe cyrus
  • Mot de passe : *****
  •  
  • # Obtenir la liste des boites existantes
  • ## lm
  • # Création d'une nouvelle boite
  • Cyrus>cm "notre partage"
  • # liste les droits sur la boite créée
  • Cyrus>lam "notre partage"
  • cyrus lrswipcda
  • anyone lrs
  • # Droits totaux à toto
  • Cyrus>sam "notre partage" toto lrswipcda
  • # Droits restreints à tutu
  • Cyrus>sam "notre partage" titi lrs
  • # On supprime les droits sur anyone
  • Cyrus>dam "notre partage" anyone
  • # Vérification
  • lam "notre partage"
  • cyrus lrswipcda
  • toto lrswipcda
  • titi lrs
  • # Sortir maintenant...
  • Cyrus>quit

Maintenant imaginons que nous voulions renommer (ou déplacer) puis finalement détruire cette boite, il faut nous connecter en tant que toto qui a seul les droits d'administration dessus :

  • ##cyradm -u toto localhost
  • Mot de passe : ****
  •  
  • # renommer la boite (il est aussi possible d'utiliser cette commande pour
  • # Déplacer une boite avec toutes ses sous boites dans une autre boite, très pratique...)
  • Cyrus>renm "notre partage" "nos partages"
  • # Obtenir la liste des boites existantes
  • Cyrus>dm "nos partages"
  • # Sortir maintenant...
  • Cyrus>quit
Si vous voulez avoir des dossiers placés au même niveau qu’INBOX, vous devez rajouter la ligne suivante dans /etc/imapd.conf :
altnamespace:1

Activation de l'IMAP Sécurisé (IMAPS)

IMAP est un protocole « en clair », il est donc important lorsque l’on connecte un serveur Cyrus sur le monde exterieur de ne pas ouvrir le port IMAP mais plutôt sa version cryptée : IMAPS.

La première chose à faire est de générer ses certificats. Vous pouvez pour cela suivre ce tutorial. Ensuite il fait déplacer les 3 fichiers dans un dossier de votre choix, par exemple /var/lib/imapd/ssl.

Tout d'abord, placez le fichier ca.crt dans le dossier /etc/ssl/ca. Ensuite, il faut éditer le fichier /etc/imapd.conf pour modifier les 3 dernières lignes comme suit :

  1. # les certificats à utiliser pour les accès SSL (voi plus loin)
  2. tls_cert_file: /etc/ssl/cyrus-imapd/mamachine.mondomaine.com.crt
  3. tls_key_file: /etc/ssl/cyrus-imapd/mamachine.mondomaine.com.key
  4. tls_ca_cert: /etc/ssl/ca/ca.crt

Ensuite, il faut décommenter la ligne correspondant à imaps dans /etc/cyrus.conf, sauver, et redémarrer cyrus.

Connexion de Postfix à Cyrius

Il y a deux manière (à ma connaissance) de faire communiquer. Soit les deux démons sont sur la même machine (méthode simple), soit les deux machines sont distantes l’une de l’autre, postfix cloîtré dans la DMZ et Cyrus sur la LAN, et il faut alors utiliser le protocole lmtp (Local Mail Transfert Protocol).

Tout sur la même machine : Utilisation d'un socket UNIX

Il suffit de modifier le fichier /etc/postfix/main.conf pour avoir la ligne :

mailbox_transport=lmtp:unix:/var/lib/imap/socket/lmtp

Ensuite dans /etc/postfix/master.conf il faut retrouver la ligne suivante :

lmtp    unix    -       -       n       -       -       lmtp

Enfin dans /etc/cyrus.conf :

  1. #  lmtp         cmd="lmtpd" listen="lmtp" prefork=0
  2.   lmtpunix      cmd="lmtpd" listen="/var/lib/imap/socket/lmtp" prefork=1

Une fois ces petits travaux effectués, relancez postfix, puis cyrus. Les deux serveurs vont alors utiliser le protocole LMTP pour communiquer via un socket unix.

Entre deux machines : Utilisation d'un canal LMTP

Nous allons ici renseigner postfix pour envoyer son courrier sur le serveur imapd de cyrus. Pour cela, il faut éditer le fichier /etc/postfix/main.cf et chercher mailbox_transport pour renseigner comme suit :

mailbox_transport = lmtp:unix:/var/lib/imap/socket/lmtp

Puis dans le fichier /etc/postfix/master.cf changer la ligne :

lmtp    unix    -       -       y       -       -       lmtp

en

lmtp    unix    -       -       n       -       -       lmtp

Enfin il suffit de relancez postfix, puis cyrus.

Maintenant de faire un test d'envoi pour vérifier que tout se passe bien (le fichier /var/log/postfix.log indique les éventuelles erreurs.

Sauvetage d’une base de courriels corrompue

Il m'est arrivé d'obtenir une grosse corruption de la base des boîtes aux lettres. C'est l'horreur à plus d'un titre car la reconstruction /usr/lib/cyrus-imapd/reconstruct -m nous envoi joyeusement ballader. Les logs quant à eux contiennent un erreur typique, en boucle du genre : DBERROR: skiplist recovery /var/lib/imap/mailboxes.db: 0090 should be ADD or DELETE

Bon, la solution car si quelqu'un me lit, il y a des chances qu'il soit sous une bonne dose de stress. Déjà, détente. Les données critiques ne sont pas dans /var/lib/imap mais dans /var/spool/imap. D'un côté les indexes de l'autre les messages. La première chose à faire, c'est d'arrêter tous les serveurs qui alimente cyrus (postfix/lmtp par exemple) pour ne pas perdre de mails entrant (vous avez tous des MX de secours configuré...).

Maintant, si ce n'est déjà fait : backup !! Copier ces dossiers avec rsync quelque part en lieu sur.

Ensuite, vous vous connectez en tant que cyrus su - cyrus et vous créer quelque part (disons en /var/lib/imap/restore_mb.sh) le script suivant :

  1. #!/bin/sh
  2. # Script de reconstruction de mailboxes.db
  3. #  Argument n°1 : dossier des mails (ex. /var/spool/imap)
  4. #  Argument n°2 : l'utilisateur par défaut pour les dossiers partagés
  5.  
  6. # On se positionne sur les boites
  7. cd $1
  8.  
  9. # intération sur les boîtes visible
  10. for mb in * ; do
  11.   cd $mb
  12.  
  13.   # si c'est un dossier utilisateur, on utilise cela pour l'associer (ACL) à sa boite
  14.   if [ -d user ] ; then
  15.     cd user
  16.  
  17.     # la magie de sed... transformation de la liste des
  18.     # dossiers en déclaration de mailboxes compatible cyrus.
  19.     # (nb. J'ai trouvé cela sur le net dans un bout de post qui
  20.     # m'a permis d'écrire ce script...)
  21.     find . -type d | grep ./ |
  22.       sed -e "s/\.\///" |
  23.       sed -e "s/\//\./g" |
  24.       sed -e "s/\([a-z]*\)\(.*\)/user\.\1\2${TAB}default${TAB}\1${TAB}lrswipcda${TAB}cyrus${TAB}lrswipcda${TAB}/"
  25.     cd ..
  26.   fi
  27.  
  28.   # traitement des éventuels dossiers partagés
  29.   find . -type d |
  30.     grep -v "./user" |
  31.     grep ./ |
  32.     sed -e "s/\.\///" |
  33.     sed -e "s/\//\./g" | sed -e "s/\([a-z]*\)\(.*\)/\1\2${TAB}default${TAB}$1${TAB}lrswipcda${TAB}cyrus${TAB}lrswipcda${TAB}/"
  34.   cd ..
  35. done | sort -u

se script se lance comme suit :

/var/lib/imap/restore_mb.sh /val/lib/spool utilisateur_partage > /var/lib/imap/mailboxes.txt

Le premier argument est la base de stockage des mails, le second un utilisateur qui deviendra propriétaire des boites partagées (si vous en avez). Le scripte basiquement fabrique un fichier texte de dump de type mailboxes.db équivalent à ce que la commande ctl_mboxlist -d aurait créé... Nous allons d'ailleurs utiliser cette même commande, avec -u en paramétrer pour reconstruire la base :

  1. service cyrus-imapd stop # si ce n'est déjà fait..
  2. cd /var/lib/imap
  3. mv mailboxes.mb mailboxes.mb.corrupted
  4. /usr/lib/cyrus-imapd/ctl_mboxlist -u -f /var/lib/imap/mailboxes.db <  /var/lib/imap/mailboxes.txt
  5. service cyrus-imapd start

Voilà, il ne reste plus qu'à relancer cyrus et redonner les bons droits aux boites partagés.. ouf Smiling))

Commentaires

Larry Cow , le 1 February, 2008 - 11:53

Juste une question: en attendant que Dovecot murisse, il y avait aussi Courier-IMAP, non? Bon, je l'ai lâché depuis un petit moment maintenant et je suis très content de Dovecot, mais de là à dire que Cyrus était seul dans son bac à sable... Smiling

Ulhume, le 1 February, 2008 - 11:59

@Larry Cow, Oui, tu as parfaitement raison, je vais corriger. Merci.

SInon, est-ce que ce que je dis sur DoveCot est encore valide ? Je sais que les choses bougent vite dans ce domaine.

Dab, le 1 February, 2008 - 16:49

Dans le dernier Linux Mag on nous explique la mise en oeuvre d'une messagerie avec Exim / Dovecot collé avec de l'openldap pour l'authentification, Dspam/Spamassassin/ClamAv pour l'anti spam/virus. Cet article est rédigé par un membre de gcu-squad ça doit donc tenir la route ? Je m'avance peut être n'ayant pas testé

Ulhume, le 1 February, 2008 - 17:31

Oh mais Dovecot tient définitivement la route, c'est juste qu'il me manque encore quelques fonctions clef. Dés que c'est validé, Cyrus part dans l'espace Smiling

Poster un nouveau commentaire

Le contenu de ce champ est gardé secret et ne sera pas montré publiquement.
  • Allowed HTML tags: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • To highlight piece of code, just surround them with <code type="language"> Your code &tl;/code>>. Language can be java,c++,bash,etc... Everything Geshi support.
  • Les lignes et les paragraphes vont à la ligne automatiquement.
  • Textual smileys will be replaced with graphical ones.
  • Les adresses de pages web et de messagerie électronique sont transformées en liens automatiquement.

Plus d'informations sur les options de formatage

Connexion utilisateur
Les derniers bavardages...