[Plone-IT] Products.PloneLDAP e Self LDAP Denial of Service

Michele Mordenti michele.mordenti a gmail.com
Sab 1 Set 2012 08:49:18 UTC


Come avrete intuito dai miei ultimi post su questa lista mi devo
occupare di nuovo di autenticazione su siti Plone.
Le condizioni al contorno sono:
 - utenti e gruppi (con relativo mapping gruppo<->ruolo) su fonte
esterna: nello specifico Active Directory;
 - autenticazione sicura: apache con mod_rewrite per switch automatico
su SSL per sessioni autenticate.

Il secondo punto sembra funzionare a modino, sul primo al contrario,
sono in alto mare.

Prodotti utilizzati:
 * Plone 4.1.4 (Python 2.6.6)
 * Products.PloneLDAP 1.1
 #Required by:
 #Products.PloneLDAP 1.1
 * Products.LDAPMultiPlugins = 1.14
 #Required by:
 #Products.PloneLDAP 1.1
 * Products.LDAPUserFolder = 2.23
 #Required by:
 #Products.LDAPUserFolder 2.23
 * dataflake.fakeldap = 1.0
 #Required by:
 #Products.LDAPUserFolder 2.23
 *python-ldap = 2.4.10

plone.app.ldap = 1.2.8 non mi serve, IMHO fa solo casino nel pannello
di controllo. In ogni caso l'ho provato e il problema che tengo non
cambia di una virgola.

Ma quale è il mio problema?
Penso di aver configurato il "Plone Active Directory Plugin" nel
migliore dei modi seguendo mille guide e, per funzionare funziona,
ma... E' LENTO!

Che LDAP non sia un fulmine nel risolvere le query è noto da tempo, ma
il problema, per quel che ho scoperto sino ad adesso, è che Zope/Plone
fa centinaia di query LDAP per ogni pagina richiesta dal singolo
utente senza tenere in cache praticamente nulla.

Esempio:
Con l'utente già "loggato" quando chiedo di servirmi una pagina ottengo:
"tcpdump tcp port 389" -> 2032 packets captured

Analizzando i pacchetti con wireshark trovo centinaia di query LDAP
identiche: binding con manager per risolvere sempre lo stesso utente e
lo stesso gruppo.
Sessione di navigazione di esempio: login -> visualizzazione pagina
News ed eventi, creazione di folder "Prova" e ritorno a root del sito.
Ottengo 9731 pacchetti sulla porta 389
Con il filtro "ldap.searchRequest" trovo 2431 pacchetti.

Nall'apposita pagina ZMI ho i parametri di cache settati a 600
secondi: per 10 minuti in teoria non dovrebbe disturbare LDAP... ma la
pratica (molto empirica) sembra dire l'esatto contrario.

Ora... come si risolve questa cosa?
Possibile che sia l'unico che abbia esigenza di mappare esternamente
utenti,gruppi e ruoli?

Ho pensato di:
1) fare una replica di utenti e gruppi AD in un LDAP su localhost, in
modo almeno da segare via l'overhead della rete e non massacrare oltre
il server M$
La sincro tra AD ed OpenLDAP non è banale, più agevole risulterebbe
con il 389 Directory Server di RedHat, ma uso debian... quindi mi devo
anche sbattere per fare il pacchetto oltre che impararne il
funzionamento (ho sempre usato OpenLDAP).

2) In alternativa mi costruisco a mano uno script Python che ogni TOT
mi faccia il sync tra AD e OpenLDAP. Si può fare, ci sono alcuni
spunti in rete (OpenXchange, GoogleSync ... ) ma sicuramente non me la
cavo in 60 minuti di lavoro. Poi lo script è da mantenere...
In questo caso però potrei leggere da AD e scrivere direttamente su
Zope saltando LDAP, ma devo sapere bene cosa scrivere e dove in
Zope/Plone.
Lo sfasamento temporale dei dati dovuto alle sync periodiche sarebbe
tollerabile.

3) Patchare Products.PloneLDAP e tutto lo stack sotto per rendere
efficace la cache, ma devo sapere bene cosa scrivere e dove nei
relativi pacchetti.

Insomma... da dove devo iniziare per farmi del male?

Buon fine settimana.

-- 
Michele Mordenti


Maggiori informazioni sulla lista Plone-IT