maquette d'implementation d'un annuaire faisant la “glue” entre les annuaires d'etablissements via le backend ldap (proxy ldap) et l'overlay Rewrite .
basé sur un exemple de TP d'enseignement à Evry de M.Gardie: http://www-public.int-evry.fr/~gardie/LDAP/Scenarios/ldap-complexe.html
Le principe est de disposer d'un proxy (coquille vide, pas de data locale) serveur qui se charge de relayer les requetes ldap vers les serveurs ldap rééls de chaque ecoles declaré dans ce serveur proxy (recherche sequentielle vers les N serveurs). il a aussi une fonction de “rewrite” de la racine / base ldap afin que tout le monde apparaisse sous la racine virtuelle dc=mines-telecom,dc=fr .
exemple de requete
# ldapsearch -x "cn=bernar*" -H ldaps://ldapmintel.tem-tsp.eu -b dc=mines-telecom,dc=fr cn -D 'cn=mintel,dc=mines-telecom,dc=fr' -W
pour l'acces en ldaps (seul port 636 ouvert depuis le firewall) , il faut disposer dans la configuration du client un poiteur vers le certificat racine TCS/DigiCert
exemple sous linux pour ldapsearch :
# cat /etc/openldap/ldap.conf TLS_CACERT /etc/pki/tls/certs/DigiCert-ca.crt
#chargement du module rewrite modulepath /usr/lib/openldap moduleload rwm.la #default searchbase sur le domaine aggregat "mines-telecom.fr" defaultsearchbase dc=mines-telecom,dc=fr #database config propre a la version OP 2.4 database config rootdn "cn=admin,cn=config" rootpw secret #ACL config access to dn.subtree="cn=config" by users none by anonymous none
#database database ldap # le suffixe ci-dessous reprénte le dn virtuel de la base. #(on peut mettre ce qu'on veut, mais faut changer dans les règles de rériture plus bas # et dans la definition du suffixe par défaut.) suffix "ou=people,dc=int-evry,dc=fr" #on va taper sur le replica ldapze uri "ldap://ldapze.int.fr" #ACL Evry # crée supplémentaire pour masquer (aux anonymes) l'adresse mail access to dn.subtree="ou=people,dc=int,dc=fr" attrs=entry,mail,title,sn,cn,telephoneNumber,ou,departmentNumber,labeleduri,o by users read by anonymous none # nécessaire si on veut voir le reste. access to dn.subtree="ou=people,dc=int,dc=fr" attrs=entry,sn by users read by anonymous read
#RELAY database relay suffix ou=evry,dc=mines-telecom,dc=fr relay ou=people,dc=int,dc=fr subordinate overlay rwm rwm-rewriteEngine on rwm-rewriteContext default rwm-rewriteRule "(.+)?ou=evry,dc=mines-telecom,dc=fr$" "$1ou=people,dc=int,dc=fr" ":" rwm-rewriteContext searchEntryDN rwm-rewriteRule "(.+)?ou=people,dc=int,dc=fr$" "$1ou=evry,dc=mines-telecom,dc=fr" ":" rwm-rewriteContext searchAttrDN rwm-rewriteRule "(.+)?ou=people,dc=int,dc=fr$" "$1ou=evry,dc=mines-telecom,dc=fr" ":" rwm-rewriteRule "(.+)?dc=mines-telecom,dc=fr$" "$1dc=mines-telecom,dc=fr" ":"
#database root mines-telecom database bdb suffix "dc=mines-telecom,dc=fr" rootdn "cn=adm,dc=mines-telecom,dc=fr" rootpw secret directory /var/lib/ldap/mintel/ index ou,cn,mail,surname,givenname,uid eq,pres,sub #ACL access to dn.base="" by * read access to dn.base="cn=Subschema" by * read access to attrs=userPassword by self auth by anonymous auth by dn="cn=adm,dc=int-evry,dc=fr" write by * none # Acces standard anonymous pour les attrs mail,givename,cn,sn access to dn.subtree="dc=mines-telecom,dc=fr" attrs=cn,sn,mail,givenname,entry,objectclass,ou,title,associatedDomain,dc by dn="cn=adm,dc=int,dc=fr" write by anonymous read access to * by self read by users read
Requete du le “meta” domaine racine dc=mines-telecom,dc=fr
$ ldapsearch -x uid=procacci -H ldap://ldapmintel.int-evry.fr cn sn displayName # procacci, evry, mines-telecom.fr dn: uid=procacci,ou=evry,dc=mines-telecom,dc=fr displayName: Jehan PROCACCIA cn: Jehan PROCACCIA sn: PROCACCIA
sur le serveur mandataire ldapmintel
Mar 5 17:13:37 ldapmintel slapd[1361]: conn=1004 fd=13 ACCEPT from IP=157.148.221.28:38383 (IP=0.0.0.0:389) Mar 5 17:13:37 ldapmintel slapd[1361]: conn=1004 op=0 BIND dn="" method=128 Mar 5 17:13:37 ldapmintel slapd[1361]: conn=1004 op=0 RESULT tag=97 err=0 text= Mar 5 17:13:37 ldapmintel slapd[1361]: conn=1004 op=1 SRCH base="" scope=2 deref=0 filter="(uid=procacci)" Mar 5 17:13:37 ldapmintel slapd[1361]: conn=1004 op=1 SRCH attr=cn sn displayName Mar 5 17:13:37 ldapmintel slapd[1361]: <= bdb_equality_candidates: (objectClass) not indexed Mar 5 17:13:37 ldapmintel slapd[1361]: conn=1004 op=1 SEARCH RESULT tag=101 err=0 nentries=1 text= Mar 5 17:13:37 ldapmintel slapd[1361]: conn=1004 op=2 UNBIND Mar 5 17:13:37 ldapmintel slapd[1361]: conn=1004 fd=13 closed
sur le serveur cible d'evry les log affichent bien une requete en entrée
Mar 5 17:13:37 ldapze slapd[9334]: conn=1963 op=5 SRCH base="ou=people,dc=int,dc=fr" scope=2 deref=0 filter="(uid=procacci)" Mar 5 17:13:37 ldapze slapd[9334]: conn=1963 op=5 SRCH attr=cn sn displayName Mar 5 17:13:37 ldapze slapd[9334]: conn=1963 op=5 SEARCH RESULT tag=101 err=0 nentries=1 text=
#################################################################### #database Paris TPT database ldap suffix "ou=people,dc=tpt,dc=fr" uri "ldap://ldapt2.tpt.fr" #ACL TPT # crée supplémentaire pour masquer (aux anonymes) l'adresse mail access to dn.subtree="ou=people,dc=tpt,dc=fr" attrs=entry,mail,title,sn,cn by users read by anonymous none # nécessaire si on veut voir le reste. access to dn.subtree="ou=people,dc=tpt,dc=fr" attrs=entry,sn by users read by anonymous read #RELAY database relay suffix ou=paris,dc=mines-telecom,dc=fr relay ou=people,dc=tpt,dc=fr subordinate overlay rwm rwm-rewriteEngine on rwm-rewriteContext default rwm-rewriteRule "(.+)?ou=paris,dc=mines-telecom,dc=fr$" "$1ou=people,dc=tpt,dc=fr" ":" rwm-rewriteContext searchEntryDN rwm-rewriteRule "(.+)?ou=people,dc=tpt,dc=fr$" "$1ou=paris,dc=mines-telecom,dc=fr" ":" rwm-rewriteContext searchAttrDN rwm-rewriteRule "(.+)?ou=people,dc=tpt,dc=fr$" "$1ou=paris,dc=mines-telecom,dc=fr" ":" rwm-rewriteRule "(.+)?dc=mines-telecom,dc=fr$" "$1dc=mines-telecom,dc=fr" ":"
# ldapsearch -x "cn=bernard*" -H ldaps://ldapmintel.tem-tsp.eu -b dc=mines-telecom,dc=fr cn -D 'cn=mintel,dc=mines-telecom,dc=fr' -W Enter LDAP Password: # extended LDIF # # LDAPv3 # base <dc=mines-telecom,dc=fr> with scope subtree # filter: cn=bernard* # requesting: cn ... # numResponses: 18 # numEntries: 17
suffix "dc=mines-telecom,dc=fr" rootdn "dc=mines-telecom,dc=fr" # le timeout est insdipensable sinon quand un serveur est down # le client laisse tomber avant d'avoir la réponse network-timeout 1 # Local uri "ldapi:///ou=paris,dc=mines-telecom,dc=fr" suffixmassage "ou=paris,dc=mines-telecom,dc=fr" "ou=people,dc=tpt,dc=fr" # Evry uri "ldaps://ldapz2.int-evry.eu/ou=evry,dc=mines-telecom,dc=fr" suffixmassage "ou=evry,dc=mines-telecom,dc=fr" "ou=people,dc=int-evry,dc=fr" # Bretagne, avec authentification uri "ldap://10.19.1.10/ou=bretagne,dc=mines-telecom,dc=fr" suffixmassage "ou=bretagne,dc=mines-telecom,dc=fr" "ou=people,o=personnel,dc=tbretagne,dc=fr" idassert-bind bindmethod="simple" binddn="cn=adm,ou=admin,o=personnel,dc=tbretagne,dc=fr" credentials="XXXXXXX" flags="override" mode="none" idassert-authzFrom "*"