[bglug] Come impazzire usando ldap

micron micron@madlab.it
Lun 5 Lug 2004 15:39:43 CEST


-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Sono finalmente riuscito a tirare insieme un server open-ldap interno per 
gestire una rubrica di posta condivisa.
Dopo innumerevoli tentativi, dovuti alla stupidità di open-ldap (ho 
"piacevolmente" scoperto che ldap non accetta eventuali spazi di fine riga 
nei suoi file di configurazione!!!), sono riuscito a ottenere buoni 
risultati: infatti la rubrica centralizzata è accessibile da KMail, outlook 
express e l'addressbook di macosx.
Dato che l'os che uso per la maggiore è linux (con kde) mi sono lanciato alla 
scoperta delle innumerevoli pecche di KAddressBook (infatti il suo supporto a 
ldap è ancora in uno stato "embrionale").

PROBLEMI:
Ecco cosa non fa KAddressBook:
1) non permette di modificare i contatti direttamente sul server
2) non permette di usare ldaps (secure)
3) perde una serie di campi durante l'import dal server

SOLUZIONI (o quasi):
1) Si può semplicemente esportare un contatto in formato ldif e importarlo 
successivamente sul server. Purtroppo i file ldif creati da KAddressBook non 
sono compatibili con open-ldap (dipende da come avete creato l'oggetto 
"persona della rubrica"), per ovviare a questo ho scritto un banale programma 
in python che risolve il tutto.
In alternativa si aspetta kde 3.3, in cui ci saranno dei miglioramenti di 
KAddressBook.
2) aspettiamo un nuovo KAddressBook, o mettiamoci a tunnellizzare con ssh le 
comunicazioni tra noi ed il server
3) sono campi proprio stupidi, passiamo vivere anche senza

IL VERO PROBLEMA:
A questo punto funziona tutto, peccato che il mio addressbook sia leggibile 
dall'intero universo, e questo (per una persona con un po' di scrupoli e 
tanta paranoia :) non è accettabile.
Per risolvere il problema basta impostare delle ACL in slapd.conf, per 
esempio:

access to *
        by self write
        by users read
        by dn.base="cn=rootdn,dc=unixum,dc=lan" write
        by anonymous auth

così possono leggere solo gli utenti che si sono autentificati.
Il tutto funziona, infatti facendo:

$ ldapsearch -x  -D "uid=micron,ou=users,dc=unixum,dc=lan" -b 
"ou=addressbook,dc=unixum,dc=lan" "mail=*utente*" -W

mi restituisce dei risultati corretti.
NB: uid=micron specifica un utente creato ad hoc in ldap:

dn: uid=micron,ou=users,dc=unixum,dc=lan
uid: micron
userPassword: {md5}Ch3_'Te_Fr3g4?
objectClass: top
objectClass: account
objectClass: simpleSecurityObject

Al che in KAddressBook ho messo i seguenti parametri nel campo "BIND DN" (nel 
pannello di configurazione per ldap):
uid=micron,ou=users,dc=unixum,dc=lan

Purtroppo le ricerche non restituisce nulla, infatti guardando il debug di 
slapd risulta:

=> id2entry_r( 245 )
=> ldbm_cache_open( "id2entry.dbb", 73, 600 )
<= ldbm_cache_open (cache 1)
=> str2entry
>>> dnPrettyNormal: <cn=Utente pippo,ou=addressbook,dc=unixum,dc=lan>
=> ldap_bv2dn(cn=Utente pippo,ou=addressbook,dc=unixum,dc=lan,0)
<= ldap_bv2dn(cn=Utente pippo,ou=addressbook,dc=unixum,dc=lan,0)=0
=> ldap_dn2bv(272)
<= ldap_dn2bv(cn=Utente pippo,ou=addressbook,dc=unixum,dc=lan,272)=0
=> ldap_dn2bv(272)
<= ldap_dn2bv(cn=utente pippo,ou=addressbook,dc=unixum,dc=lan,272)=0
<<< dnPrettyNormal: <cn=Utente pippo,ou=addressbook,dc=unixum,dc=lan>, 
<cn=utente pippo,ou=addressbook,dc=unixum,dc=lan>
<= str2entry(cn=Utente pippo,ou=addressbook,dc=unixum,dc=lan) -> 0x81965c0
<= id2entry_r( 245 ) 0x81965c0 (disk)
=> test_filter
    SUBSTRINGS
begin test_substrings_filter
=> access_allowed: search access to "cn=Utente 
pippo,ou=addressbook,dc=unixum,dc=lan" "mail" requested
=> acl_get: [1] check attr mail
<= acl_get: [1] acl cn=Utente pippo,ou=addressbook,dc=unixum,dc=lan attr: mail
=> acl_mask: access to entry "cn=Utente 
pippo,ou=addressbook,dc=unixum,dc=lan", attr "mail" requested
=> acl_mask: to all values by "", (=n)
<= check a_dn_pat: self
<= check a_dn_pat: users
<= check a_dn_pat: cn=rootdn,dc=unixum,dc=lan
<= check a_dn_pat: anonymous
<= acl_mask: [4] applying auth(=x) (stop)
<= acl_mask: [4] mask: auth(=x)
=> access_allowed: search access denied by auth(=x)
<= test_filter 50
ldbm_search: candidate entry 245 does not match filter

Ergo kaddressbook non si è autentificato, temo che provi ad autentificarsi 
usando cyrus sasl, proprio come fa di base anche ldap a meno che non si usi 
l'opzione -x (che come avrete notato ho sempre usato).

Adesso mi si presentano tre soluzioni:
1) ricompilare openldap senza il supporto a cyrus sasl
2) fare funzionare cyrus sasl
3) impostare l'autentificazione semplice (quella -x) al posto di sasl come 
default

La 1 mi pare proprio da stupidi, per la 2 ho provato ma non sono riuscito 
(ovviamente i test prima li faccio con i programmi da linea di comando, solo 
dopo con le gui), per la 3 non ho trovato nessuna opzione.

Ed ecco, dopo un post chilometrico, la tanto attesa domanda: nessuno sa come 
diavolo funziona cyrus sasl? come la interfaccio con ldap (alcune guide 
prevedono l'uso di kerberos, aiuto!!!!)

grazie in anticipo
	micron

PS: sorry per il post lunghissimo, ma so che l'argomento interessava ad un po' 
di gente
- --
|§ micron<- ICQ #118796665
|§ GPG Key:
|§  ~ Keyserver: pgp.mit.edu
|§  ~ KeyID: 6D632BED

~ "Progress is merely a realisation of utopias" ~
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.2.4 (GNU/Linux)

iD8DBQFA6VofADGi/m1jK+0RArLNAJ4opr442mzVyHvQVFXbiw6pfWsDtQCcDPtS
g6ORlJ3MKl73JRHoqJlOUUI=
=E01X
-----END PGP SIGNATURE-----


Maggiori informazioni sulla lista bglug