Current oav website

This commit is contained in:
Charlie Root
2023-03-20 12:18:38 +01:00
commit a096ce07cf
3270 changed files with 261778 additions and 0 deletions

View File

@ -0,0 +1,970 @@
<html>
<head>
<title>Howto pour installer un serveur de mail multidomaine utilisant un annuaire LDAP.</title>
</head>
<body bgcolor="#ffffff">
<center><h1><strong>Guide pour installer un serveur de mails multidomaine utilisant un annuaire LDAP.</strong></h1></center>
<br>
<center><h3>Auteur: Luc Saillard &lt;luc.saillard at free.fr&gt;</h3></center>
<center><h4>Date: 16 mai 2001, Version: 0.1.2</h4></center>
<center><h4>Licence: <a href="http://www.gnu.org/copyleft/fdl.html">GNU Free Documentation License</a></h4></center>
<h4>
Copyright (c) 2000-2001 Luc Saillard<br>
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".
</h4>
<br>
<h1>Introduction</h1>
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<62>tes
aux lettres. Cette solution permet aussi de rendre le syst<73>me scalable, et
facilement redondant.<br>
L'utilisation d'un annuaire LDAP n'est pas obligatoire, puisque l'on peut
faire la m<>me chose avec des bases de donn<6E>es. LDAP <20>tant plus ouvert que le
support des bases de donn<6E>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<71> puisqu'il permet une
plus grande souplesse d'administration tout en conservant une vitesse de
recherche plus importante qu'une base de donn<6E>es.<br>
L'avantage d'utiliser LDAP permet de d<>centraliser les services plus
facilement, si on d<>sire faire fonctionner le syst<73>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.<br>
Un annuaire peut <20>tre administr<74> depuis une autre machine. Il existe de
nombreux outils pour administrer une base, la plupart des langages (C, Perl,
Php, Python) poss<73>de une API pour dialoguer avec un serveur LDAP donc rien
n'emp<6D>che d'<27>crire son propre outil adapt<70> <20> 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<6E>es de fa<66>on
efficace, ce qui permet de faire simplement de la haute disponibilit<69>.
<h1>Logiciels n<>cessaires</h1>
<ul>
<li><b>un serveur LDAP</b>. Il y a plusieurs serveurs LDAP sur le march<63>. Dans le libre,
il y a <a href="http://www.openldap.org/">Openldap</a>, et une version plus ancienne qui est
<a href="">UmichLdap</a>. Dans les solutions propri<72>taires, nous retrouvons <a
href="http://www.iplanet.com/products/infrastructure/dir_security/dir_srvr/">iPlanet
Directory Server</a> anciennement Netscape LDAP, Microsoft poss<73>de aussi une
version avec son <a href="http://www.microsoft.com/windows2000/guide/server/features/dirlist.asp">Active Directory</a>,
Novell avec Novel Directory Service.</li>
<li><b>un serveur de courrier sortant</b>. Il existe de nombreux serveur POP ou Imap dans le monde des
logiciels libres. Cependant, il faut choisir celui qui est le plus adapt<70> en fonction des besoins.
Dans ce guide nous allons utiliser la suite <a
href="http://www.courier-mta.org/">courier-imap</a> et <a
href="http://www.courier-mta.org/">courier-pop</a>.</li>
<li><b>un serveur de courrier entrant</b>. 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.</li>
</ul>
Optionnels:<br>
<ul>
<li><b>un serveur Webmail</b>. 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: <a href="http://www.horde.org/imp/">Imp</a> et
<a href="http://www.inter7.com/sqwebmail/">SqWebmail</a>.
<li><b>une couche SSL</b>. On peut rajouter une couche s<>curis<69> au syst<73>me pour transmettre
le courrier en crypt<70> en utilisant le m<>me protocole que le http. La s<>curit<69> s'applique <20> tous
les services (Pop, Imap, Web). Pour le smtp, il faut utiliser SMTP Auth.
</ul>
<h1>Pr<EFBFBD>-requis</h1>
<h2>LDAP</h2>
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<6E>es. Les outils tels que
ldapsearch, ldapdelete, ... sont ceux de la version Openldap. Les utilisateurs de Netscape Ldap
auront une syntaxe presque identique.
<h2>Le serveur de mail</h2>
Je considererai par la suite que le serveur de mails est d<>j<EFBFBD> fonctionnel (il peut envoyer et recevoir des emails).
Seuls Exim et Postfix seront d<>taill<6C>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 <20> la documentation du programme.
<h2>Le serveur Pop, Imap</h2>
La solution pr<70>sent<6E>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 <20> travers PAM-Ldap. Je d<>conseille la 2<>me m<>thode
ralentissant le serveur.<br>
On trouvera <20> cette adresse <a href="http://luc.saillard.free.fr/patches/qpopper/">
http://luc.saillard.free.fr/patches/qpopper/</a>,
un patch pour <a href="http://www.eudora.com/qpopper/">Qpopper</a> version
3.0.x supportant en mode natif le protocole LDAP. Malheureusement, il n'y a pas
de documentation pour l'utiliser.<br>
Le principal avantage de la suite <a
href="http://www.courier-mta.org/">Courier</a>, 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.<br>
Courier-Imap peut-<2D>tre t<>l<EFBFBD>charg<72> <20> cette adresse:
<a href="http://www.inter7.com/courier-imap/">http://www.inter7.com/courier-imap/</a>.<br>
Il existe un patch pour le support Ldap pour le v<>n<EFBFBD>rable serveur Pop, Imap de l'
Universit<EFBFBD> de Washington (les auteurs de <a
href="http://www.washington.edu/pine/">Pine</a>), mais je n'arrive plus <20>
remettre la main dessus. Le plus gros d<>faut d'<a
href="http://www.washington.edu/imap/">UW-Imap</a>, est la m<>moire utilis<69>e pour
chaque connection. Il est oblig<69> de fonctionner avec inetd, le rendant
inad<EFBFBD>quate pour les gros serveurs de mails. De plus, il est tr<74>s difficile
d'inclure de nouveaux drivers, la licence et le design du programme rendent
l'ajout tr<74>s difficile.<br>
<h1>Installation et configuration des logiciels</h1>
<h2>Openldap</h2>
Pour les utilisateurs de Netscape LDAP, je vous renvoie <20> la documentation
fournie avec le logiciel, de toute fa<66>on, on ne peut pas compiler Netscape
LDAP.
<h3>Compilation</h3>
Apr<70>s quelques tests effectu<74>s avec Openldap v2.0, il semblerait que la
librairie dbm a utilis<69> soit la berkeley 2.x, d<>velopp<70>e par la soci<63>t<EFBFBD>
SleepyCat (<a href="http://www.sleepycat.com/">http://www.sleepycat.com</a>). La
version 3.x apporte une meilleure gestion mais semblerait plus lente en
d<EFBFBD>finitive pour des tailles d'annuaires inf<6E>rieures <20> 100.000 entr<74>es. La version
GNU libgdbm est plus lente que la version 2.x. J'ai fait les tests de
compilation de la librairie <20> partir d'un ordinateur Pentium II Intel sous
Linux. Pour ceux que <20>a int<6E>resse, j'ai mis en annexe les temps et les
proc<EFBFBD>dures de tests. <br>
Voici les directives que j'utilise pour compiler Openldap sur une machine
Linux Intel. Note je n'utilise pas slurpd.
<ul>
<li>Pour Openldap 1.2.x:<br>
<ul>
<li>Compilation de la librairie Berkeley 2.x:
<pre>
CFLAGS="-O2 -pipe -mpentiumpro \
-fexpensive-optimizations \
-fomit-frame-pointer" \
../dist/configure \
--disable-shared \
--prefix=/home/luc/srcs/openldap/build/db2
make
make install
</pre></li>
<li>Compilation d'Openldap 1.2.x:
<pre>
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
</pre>
Voici ce que j'ai utilis<69> pour Solaris8
<pre>
% 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
</pre>
</li>
</ul>
<li>Pour Openldap 2.0.x<br>
<ul>
<li>Compilation de la librairie Berkeley 2.x:<br>
<pre>
CFLAGS="-O2 -pipe -mpentiumpro \
-fexpensive-optimizations \
-fomit-frame-pointer" \
../dist/configure \
--disable-shared \
--prefix=/home/luc/srcs/openldap/build/db2
make
make install
</pre></li>
<li>Compilation d'Openldap 2.0.7:<br>
<pre>
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
</pre></li>
</ul>
</ul>
<h3>Cr<EFBFBD>ation des fichiers Ldif</h3>
Plusieurs fichiers LDIF devront <20>tre cr<63><72>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<63>er l'arborescence de l'annuaire, et un fichier
pour quelques utilisateurs de test, ainsi que l'administrateur.
<h4>D<EFBFBD>finition du profil des utilisateurs</h4>
Nous avons 2 solutions pour cr<63>er un profil d'utilisateur. Prendre un
mod<EFBFBD>le existant d<>j<EFBFBD> dans les Rfcs tel que le profil InetOrgPerson, ou construire
son propre profil. Chacun a ses avantages et ses inconv<6E>nients. Personnellement, j'utilise
plus souvent le 2<>me cas (cr<63>ation du profil personnalis<69>), car l'on peut adapter plus
facilement certains probl<62>mes (quota, autorisation de recevoir des emails, ...)<br>
Voici un profil d'utilisateur pour une entreprise nomm<6D>e Toto. J'ai sp<73>cifi<66> uniquement les
attributs qui me sont n<>cessaires:<br>
<b>Fichier toto_com.oc.conf</b>
<pre>
objectclass personToto
requires
objectclass,
cn,
uid,
mail,
maildrop,
userPassword
allows
allowedServices
</pre>
<b>Fichier toto_com.at.conf</b>
<pre>
attribute allowedServices ces
attribute maildrop ces
</pre>
Seul l'attribut <b>allowedServices</b> n'est pas obligatoire. Il servira pour montrer
comment on peut restreindre l'acc<63>s au serveur FTP, au serveur de mails, ou <20> d'autres
services.<br>
<b>cn</b>: (abr<62>viation de Common Name) donne le nom complet de la personne. Ce nom
sera utilis<69> par les applications pour afficher le nom complet de la personne.<br>
<b>uid</b>: La valeur permettra d'identifier une personne de fa<66>on unique dans
l'annuaire. La plupart du temps, <b>uid</b> correspondra <20> la partie gauche
d'une adresse email. ($local_part sous Exim)<br>
<b>mail</b>: Cet attribut contiendra les diff<66>rentes adresses qu'il pourra recevoir. Je
le repr<70>ciserai plus tard, mais les valeurs d'un attribut Ldap peuvent <20>tre multiples,
c'est une des possibilit<69>s pour l'utilisateur de recevoir du courrier provenant de plusieurs
adresses emails. G<>n<EFBFBD>ralement, on sp<73>cifie l'adresse email en entier de la personne.<br>
<b>maildrop</b>: Cet attribut contiendra les diff<66>rentes adresses de livraison du mail pour
cette personne. En fonction du serveur de mails, les adresses de livraison peuvent-<2D>tre une
adresse email, un r<>pertoire, un fichier, un programme externe. Ainsi, on retrouve
la notion d'<i>alias</i> et de <i>.forward</i>.<br>
<b>userPassword</b>: Cet attribut contient le mot de passe de l'utilisateur. Il peut-<2D>tre
crypt<EFBFBD> par le serveur LDAP auquel cas, il faudra configurer les serveurs Pop et Imap
sp<EFBFBD>cifiquement. Ainsi il est impossible d'utiliser le mode CRAM-MD5 (option
permettant d'<27>viter la transmission du mot de passe en clair sur le r<>seau Internet.<br>
<b>allowedServices</b>: Certains administrateurs veulent pouvoir limiter les acc<63>s
Mails, les acc<63>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<EFBFBD>s FTP. On pourra facilement cr<63>er d'autres attributs pour d'autres situations.
L'exemple devrait suffire pour comprendre la m<>thode.<br>
<h4>D<EFBFBD>finition de l'arbre LDAP</h4>
Dans le cas d'un serveur de mails multidomaines, il est bon de cr<63>er un branche
par sous-domaine. Il sera plus facile apr<70>s de le g<>rer. La cr<63>ation de multiples
branches ne p<>nalise pas les recherches, puisque les recherches ne se font pas sur les
branches mais sur les attributs.<br>
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.<br>
<pre>
+ 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
| |...
|...
</pre>
Explication:<br>
Dans cet exemple, j'ai pris le cas d'une entreprise multinationale, qui voudrait
centraliser <20> un seul endroit les informations des ses collaborateurs.<br>
L'entreprise s'appelle toto, et dispose du nom de domaine toto.com. Les adresses
emails sont hi<68>archis<69>es par pays (toto@uk.toto.com, toto@fr.toto.com, ...),
donc on voudrait aussi que l'annuaire poss<73>de cette m<>me hi<68>rarchie. J'ai donc
cr<EFBFBD><EFBFBD> des organisations pour chaque pays (o=groupFR et o=groupUK).<br>
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<63>t<EFBFBD>. Ici, j'ai d<>cid<69> que l'on classerait
les informaticiens (ou=Administrators) et les non-informaticiens (ou=Peoples). J'ai donc cr<63><72>
2 sous-organisations.<br>
Juste en dessous viennent les profils des utilisateurs. Mais nous pouvons tr<74>s
bien avoir d'autres sous-organisations. Pour regrouper tous les services qui
ont besoin d'acc<63>der, j'ai cr<63><72> un organisation Administrators <20> la racine du
site. Il y aura un utilisateur root, qui aura le droit de tout modifier, un
utilisateur mail, un utilisateur imap.<br>
<h4>Cr<EFBFBD>ation des fichiers</h4>
Maintenant, que les profils et la structure sont d<>finis, voici les fichiers LDIF
correspondant <20> l'exemple enonc<6E>.
<b>Fichier toto_com-tree.ldif</b>
<pre>
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
</pre>
<b>Fichier toto_com-admins.ldif</b>
<pre>
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
</pre>
<b>Fichier toto_com-users.ldif</b>
<pre>
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
</pre>
<h3>Configuration du serveur</h3>
<h4>Cr<EFBFBD>ation du fichier slapd.conf</h4>
Il n'y a pas grand chose <20> dire au sujet du fichier de configuration, sauf pour la partie
droits d'acc<63>s qui sera d<>taill<6C>e ci-dessous. Il faut toujours activer l'option <b>schemacheck</b>.
<pre>
schemacheck on
</pre>
Pour optimiser les performances, on peut rajouter ceci dans la section de notre backend.
<pre>
lastmod off
cachesize 10000
dbcachesize 5000000
</pre>
Ensuite, il faut lui indiquer, quels sont les attributs <20> indexer. Dans la
version 2.0 d'Openldap, il faut lui pr<70>ciser objectclass. Les attributs o<> l'on
ne fait jamais de recherche doivent <20>tre index<65>s.
<pre>
index cn
index mail,uid eq,sub
index default none
</pre>
Pour encore plus optimiser, on peut rajouter ces 2 options dans la version 2.0 d'Openldap.
<pre>
dbnosync
dbnolocking
</pre>
S<EFBFBD>curit<EFBFBD>, d<>finition des droits d'acc<63>s aux attributs.<br>
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.<br>
Voici donc les Access Control List que j'utilise dans notre exemple ci-dessus.
<pre>
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
</pre>
Le fichier de configuration d'Openldap:
<pre>
#
# 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<6E>re modification.
lastmod off
# Les indexs
index cn
index mail,uid eq,sub
index default none
# La m<>moire utilis<69>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
</pre>
<h4>Importation des donn<6E>es LDIF</h4>
Pour cr<63>er notre base, nous avons 2 solutions. La premi<6D>re est tr<74>s rapide
et permet d'importer tr<74>s rapidement plusieurs milliers d'enregistrements. La 2<>me
n<EFBFBD>cessite que le serveur LDAP soit actif, mais peut se faire <20> distance.<br>
<ul>
<li>M<EFBFBD>thode utilisant ldif2ldm:<br>
Concatener tous les fichiers <i>.ldif</i> dans le fichier <i>all.ldif</i><br>
Lancer la commande suivante avec le serveur ldap arr<72>t<EFBFBD>.<br>
<pre>
ldif2ldbm -i all.ldif
</pre>
</li>
<li>M<EFBFBD>thode utilisant ldapadd:<br>
Pour utiliser cette m<>thode, il faut qu'il existe un utilisateur ayant le droit
d'<27>crire dans la base LDAP. La m<>thode la plus simple est de d<>commenter les
lignes dans le fichier de configuration <i>slapd.conf</i>: <b>rootdn</b> et
<b>rootpw</b>.<br>
D<EFBFBD>marrer le serveur Ldap.<br>
Pour chaque fichier en commen<65>ant par le fichier <i>-tree.ldif</i>,
lancer la commande suivante:<br>
<pre>
ldapadd -h localhost -p 389 \
-D "cn=root,dc=toto,dc=com" \
-w secret \
-f all.ldif
</pre>
</li>
</ul>
<h3>Test du bon fonctionnement du serveur</h3>
<h4>Lancement du serveur</h4>
<pre>
slapd -f /home/luc/srcs/openldap/build/openldap1/etc/slapd.toto_com.conf \
-p 389
</pre>
<h4>test de recherche</h4>
La commande suivante doit afficher tous les objets contenus dans la base sous la
m<EFBFBD>me forme que les fichiers <i>.ldif</i>.
<pre>
ldapsearch -L -h localhost -p 389 -b "dc=toto,dc=com" "(objectclass=*)"
</pre>
<h4>test d'ajout</h4>
<pre>
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
</pre>
<h4>test de suppression</h4>
<pre>
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
</pre>
<h4>Utilisation du programme GQ.</h4>
On peut utiliser un programme graphique tel que <a href="http://biot.com/gq/">GQ</a>.
<h3>Optionnel: Migration d'une liste d'utilisateurs existante</h3>
<h2>Exim</h2>
<h3>Compilation</h3>
Copier le fichier <i>src/EDITME</i> <20> la place de <i>Local/Makefile</i>.
Configurer les options qui correspondent <20> votre syst<73>me et activer les options
suivantes pour avoir le support LDAP.<br>
<pre>
LOOKUP_LDAP=yes
LOOKUP_LIBS=-lldap -llber
LDAP_LIB_TYPE=UMICHIGAN
</pre>
Si vous utilisez la version 2 d'Openldap, ou la version Netscape, remplacer
<b>LDAP_LIB_TYPE=UMICHIGAN</b> par <b>LDAP_LIB_TYPE=NETSCAPE</b>.<br>
La distribution Debian/GNU Linux utilise comme serveur de mail par d<>faut, le
programme Exim. Il est compil<69> avec toutes les options n<>cessaires pour un
serveur et dispose donc du support LDAP.<br>
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.<br>
<pre>
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
</pre>
Il ne reste plus qu'<27> le compiler avec la commande <b>make</b>.
<h3>Configuration</h3>
Pour d<>livrer les mails en utilisant le support LDAP, j'ai besoin d'un
transport et d'un director. Je vais donc cr<63>er un <b>Director</b> que je
placerai apr<70>s la gestion des alias syst<73>mes.<br>
Voici donc le <b>Director</b> qu'il faut utiliser dans notre exemple.
<pre>
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
</pre>
<h2>Postfix</h2>
<h3>Compilation</h3>
<pre>
% 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
</pre>
<h3>Configuration</h3>
<h2>Sendmail</h2>
<h3>Compilation</h3>
Ajouter le support LDAP <20> sendmail.
<!-- mkdir -p /home/luc/srcs/sendmail/build/usr/lib/sm.bin /home/luc/srcs/sendmail/build/usr/bin /home/luc/srcs/sendmail/build/usr/sbin /home/luc/srcs/sendmail/build/etc/mail -->
Voici le fichier site.local.m4 qui permet de compiler Sendmail avec le support LDAP.
<pre>
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')
</pre>
Lancer la compilation de sendmail avec la commande suivante:
<pre>
sh Build -f site.local.m4
</pre>
<h3>Configuration</h3>
Voici le contenu de mon fichier local.mc. Dixit, les docs que j'ai trouv<75> sur
Internet. La meilleure documentation, ce sont les sources. Le code n'est pas
beaucoup document<6E>, donc pour trouver les options, allez voir le fichier
<i>sendmail/map.c</i> et chercher la fonction <i>ldapmap_parseargs</i>. Sinon
il y a une documentation qui explique un peu plus en d<>tail mes propos.
(<a href="http://www.stanford.edu/~bbense/Inst.html">www.stanford.edu/~bbense/Inst.html</a>)
Les options principales:
<ul>
<li>-b"ldap search base":<br>
The is the "directory" in your ldap "tree" that you are going to search in.
</li>
<li>-h"ldap servers":<br>
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.
</li>
<li>-k"ldap search string":<br>
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.
</li>
<li>-v"ldap attribute":<br>
The value that replaces the origin string in the map. In most cases this will be your rfc822
email address.
</li>
<li>-d"ldap bind dn":<br>
</li>
<li>-P"ldap bind passwd":<br>
</li></ul>
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<71>tes LDAP, on devrait y
arriver. Voici donc le fichier <i>local.mc</i> permettant de g<>n<EFBFBD>rer le fichier
<i>sendmail.cf</i>.
<pre>
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)
</pre>
<h2>Courier-Imap & Courier-Pop</h2>
<h3>Compilation</h3>
Voici la ligne de commande que j'utilise pour compiler courier-imap (et donc
courier-pop):
<pre>
CPPFLAGS="-I/usr/local/openldap/include/" \
LDFLAGS="-L/usr/local/openldap/lib" \
LIBS="-lresolv" \
./configure --prefix=/usr/local/courier
</pre>
Sur une machine solaris 8
<pre>
% 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
</pre>
La librairie <i>resolv</i> n'est pas n<>cessaire pour Openldap 1.x.
<h3>Configuration</h3>
Courier-Imap utilise plusieurs fichiers de configuration correspondants <20> chacun
de ses modules.<br><br>
<b>imapd.conf</b> ou <b>imapd</b>: Sert pour la configuration du serveur IMAP. La configuration
par d<>faut est correcte mais pensez <20> changer la variable IMAPDSTART par
YES.<br>
<b>authdaemonrc</b>: Ce fichier permet de configurer le daemon
d'authentification. Il contient plusieurs param<61>tres permettant de configurer
le nombre de daemon lanc<6E> (<i>daemons</i>), l'ordre des modules pour
authentifier une personne (<i>authmodulelist</i>). Voici une courte explication
des diff<66>rents modules:
<ul>
<li>authuserdb: utilise une base au format dbm pour faire l'authentification.
<li>authcram: permet de r<>aliser le cryptage des mots de passe au format
CRAM-MD5 utilisable ensuite dans les autres modules.
<li>authcustom: est juste un template permettant d'impl<70>menter votre propre module
d'authentification.
<li>authldap: permet de r<>aliser l'authentification au format LDAP. Le fichier
de configuration se nomme <i>authldaprc</i>
<li>authmysql: r<>alise l'authentification en utilisant une base Mysql. A quand
un module pour Postgresql ?
<li>authpam: r<>alise l'authentification en utilisant PAM.
<li>authpwd et doauthshadow: r<>alisent l'authentification en utilisant les
fonctions standards d'Unix pour lire les fichiers <i>/etc/passwd</i> ou
<i>/etc/shadow</i>.
<li>authvchkpw: r<>alise l'authentification en utilisant les m<>me modules que
vpopmail (voir <a href="http://www.qmail.org">Qmail</a>). Note je ne connais
pas ce module.
</ul>
Dans notre cas, cette variable ne contiendra que "authcram authldap".<br><br>
<b>authldaprc</b>: Ce fichier configure le module d'authentification pour
LDAP.<br>
<pre>
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
</pre>
<b>LDAP_DOMAIN</b> 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 <b>LDAP_BINDDN</b>
devra pouvoir lire les entr<74>es des champs password et faire des recherches sur
l'adresse email.<br>
<i>TODO</i>
<h1>Programmes additionnels</h1>
<h2>Installation du webmail: IMP</h2>
Pour installer IMP, il faut la librairie Horde, que l'on trouvera au m<>me endroit que IMP.
D<EFBFBD>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<6E>es g<>rant les sessions.
Une fois les 2 programmes install<6C>s et configur<75>s, on va passer <20> 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<75> un seul.
<pre>
&lt;?php
$IMAPServers = array();
$IMAPServers['localhost'] = new IMAPServer('Webmail',
'localhost',
143,
'',
'toto.com');
?&gt;
</pre>
Editer le fichier <i>imp/config/ldap.php3</i>, qui contiendra la liste des serveurs LDAP auquel
IMP pourra se connecter pour faire des recherches.
<pre>
&lt;?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');
?&gt;
</pre>
Dans le fichier <i>imp/config/defaults.php3</i>, activez cette variable <20> TRUE, pour que IMP utilise la liste
des serveurs IMAP configur<75>s dans le fichier <i>imp/config/servers.php3</i>
<pre>$default->use_server_list = TRUE;</pre>
On utilise Courier-Imap, alors il faut modifier la valeur de la variable personal_folders.
<pre>$default->personal_folders = 'INBOX.'</pre>
<h1>FAQ</h1>
<ol>
<li><b>Comment une personne peut avoir plusieurs adresses emails ?</b><br>
Il suffit de mettre plusieurs valeurs dans l'attribut mails, les clients LDAP
devraient tous savoir g<>rer les valeurs multi-<2D>valu<6C>es.
<li><b>Comment envoyer un mail <20> un groupe de personnes ?</b><br>
Il suffit de cr<63>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 <20> rajouter.
<li><b>Comment d<>finir que tous les domaines soient <20>quivalents ?</b><br>
Il suffit de d<>finir LDAP_DOMAIN <20> la valeur *
</ol>
<h1>Annexe</h1>
<h2>Remerciements</h2>
Je tiens remercier la soci<63>t<EFBFBD> <a href="http://www.alcove.com/">Alc<EFBFBD>ve</a> pour
son effort en faveur de l'Open Source, et qui m'a permis de me former sur les
outils utilis<69>s ci-dessus.<br>
Et les auteurs des programmes cit<69>s sans lesquels ce guide n'existerait pas.<br>
Et aussi fr<66>d<EFBFBD>ric massot pour ses commentaires :-).<br>
<h2>R<EFBFBD>f<EFBFBD>rences</h2>
Un Tutorial LDAP en fran<61>ais:
<a href="http://www-sop.inria.fr/semir/personnel/Laurent.Mirtain/LDAP.html">http://www-sop.inria.fr/semir/personnel/Laurent.Mirtain/LDAP.html</a><br>
Installation d'un serveur LDAP (de type stand-alone) sous Linux.
<a href="http://www.chez.com/frafart/documents/LDAP.html">http://www.chez.com/frafart/documents/LDAP.html</a><br>
<i>Je ne donne aucune garantie sur le contenu de ce document, <20> vos risques et p<>rils.</i>
</body>
</html>