Guide pour installer un serveur de mails multidomaine utilisant un annuaire LDAP.


Auteur: Luc Saillard <luc.saillard at free.fr>

Date: 16 mai 2001, Version: 0.1.2

Licence: GNU Free Documentation License

Copyright (c) 2000-2001 Luc Saillard
Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.1 or any later version published by the Free Software Foundation; with no Invariant Sections, with no Front-Cover Texts, and with no Back-Cover Texts. A copy of the license is included in the section entitled "GNU Free Documentation License".


Introduction

Ce mini guide décrit l'installation d'un serveur de mails pour un grand nombre d'utilisateurs et ne voulant pas utiliser de comptes Unix pour gérer les boîtes aux lettres. Cette solution permet aussi de rendre le système scalable, et facilement redondant.
L'utilisation d'un annuaire LDAP n'est pas obligatoire, puisque l'on peut faire la même chose avec des bases de données. LDAP étant plus ouvert que le support des bases de données avec le monde Windows. LDAP servira pour l'authentification des utilisateurs et la conservation des profils de chaque utilisateur. L'utilisation d'un annuaire est tout indiqué puisqu'il permet une plus grande souplesse d'administration tout en conservant une vitesse de recherche plus importante qu'une base de données.
L'avantage d'utiliser LDAP permet de décentraliser les services plus facilement, si on désire faire fonctionner le système sur plusieurs machines. Plusieurs machines pour les serveurs de mails et Imap, un serveur faisant fonctionner LDAP, et un autre pour partager les fichiers.
Un annuaire peut être administré depuis une autre machine. Il existe de nombreux outils pour administrer une base, la plupart des langages (C, Perl, Php, Python) possède une API pour dialoguer avec un serveur LDAP donc rien n'empêche d'écrire son propre outil adapté à la situation. La base des utilisateurs pourra servir comme carnet d'adresses pour les clients mails. Le protocole permet de gérer la réplication des données de façon efficace, ce qui permet de faire simplement de la haute disponibilité.

Logiciels nécessaires

Optionnels:

Pré-requis

LDAP

LDAP va servir d'annuaire pour sauvegarder les profils des utilisateurs. Ce guide n'expliquera pas le fonctionnement d'un annuaire, ou de la norme pour importer des données. Les outils tels que ldapsearch, ldapdelete, ... sont ceux de la version Openldap. Les utilisateurs de Netscape Ldap auront une syntaxe presque identique.

Le serveur de mail

Je considererai par la suite que le serveur de mails est déjà fonctionnel (il peut envoyer et recevoir des emails). Seuls Exim et Postfix seront détaillés. Sendmail et Qmail ne le sont pas car je ne connais pas la syntaxe a employer. Pour les autres serveurs de mails, je vous renvoie à la documentation du programme.

Le serveur Pop, Imap

La solution présentée dans ce document se base sur Courier-Imap et Courier-Pop. Bien sûr, on pourra utiliser d'autres serveurs Pop ou Imap qui supportent le protocole LDAP, ou à travers PAM-Ldap. Je déconseille la 2ème méthode ralentissant le serveur.
On trouvera à cette adresse http://luc.saillard.free.fr/patches/qpopper/, un patch pour Qpopper version 3.0.x supportant en mode natif le protocole LDAP. Malheureusement, il n'y a pas de documentation pour l'utiliser.
Le principal avantage de la suite Courier, est le support des modules d'authentification en mode daemon et sous forme de plugins. Son interface permet de développer rapidement de nouveaux drivers pour gérer de nouveaux modules d'authentification.
Courier-Imap peut-être téléchargé à cette adresse: http://www.inter7.com/courier-imap/.
Il existe un patch pour le support Ldap pour le vénérable serveur Pop, Imap de l' Université de Washington (les auteurs de Pine), mais je n'arrive plus à remettre la main dessus. Le plus gros défaut d'UW-Imap, est la mémoire utilisée pour chaque connection. Il est obligé de fonctionner avec inetd, le rendant inadéquate pour les gros serveurs de mails. De plus, il est très difficile d'inclure de nouveaux drivers, la licence et le design du programme rendent l'ajout très difficile.

Installation et configuration des logiciels

Openldap

Pour les utilisateurs de Netscape LDAP, je vous renvoie à la documentation fournie avec le logiciel, de toute façon, on ne peut pas compiler Netscape LDAP.

Compilation

Après quelques tests effectués avec Openldap v2.0, il semblerait que la librairie dbm a utilisé soit la berkeley 2.x, développée par la société SleepyCat (http://www.sleepycat.com). La version 3.x apporte une meilleure gestion mais semblerait plus lente en définitive pour des tailles d'annuaires inférieures à 100.000 entrées. La version GNU libgdbm est plus lente que la version 2.x. J'ai fait les tests de compilation de la librairie à partir d'un ordinateur Pentium II Intel sous Linux. Pour ceux que ça intéresse, j'ai mis en annexe les temps et les procédures de tests.
Voici les directives que j'utilise pour compiler Openldap sur une machine Linux Intel. Note je n'utilise pas slurpd.

Création des fichiers Ldif

Plusieurs fichiers LDIF devront être créés pour permettre plus tard, une plus grande souplesse en cas d'upgrade ou de migration vers d'autres serveurs. Il y aura un fichier pour créer l'arborescence de l'annuaire, et un fichier pour quelques utilisateurs de test, ainsi que l'administrateur.

Définition du profil des utilisateurs

Nous avons 2 solutions pour créer un profil d'utilisateur. Prendre un modèle existant déjà dans les Rfcs tel que le profil InetOrgPerson, ou construire son propre profil. Chacun a ses avantages et ses inconvénients. Personnellement, j'utilise plus souvent le 2ème cas (création du profil personnalisé), car l'on peut adapter plus facilement certains problèmes (quota, autorisation de recevoir des emails, ...)
Voici un profil d'utilisateur pour une entreprise nommée Toto. J'ai spécifié uniquement les attributs qui me sont nécessaires:
Fichier toto_com.oc.conf
objectclass personToto
        requires
                objectclass,
                cn,
                uid,
                mail,
                maildrop,
                userPassword
        allows
                allowedServices
Fichier toto_com.at.conf
attribute   allowedServices ces
attribute   maildrop        ces 
Seul l'attribut allowedServices n'est pas obligatoire. Il servira pour montrer comment on peut restreindre l'accès au serveur FTP, au serveur de mails, ou à d'autres services.
cn: (abréviation de Common Name) donne le nom complet de la personne. Ce nom sera utilisé par les applications pour afficher le nom complet de la personne.
uid: La valeur permettra d'identifier une personne de façon unique dans l'annuaire. La plupart du temps, uid correspondra à la partie gauche d'une adresse email. ($local_part sous Exim)
mail: Cet attribut contiendra les différentes adresses qu'il pourra recevoir. Je le repréciserai plus tard, mais les valeurs d'un attribut Ldap peuvent être multiples, c'est une des possibilités pour l'utilisateur de recevoir du courrier provenant de plusieurs adresses emails. Généralement, on spécifie l'adresse email en entier de la personne.
maildrop: Cet attribut contiendra les différentes adresses de livraison du mail pour cette personne. En fonction du serveur de mails, les adresses de livraison peuvent-être une adresse email, un répertoire, un fichier, un programme externe. Ainsi, on retrouve la notion d'alias et de .forward.
userPassword: Cet attribut contient le mot de passe de l'utilisateur. Il peut-être crypté par le serveur LDAP auquel cas, il faudra configurer les serveurs Pop et Imap spécifiquement. Ainsi il est impossible d'utiliser le mode CRAM-MD5 (option permettant d'éviter la transmission du mot de passe en clair sur le réseau Internet.
allowedServices: Certains administrateurs veulent pouvoir limiter les accès Mails, les accès FTP pour certaines personnes. On va utiliser cet attribut pour autoriser uniquement les utilisateurs qui peuvent recevoir du mail, et disposent d'un accès FTP. On pourra facilement créer d'autres attributs pour d'autres situations. L'exemple devrait suffire pour comprendre la méthode.

Définition de l'arbre LDAP

Dans le cas d'un serveur de mails multidomaines, il est bon de créer un branche par sous-domaine. Il sera plus facile après de le gérer. La création de multiples branches ne pénalise pas les recherches, puisque les recherches ne se font pas sur les branches mais sur les attributs.
Voici un exemple d'arbre LDAP pour un serveur multi-domaines. Pour un serveur ne gérant qu'un seul domaine, on appliquera la même méthode sauf que l'on se retrouvera qu'avec une seul branche organisation.
+ dc=toto, dc=com
|-+ o=groupFR, dc=toto, dc=com
| |-+ ou=Peoples, o=groupFR, dc=toto, dc=com
| | |-- uid=user1, ou=Peoples, o=groupFR, dc=toto, dc=com
| | |-- uid=user2, ou=Peoples, o=groupFR, dc=toto, dc=com
| | |-- uid=user3, ou=Peoples, o=groupFR, dc=toto, dc=com
| | |...
| |-+ ou=Administrators,dc=toto,dc=com
| | |-- uid=admin1, ou=Administrators, o=groupFR, dc=toto, dc=com
| | |-- uid=admin2, ou=Administrators, o=groupFR, dc=toto, dc=com
| | |...
| |...
| ...
|-+ o=groupUK,dc=toto,dc=com
| |-+ ou=Peoples, o=groupUK, dc=toto, dc=com
| | |-- uid=user1, ou=Peoples, o=groupUK, dc=toto, dc=com
| | |-- uid=user2, ou=Peoples, o=groupUK, dc=toto, dc=com
| | |-- uid=user3, ou=Peoples, o=groupUK, dc=toto, dc=com
| | |...
| |-+ ou=Administrators,dc=toto,dc=com
| | |-- uid=admin1, ou=Administrators, o=groupUK, dc=toto, dc=com
| | |-- uid=admin2, ou=Administrators, o=groupUK, dc=toto, dc=com
| | |...
| |...
| ...
|-+ o=Administrators,dc=toto,dc=com
| |-- cn=admin,o=Administrators,dc=toto,dc=com
| |-- cn=mail,o=Administrators,dc=toto,dc=com
| |-- cn=imap,o=Administrators,dc=toto,dc=com
| |...
|...
Explication:
Dans cet exemple, j'ai pris le cas d'une entreprise multinationale, qui voudrait centraliser à un seul endroit les informations des ses collaborateurs.
L'entreprise s'appelle toto, et dispose du nom de domaine toto.com. Les adresses emails sont hiéarchisées par pays (toto@uk.toto.com, toto@fr.toto.com, ...), donc on voudrait aussi que l'annuaire possède cette même hiérarchie. J'ai donc créé des organisations pour chaque pays (o=groupFR et o=groupUK).
Dans chaque organisation, on peut classer (même si je n'aime pas ce mot) les personnes suivant leur fonction ou leur place dans la société. Ici, j'ai décidé que l'on classerait les informaticiens (ou=Administrators) et les non-informaticiens (ou=Peoples). J'ai donc créé 2 sous-organisations.
Juste en dessous viennent les profils des utilisateurs. Mais nous pouvons très bien avoir d'autres sous-organisations. Pour regrouper tous les services qui ont besoin d'accéder, j'ai créé un organisation Administrators à la racine du site. Il y aura un utilisateur root, qui aura le droit de tout modifier, un utilisateur mail, un utilisateur imap.

Création des fichiers

Maintenant, que les profils et la structure sont définis, voici les fichiers LDIF correspondant à l'exemple enoncé. Fichier toto_com-tree.ldif
dn: dc=toto, dc=com
objectclass: dcobject
dc: toto

dn: o=Administrators, dc=toto, dc=com
objectclass: organization
o: Administrators

dn: o=groupFR, dc=toto, dc=com
objectclass: organization
o: groupFR

dn: o=groupUK, dc=toto, dc=com
objectclass: organization
o: groupUK

dn: ou=Peoples, o=groupFR, dc=toto, dc=com
objectclass: organizationalUnit
ou: Peoples

dn: ou=Administrators, o=groupFR, dc=toto, dc=com
objectclass: organizationalUnit
ou: Administrators

dn: ou=Peoples, o=groupUK, dc=toto, dc=com
objectclass: organizationalUnit
ou: Peoples

dn: ou=Administrators, o=groupUK, dc=toto, dc=com
objectclass: organizationalUnit
ou: Administrators
Fichier toto_com-admins.ldif
dn: cn=admin, o=Administrators, dc=toto, dc=com
objectclass: person
cn: admin
sn: admin
userPassword: 3bLtqp4wTXp35dRR

dn: cn=mail, o=Administrators, dc=toto, dc=com
objectclass: person
cn: mail
sn: mail
userPassword: 3bLtqp4wTXp35dRR

dn: cn=imap, o=Administrators, dc=toto, dc=com
objectclass: person
cn: mail
sn: mail
userPassword: 3bLtqp4wTXp35dRR
Fichier toto_com-users.ldif
dn: uid=Fayre.Nickerson, ou=Peoples, o=groupFR, dc=toto, dc=com
objectclass: personToto
uid: Fayre.Nickerson
cn: Fayre Nickerson
maildrop: /import/mail/Fayre.Nickerson/
userPassword: toto
mail: fnickerson@fr.toto.com
mail: Nayre.Nickerson@fr.toto.com

dn: uid=Felice.Risher, ou=Peoples, o=groupUK, dc=toto, dc=com
objectclass: personToto
uid: Felice.Risher
cn: Felice Risher
allowedServices: FTP
allowedServices: SMTP
maildrop: /import/mail/Felice.Risher/
userPassword: fff
mail: FRisher@uk.toto.com
mail: felice.risher@uk.toto.com

dn: uid=Kollen.Beshai, ou=Administrators, o=groupFR, dc=toto, dc=com
objectclass: personToto
uid: Kollen.Beshai
cn: Kollen Beshai
allowedServices: SMTP
maildrop: /import/mail/Kollen.Beshai/
userPassword: mmm
mail: KBeshai@fr.toto.com
mail: Kollen.Beshai@fr.toto.com

Configuration du serveur

Création du fichier slapd.conf

Il n'y a pas grand chose à dire au sujet du fichier de configuration, sauf pour la partie droits d'accès qui sera détaillée ci-dessous. Il faut toujours activer l'option schemacheck.
schemacheck     on
Pour optimiser les performances, on peut rajouter ceci dans la section de notre backend.
lastmod off

cachesize   10000
dbcachesize 5000000
Ensuite, il faut lui indiquer, quels sont les attributs à indexer. Dans la version 2.0 d'Openldap, il faut lui préciser objectclass. Les attributs où l'on ne fait jamais de recherche doivent être indexés.
index cn
index mail,uid eq,sub
index default none
Pour encore plus optimiser, on peut rajouter ces 2 options dans la version 2.0 d'Openldap.
dbnosync
dbnolocking
Sécurité, définition des droits d'accès aux attributs.
Il faut définir, quels sont les personnes qui ont le droit de lire ou modifier les attributs. Prenons le cas du serveur de mail, il faut qu'il puisse lire le contenu de la variable maildrop, et mail. En revanche, le serveur IMAP doit avoir le droit de lire le contenu de la variable userPassword, cn, maildrop. En aucun cas, les 2 programmes ne devront avoir le droit de modifier les valeurs.
Voici donc les Access Control List que j'utilise dans notre exemple ci-dessus.
access to attribute=userPassword
        by dn="cn=admin, o=Administrators, dc=toto, dc=com" write
        by dn="cn=imap, o=Administrators, dc=toto, dc=com" read
        by self write
        by * none

access to attribute=maildrop
        by dn="cn=admin, o=Administrators, dc=toto, dc=com" write
        by dn="cn=mail, o=Administrators, dc=toto, dc=com" read
        by dn="cn=imap, o=Administrators, dc=toto, dc=com" read
	by * none

access to attribute=*
        by dn="cn=admin, o=Administrators, dc=toto, dc=com" write
	by * read
Le fichier de configuration d'Openldap:
#
# See slapd.conf(5) for details on configuration options.
# This file should NOT be world readable.
#
include		/home/luc/srcs/openldap/build/openldap1/etc/slapd.at.conf
include		/home/luc/srcs/openldap/build/openldap1/etc/slapd.oc.conf
include		/home/luc/srcs/openldap/build/openldap1/etc/toto_com.at.conf
include		/home/luc/srcs/openldap/build/openldap1/etc/toto_com.oc.conf

schemacheck	on

pidfile		/home/luc/srcs/openldap/build/openldap1/var/slapd.pid
argsfile	/home/luc/srcs/openldap/build/openldap1/var/slapd.args

#######################################################################
# ldbm database definitions
#######################################################################

database	ldbm
suffix		"dc=toto, dc=com"
directory	/home/luc/srcs/openldap/build/openldap1/var/openldap-ldbm
defaultaccess   none

#rootdn		"cn=root, dc=toto, dc=com"
#rootpw		secret

# Pas d'attribut indiquant la dernière modification.
lastmod off

# Les indexs
index cn
index mail,uid eq,sub
index default none

# La mémoire utilisée
cachesize   10000
dbcachesize 5000000

# Attention a ne pas mettre d'espace lors de l'utilisation des dn
access to attribute=userPassword
        by dn="cn=admin,o=Administrators,dc=toto,dc=com" write
        by dn="cn=imap,o=Administrators,dc=toto,dc=com" read
        by self write
        by * none

access to attribute=maildrop
        by dn="cn=admin,o=Administrators, dc=toto,dc=com" write
        by dn="cn=mail,o=Administrators, dc=toto,dc=com" read
        by dn="cn=imap,o=Administrators, dc=toto,dc=com" read
	by * none

access to attribute=*
        by dn="cn=admin,o=Administrators,dc=toto,dc=com" write
	by * read

Importation des données LDIF

Pour créer notre base, nous avons 2 solutions. La première est très rapide et permet d'importer très rapidement plusieurs milliers d'enregistrements. La 2ème nécessite que le serveur LDAP soit actif, mais peut se faire à distance.

Test du bon fonctionnement du serveur

Lancement du serveur

slapd -f /home/luc/srcs/openldap/build/openldap1/etc/slapd.toto_com.conf \
      -p 389

test de recherche

La commande suivante doit afficher tous les objets contenus dans la base sous la même forme que les fichiers .ldif.
ldapsearch -L -h localhost -p 389 -b "dc=toto,dc=com" "(objectclass=*)"

test d'ajout

ldapadd -h localhost -p 389 \
	-D cn=admin,o=Administrators,dc=toto,dc=com -w 3bLtqp4wTXp35dRR
dn: uid=test, ou=Peoples, o=groupFR, dc=toto, dc=com
objectclass: personToto
uid: test
cn: utilisateur test
maildrop: /var/spool/mail/test
userPassword: bingo
mail: test@fr.toto.com

test de suppression

ldapdelete \
 -h localhost -p 389 \
 -D cn=admin,o=Administrators,dc=toto,dc=com -w 3bLtqp4wTXp35dRR \
 uid=test,ou=Peoples,o=groupFR,dc=toto,dc=com

Utilisation du programme GQ.

On peut utiliser un programme graphique tel que GQ.

Optionnel: Migration d'une liste d'utilisateurs existante

Exim

Compilation

Copier le fichier src/EDITME à la place de Local/Makefile. Configurer les options qui correspondent à votre système et activer les options suivantes pour avoir le support LDAP.
LOOKUP_LDAP=yes
LOOKUP_LIBS=-lldap -llber
LDAP_LIB_TYPE=UMICHIGAN
Si vous utilisez la version 2 d'Openldap, ou la version Netscape, remplacer LDAP_LIB_TYPE=UMICHIGAN par LDAP_LIB_TYPE=NETSCAPE.
La distribution Debian/GNU Linux utilise comme serveur de mail par défaut, le programme Exim. Il est compilé avec toutes les options nécessaires pour un serveur et dispose donc du support LDAP.
Voici le fichier Local/Makefile. Ce n'est qu'un exemple. Je vous recommande de lire le fichier de configuration en détail pour personnaliser au mieux le serveur de mails.
COMPRESS_COMMAND=gzip
COMPRESS_SUFFIX=gz
ZCAT_COMMAND=zcat
CONFIGURE_FILE=/etc/exim.conf
DIRECTOR_ALIASFILE=yes
DIRECTOR_FORWARDFILE=yes
DIRECTOR_LOCALUSER=yes
DIRECTOR_SMARTUSER=yes
EXICYCLOG_MAX=10
EXIM_UID=1000
EXIM_GID=1000
EXIM_MONITOR=eximon.bin
LOOKUP_DBM=yes
LOOKUP_LSEARCH=yes
LOOKUP_LDAP=yes
LOOKUP_INCLUDE=-I/home/luc/srcs/openldap/build/openldap1/include 
LOOKUP_LIBS=-L/home/luc/srcs/openldap/build/openldap1/lib -lldap -llber
LDAP_LIB_TYPE=UMICHIGAN
ROUTER_DOMAINLIST=yes
ROUTER_IPLITERAL=yes
ROUTER_LOOKUPHOST=yes
SPOOL_DIRECTORY=/var/spool/exim
SUPPORT_MAILDIR=yes
TRANSPORT_APPENDFILE=yes
TRANSPORT_PIPE=yes
TRANSPORT_SMTP=yes
Il ne reste plus qu'à le compiler avec la commande make.

Configuration

Pour délivrer les mails en utilisant le support LDAP, j'ai besoin d'un transport et d'un director. Je vais donc créer un Director que je placerai après la gestion des alias systèmes.
Voici donc le Director qu'il faut utiliser dans notre exemple.
ldap_user:
  driver = aliasfile
  search_type = ldapm
  query = user="cn=mail,o=Administrators,dc=toto,dc=com" \
          pass="secret" \
          "ldap://localhost:389/dc=toto,dc=com?maildrop?sub? \
	  (&(mail=${local_part}@${domain})(allowedServices=SMTP))"
  expand errors_to = admin
  user = vmail
  group = vmail
  directory_transport = address_directory_ldap
  forbid_pipe = true

Postfix

Compilation

% make makefiles \
CCARGS="-pipe 
  -I/usr/local/BerkeleyDB/include/ \ 
  -L/usr/local/BerkeleyDB/lib -DHAS_LDAP \ 
  -I/usr/local/openldap/include" \ 
AUXLIBS="-L/usr/local/openldap/lib/ -lldap -llber" \
OPT="-O2" DEBUG=""  
% make clean 
% make 

Configuration

Sendmail

Compilation

Ajouter le support LDAP à sendmail. Voici le fichier site.local.m4 qui permet de compiler Sendmail avec le support LDAP.
define(`confMAPDEF', `-DMAP_REGEX -DNEWDB')
define(`confINCDIRS', `-I/home/luc/srcs/openldap/build/openldap1/include 
                       -I/home/luc/srcs/openldap/build/db2/BerkeleyDB/include')
define(`confLIBDIRS', `-L/home/luc/srcs/openldap/build/openldap1/lib
                       -L/home/luc/srcs/openldap/build/db2/BerkeleyDB/lib')
APPENDDEF(`conf_sendmail_ENVDEF', `-DLDAPMAP')
APPENDDEF(`conf_sendmail_LIBS', `-ldb -lldap -llber')
dnl define(`confENVDEF', `-DUSE_VENDOR_CF_PATH=/home/luc/srcs/sendmail/build/etc/mail/sendmail.cf')
define(`confLIBS', `')

define(`confCC',        `gcc')
define(`confOPTIMIZE',  `-O2 -Wall -pipe')

dnl define(`confEBINDIR',   `/home/luc/srcs/sendmail/build/usr/lib/sm.bin')
dnl define(`confHDIR',      `/home/luc/srcs/sendmail/build/usr/lib')
dnl define(`confHFDIR',     `/home/luc/srcs/sendmail/build/etc/mail')
dnl define(`confHFFILE',    `helpfile')
dnl define(`confMANROOT',   `/home/luc/srcs/sendmail/build/usr/man/man')
dnl define(`confMANOWN',    `luc')
dnl define(`confMANGRP',    `luc')
dnl define(`confMBINDIR',   `/home/luc/srcs/sendmail/build/usr/sbin')
dnl define(`confSBINDIR',   `/home/luc/srcs/sendmail/build/usr/sbin')
dnl define(`confSBINOWN',   `luc')
dnl define(`confSBINGRP',   `luc')
dnl define(`confSBINMODE',  `0755')
dnl define(`confSTDIR',     `/home/luc/srcs/sendmail/build/var/lib/sendmail')
dnl define(`confSTFILE',    `statistics')
dnl define(`confUBINDIR',   `/home/luc/srcs/sendmail/build/usr/bin')
dnl define(`confUBINOWN',   `luc')
dnl define(`confUBINGRP',   `luc')
dnl define(`confUBINMODE',  `0755')
dnl 
dnl define(`confNO_MAN_BUILD', `true')
dnl define(`confNO_MAN_INSTALL', `true')
dnl define(`confNO_STATISTICS_INSTALL', `true')
Lancer la compilation de sendmail avec la commande suivante:
sh Build -f site.local.m4

Configuration

Voici le contenu de mon fichier local.mc. Dixit, les docs que j'ai trouvé sur Internet. La meilleure documentation, ce sont les sources. Le code n'est pas beaucoup documenté, donc pour trouver les options, allez voir le fichier sendmail/map.c et chercher la fonction ldapmap_parseargs. Sinon il y a une documentation qui explique un peu plus en détail mes propos. (www.stanford.edu/~bbense/Inst.html) Les options principales: Le fichier de configuration fourni ne concerne qu'un seul domaine pour plusieurs raisons. Avec Sendmail, je ne sais pas comment gérer les sites multidomaines pour permettre de faire plusieurs règles (une par domaine). Sendmail ne permet pas d'avoir d'autres informations que la clef unique qui identifie le mail. Je pense quand faisant 2 requètes LDAP, on devrait y arriver. Voici donc le fichier local.mc permettant de générer le fichier sendmail.cf.
VERSIONID(`$Id: comment_installer_un_serveur_multidomaine_avec_ldap.html,v 1.1 2003/06/04 12:41:10 kiwi Exp $')
OSTYPE(linux)dnl
DOMAIN(generic)dnl
MAILER(local)dnl
MAILER(smtp)dnl
define(`confLDAP_DEFAULT_SPEC', `-h localhost -p 389 -b dc=toto,dc=com')
APPENDDEF(`confLDAP_DEFAULT_SPEC', `-dcn=mail,o=Administrators,dc=toto,dc=com -P/etc/mail/secret')
define(`ldap_query', `ldap -1 -v maildrop -k"(&(objectClass=personToto)(uid=%0))"')
FEATURE(`ldap_routing',`',ldap_query)

Courier-Imap & Courier-Pop

Compilation

Voici la ligne de commande que j'utilise pour compiler courier-imap (et donc courier-pop):
CPPFLAGS="-I/usr/local/openldap/include/" \
LDFLAGS="-L/usr/local/openldap/lib" \
LIBS="-lresolv" \
./configure --prefix=/usr/local/courier
Sur une machine solaris 8
% LIBS="-lsocket" LDFLAGS="-L/usr/local/BerkeleyDB/lib \ 
-L/usr/local/openldap/lib" CXXFLAGS="-pipe -O2 \ 
-I/usr/local/BerkeleyDB/include \ 
-I/usr/local/openldap/include" CFLAGS="-pipe -O2 \ 
-I/usr/local/BerkeleyDB/include \  
-I/usr/local/openldap/include" ./configure \ 
--prefix=/usr/local/courier-imap --with-waitfunc=wait3  
% make 
% make install 
La librairie resolv n'est pas nécessaire pour Openldap 1.x.

Configuration

Courier-Imap utilise plusieurs fichiers de configuration correspondants à chacun de ses modules.

imapd.conf ou imapd: Sert pour la configuration du serveur IMAP. La configuration par défaut est correcte mais pensez à changer la variable IMAPDSTART par YES.
authdaemonrc: Ce fichier permet de configurer le daemon d'authentification. Il contient plusieurs paramètres permettant de configurer le nombre de daemon lancé (daemons), l'ordre des modules pour authentifier une personne (authmodulelist). Voici une courte explication des différents modules: Dans notre cas, cette variable ne contiendra que "authcram authldap".

authldaprc: Ce fichier configure le module d'authentification pour LDAP.
LDAP_SERVER             localhost
LDAP_PORT               389
LDAP_BASEDN             dc=toto.com
LDAP_BINDDN             cn=mail,o=Administrators,dc=toto.com
LDAP_BINDPW             34GREGEop#'
LDAP_TIMEOUT            5
LDAP_MAIL               mail
LDAP_DOMAIN             toto.com
LDAP_GLOB_UID           vmail
LDAP_GLOB_GID           vmail
LDAP_HOMEDIR            maildrop
LDAP_MAILDIR            maildrop
LDAP_FULLNAME           cn
LDAP_CLEARPW            userPassword
LDAP_DOMAIN ne servira uniquement si l'utilisateur ne rentrera pas de nom de domaine lors de son login. Ainsi la gestion est transparente comme pour les serveurs de mail, lorsqu'il rajoute le nom de domaine. L'utilisateur LDAP_BINDDN devra pouvoir lire les entrées des champs password et faire des recherches sur l'adresse email.
TODO

Programmes additionnels

Installation du webmail: IMP

Pour installer IMP, il faut la librairie Horde, que l'on trouvera au même endroit que IMP. Décompressez les sources de horde, puis dans le répertoire horde, décompressez les sources de IMP. Lisez la documentation se trouvant dans horde/doc/INSTALL et horde/imp/doc/INSTALL. Doit-on parler de la base de données gérant les sessions. Une fois les 2 programmes installés et configurés, on va passer à la configuration du Webmail. Editez le fichier de configuration de IMP config/servers.php3. Ce fichier permet d'afficher la liste des serveurs IMAP auquel l'utilisateur pourra se connecter. Pour le moment, on en a configuré un seul.
<?php
$IMAPServers = array();
$IMAPServers['localhost'] = new IMAPServer('Webmail',
                                        'localhost',
                                        143,
                                        '',
                                        'toto.com');
?>
Editer le fichier imp/config/ldap.php3, qui contiendra la liste des serveurs LDAP auquel IMP pourra se connecter pour faire des recherches.
<?php
$LDAPServers = array();
$LDAPServers['localhost'] = new LDAPServer('Annuaire',
                                          'Annuaire de Toto.com',
                                          'localhost',
                                          'dc=toto,dc=com',
                                          'sn',
                                          'cn,mail,sn,givenname',
                                          'contains,begins,ends');

?>
Dans le fichier imp/config/defaults.php3, activez cette variable à TRUE, pour que IMP utilise la liste des serveurs IMAP configurés dans le fichier imp/config/servers.php3
$default->use_server_list = TRUE;
On utilise Courier-Imap, alors il faut modifier la valeur de la variable personal_folders.
$default->personal_folders = 'INBOX.'

FAQ

  1. Comment une personne peut avoir plusieurs adresses emails ?
    Il suffit de mettre plusieurs valeurs dans l'attribut mails, les clients LDAP devraient tous savoir gérer les valeurs multi-évaluées.
  2. Comment envoyer un mail à un groupe de personnes ?
    Il suffit de créer un profil, contenant plusieurs adresses emails dans l'attribut maildrop. Une seconde méthode serait de rajouter pour chaque personne, dans son attribut mail, le nom du groupe à rajouter.
  3. Comment définir que tous les domaines soient équivalents ?
    Il suffit de définir LDAP_DOMAIN à la valeur *

Annexe

Remerciements

Je tiens remercier la société Alcôve pour son effort en faveur de l'Open Source, et qui m'a permis de me former sur les outils utilisés ci-dessus.
Et les auteurs des programmes cités sans lesquels ce guide n'existerait pas.
Et aussi frédéric massot pour ses commentaires :-).

Références

Un Tutorial LDAP en français: http://www-sop.inria.fr/semir/personnel/Laurent.Mirtain/LDAP.html
Installation d'un serveur LDAP (de type stand-alone) sous Linux. http://www.chez.com/frafart/documents/LDAP.html
Je ne donne aucune garantie sur le contenu de ce document, à vos risques et périls.