polux     Julien Thomas - TELECOM Bretagne frenchenglish

Déploiement de Courrier-IMAP : POP & IMAP

Pour l'obtention des services POP et IMAP, plusieurs applications sont disponibles. Notre choix s'est initialement porté sur l'une des applications les plus connues : Cyrus-IMAP. Cependant, nous avons abandoné ce choix pour des différentes raisons. Premièrement, Cyrus est très délicat à configurer et deuxiemement, lors de test d'interfacage avec le service webmail Horde, Cyrus ralentissait considérablement les performances de Horde (temps de connexion de plusieurs minutes, navigation lente).

Nous avons donc opté pour un autre logiciel, Courier-IMAP. Celui-ci propose les services POP, POPS, IMAP et IMAPS et l'installation est la aussi très simple : il suffit d'emerge le packet courier-imap. De plus, Courier-IMAP offre d'autres fonctionnalités telles que l'interfacage avec un annuaire LDAP. La version installée sur la maquette est la version 4.0.6-r2.

Objectifs

Les serveurs POP et IMAP permettent de consulter les répertoires de mails gérés par le serveur SMTP. Ils reposent eux aussi sur les serveurs LDAP, pour les différentes informations relatives aux comptes, et NFS, pour l'accès aux mails.

Configuration des serveurs

La configuration des serveurs IMAP, POP, IMAPS et POPS est identique avec Courrier-IMAP. Il suffit de lancer le bon service pour avoir la bonne fonctionnalité, mais le fichier à configurer est le même : /etc/courier/authlib/authldaprc. Nous avons alors complété ce fichier comme suit. Attention à la différence comparé au document de référence pour l'option LDAP_CLEARPW au lieu de LDAP_CRYPTPW.

LDAP_URI ldap ://ldap.polux.org, ldaps ://ldap.polux.org
LDAP_PROTOCOL_VERSION 3
LDAP_BASEDN ou=mails,ou=accounts,dc=polux,dc=org
LDAP_BINDDN cn=Manager,dc=polux,dc=org
LDAP_BINDPW tutu
LDAP_TIMEOUT 15
LDAP_AUTHBIND 1
LDAP_MAIL uid
LDAP_FILTER (accountStatus=active)
LDAP_GLOB_UID vmail
LDAP_GLOB_GID vmail
LDAP_HOMEDIR mailMessageStore
LDAP_MAILDIR mailMessageStore
LDAP_FULLNAME cn
LDAP_CLEARPW userPassword
LDAP_DEREF never
LDAP_TLS 0

Créer une boite aux lettres

Script de création automatique

Pour créer une boite au lettre, il suffit d'exécuter le script fournit sur le document disponible sur http ://www.vriesman.tk/ (Configuration de postfix et courier-imap avec ldap, Jeroen Vriesman), en étant loggué sur le compte qui va posséder la boite au lettre, ici le compte vmail. Il ne faudra pas oublier de modifier au début de ce script les informations nécessaires pour la connexions au serveur LDAP et de monter les disques réseau si nécessaire avant l'exécution du script. Ainsi le script va créer et initialiser les dossiers nécessaires au stockage de email aux endroits spécifiés par les comptes mails créés dans le serveur LDAP.

Notre script est donc celui décrit cidessous. Il consiste à créer les répertoires des utilisateurs via la commande maildirmake. Comme indiqué sur la documentation officielle, cette commande permet de créer des répertoires de mails de plusieurs catégories : répertoires classiques, répertoires partagés, répertoires avec ACL.

Dans le script, on peut donc distinguer deux cas.

  • les dossiers personnels (accountStatus=active)) qui contiennent les mails de chaque utilisateur. Ils sont crées via la commande maildirmake $ldappersonaldir
  • les dossiers partagés (accountStatus=shared)) maildirmake -s write -f $shared_uid $ldapsharedmaildir maildirmake --add $groupname=$ldapsharedmaildir $subscribed_dir ln -s $ldapsharedmaildir/.$shared_uid $dirlink
#!/bin/sh
systempass="tutu" # the userPassword of dn: system-leave
systemleave="cn=Manager,dc=polux,dc=org" # e.g. ou=System,o=company
accountleave="ou=mails,ou=accounts,dc=polux,dc=org" # e.g. ou=Tokelau,o=company


ldappersonaldirs=`ldapsearch -x -w $systempass -D "$systemleave" -b "$accountleave" "(accountStatus=active)"\
 mailMessageStore | grep "^[^#]" | grep mailMessageStore | awk '{ print $2 }'`
ldapshareddirs=`ldapsearch -x -w $systempass -D "$systemleave" -b "$accountleave" "(accountStatus=shared)"\
 mailMessageStore | grep "^[^#]" | grep mailMessageStore | awk '{ print $2 }'`

# create personal mailfolders

for ldappersonaldir in $ldappersonaldirs
do
	if [ ! -d $ldappersonaldir ]
	then
		mkdir -p `dirname $ldappersonaldir`
		maildirmake $ldappersonaldir
	fi
done

for ldapshareddir in $ldapshareddirs
do
	ldapsharedmaildir=`dirname $ldapshareddir | sed 's/\/shared\//\/shared\.maildirs\//g'`
	shared_dn=`ldapsearch -x -w $systempass -D "$systemleave" -b "$accountleave"\
	 "(mailMessageStore=$ldapshareddir)" uid | grep "^[^#]" | grep "^dn:" | sed 's/^dn: //g'`
	shared_uid=`ldapsearch -x -w $systempass -D "$systemleave" -b "$accountleave"\
	 "(mailMessageStore=$ldapshareddir)" uid | grep "^[^#]" | grep "^uid:" | sed 's/^uid: //g'`
	shared_boxes=`ldapsearch -x -w $systempass -D "$systemleave" -b "$accountleave" "(mailMessageStore=$ldapshareddir)"\
	 postOfficeBox | grep "^[^#]" | grep "^postOfficeBox:" | sed 's/^postOfficeBox: //g'`
	shared_cn=`ldapsearch -x -w $systempass -D "$systemleave" -b "$accountleave"\
	 "(mailMessageStore=$ldapshareddir)" cn | grep "^[^#]" | grep "^cn:" | sed 's/^cn: //g'`
	subscribed_dirs=`ldapsearch -x -w $systempass -D "$systemleave" -b "$accountleave" "(&(accountStatus=active)\
	 (seeAlso=$shared_dn))" mailMessageStore | grep "^[^#]" | grep mailMessageStore | awk '{ print $2 }'`

	# create shared mailfolder

	if [ ! -d $ldapsharedmaildir ]
        then
                maildirmake -S $ldapsharedmaildir
        fi

	# create shared subfolders

	if [ ! -d $ldapsharedmaildir/.$shared_uid ]
	then
		maildirmake -s write -f $shared_uid $ldapsharedmaildir
	fi

	# create other shared subfolders
	for box in $shared_boxes
	do
		if [ ! -d $ldapsharedmaildir/.$box ]
		then
			maildirmake -s write -f $box $ldapsharedmaildir
		fi
	done

	# mailstorage directory

	if [ ! -d $ldapshareddir ]
        then
	        mkdir -p `dirname $ldapshareddir`
        fi

	# link mailstorage to incoming shared folder

	dirlink=`echo $ldapshareddir | sed 's/\/$//g'`

	if [ ! -L $dirlink ]
	then
		ln -s $ldapsharedmaildir/.$shared_uid $dirlink
	fi

	# subscribe those who have a 'seeAlso' to the dn of the shared account

	for subscribed_dir in $subscribed_dirs
	do
		groupname=`echo $shared_cn | sed 's/ /_/g'`
		subscribed=$groupname
		
		if [ -e $subscribed_dir/shared-maildirs ]
		then
			subscribed=`cat $subscribed_dir/shared-maildirs | grep ^$groupname[[:space:]] | awk '{ print $1 }'`
		fi

		if [ ! $subscribed ]
		then
			maildirmake --add $groupname=$ldapsharedmaildir $subscribed_dir
		fi
	done
done

Droits d'accès aux répertoires utilisateurs

Les accès aux fichiers doivent être autorisés pour l'utilisateur vmail, comme indiqué dans le fichier main.cf de postfix. Il possède un uid à 5000 et un gid à 5000. Cet utilisateur peut être créé local (sur MV3). Toutefois, dans un soucis d'homogénisation, il est préférable de le créé sur le ldap, au niveau de la branche ou=all,ou=servers,ou=accounts,ROOT_DN. De ce fait, cet utilisateur est valide pour la machine MV3, mais il est également correctement définit pour la machine MV2 qui doit pouvoir accéder aux mail par l'interm édiaire du serveur IMAP.



«Design-by-assumption works as long as assumptions hold. Assumptions are shortcuts to useful efficiencies, provided they are not violated. »
David S. Isenberg

«If the kernel is not evaluated to an MLS-capable protection profile, MLS features cannot be trusted regardless of how impressive the demonstration looks.»
J. Davidson