Professional Documents
Culture Documents
Rapport de soutenance
Olivier Schmitt
Yannik Soubigou
Rapport de projet
de fin dtudes ENSIMAG
Conception et Ralisation
dun proxy dannuaire LDAP
Date: 27/06/00
Page:1/46
Date: 27/06/00
Page:2/46
Olivier Schmitt
Yannik Soubigou
II. Remerciements________________________________________________________________4
III.
Introduction ________________________________________________________________5
A. Gnralits __________________________________________________________________5
B. Contexte ____________________________________________________________________5
C. Sujet_______________________________________________________________________5
IV.
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
VI.
Dveloppement _____________________________________________________________19
Date: 27/06/00
Page:3/46
Olivier Schmitt
Yannik Soubigou
1.
2.
3.
4.
5.
6.
IX.
Planning __________________________________________________________________38
X. Conclusion __________________________________________________________________39
XI.
Bibliographie ______________________________________________________________40
XII. Annexes___________________________________________________________________41
A. Grammaire ASN1 pour LDAPv3 ________________________________________________41
Date: 27/06/00
Page:4/46
Olivier Schmitt
Yannik Soubigou
II. Remerciements
Nous voudrions remercier toutes les personnes qui par leur aide ou simplement par leur
gentillesse ont contribues dune faon ou dune autre la bonne ralisation du projet dont nous
avons eu la charge. Nous tenons donc remercier tous les membres de lquipe e-Solutions du site
dEchirolles pour leur disponibilit et leur sympathie.
Nous tenons tout particulirement remercier Antoine Geronimi, Thierry Dessenne, Jrme
Camilleri et Vladimir Plotto pour leur disponibilit, laide quils nous ont apporte et leur exprience.
Nous remercions galement Emmanuel Chabani, Pascal Deveze, Carole Hbrard et Serge Reboul.
Enfin, nous tenons tmoigner de toute notre sympathie pour les proches de notre matre de
stage Marc Fleurisson et de la douleur que son dcs a provoque en nous. Nous avions nou avec lui
des relations amicales qui dpassaient le cadre strictement professionnel. Il restera dans notre
mmoire.
Date: 27/06/00
Page:5/46
Olivier Schmitt
Yannik Soubigou
III. Introduction
A. Gnralits
Le prsent document est le rapport du projet de fin dtudes de Yannik SOUBIGOU et Olivier
SCHMITT, lves ingnieurs lENSIMAG. Il a comme but de situer le contexte du projet, de
dcrire son sujet, les mthodes et outils utiliss ainsi que les rsultats obtenus.
B. Contexte
Ce projet sest droul BULL Echirolles dans le service Consulting & Systmes dIntgration. Il a
t commenc mi-temps, de dbut janvier au 31 mars. Cette premire priode a t principalement
passe en tudes bibliographiques. Elle a t suivie de quatre mois plein temps.
Lencadrement tait initialement assur par Marc Fleurisson. Suite son dcs, Antoine Gronimi et
Thierry Dessenne se sont partags le rle de chef de projet.
C. Sujet
Les annuaires (norme ISO X500) permettent de grer de faon centralise les donnes de lentreprise
concernant les personnes, leurs habilitations, la configuration des logiciels, des donnes lies
larchitecture du rseau, les machines... Le protocole daccs et de requtes ces annuaires a t
nomm DAP (Directory Access Protocol). Ce protocole a t abandonn et remplac par le protocole
LDAP (Lightweight Directory Access Protocole) pour les accs par des clients lgers, qui est
beaucoup plus simple implmenter et utiliser. DAP est toujours utilis et support par des
annuaires DAP comme celui dISOCOR et LDAP constitue le protocole daccs par Internet. La
version 2 de ce protocole (RFC 1777) est trs largement supporte et la version 3 (RFC 2251) tend
aujourdhui devenir le standard daccs aux annuaires.
Le sujet initial du stage tait : Dveloppement dun Proxy LDAP. Il sagissait de dvelopper une
application qui, place entre un client et un serveur LDAP, pourra filtrer et modifier les informations
en transit.
Date: 27/06/00
Page:6/46
Olivier Schmitt
Yannik Soubigou
OBJECTIFS :
Fonctionnalits demandes : Le proxy LDAP proposera les fonctions de :
Gestion du contrle d'accs aux informations contenues dans les annuaires.
Distribution et agrgation des requtes LDAP sur les serveurs d'annuaire.
Cache des requtes.
Technologies mises en uvre : cette application sera ralise en Java (Application, Servlet, Applet),
mettra en uvre les protocoles et schmas d'Annuaire LDAP (interface JNDI), et sera scurise par
SSL.
PROFIL/COMPETENCES :
Comptences requises : Java, HTML, Unix.
Comptences souhaites : LDAP, NT.
Dure minimum : Janvier juin 2000 (pour 2 personnes).
Tuteur du stage : Marc FLEURISSON tel. 04 76 29 79 69
Logistique stage : Anne De DARASSUS tel. 04 76 29 75 80
Date: 27/06/00
Page:7/46
Olivier Schmitt
Yannik Soubigou
Bull fournit des solutions scurises pour le commerce lectronique et Internet portant
principalement sur trois domaines :
les solutions dintgration,
les solutions dinfrastructure garantissant haute disponibilit et scurit,
les solutions dinfo grance et de services de support.
B. Bull France
Bull France ralise le tiers du chiffre daffaire du groupe et emploie plus de 6000 personnes.
Cest un intgrateur de technologies qui fournit des solutions adaptes aux besoins de chaque client,
en utilisant loffre de produits et de services de BULL, associe loffre et aux comptences des
meilleurs partenaires. Le Groupe Bull a adopt une stratgie dindpendance vis--vis du
gouvernement et a conclu des alliances dans le monde entier.
Aprs un dveloppement aussi rapide, une restructuration a dbut en 1994 qui a impliqu la
fermeture de plusieurs usines de fabrication dont lactivit avait t rduite. Lactivit de Bull sest
progressivement concentre sur les tches dintgration. Les mesures prises afin de rduire les cots
avaient pour but de permettre la compagnie de retourner dans le secteur priv, ce qui se fait depuis
1994, avec comme principaux actionnaires de dpart France Tlcom, NEC et Motorola.
Date: 27/06/00
Page:8/46
Olivier Schmitt
Yannik Soubigou
Lille
Caen
Rennes
Nantes
Paris Metz
Nancy
Strasbourg
Tours
Poitiers
Bordeaux
Lyon
k Grenoble
Montpellier Nice
Toulouse
Marseille
Le service CSI pourra ainsi conseiller le client afin danticiper les choix dvolution, conduire et
dployer les projets d'envergure et fournir des expertises multiples dans la dure.
Date: 27/06/00
Page:9/46
Olivier Schmitt
Yannik Soubigou
V. Etude bibliographique
Pendant la partie mi-temps du stage, de dbut janvier fin fvrier, nous avons recherch les meilleurs
outils et cherch faire les meilleurs choix dimplmentation pour notre Proxy.
A. LDAP et les annuaires
Les annuaires (Recommandation X.500 parue en 1994 de l'UIT-T connue aussi comme ISO/IEC
9594 : Technologie de l'information Interconnexion des systmes ouverts Annuaire) permettent
de grer de faon centralise les donnes de lentreprise concernant les personnes, leurs habilitations,
la configuration des logiciels, des donnes lies larchitecture du rseau, les machines... La
dfinition de cette norme dannuaires a t labore l'origine pour traiter la gestion des adresses
lectroniques, de concert avec l'application du traitement des messages lectroniques d'ISO (X.400).
Le protocole daccs et de requtes ces annuaires a t nomm DAP (Directory Access Protocole)
et utilisait larchitecture couches dISO. Ce protocole a t abandonn et remplac par le protocole
LDAP (Lightweight Directory Access Protocole) pour les accs par des clients Internet, LDAP
fonctionnant au-dessus de IP et de TCP et tant beaucoup plus simple implmenter et utiliser sur
Internet. La version 2 de ce protocole (RFC 1777 parue en 1995) est trs largement supporte et la
version 3 (RFC 2251 parue en 1997) tend aujourdhui devenir le standard daccs aux annuaires sur
Internet.
Les annuaires X.500
Modle de donnes
Un annuaire X500 est une collection d'informations de toutes catgories. Ces informations sont
stockes dans la "Directory Information Base" ou DIB. La DIB est compose d'entres. Ces entres
sont constitues de un ou plusieurs attributs qui peuvent prendre une ou plusieurs valeurs.
Structure
Les entres de la DIB sont organises hirarchiquement, sous forme d'un arbre, le DIT ou Directory
Information Tree. Ce DIT contient donc deux types dentres :
Les nuds qui sont des entres part entire, et sont la base d'un sous-arbre du DIT.
Les feuilles qui terminent les branches des sous-arbres.
Chaque entre de larbre est nomme par un nom tenant compte du chemin parcouru dans l'arbre
pour l'atteindre, depuis la racine. Il existe deux appellations pour ces entres :
Le nom distinctif relatif (RDN ou Relative Distinguished Name).
Le nom distinctif (dn ou Distinguished Name ), concatenation des diffrents RDNs du chemin
utilis depuis la racine, pour joindre lentre concerne.
Date: 27/06/00
Page:10/46
Olivier Schmitt
Yannik Soubigou
B. Le protocole LDAP
LDAP (Lightweight Directory Access Protocol) est le protocole daccs aux annuaires LDAP. Il
permet de passer des requtes un serveur dannuaire et de retourner les rsultats aux clients. Ce
protocole fonctionne au-dessus de la couche TCP et le port dcoute standard des serveurs LDAP est
le port 389.
La version 2 parue en 1995 dfinissait les types de messages (verbes ) suivants :
SearchRequest et SearchResponse : pour chercher des entres suivant un filtre.
ModifyRequest et ModifyResponse : pour modifier les attributs dune entre.
AddRequest et AddResponse : pour ajouter une entre.
DelRequest et DelResponse : pour effacer une entre.
ModifyDNRequest et ModifyDNResponse : pour modifier le DN dune entre.
CompareRequest et CompareResponse : pour comparer des valeurs dattributs avec des
valeurs donnes.
BindRequest et BindResponse : pour dbuter une connexion LDAP.
AbandonRequest : pour demander au serveur dabandonner la requte en cours.
UnbindRequest : pour finir une connexion LDAP.
Date: 27/06/00
Page:11/46
Olivier Schmitt
Yannik Soubigou
Date: 27/06/00
Page:12/46
Olivier Schmitt
Yannik Soubigou
Le but principal dun Proxy est dajouter des fonctionnalits la relation client/serveur sans avoir
toucher au serveur souvent dj lourd ni aux clients qui sont trop nombreux pour en envisager une
modification.
Quelques exemples de fonctionnalits :
La gestion de cache :
Le proxy intercepte les requtes du client et garde en mmoire les rsultats associs aux dernires
requtes traites. Sil reoit une requte quil a encore en mmoire, il retourne directement le
rsultat au client sans sadresser au serveur.
Le routage :
Le proxy peut adresser les requtes du client un serveur parmi plusieurs aprs analyse de la
requte. Le Proxy constitue, pour les clients, un unique point dentre un service.
Le filtrage :
Le Proxy peut refuser de transmettre au serveur des requtes de clients non autoriss ou des types
de requtes interdits. Il peut aussi filtrer les rsultats retourns par le serveur.
Un Proxy LDAP est donc une application place entre le client et le serveur qui analysera les
messages LDAP transitant entre eux. Il pourra agir sur ces messages suivant les fonctionnalits qui
lui sont donnes.
2. Cahier des charges
Fonctionnalits de bases :
Le Proxy doit possder toutes les fonctionnalits de base que doit possder un Proxy. Ctait le but de
notre premire partie de stage : dvelopper un Proxy qui transmette dun sens comme de lautre les
messages LDAP aprs en avoir dcod et analys les informations.
Nous devions dvelopper une application performante, modulaire et pouvant servir plusieurs clients
sans perte majeure de performance.
Temps de traitement des requtes :
Le temps de traitement des requtes par le Proxy ne doit pas tre trop important. Dans toutes les
utilisations futures et possibles du logiciel, une attention particulire sera porte la rapidit de
traitement des requtes des clients.
Rsistance une charge leve :
Tout Proxy doit tre prt subir une demande de connexions trs importante. Celui-ci ne doit donc
pas montrer de perte de performance trop importante sil doit traiter un nombre important de
connexions clientes.
Les contraintes de prix taient importantes aussi. Nous devions raliser notre proxy en nengageant
que trs peu de frais.
Fonctionnalits supplmentaires :
Date: 27/06/00
Page:13/46
Olivier Schmitt
Yannik Soubigou
Jusquau mois davril, la principale fonctionnalit que devait prsenter le Proxy portait sur la
scurit.
La gestion des droits des clients sur les entres de lannuaire est souvent faite par le serveur luimme. Cependant, ce type de gestion propritaire a ses limitations. Nous devions donc ajouter au
Proxy un module qui identifierait les clients et leur affecterait des droits suivant une base de donnes
stocke dans un annuaire. Le Proxy transmettrait alors uniquement les messages dun client aprs
vrification de ses droits.
A la fin du mois davril, suite au dcs de Marc Fleurisson, nous avons parl du futur de notre stage
avec Jrme Camilleri, Antoine Geronimi et Thierry Dessenne. Lajout de cette fonctionnalit a alors
du tre abandonne au profit dune gestion des referrals au niveau du Proxy. En effet, personne ne
pouvait plus nous aider sur cette partie et lajout de la gestion des referrals intressait directement
Antoine Geronimi et Thierry Dessenne dans le cadre de leur projet.
Beaucoup de client LDAPv2, ne comprenant pas les referrals, sont encore utiliss aujourdhui. La
fonctionnalit que nous devions ajouter au Proxy permettrait de rendre la prsence de referrals
invisible pour les clients.
Quand celui-ci reoit un avis de referral, il doit traduire lURL qui lui est transmise, ouvrir une
connexion vers lannuaire dlgu, lui transmettre la requte et transmettre la ou les rponses au
client aprs avoir ferm la connexion avec le deuxime annuaire. Le tout doit tre cach au client.
Au dbut du stage, et en accord avec notre sujet initial, nous avons ax notre recherche sur des outils
Java, et plus particulirement JNDI(java Naming and Directory Interface). En effet, Marc Fleurisson
nous avait orient vers JNDI parce que cette interface tait utilise avec succs dans le projet
WebD&CA pour interroger un annuaire LDAP. La technologie Java nous a aussi sembl intressante
car un proxy est un logiciel qui doit communiquer sur le rseau et que Java est bien adapt pour cette
tche. De plus, profiter de fonctionnalits comme le garbage collector nous paraissait intressant.
Nanmoins, le problme des performances risquait de se poser, surtout pour un proxy, qui par
essence doit rpondre rapidement.
Cette API est de trs haut niveau et permet donc de dvelopper rapidement des clients LDAP. Elle
fonctionne de faon modulaire. Le module JNDI en lui-mme noffre que peu de fonctionnalits mais
il permet de fdrer sous une interface unique toutes les interfaces qui offrent des services de
nommage ou dannuaire. En effet, un module LDAP, DNS ou encore NIS (ces modules sont appels
Service Provider) peuvent se brancher dans le module JNDI pour offrir des services spcifiques pour
les protocoles respectifs. Pour plus de dtails, on se reportera lurl suivante :
http://www.java.sun.com/products/jndi/
Pour nous familiariser avec cette API nous avons dvelopp un petit client java qui se connecte un
annuaire en sauthentifiant grce un nom et un mot de passe et qui passe une requte de type
Date: 27/06/00
Page:14/46
Olivier Schmitt
Yannik Soubigou
LdapSearch selon un filtre sur les attributs dune (ou des) entre(s) de lannuaire. Ce client traite
ensuite les rsultats retourns et les prsente lutilisateur.
Ce programme nous a permis de nous rendre compte que lAPI JNDI et son Service Provider LDAP
ne permettent que de faire des requtes et de traiter les rsultats. Cest seulement une API cliente qui,
comme JDBC, passe des requtes un serveur et traite les rsultats. Nous ne pouvions donc pas
utiliser cette interface pour notre proxy car celui-ci doit pouvoir jouer le rle de serveur : il doit
savoir interprter une requte qui arrive et gnrer des rsultats. Nous avons donc ensuite cherch
dautres API en Java qui offrent des fonctionnalits serveur.
2. Netscape Directory SDK 4.0 for Java
Cette API dite par Netcape fourni des primitives Java pour adresser des requtes un annuaire
LDAP et traiter les rsultats. Elle offre globalement les mmes fonctionnalits que le JNDI ( client
uniquement ) et son Service Provider LDAP, en plus dtre spcialement optimise pour sinterfacer
avec lannuaire LDAP de la mme socit : le Netscape Directory Server 4.1
Pour plus de dtails on se reportera :
http://developer.netscape.com/software/sdks/index.html?content=/tech/directory/downloads.html
3. Netscape Directory SDK 4.0 for C
Cette API dite par Netcape fourni des primitives C pour adresser des requtes un annuaire LDAP
et traiter les rsultats. Elle offre globalement les mmes fonctionnalits que lAPI prcdente (client
uniquement) et est spcialement optimise pour sinterfacer avec lannuaire LDAP de Netscape.
Pour plus de dtails on se reportera :
http://developer.netscape.com/software/sdks/index.html?content=/tech/directory/downloads.html
4. Loutil Snacc4Java dIBM
Loutil Snacc4Java (Snacc for Java) est dit par le dpartement Alphaworks dIBM qui effectue
diffrents travaux exploratoires dans diffrents domaines de la technologie. Ce produit effectue trs
bien la tche pour laquelle il a t conu mais il ne constitue pas encore un produit commercial. Il
faut plus le voir comme un dmonstrateur de technologie.
Snacc est un gnrateur danalyseur de grammaire ASN1 en Java. Il suffit de lui fournir en entre la
grammaire ASN1 de LDAPv3 dans notre cas pour quil produise un ensemble de classes Java qui
analysent et dcodent cette grammaire. Cet outil offre des services beaucoup plus puissants que le
JNDI puisque cest un outil client et serveur : il permet denvoyer des requtes et de traiter les
rsultats mais aussi de recevoir des requtes et denvoyer des rsultats. Ce produit fourni un support
complet de la grammaire LDAP.
Un petit serveur LDAP a mme t dvelopp par Clayton Donley en utilisant cette interface. Pour
plus de dtails sur son travail, on se reportera : http://www.linc-dev.com/
Cet outil sest rvl tre un bon candidat pour notre proxy et cest donc pourquoi nous avons ralis
une maquette (une toute premire version simplifie) de notre proxy en utilisant cette interface, qui a
Date: 27/06/00
Page:15/46
Olivier Schmitt
Yannik Soubigou
bien rempli son rle. Nanmoins, nous navons pas continu dans cette voie pour des raisons de
performance et de non-disponibilit commerciale officielle de cette API.
Pour plus de dtails, on se reportera : http://www.alphaworks.ibm.com/tech/snaccforjava
5. Le couple Cup/Jlex
Notre proxy devant analyser la grammaire ASN1 et LDAP pour dcoder les messages mis par un
client, nous avons envisag un moment de trouver des outils danalyse grammaticale analogues aux
clbres Yacc et Lex. Comme nous tions dans notre optique de dveloppement en Java, nous avons
trouv les outils Cup et Jlex qui sont respectivement un gnrateur de reconnaisseur de grammaire et
un analyseur lexical. Ces deux outils auraient pu nous permettre, moyennant une rcriture de la
grammaire LDAP au format reconnu par ces outils, de gnrer un ensemble de classes reconnaissant
cette grammaire. Mais il nous aurait quand mme manqu un moteur dencodage et de dcodage
ASN1. Nous navons donc pas pouss plus loin cette recherche.
Pour plus de dtails, on se reportera aux rfrences suivantes :
http://www.cs.princeton.edu/~appel/modern/java/CUP/
http://www.cs.princeton.edu/~appel/modern/java/JLex/
6. Les outils dOSS Nokalva
La compagnie amricaine OSS Nokalva, rpute pour son expertise en ASN1, dite des API clientes
et serveur pour manipuler des messages ASN1. Ces outils de grande qualit sont disponibles pour de
nombreux langages de programmation, et sur de nombreuses plates-formes. Mais ces produits sont
commerciaux et leur prix est lev.
Lun des objectifs de notre stage tait de produire un proxy qui nimplique que peu de frais. Nous
avons donc renonc utiliser ces outils. Pour plus de dtails, on se reportera :
http://www.oss.com/products/products.html
7. Les outils fournis par les chercheurs de luniversit du Michigan
Les chercheurs et tudiants de luniversit du Michigan ont t pour une bonne partie lorigine des
travaux qui ont conduit aux normes dannuaires LDAP actuelles. Leurs travaux font rfrence dans le
monde entier et ils continuent aujourdhui de dvelopper des logiciels utilisant LDAP et les annuaires
X500.
Lintrt principal de ces logiciels est quils sont gratuits et pour la plus grande partie le code source
de ces logiciels est librement accessible. Aujourdhui, ils continuent de dvelopper des logiciels
client LDAP et des serveurs mais cette activit semble devoir sarrter bientt. Elle nest plus aussi
importante quil y a quelques annes. Ces travaux ont t repris par la communaut de dveloppeurs
OpenLDAP qui eux, travaillent amliorer des produits gratuits et dont le code source est accessible
librement.
Pour plus de dtails, on se reportera : http://www.umich.edu/~dirsvcs/
Date: 27/06/00
Page:16/46
Olivier Schmitt
Yannik Soubigou
8. Les outils fournis par le groupe OpenLDAP
OpenLDAP est une communaut de dveloppeurs issus du monde entier et qui travaillent ensemble
pour dvelopper une suite dapplications (clientes et serveurs) et doutils de dveloppement lis
LDAP qui soient robustes, de niveau commercial et dont le code source soit disponible. Ce package
est bas sur la version 3.3 Release de lUniversit du Michigan.
Ces outils, clients et serveurs sont programms en langage C et fournis gratuitement sous forme de
package. Nous avons utilis une partie des librairies de ce package dans sa version 1.2.7 disponible
depuis fvrier 2000 pour programmer notre proxy. La version 1.2.10 de ce package est actuellement
(en juin 2000) la dernire version disponible.
Nous avons utilis la librairie de codage et de dcodage BER (ASN1 Basic Encoding Rules) de ce
package et nous lavons compltement dtache (en prenant juste les fichiers ncessaires une bonne
compilation) du package pour lincorporer dans notre proxy.
Cette approche a des avantages, dont lespoir de performances (programmation en langage C), la
gratuit et la disponibilit des fichiers source du produit. Mais elle a aussi des inconvnients dont le
fait que les fichiers source soient trs peu comments et assez complexes et aussi le fait que nous ne
soyons pas certains que le codage et dcodage BER soit complet et dbogu.
Pour plus de dtails, on se reportera : http://www.openldap.org
9. Les proxy LDAP disponibles sur le march
Date: 27/06/00
Page:17/46
Olivier Schmitt
Yannik Soubigou
Un proxy LDAP a t dvelopp au sein de BullSoft en 1999. Ce proxy cod en langage C utilise un
moteur de codage et de dcodage fourni par OSS et sinspire de larchitecture du proxy DNS de
Netwall 4.0 : le dmon inetd instancie un processus pour chaque demande de connexion de clients.
Ce proxy offre comme fonctionnalit complmentaire la confirmation de lidentit du client en
effectuant une rsolution DNS simple et inverse du nom du client.
Ce proxy ne fait pas actuellement partie de loffre commerciale BullSoft de Netwall.
http://www.securware.com/netwall/
10. Les clients LDAP disponibles
Le Navigateur LDAPBrowzer
LDAPBrowzer est un client LDAP gratuit dvelopp en Java. Il permet la consultation, la
modification dun annuaire LDAP et limportation dentres dans lannuaire a partir de fichiers ldif.
Cest le client que nous avons utilis le plus souvent pour nos tests.
Nous avons dcouvert un Bug : il ne permet pas dajouter manuellement des entres.
http://www.iit.edu/~gawojar/ldap/
Visual LDAP
Cest un client que nous avons rcupr en version de dmonstration. Toutes les fonctionnalits
ntaient donc pas prsentes et il tait moins simple dutilisation que le prcdent.
http://www.CQSL.com
Directory Mark
Ce client, contrairement aux autres nest pas graphique. Il nous a particulirement servi tester les
performances de notre Proxy. En tant que BenchMark dannuaire, il donne des informations
intressantes sur les performances dun serveur dannuaire.
Il prend en entre un script qui lui permet de gnrer des requtes quil transmet alors au serveur. Sa
fonctionnalit la plus intressante est sa possibilit de simuler plusieurs clients qui se connectent
simultanment au serveur.
www.mindcraft.com
Date: 27/06/00
Page:18/46
Olivier Schmitt
Yannik Soubigou
Date: 27/06/00
Page:19/46
Olivier Schmitt
Yannik Soubigou
VI. Dveloppement
A. Phase prliminaire
Une fois que nous nous tions fixs sur les outils utiliser, en loccurrence les outils fournis par
OpenLDAP, nous avons men une tude prliminaire permettant de concevoir notre proxy.
1. Etude de larchitecture globale du logiciel
Il nous a t prsent un proxy ayant dj t dvelopp par BullSoft, sintgrant dans le produit
NetWall. Ce proxy a t dvelopp en C pour Unix (Aix) en utilisant un moteur de codage et de
dcodage des messages LDAP fourni par OSS. Ce proxy ne convenait donc pas ce que lon
souhaitait faire puisque la licence du module fourni par OSS est trs onreuse. De plus, ce proxy
navait pas t dvelopp de faon multithreade : un processus instance du proxy devant tre
dmarr chaque connexion dun client par le dmon inetd . Linstanciation dun processus tant
beaucoup plus longue que celle dun thread au sein dun processus, il nous a sembl quil serait
prfrable de dvelopper le ntre de faon multithread. Nous avons de plus pens dvelopper notre
proxy en langage C++ dans un soucis de clart et de facilit de dveloppement : nous pensons ici
toutes les fonctionnalits supplmentaires que le C++ apporte au C comme la surcharge doprateurs,
de constructeurs, de mthodes, lallocation dynamique et la gestion des flux. Il nous a t fourni par
Marc Fleurisson comme plate-forme de dveloppement le Visual C++ 5.0 de Microsoft sur des
machines PC sous Windows NT 4.0.
Une fois ces principaux choix faits, il nous restait choisir parmi les diffrentes API celles que nous
allions utiliser et nous former utiliser celles-ci pour raliser une premire version (une maquette)
du proxy. La principale motivation qui nous a guide pour ces choix fut lobjectif de portabilit
maximale du logiciel final sur une autre plate-forme (Unix en particulier).
Un de ces choix tait relatif la communication de notre proxy avec le rseau. Le protocole LDAP
tant conu pour fonctionner au-dessus de IP et de TCP, il nous fallait choisir parmi les diffrentes
librairies offrant le mcanisme de Socket. La librairie C standard de gestion des communications par
socket sous Windows est appele winsock. Elle comporte des mcanismes et des primitives socket
trs similaires ce que lon trouve sous Unix et elle apporte aussi des fonctionnalits supplmentaires
telles que la dtection dvnements rseau comme la fermeture distante de la connexion. La librairie
MFC (ou plutt architecture oriente objet de Microsoft) dfini aussi des classes permettant la
gestion de sockets. Ces classes apportent des fonctionnalits supplmentaires et permettent de
manipuler de faon objet les sockets. Notre objectif de portabilit maximale nous a amen
utiliser les mcanismes socket standards de winsock, qui seront facilement portable.
Un autre de ces choix tait relatif la gestion du caractre multithread de notre proxy. Trois librairies
permettent de grer des threads sous Windows. On trouve la librairie C standard, la lAPI Win32 et
larchitecture objets MFC. Nous navons pas utilis les classes de la librairie MFC car la gestion de
threads aurait t de cette faon trop diffrente de ce qui se fait sous Unix. La librairie standard C et
lAPI Win32 offrent presque le mme niveau de fonctionnalits et ressemblent fortement ce que
lon peut trouver sous Unix. Nous avons utilis lAPI Win32 pour notre proxy. Il ne sest pas agit l
Date: 27/06/00
Page:20/46
Olivier Schmitt
Yannik Soubigou
dun vrai choix car nous navons dcouvert lexistence des primitives multithread de la librairie C
qu la fin de notre projet.
Le proxy avait t initialement prvu pour apporter les valeurs ajoutes suivantes :
Simple proxy permettant de cacher larchitecture physique des annuaires
Gestion dun systme dhabilitations pour pouvoir sinterfacer avec WebD&CA (un logiciel de
consultation dannuaire LDAP et de dlgation dadministration dvelopp par BULL ) et
identifier les clients qui se connectent et leur affecter des droits daccs
Routage : Gestion des referrals pour pouvoir rsoudre les rfrences des donnes dannuaires
rparties mme si le client ne sait pas rsoudre les referrals.
Cache : gestion dune mmoire cache au sein du proxy pour acclrer laccs aux donnes par les
clients.
La fonctionnalit principale qui avait t prvue tait la gestion des habilitations. Suite une
rorientation de nos objectifs en cours de stage, il a t dcid dabandonner cette partie, en raison de
la complexit de la tche et du temps qui nous restait. Il a t dcid de dvelopper la gestion des
referrals en lieu et place des habilitations. Cest pourquoi nous avons dsactiv certaines parties du
programme en les mettant en commentaires et qui sont relatives la gestion des habilitations.
Les besoins que nous avons identifis taient :
Ncessit pour le thread principal de lapplication de faire toutes les initialisations ncessaires au
bon dmarrage du logiciel.
Prvoir un module charg de la configuration du proxy, soit par ligne de commande (et son
interprtation) soit par fichier de configuration (et sa lecture et son interprtation). Il nous a
sembl bon que ce module puisse gnrer automatiquement un fichier de configuration type au
cas o celui-ci ne soit pas trouv.
Ncessit dun module qui permette dassurer linterface console avec loprateur du proxy, ne
serait-ce que pour arrter le proxy proprement et passer quelques ordres de type statistique.
Ncessit de traiter les diffrentes transactions des clients en parallle et prvoir un algorithme
adapt de traitement des diffrents messages entre le proxy, le client et le serveur LDAP. Pour
cela, le module de traitement dun client doit pouvoir communiquer avec lannuaire tout
moment. Il ne faut pas que lenvoi dun message un client soit bloqu par le traitement des
messages dun autre client.
Il nous a sembl intressant de limiter le nombre de threads qui soient simultanment dans le
proxy. Ainsi, on pourra fixer une limite dans le fichier de configuration. Si un client cherche
accder au proxy un moment o le nombre maximal est dj atteint, il se verra rejeter sa
connexion. Il faudra quil essaye plus tard.
Ncessit davoir un module qui soit charg daccepter les demandes de connexions des
nouveaux clients (et de faire du filtrage si ncessaire). Lacceptation dune demande de
connexion par le proxy doit pouvoir se faire en parallle du traitement des clients dj en cours de
traitement et du traitement des ordres passs la console par loprateur.
Une fois ces modules bien identifis, nous avons rdig un document Spcifications
Fonctionnelles qui les regroupait. On trouvera dans la partie VI.C la description de la faon dont
nous avons architectur finalement ces fonctionnalits.
Date: 27/06/00
Page:21/46
Olivier Schmitt
Yannik Soubigou
2. Etude des librairies fournies par OpenLDAP
Nous nous sommes bass sur le package OpenLDAP 1.2.7 datant de fvrier 2000 pour raliser notre
proxy. Ce package est driv de la version 3.3 Release de lUniversit du Michigan. Celui ci
comprend :
Le code source de logiciels clients : fax500, finger, gopher, mail500, rcpt500 (X500 email query
responder), ldapdelete, ldapmodify, ldapmodrdn, ldapsearch, ud (interactive LDAP Directory
Server query program).
Des outils annexes : saucer (General purpose command-line LDAP client), des outils PHP3,
web500gw (HTTP to X.500/LDAP gateway), whois++, ldaptcl (extension to Tcl to interface with
an LDAP server).
Des documentations sous forme de fichier texte (readme) et de fichiers daide Unix (man).
Des librairies et leurs fichiers source : libavl, liblber, libldap, libldbm, libldif, liblthread, liblutil
Des serveurs et leurs fichiers sources : ldapd (dmon LDAP), slapd (serveur dannuaire), slurpd
(outil de rplication entre annuaires).
Tous les outils ncessaires la compilation : makefile sous Unix et dsp et dsw sous Windows
pour le Visual Studio.
Quelques outils de tests dont des fichiers ldif.
Les deux sources dinformation que nous avions disposition pour utiliser ces librairies sont les
fichiers man dcrivant les primitives des fichiers encode.c et decode.c ainsi que les sources des
serveurs et clients prsents ci dessus.
Notre premier programme avait pour but de rcuprer une requte LDAP mise par un client JNDI
(que nous avions dvelopp plus tt quand nous dcouvrions cette API Java).
OpendLDAP utilise les structures de donnes suivantes :
Un BerElement est une suite doctets cods sous forme hexadcimale. Les messages LDAP sont
stocks sous cette forme par lAPI OpenLDAP.
Un SockBuf est une structure dans laquelle peuvent tre stocks plusieurs message LDAP (sous
forme de BerElement).
Les primitives que nous avions disposition taient alors :
ber_get_next pour rcuprer un message LDAP sous forme de BerElement.
ber_get_tag et ber_skip_tag qui permettent de lire, un par un, les composants (tag ou tiquette )
dun message LDAP.
Ces primitives sont de trs bas niveau et ncessitent une connaissance parfaite du codage BER des
lments de la grammaire LDAP, connaissance que nous ne pouvions pas avoir, faute de donnes
suffisantes.
Aprs une lecture plus approfondie des sources des serveurs et clients nous avons remarqu que
lutilisation dune primitive de plus haut niveau (ber_scanf ) pourrait rendre le codage plus simple et
plus rapide.
Linterface fournie par OpenLDAP que nous allions utiliser tant alors de trs bas niveau
(codage/dcodage BER des messages LDAP) il nous a fallu dvelopper une interface de niveau
suprieur qui pourrait tre intgre dans le Proxy.
Cette nouvelle interface cachera aux couches suprieures le codage/dcodage des messages LDAP et
ceux-ci seront stocks sous forme dobjets C++, lutilisation en sera plus simple.
Date: 27/06/00
Page:22/46
Olivier Schmitt
Yannik Soubigou
Pour une utilisation plus simple des donnes, nous avons dcid de stocker les informations
contenues dans les messages sous forme dobjet C++. Chaque lment du protocole LDAP dfini
dans la grammaire ASN1 (cf. Annexe A ) est donc un objet C++.
Par exemple, llment LDAPResult est un objet LDAPResult contenant les variables :
ResultCode : un entier.
MatchedDN : un pointeur vers un caractre.
ErrorMessage : un pointeur vers un caractre.
Referral : un pointeur vers un objet Referral.
Un message LDAP est un objet LDAPMess contenant alors toutes les informations ncessaires la
comprhension et la reconstruction du message.
Lobjet que manipuleront les couches suprieures cette interface est lobjet LDAPConnexion, qui
encapsule un objet LDAPMess et une connexion vers un serveur ou un client. Les mthodes de cette
classe sont :
SendLDAP : pour envoyer un message LDAP, stock sous forme dobjet LDAPMess, sur une
socket donne en paramtre.
RecvLDAP : pour recevoir dune socket donne en paramtre, un message qui sera stock sous
forme dobjet LDAPMess.
ImportLDAP : pour importer un objet LDAPMess dun objet LDAPConnexion un autre.
2. Choix darchitecture
Il existe un fichier source (de bind.cpp extended.cpp )pour chaque catgorie de verbes LDAP, un
ficher source (ldapv3.cpp ) pour lensemble des lments de la grammaire LDAPv3 autres que les
verbes ainsi quun fichier source concernant les exceptions (cf. ci-dessous).
La relecture et la modification sont alors facilites, le code tant plus clair.
3. Choix de conception
Date: 27/06/00
Page:23/46
Olivier Schmitt
Yannik Soubigou
Les exceptions
Il se peut que le client mette des messages errons, ne respectant pas le protocole. Dans ce cas,
les messages reus ne peuvent tre lus correctement. Quand un tel cas se prsente, une exception
est leve. Elle doit tre rcupre par les couches suprieures pour tre traite.
Le traitement dpend de la gravit de lerreur. Si le Proxy a pu lire le verbe LDAP de la requte
du client, il retourne au client un message lui signalant que sa dernire requte ne respecte pas le
protocole, sinon, il doit fermer la connexion.
Des exceptions de deux types peuvent alors tre leves suivant la conduite tenir.
LDAPConnexion et LDAPMess
Les objets LDAPConnexion et LDAPMess ont t dvelopps de telle sorte quune rutilisation de
cette interface soit possible pour le dveloppement dune application autre quun Proxy (i.e. un
serveur LDAP ou un client LDAP ). Un objet LDAPConnexion encapsule un unique message
LDAP et une unique connexion.
Dans le cas o louverture dune nouvelle connexion, vers un annuaire rfr (cf. VI.E Gestion de
la rsolution des referrals) par exemple, est ncessaire, il suffit de crer un nouvel objet
LDAPConnexion en appelant le constructeur avec la nouvelle socket en paramtre.
Les objets LDAPConnexion sont donc indpendants les uns des autres. La primitive importLDAP
permet lchange dinformations entre deux connexions.
Date: 27/06/00
Page:24/46
Olivier Schmitt
Yannik Soubigou
Le Proxy a t dvelopp comme une application Win32 avec utilisation de la console (fentre
DOS). Le proxy est dmarr par un oprateur en tapant au clavier dans une fentre DOS le nom du
programme. Aucun paramtre de dmarrage nest requis, toute la configuration du proxy est lue
partir dun fichier texte de configuration. Cette configuration, ainsi que dautres informations sont
ranges en mmoire globale partage (heap), accessible par tous les threads.
Une fois le proxy dmarr et le thread gestionnaire de connexions lanc, le thread principal joue le
rle dinterface avec ladministrateur du proxy, notamment pour permettre larrt du proxy. Il permet
aussi dafficher des informations concernant le fonctionnement courant du proxy et des statistiques.
Le module principal du proxy est constitu dune collection de fonction C dont la fonction main
sexcutant au sein du principal thread de lapplication. Les principales responsabilits de ce module
sont :
Chargement de la configuration de dmarrage
Date: 27/06/00
Page:25/46
Olivier Schmitt
Yannik Soubigou
Date: 27/06/00
Page:26/46
Olivier Schmitt
Yannik Soubigou
Date: 27/06/00
Page:27/46
Olivier Schmitt
Yannik Soubigou
select permet de dtecter (durant une priode de temps donne limite par un dlai timeout ) un
vnement se produisant sur un ensemble de sockets. Cet vnement peut tre :
La socket devient prte en lecture (des donnes sont arrives)
La socket devient prte en criture
La socket est en erreur
Nous dtectons ainsi larrive dun message sur une connexion : le traitement consiste le plus souvent
lenvoyer lautre connexion. On change ainsi les messages arrivant entre le client, le proxy et
lannuaire.
Ci dessous un diagramme de squence
reprsentant un cas de fonctionnement standard
lors dune transaction avec un seul client LDAP
On voit sur ce diagramme diffrents types de messages (ou verbes) faisant partie de la grammaire
LDAP. Comme dit prcdemment, le client peut envoyer un message AbandonRequest tout
moment et la dtection darrive de donnes sur un port de communication prend tout son sens.
E. Gestion de la rsolution des referrals
Comme nous lavons expliqu, un referral est un type de message LDAPv3 qui peut tre retourn au
client par lannuaire si celui-ci na pas la connaissance des donnes recherches. Inclure dans notre
proxy un module de traitement des referrals constitue une vraie valeur ajoute.
Lors de la rception dun referral par le proxy, plusieurs choix soffrent nous. Il sagit ici dune
politique de gestion des referrals. Une variable de notre fichier de configuration permet de fixer la
faon dont les referrals seront traits par le proxy.
Date: 27/06/00
Page:28/46
Date: 27/06/00
Page:29/46
Olivier Schmitt
Yannik Soubigou
MULTICASTING(non
implment) :
le
proxy
contacte tous les annuaires
connus pour trouver les
donnes
manquantes.
Le
contact de tous ces annuaires
doit se faire en parallle et le
premier annuaire rpondre
correctement (avec les donnes
recherches) est celui dont les
rsultats sont transmis au client
Ces quatre rgles sont prvues par la norme X500 (normalisations 88 et 93) et sont dtailles lurl
suivante : http://www.spidernet.tm.fr/
Ci dessous un diagramme de squence
reprsentant un cas de fonctionnement standard
lors du traitement de type CHAINING dun referral
Date: 27/06/00
Page:30/46
Olivier Schmitt
Yannik Soubigou
La rsolution des referrals que nous avons implmente est complte car nous pouvons rsoudre tous
les referrals contenus dans un message LDAP et nous pouvons aussi rsoudre une succession de
referrals envoys dans des messages LDAP spars. De plus, notre algorithme permet de rsoudre
des referrals successifs, dans le cas o linformation rfre contient elle-mme des referrals. La
profondeur de rsolution de referrals ainsi chans est de plus paramtrable.
Les rsultats ainsi retourns au clients sont complets et tout se passe de faon transparente pour lui.
Notre proxy simule ainsi pour le client la prsence dun annuaire LDAP qui contienne lensemble des
informations recherches. Lobjectif de consolidation est atteint.
Date: 27/06/00
Page:31/46
Olivier Schmitt
Yannik Soubigou
Il a fallu couvrir de faon exhaustive tous les lments de la grammaire LDAP (v2 et v3).
Ces tests ont t principalement effectus laide du Navigateur LDAP LDAPBrowser (client en
Java)
Nous avons aussi dvelopp une interface html pour tester les filtres. Cette interface fonctionne
avec le navigateur Netscape (qui sappuie sur lAPI dannuaire de Netscape NSDK) qui lit des
LDAPURL et affiche le rsultat sous forme dune page web. Nous avons ainsi pu tester tous les
types de filtres lors dune requte ldapsearch.
Nous avons utilis DirectoryMark pour tester les diffrents lments de la grammaire LDAP. Ce
programme permet de tester les annuaires en leur envoyant de nombreuses requtes et ainsi de
gnrer un rapport de performance de lannuaire.
Parmi les lments de la grammaire LDAPv3, les verbes ExtendedRequest et
ExtendedResponse ainsi que llment ExtensibleMatch nont pas t tests faute de clients les
traitant.
Les tests que nous avons effectus lont t en utilisant principalement lannuaire Netscape Directory
Server 4.1. Nous avons aussi fait quelques tests beaucoup plus sommaires en utilisant le Global
Directory Server 3.0 dIsocor. Un bug a t constat concernant lutilisation conjointe du GDS v2.1
et v3.0, du proxy et de requtes contenant des contrles optionnels. Ce bug est dtaill la section
Amliorations et Bugs.
2. Les tests de stress
Laccs au Proxy par un nombre lev de clients et lenvoi dun nombre lev de requtes clientes
ont t simuls et observs. La plupart des pertes en temps cres par le Proxy sont dues la gestion
des sockets. De tels tests permettent dobserver le comportement du proxy en cas de pic de charge.
Deux types de dysfonctionnement peuvent dans ce cas arriver :
Les connexions des clients arrivent dans un intervalle de temps trs court.
Une socket serveur traite les demandes de connexion une par une et stocke les demandes en
attente dans une file dattente. Celle-ci tant de taille limite, il se peut quun client ne puisse pas
se mettre en attente. Il se passe alors ce que lon appelle du denial of Service : le client se voit
refuser la connexion.
Les connexions des clients arrivent dans un intervalle de temps moins court et le proxy a le temps
de toutes les traiter : la connexion du client peut tre rejete si lon atteint le nombre maximum de
threads dans le proxy.
Date: 27/06/00
Page:32/46
Olivier Schmitt
Yannik Soubigou
Nous avons test notre proxy dans son fonctionnement courant en essayant de dtecter une
augmentation ventuelle des ressources utilises. Les outils utiliss sont lAnalyseur de performance
Windows ainsi que Purify (Rational Corporation).
Linterface LDAP (telle quelle a t conue) et les librairies quelle inclue grent correctement la
mmoire. Toute la mmoire alloue est relche.
Laugmentation des ressources mmoire a t observe lorsque plusieurs threads client sont crs.
Malgr lutilisation de Purify, nous navons pas pu corriger ces problmes de fuites de mmoire.
Nous savons que les threads de la librairie Win32 ne librent pas toutes leurs ressources en fin de
vie.
4. Les tests de robustesse
Date: 27/06/00
Page:33/46
Olivier Schmitt
Yannik Soubigou
Comportement dangereux :
Ce cas dutilisation est dangereux si on ne fixe pas de limite au nombre de threads pouvant
tre dmarrs.
Solution :
On pourrait dtecter ce cas dutilisation en effectuant une rsolution DNS des deux couples
(proxy.ipaddress, proxy.port) et (dsa.ipaddress, dsa.port) et en comparant les rsultats. Mais
cette vrification est trop simple si lon envisage le cas de deux proxy qui se dsignent
mutuellement comme tant le serveur dannuaire.
Gestion des referrals :
Politique DROP : fonctionne correctement.
Politique REFERRAL : fonctionne correctement.
Politique CHAINING :
Nous avons test ce mode de fonctionnement et il nous a donn satisfaction.
Cependant, nous navons pas pu entirement le tester. Nos tests se sont limits une
seule url retourne par message LDAP et nous navons pas pu dpasser une
profondeur de 3 en rsolution ( 3 referrals successifs).
Politique MULTICASTING : Non encore dveloppe.
6. Les tests de performance
Nous avons effectu des tests pour valuer les performances de notre proxy, et afin de les comparer
avec les performances de lannuaire seul. Loutil (client LDAP) utilis est DirectoryMark 1.1
(www.mindcraft.com ). Ce BenchMark peut simuler plusieurs clients se connectant et interrogeant
ensemble le Proxy. Nous avons laiss DirectoryMark interroger lannuaire seul et lannuaire en
passant par le proxy pendant 10 minutes environ ( quelques secondes prs).
Nous avons effectu nos tests sur larchitecture rseau dcrite ci-dessous :
Date: 27/06/00
Page:34/46
Olivier Schmitt
Yannik Soubigou
Date: 27/06/00
Page:35/46
Olivier Schmitt
Yannik Soubigou
Les oprations effectues pour les tests ci dessus sont souvent des oprations LDAPsearch
lourdes par rapport aux faibles capacits de nos machines : la charge de travail de lannuaire pour
rpondre chaque requte est importante, ce qui explique que seulement 2,4 oprations sont
effectues chaque seconde. Lors de ces tests, nous avons pu constater que la charge CPU du
processus ldapd (l'annuaire) tait de 98% en moyenne et celle du proxy de 1% en moyenne. Cest
pourquoi nous avons effectu dautres tests pour lesquels lannuaire est hberg par un serveur trs
performant.
Tests sur une plate-forme plus performante :
Ces tests ont t effectus entre les machines DGA_SERV et Aladin4. Nous avons effectu 4 fois le
mme test. Le rsultat prsent ci dessous en est la moyenne.
Rsultat avec 5 processus de 10 threads chacun soit 50 clients simultans pendant 10 minutes :
200926 requtes search adresses directement lannuaire
En passant par le proxy : il a pu en traiter 140836 soit une perte de performance de 30%.
Cette perte de performance peut venir du rseau, des temps de latence dus louverture de socket
ou enfin dune latence due au proxy lui-mme (le plus probable).
Nous avons observ des latences (dlai entre lmission de la requte par le client et la rception
des rsultats par le client) comprises entre 111 ms et 3114 ms.
Les latences constates en sadressant directement lannuaire sont comprises entre 6 ms et 2911
ms.
Nous sommes trs conscients de la difficult dinterprtation de ces tests. En effet, ils dpendent pour
beaucoup de lenvironnement technique utilis :
La machine hbergeant le proxy est-elle puissante, a-t-elle plusieurs processeurs ?
Quelle est la rapidit des connexions rseaux ?
Quutilise t-on comme annuaire ? Est-ce un annuaire LDAP ou un serveur LDAP qui traduise les
requtes en DAP de faon interne ?
Quelle est la performance de la machine qui hberge le serveur dannuaire ?
Quels sont les clients LDAP utiliss ? En quel nombre, et do viennent les connexions du
rseau ?
En raison de toutes ces difficults dinterprtation, on ne prendra les valeurs donnes prcdemment
et notamment les pertes de performance (de 1% dans le cas le plus favorable 30% dans le cas le
plus dfavorable) que de faon indicative. Une campagne de tests planifie et pense de faon
exhaustive et rigoureuse tant ncessaire pour correctement valuer notre logiciel.
Date: 27/06/00
Page:36/46
Olivier Schmitt
Yannik Soubigou
Date: 27/06/00
Page:37/46
Olivier Schmitt
Yannik Soubigou
Fuites de mmoires
Nous avons pu observer des fuites de mmoire lors du deboguage du proxy sous Windows
NT. Pour cela, on pourra modifier le proxy pour utiliser les primitives de gestion de thread de
lAPI C comme _beginthread() au lieu des primitives de lAPI Win32 comme CreateThread().
IX. Planning
Date: 27/06/00
Page:38/46
Date: 27/06/00
Page:39/46
Olivier Schmitt
Yannik Soubigou
X. Conclusion
Nous tirons globalement de ce stage un bilan trs positif, bien que nous ayons eu faire face des
difficults. Notre capacit les rsoudre et les mthodologies que nous avons employes pour les
rsoudre finalement sont des motifs de satisfaction.
Lvnement tragique de la disparition de notre responsable Marc Fleurisson nous a caus un choc. Il
a fallu par la suite qui nous soyons encore plus autonomes dans notre travail, tout en pouvant compter
sur nos autres collgues.
Nous avons eu un certain nombre de difficults techniques. Notamment la difficult de
comprhension des librairies dOpenLDAP qui sont mal commentes et peu documentes. Nous
avons aussi eu rsoudre des bogues dans notre application et mettre en uvre le dboguage dune
application multithread avec tous les problmes de concurrence daccs et de synchronisation que
cela suppose. Nous navons pas pu trouver de client LDAP qui permette de tester toute la grammaire
LDAP de faon aise.
Mais ce stage a t pour nous le plaisir et loccasion de dcouvrir les technologies dannuaires
LDAP, qui nous taient au dpart compltement inconnues. Il nous a apport la satisfaction de
travailler sur un projet de Recherche et Dveloppement puisque la ralisation de ce logiciel constitue
pour le Dpartement e-Solutions un produit qui pourra sintgrer dans le futur au sein de plusieurs
offres pour les clients de Bull.
Nous avons atteint notre objectif de ralisation dun proxy dannuaire LDAP multi-thread, ne
dpendant pas de librairies commerciales, et qui est capable de rsoudre des referrals. Dautre part, il
est modulaire et les fichiers sources du projet sont entirement accessibles si bien que Bull eSolutions pourra, par des dveloppements ultrieurs, y ajouter les fonctionnalits souhaites par ses
clients.
Ce projet a t loccasion de mettre en pratique la formation thorique que nous avons reue
lENSIMAG, qui sest rvle adapte aux comptences souhaites.
Date: 27/06/00
Page:40/46
Olivier Schmitt
Yannik Soubigou
XI. Bibliographie
Livres :
Implementing LDAP, Wrox press limited 1999
Developper sous windows 95 et NT4.0, Microsoft Press
Internet :
JNDI
Snacc4Java
OSS Nokalva
Michigan University
OpenLDAP
LDAP v2
LDAP v3
Netscape SDK
Serveur de Clayton Donley
Les outils Cup/Jlex
Proxy Innosoft
descript.html
Proxy MaXware
Proxy Nexor Directory Boundary Agent
BullSoft Netwall 4.0
Une documentation X500
DirectoryMark
www.java.sun.com/products/jndi
www.alphaworks.ibm.com/tech/snaccforjava
www.oss.com/news/press060399.html
www.umich.edu/~dirsvcs/
www.openldap.org
www.ietf.org/rfc/rfc1777.txt
www.ietf.org/rfc/rfc2251.txt
developer.netscape.com/software/sdks/index.html
www.linc-dev.com/
http://www.cs.princeton.edu/~appel/modern/java/CUP/
http://www.cs.princeton.edu/~appel/modern/java/JLex/
http://www.innosoft.com/directory_solutions/ilpshttp://www.maxware.no/mias/
http://www.nexor.com/products/dba.htm
http://www.securware.com/netwall/
http://www.spidernet.tm.fr/
www.mindcraft.com
XII. Annexes
A. Grammaire ASN1 pour LDAPv3
Lightweight-Directory-Access-Protocol-V3 DEFINITIONS
IMPLICIT TAGS ::=
BEGIN
LDAPMessage ::= SEQUENCE {
messageID
MessageID,
protocolOp CHOICE {
bindRequest BindRequest,
bindResponse BindResponse,
unbindRequest UnbindRequest,
searchRequest SearchRequest,
searchResEntry SearchResultEntry,
searchResDone SearchResultDone,
searchResRef SearchResultReference,
modifyRequest ModifyRequest,
modifyResponse ModifyResponse,
addRequest AddRequest,
addResponse AddResponse,
delRequest
DelRequest,
delResponse DelResponse,
modDNRequest ModifyDNRequest,
modDNResponse ModifyDNResponse,
compareRequest CompareRequest,
compareResponse CompareResponse,
abandonRequest AbandonRequest,
extendedReq ExtendedRequest,
extendedResp ExtendedResponse },
controls
[0] Controls OPTIONAL }
MessageID ::= INTEGER (0 .. maxInt)
maxInt INTEGER ::= 2147483647 -- (2^^31 - 1) -LDAPString ::= OCTET STRING
LDAPOID ::= OCTET STRING
LDAPDN ::= LDAPString
RelativeLDAPDN ::= LDAPString
Date: 27/06/00
Page:41/46
Date: 27/06/00
Page:42/46
aliasProblem
(33),
invalidDNSyntax
(34),
-- 35 reserved for undefined isLeaf -aliasDereferencingProblem (36),
-- 37-47 unused -inappropriateAuthentication (48),
invalidCredentials
(49),
insufficientAccessRights (50),
busy
(51),
unavailable
(52),
unwillingToPerform
(53),
loopDetect
(54),
-- 55-63 unused -namingViolation
(64),
objectClassViolation
(65),
notAllowedOnNonLeaf
(66),
notAllowedOnRDN
(67),
entryAlreadyExists
(68),
objectClassModsProhibited (69),
-- 70 reserved for CLDAP -affectsMultipleDSAs
(71), -- new
-- 72-79 unused -other
(80) },
-- 81-90 reserved for APIs -matchedDN
LDAPDN,
errorMessage LDAPString,
referral
[3] Referral OPTIONAL }
Referral ::= SEQUENCE OF LDAPURL
LDAPURL ::= LDAPString -- limited to characters permitted in URLs
Controls ::= SEQUENCE OF Control
Control ::= SEQUENCE {
controlType
LDAPOID,
criticality
BOOLEAN DEFAULT FALSE,
controlValue
OCTET STRING OPTIONAL }
BindRequest ::= [APPLICATION 0] SEQUENCE {
version
INTEGER (1 .. 127),
name
LDAPDN,
authentication
AuthenticationChoice }
AuthenticationChoice ::= CHOICE {
simple
[0] OCTET STRING,
Date: 27/06/00
Page:43/46
sasl
-- 1 and 2 reserved
[3] SaslCredentials }
Date: 27/06/00
Page:44/46
Date: 27/06/00
Page:45/46
Date: 27/06/00
Page:46/46