implementation Glue ldap Groupe d'etablissements

principes

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 .

configurations

Serveur

  • le serveur d'exemple sera ldapmintel.tem-tsp.eu
  • le base DN est dc=mines-telecom,dc=fr
  • il est accessible en ldaps
  • binddn (compte d'acces) cn=mintel,dc=mines-telecom,dc=fr

Client ldap

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

slapd.conf generalité

#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

slapd.conf backend ldap

#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

slapd.conf relay

Partie Relay / Rewrite pour Evry

#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" ":"

slapd.conf

racine mines-telecom

#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

exemple requete

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

Logs ldapmintel

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

logs ldapze

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=

Proxy Paris TPT

####################################################################
#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" ":"

requete Ziann

# 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

Variante en utilisant le backend meta

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 "*"