Il servizio di directory LDAP

La logica e gli strumenti in grado di utilizzare uno standard de facto. Pubblicato sul numero 14 di Netstime di Giugno 2001

Spesso non conosciuti abbastanza, i servizi di directory sono una componente fondamentale della gestione delle informazioni su una rete di grosse dimensioni. Una directory è una struttura paragonabile a un database: ci si possono inserire delle informazioni e in seguito recuperarle; un servizio di directory è semplicemente una directory più il protocollo di rete usato per accedervi. Il servizio di directory di cui tratteremo in questo articolo, oramai uno standard, è LDAP (Lightweight Directory Access Protocol). Originariamente sviluppato come front-end del più complesso protocollo X.500, il servizio di directory sviluppato dall'OSI, LDAP ha subito due revisioni grazie a cui è divenuto un protocollo leggero per l'accesso alle informazioni. Una caratteristica fondamentale di LDAP è che definisce come un client possa accedere alle informazioni sul server, non come queste debbano essere organizzate: ciò gli permette di essere un front-end che può essere utilizzato per un qualsiasi servizio che fornisca dati.

Figura: ESEMPIO DI DIT (DIRECTORY INFORMATION TREE)




Un esempio

per capire meglio LDAP



Un server LDAP contiene degli elementi (entry) che appartengono a classi diverse. Una classe definisce una serie di coppie attributo-valore, obbligatorie o opzionali, che vengono associate a ogni istanza di quella classe; ogni entry ha quindi molti attributi, ognuno dei quali può avere uno o più valori a seconda della configurazione del server. Ogni entry è univocamente identificato da un DN (Distinguished Name). I DN sono organizzati gerarchicamente in una struttura ad albero: come i FDQN (Fully Qualified Domain Name) di un DNS, i DN di LDAP consistono nel nome dell'elemento seguito dalla serie di elementi che si attraversano per arrivare fino alla radice dell'albero. La struttura organizzativa di una directory LDAP è pertanto chiamata DIT (Directory Information Tree).

Per esempio il DN "cn=Andrea Iacono, ou=Collaboratori, o=www.netstime.com" appartiene alla classe Person, che definisce un attributo obbligatorio "cn" (Common Name) che rappresenta il nome della persona; la classe Person definisce anche altri attributi obbligatori, ma solo cn è richiesto per definire il DN. L'attributo "ou" dell'esempio appartiene alla classe OrganizationalUnit, mentre la classe Organization (identificata nel DN dall'attributo "o") rappresenta l'azienda. Ogni server LDAP ha una gerarchia di DN di sua competenza, definiti a partire da un DN base: nel nostro esempio il server LDAP ha competenza su tutti i DN che hanno come attributo "o" della classe Organization il valore "www.netstime.com".

CLASSI PREDEFINITE DALLO STANDARD LDAP


Sebbene sia possibile definire nuove classi, o estendere le esistenti, lo standard LDAP definisce una serie di classi predefinite per rappresentare gli elementi e per ognuna di queste una serie di attributi.



Ci sono diversi livelli

di autenticazione



Il protocollo LDAP prevede l'autenticazione dei client per fornire privilegi di lettura, inserimento, ricerca e confronto dei dati; ad ogni livello dell'albero delle informazioni è possibile definire privilegi per singoli utenti, gruppi o "se stessi" (che permette a un utente autenticato di accedere ai propri dati). LDAP prevede anche una modalità di accesso ai dati senza autenticazione: sta all'amministratore di sistema decidere quali informazioni rendere disponibili a chi le richiede senza autenticarsi. LDAP definisce sei operazioni che possono essere effettuate sui dati dell'albero: il "binding" (autenticazione) al server, la ricerca di dati, il confronto di entry diverse, l'inserimento di una entry, la sua cancellazione e la sua modifica. Oltre a queste funzionalità inerenti i dati contenuti nell'albero sono definite altre tre operazioni che riguardano più da vicino il funzionamento dei server LDAP: il riferimento a un altro server è utilizzato per estendere l'albero di un server con i dati di un altro server (i dati dei due server non vengono fusi: ogni server inoltra a quello di competenza le richieste che non può soddisfare); la replica dei dati su un altro server, per una maggiore disponibilità dei dati; la cifratura per garantire sicurezza nell'interazione client-server.



Da Sun un package Java

per le directory



Da qualche anno Sun fornisce un insieme di API in Java per accedere ai servizi di directory; l'architettura del framework è stata disegnata in maniera così astratta da rendere possibile l'accesso a server LDAP, file system o server DNS: un qualsiasi servizio di directory. Dalla versione 1.1 del JDK, il package JNDI (Java Naming and Directory Interface) è disponibile come estensione,e, dall'ultima release, la 1.3, il package JNDI è incluso direttamente nel J2SE (Java 2 Platform, Standard Edition). L'architettura JNDI fornisce un'interfaccia chiamata Context che rappresenta un nodo dell'albero; l'interfaccia DirContext la estende per poter manipolare le entry di un servizio di directory LDAP e rappresenta il punto di accesso all'albero.

LISTATO INIT.JAVA


Nel listato init.java per prima cosa viene specificato chi fornirà il servizio di naming per quest'istanza del DirContext: la classe "com.sun.jndi.ldap.LdapCtxFactory" rappresenta un server LDAP e viene fornita insieme a tutta l'architettura; successivamente viene specificato l'indirizzo del server e la porta su cui sta girando; il tipo di autenticazione può essere "none" per la consultazione dei dati senza autenticarsi, "simple", come nel nostro esempio, per specificare un "Distinguished Name" e una password che vengono inviati al server in chiaro, oppure "strong" per specificare uno dei numerosi metodi supportati per cifrare l'invio dei dati. Le due righe successive specificano il DN tramite cui autenticarsi e la relativa password; l'ultima istruzione ci restituisce un oggetto della classe "DirContext" grazie a cui possiamo finalmente interagire con il server LDAP.

LISTATO LIST.JAVA


Una volta ottenuto il "DirContext" lo utilizziamo per interrogarlo sui dati contenuti all'interno del server LDAP (listato list.java); il metodo "list" ci permette di specificare a partire da quale punto dell'albero recuperare i dati che sono su quel livello e in tutti i livelli sottostanti: nel nostro esempio siamo partiti dalla radice dell'albero, perché vogliamo vedere tutto il contenuto del server LDAP. Il risultato di quest'interrogazione restituisce un'estensione di "Enumeration" che ci permette di ciclare su tutti gli elementi tramite il ciclo for.

Tramite la classe NameClassPair possiamo ottenere un'istanza di una entry di cui possiamo avere il nome (tramite il metodo "getName"). Dal "DirContext" possiamo recuperare tutti gli attributi di una entry grazie al metodo "getAttributes" a cui va specificato di quale entry si vogliono gli attributi. Questo metodo restituisce ancora una "NamingEnumeration" che può essere ciclata e dove ogni elemento rappresenta un diverso attributo della entry; ma, dato che ogni attributo può avere più di un valore, anche la classe "Attribute" fornisce un metodo "getAll" che restituisce una "NamingEnumeration" per ciclare, questa volta, su tutti i diversi valori di uno stesso attributo.

Nel listato d'esempio l'intero albero viene scritto sullo standard output mediante le chiamate "System.out.print".



Come ricercare e inserire una entry



Un'altra operazione che possiamo eseguire sull'albero è, ovviamente, la ricerca di una entry specifica (listato search.java);

LISTATO SEARCH.JAVA

per fare questo istanziamo un oggetto della classe "Attributes" per indicare quale entry vogliamo cercare. Il metodo "search" ha bisogno di un parametro che indica da quale punto dell'albero cercare quella entry; la solita "NamingEnumeration" permette di ciclare sulle entry che soddisfano i criteri di ricerca e di stamparle a video, oppure, se la "NamingEnumeration" è vuota, significa che la ricerca non ha trovato alcuna entry.

LISTATO ADD.JAVA


Per inserire una entry nell'albero (listato add.java) basta istanziare l'oggetto da inserire nell'albero e poi chiamare il metodo "bind" e indicare dove posizionare e quale oggetto inserire. Ciò che invece è più complicato è scrivere la classe che permette di generare oggetti inseribili in un albero LDAP.

LISTATO ENTRYTEST.JAVA

Nel listato EntryTest.java viene esemplificata una classe di esempio chiamata EntryTest (sono stati omessi per motivi di spazio tutti i 50 metodi non implementati nella DirContext a ciascuno dei quali va fatta sollevare l'eccezione OperationNotSupportedException se non interessa supportarlo).La rimozione della entry è ancora più semplice:



// rimuove la entry specificata dal DN passato come parametro

ctx.unbind("uid=test, ou=ServiceAdmin, o=myserver.org");



Ovviamente, sia per inserire che per rimuovere delle entry bisogna avere i privilegi di amministrazione necessari per poterlo fare; per avere questi privilegi è necessario rivolgersi all'amministratore del server LDAP.

LASCIA UN COMMENTO

Inserisci il tuo commento
Inserisci il tuo nome