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
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
- un serveur LDAP. Il y a plusieurs serveurs LDAP sur le marché. Dans le libre,
il y a Openldap, et une version plus ancienne qui est
UmichLdap. Dans les solutions propriétaires, nous retrouvons iPlanet
Directory Server anciennement Netscape LDAP, Microsoft possède aussi une
version avec son Active Directory,
Novell avec Novel Directory Service.
- un serveur de courrier sortant. Il existe de nombreux serveur POP ou Imap dans le monde des
logiciels libres. Cependant, il faut choisir celui qui est le plus adapté en fonction des besoins.
Dans ce guide nous allons utiliser la suite courier-imap et courier-pop.
- un serveur de courrier entrant. Les principaux MTA sont Sendmail, Qmail, Exim, Postfix.
Ils ont tous un support LDAP, sauf pour Qmail qui a ce support sous forme de patch.
Optionnels:
- un serveur Webmail. Le serveur Webmail comprend, un serveur web et
une application permettant d'afficher le courrier. Ils sont nombreux dans les logiciels
libres. On peut citer notamment: Imp et
SqWebmail.
- une couche SSL. On peut rajouter une couche sécurisé au système pour transmettre
le courrier en crypté en utilisant le même protocole que le http. La sécurité s'applique à tous
les services (Pop, Imap, Web). Pour le smtp, il faut utiliser SMTP Auth.
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.
- Pour Openldap 1.2.x:
- Compilation de la librairie Berkeley 2.x:
CFLAGS="-O2 -pipe -mpentiumpro \
-fexpensive-optimizations \
-fomit-frame-pointer" \
../dist/configure \
--disable-shared \
--prefix=/home/luc/srcs/openldap/build/db2
make
make install
- Compilation d'Openldap 1.2.x:
CPPFLAGS="-I/home/luc/srcs/openldap/build/db2/BerkeleyDB/include/" \
LDFLAGS="-L/home/luc/srcs/openldap/build/db2/BerkeleyDB/lib" \
CFLAGS="-O2 -pipe -mpentiumpro -fexpensive-optimizations -fomit-frame-pointer" \
./configure \
--with-threads \
--disable-debug \
--enable-aclgroups \
--disable-wrappers \
--disable-rlookups \
--enable-ldbm \
--enable-ldbm-api=db2 \
--disable-slurpd \
--prefix=/home/luc/srcs/openldap/build/openldap1 \
--libexecdir=/home/luc/srcs/openldap/build/openldap1/sbin
make depend
make
make install sysconfdir=/home/luc/srcs/openldap/build/openldap1/etc
Voici ce que j'ai utilisé pour Solaris8
% LIBS="-lresolv -lgen -lnsl -lsocket -lrt" \
LDFLAGS="-L/usr/local/BerkeleyDB/lib" \
CFLAGS="-O2 -pipe -I/usr/local/BerkeleyDB/include" \
./configure \
--prefix=/usr/local/openldap --enable-shared \
--with-threads=lwp --with-ldbm-api=db2 \
--sysconfdir=/usr/local/openldap/etc
% make
% make install sysconfdir=/usr/local/openldap/etc
- Pour Openldap 2.0.x
- Compilation de la librairie Berkeley 2.x:
CFLAGS="-O2 -pipe -mpentiumpro \
-fexpensive-optimizations \
-fomit-frame-pointer" \
../dist/configure \
--disable-shared \
--prefix=/home/luc/srcs/openldap/build/db2
make
make install
- Compilation d'Openldap 2.0.7:
CPPFLAGS="-I/home/luc/srcs/openldap/build/db2/BerkeleyDB/include/" \
LDFLAGS="-L/home/luc/srcs/openldap/build/db2/BerkeleyDB/lib" \
CFLAGS="-O2 -pipe -mpentiumpro -fexpensive-optimizations -fomit-frame-pointer" \
./configure \
--with-threads \
--with-readline \
--enable-syslog \
--enable-aci \
--with-ldbm-api=berkeley \
--disable-slurpd \
--prefix=/home/luc/srcs/openldap/build/openldap2 \
--libexecdir=/home/luc/srcs/openldap/build/openldap2/sbin
make depend
make
make install sysconfdir=/home/luc/srcs/openldap/build/openldap2/etc
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:
- -b"ldap search base":
The is the "directory" in your ldap "tree" that you are going to search in.
- -h"ldap servers":
This is a space separated string of servers that support ldap at your site. The ldap libraries
will attempt to connect to these machines in the order that they are listed.
- -k"ldap search string":
This is a "sprintf" style string that defines how the map takes it's input value and constructs
an ldap search. It MUST be of the form "attribute=%s". It and the base used above should define a
search that returns AT MOST ONE ENTRY. The ldap map will only use the first entry it recieves.
- -v"ldap attribute":
The value that replaces the origin string in the map. In most cases this will be your rfc822
email address.
- -d"ldap bind dn":
- -P"ldap bind passwd":
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:
- authuserdb: utilise une base au format dbm pour faire l'authentification.
- authcram: permet de réaliser le cryptage des mots de passe au format
CRAM-MD5 utilisable ensuite dans les autres modules.
- authcustom: est juste un template permettant d'implémenter votre propre module
d'authentification.
- authldap: permet de réaliser l'authentification au format LDAP. Le fichier
de configuration se nomme authldaprc
- authmysql: réalise l'authentification en utilisant une base Mysql. A quand
un module pour Postgresql ?
- authpam: réalise l'authentification en utilisant PAM.
- authpwd et doauthshadow: réalisent l'authentification en utilisant les
fonctions standards d'Unix pour lire les fichiers /etc/passwd ou
/etc/shadow.
- authvchkpw: réalise l'authentification en utilisant les même modules que
vpopmail (voir Qmail). Note je ne connais
pas ce module.
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
- 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.
- 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.
- 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.