Introduzione ai Directory Services & LDAP (02/06/2017) Nel corso dell’ultimo decennio le directory LDAP sono diventate il centro nervoso delle infrastrutture informatiche ai fini di fornire spazi di nomi, localizzazione, gestione, sicurezza e numerosi altri servizi che tradizionalmente vengono forniti dai sistemi operativi. Cos’è una Directory Anche se non ce ne rendiamo conto tutti abbiamo familiarità con vari servizi di directory. Costituiscono esempi di directory della vita di tutti i giorni (offline directories) gli elenchi telefonici (pagine bianche e gialle), guide TV, cataloghi per gli acquisti, … E’ chiaro che le directory aiutano a reperire informazioni, descrivendo ed organizzando le stesse in modo da renderle facilmente reperibili. Le directory del mondo computazionale, ovvero le online directories, differiscono dalle offline principalmente per i seguenti motivi: sono dinamiche sono flessibili possono essere rese sicure possono essere personalizzate A loro volta le online directories possono essere suddivise nelle seguenti categorie: Application specific directories: sono in bundle o integrate nell’ applicativo (Lotus Notes Name&Address book, Exchange (versioni pre-2000) directory Network Operating System (NOS) based directories: Novell e-Directory, Microsoft Active Directory, SUN NIS/NIS+ Purpose specific directories: definite per uno scopo specifico e non estensibili come l’ Internet Domain Name System (DNS) General purpose, standard based directories: implementate per soddisfare le esigenze di varie applicazioni e servizi (LDAP e X.500 directories) Le directories sono dinamiche Le directory offline sono relativamente statiche: l’elenco telefonico ad esempio viene rivisitato su base annuale, le guide TV su base settimanale, … Al contrario le online directories sono mantenute molto più aggiornate con criteri decisi dai relativi amministratori. Spesso sono considerate come migliori le directories che possiedono autoritativamente l’informazione più recente, in modo che le modifiche siano rese immediatamente disponibili all’utenza. Il vantaggio degli aggiornamenti delle directory online consente di introdurre applicazioni che non trovano analogia nelle directories offline. Ad esempio una directory che contiene informazioni aggiornate sui dipendenti di una azienda potrebbe essere consultata in tempo reale da lettori di badge che autorizzino l’accesso ad edifici e stanze dell’azienda stessa; nel caso di trasferimenti le informazioni aggiornate nella directory possono esse consultate per dirottare automaticamente telefonate, fax, … Un altro vantaggio delle directories online consiste nel distribuire e delegare le responsabilità di aggiornamento/modifica delle informazioni: quanto più vicina è l’informazione alla sua sorgente tanto più accurata e tempestiva sarà l’aggiornamento dell’informazione. Le directories sono flessibili Flessibilità dei contenuti Al contrario delle directories offline quelle online sono estensibili senza dover essere ripianificate o ridistribuite. L’aggiunta di nuovi tipi di informazioni infatti viene riflessa automaticamente ed immediatamente dato che i client non posseggono una copia della directory stessa ma interrogano direttamente quella online. Rispetto alle directories offline inoltre l’estensibilità dei contenuti ha costi trascurabili (spazio su disco maggiore). Flessibilità organizzativa L’elenco telefonico tradizionale contiene nomi, numeri telefonici ed indirizzi organizzati in modo da facilitare le ricerche per nome. Cercare un nome per indirizzo o numero di telefono è operazione quasi impossibile. Emerge quindi che nelle directory di tipo offline l’organizzazione dei contenuti è limitata sia a causa del supporto utilizzato (es. cartaceo) che dalle capacità dell’utilizzatore (senza formazione adeguata). Al contrario le directory online supportano simultaneamente molteplici tipi di organizzazione dei dati. Ad esempio un elenco telefonico online potrebbe essere consultato e cercato per qualsiasi tipo di campo o attributo. Le directory online inoltre consentono tipi avanzati di ricerca impossibili in altri tipi di directory (ad esempio le ricerche di tipo “like”, substring, …) Le directories possono essere sicure Le directory offline sono spesso prive di alcun tipo di sicurezza. Un elenco telefonico cartaceo ad esempio è pubblico e tutte le informazioni in esso contenute sono immediatamente disponibili. La causa principale dell’insicurezza delle directories offline è il metodo con cui sono distribuite (ovvero distribuzione su vasta scala a disposizione di tutti); non c’è modo inoltre di identificare chi consulta la directory e di limitare le informazioni accessibili. Le directories online sono in grado di risolvere questi problemi. Esse consentono di controllare l’accesso alle informazioni identificando l’utilizzatore attraverso processi di autenticazione. L’autenticazione affiancata dalle Access Control Lists (ACL), indirizzo IP del client, data/ora, … determina il tipo di autorizzazione del client ad accedere a quali informazioni della directory. Le directories possono essere personalizzate Le guide TV sono generalmente differenti su base regionale/nazionale. Sarebbe bello proporre delle guide che consentano delle “viste” personalizzate in base alle preferenze dell’utente finale, preferenze che però non devono essere note a terzi. Le directories online consentono di soddisfare entrambe i requisiti: tramite un processo di profilazione dell’utenza (protetta ai fini della privacy con opportune ACL) vengono archiviate le personalizzazioni su base utente che consentiranno di ottenere delle query che soddisfano il cliente finale. Allo stesso modo un negozio virtuale potrebbe proporre al proprio cliente, in base alle sue preferenze, una lista di prodotti in promozione totalmente personalizzata. Directories e Database Le differenze tra un database e una directory (general purpose) cadono nelle seguenti categorie: Rapporto operazioni Read/Write Estensibilità Distribuzione Replicazione Performance Standard supportati Transazioni e “Join” Rapporto operazioni R/W Una delle caratteristiche principali di una directory è data dal fatto che le operazioni di lettura e ricerca sono di gran lunga superiori a quelle di scrittura o modifica. Questo non sempre è vero per i database. In database per la registrazione di auditing/logging le operazioni di lettura sono rare e vengono fatte solo quando si verificano determinate condizioni (ad esempio per fornire dei report mensili). Generalmente una directory è letta 1000/10000 volte più che scritta o modificata. Tale rapporto è giustificato dalla natura delle informazioni solitamente inserite in una directory: si pensi ad esempio a quante volte cambia un numero di telefono rispetto al numero di telefonate ricevute, o quante sono le mail ricevute rispetto ad un cambio di indirizzo. Questi parametri sono fondamentali per il design della directory. La massima attenzione andrà all’ottimizzazione per ottenere il massimo delle performance nelle operazioni di lettura, mentre la modalità delle operazioni di scrittura dovrà essere pianificata tenendo conto delle implicazioni sulle procedure di replicazione. Estensibilità Generalmente le directories sono estensibili con maggior facilità rispetto ai database. Con il termine directory schema ci si riferisce al tipo di informazioni che possono essere archiviate in una directory e alle regole che queste devono osservare. Le directory non sono mai limitate ad uno schema fisso, ma esso può essere esteso per soddisfare le esigenze di utenti e applicazioni. Ogni directory parte da un insieme predefinito di tipi di informazioni che possono essere archiviate, ma ogni realtà spesso sente l’esigenza di definire dei nuovi attributi. AL contrario raramente un database consente di inserire nuovi tipi di dati con nuova semantica. Distribuzione Per distribuzione dei dati s’intende porre le informazioni in server diversi connessi in rete. Raramente accade di splittare database su più server, sia perché il livello di distribuzione è poco scalabile (qualche sito), sia perché le operazioni di query che interessano più siti sono poco performanti. Al contrario il concetto di distribuzione è fondamentale per la pianificazione delle directories. I principali motivi di distribuzione sono di autority/amministrazione oppure di carattere logistico (per uffici, sedi geografiche, …). Oltre a questi motivi spesso una directory viene distribuita su vari server per motivi di performance (carico delle query distribuite su vari server) e per motivi di ridondanza delle informazioni (la rottura di un server non comporta la caduta del servizio, o solo di parte di esso). Replicazione La replicazione è il processo con cui si mantengono copie multiple dei dati in punti fisicamente differenti. I motivi per cui viene replicata una directory ( o un database) sono per migliorare l’affidabilità, la disponibilità, la prossimità (dei dati rispetto ai client) e le performance (maggiore throughput, scalabilità orizzontale). Anche i database supportano la replicazione, tipicamente per un numero ridotto di repliche; al contrario le directory supportano varie repliche. Nel caso dei database il problema principale è la consistenza dei dati tra le repliche, problema che non consente una grossa scalabilità (limitato numero di hops) né l’utilizzo di link deboli o intermittenti. Performance La performance dei database viene generalmente misurata in numero di transazioni per secondo. Lo stesso avviene per le directory generalmente misurata in numero di query per secondo. Le transazioni di un database sono di solito operazioni più complesse di una query, inoltre le performance di scrittura (update) sono meno critiche per una directory rispetto ad un database. Mentre i database vengono pianificati a servizio di un numero limitato di applicazioni le directory stanno diventando il centro nervoso delle infrastrutture informatiche utilizzato da un numero sempre crescente di applicazioni sia a livello aziendale che a livello molto più esteso (attraverso Internet). Le performance di una directory quindi devono essere capaci di soddisfare il tipo ed il numero di query a cui dovrà rispondere. Standard ed interoperabilità Nel mondo dei database ci sono molti pseudostandard, a partire dal modello relazionale Structured Query Language (SQL). Questi pseudostandard consentono di migrare facilmente da un sistema database ad un altro, i concetti appresi su un database consento spesso di apprendere con facilità quelli di altri vendor, ma questi standard non forniscono una vera interoperabilità. Al contrario del mondo delle directories, dato che le applicazioni di qualsiasi vendor devono essere in grado di accedere all informazioni, il problema dell’interoperabilità attraverso degli standard è critico. Il Lightweight Directory Access Protocol (LDAP) fornisce i modelli e i protocolli utilizzati dalle directories attuali. Grazie ad LDAP vengono disacoppiati le directories dai client. Transazioni e Join Le directory consentono transazioni relativamente facili, singole operazioni su singole entry; al contrario i database consentono complesse transazioni che possono interessare svariati record compiendo serie di operazioni. I database supportano inoltre il rollback delle transazioni ai fini di ripristinare lo stato originale dei dati nel caso in cui si verifichino degli errori nella serie di operazioni effettuate dalla transazione stessa. Solo alcuni software directory service supportano, per mezzo di estensioni proprietarie di LDAP, il concetto di transazione database-style. I database relazionali supportano inoltre i join, tipi di query che prelevano dati da sorgenti multiple in una risultante basandosi su chiavi comuni. La maggior parte delle directory non supporta affatto il join. Applicazioni delle directories Ricerca di informazioni Come è stato già menzionato una delle applicazioni più diffuse delle directories sono le ricerche di informazioni. L’esempio classico è costituito dai phone book; molto diffusi anche su internet (Switchboard, Yahoo People Search, Bigfoot, …) hanno molte analogie con le rubriche cartacee ma con importanti differenze nelle modalità di ricerca, nella flessibilità della navigazione delle informazioni. Gestione centralizzata di oggetti e configurazioni In ambienti distribuiti le directories forniscono una gestione centralizzata di oggetti. La categoria più frequente di questi oggetti è costituita da utenti e gruppi, forse il servizio di gestione più importante fornito da una directory. Sino a qualche anno fa ogni applicazione ed ogni servizio avevano la propria directory di gestione utenti. La situazione può essere conveniente sino a quando è sentita l’esigenza di utilizzare una sola di queste applicazioni, diventando ingestibile al crescere delle directories. La scomodità di dover gestire molteplici directories non è solamente più costosa dal punto amministrativo ma anche scomoda per l’utente finale che si vede costretto a ricordare password diverse per servizi diversi (generalmente directory services proprietari non sono facilmente sincronizzabili). Al contrario, nel caso di una directory centralizzata, gli amministratori modificano le informazioni (es. creazione utenti) in un unico punto ed ogni applicazione nuova o esistente utilizzerà la directory stessa al posto di quelle proprietarie. Un'altra importante area in cui la directory risolve problemi di gestione è l’archiviazione delle configurazioni delle applicazioni. Storicamente la configurazione delle applicazioni viene archiviata localmente in file o altri componenti specifici dei sistemi operativi (ad esempio il registro di sistema per Microsoft Windows). Se questa soluzione è vantaggiosa e comoda per alcuni applicativi non lo è affatto per le network-applications, specie se implementate su vasta scala. Si consideri ad esempio i server Web. Una grande organizzazione potrebbe avere centinaia di server web, tutti con un set di configurazioni comuni. In condizioni di gestione non centralizzata ogni modifica comporta la revisione della configurazione di centinaia di server diversi. Archiviando la configurazione in una directory centralizzata invece si ottiene una configurazione unica, condivisa e accessibile da rete. Lo stesso vale per la profilazione degli utenti: informazioni come la home directory, i parametri di configurazione degli applicativi, … per forza di cose devono essere archiviate in un deposito centralizzato, specie se gli utenti sono roaming (cambiano spesso postazione di lavoro). Sicurezza Un’altra applicazione interessante delle directories è relativa alla sicurezza, in particolare come supporto ai sistemi a chiave pubblica (PKI). La directory può essere infatti utilizzata sia per l’archiviazione dei certificati digitali che per la gestione dei ciclo di vita dei certificati (pubblicando ad esempio le CRL ovvero le liste di revoca dei certificati). Nelle applicazioni che utilizzano i certificati (ai fini dell’autenticazione, le operazioni di firma e crittografia, …) è fondamentale un metodo di localizzazione dei certificati degli utenti con cui si interagisce. Ai fini di queste applicazioni il certificato digitale diventa semplicemente un attributo aggiuntivo dell’oggetto utente all’interno della directory. In questo modo il certificato può essere reperito allo stesso modo di informazioni come il numero di telefono o l’indirizzo email. Storia e origini di LDAP X.500 Non è possibile discutere delle origini di LDAP senza parlare di X.500, standard nato dagli sforzi di CCITT e ISO nel 1988. Esso possedeva numerose qualità: era stato il primo vero general purpose directory system, estensibile ai fini di servire il maggior numero di applicazioni disponeva di un ricco insieme di operazioni di ricerca era stato sviluppato in modo da favorire implementazioni notevolmente distribuite era open standard non controllato da alcun vendor né legato ad alcun sistema operativo, applicativo o teconologia di networking In pratica X.500 non ebbe il successo previsto. Le prime implementazioni infatti ebbero problemi di scalabilità, la complessità degli standard e della sua implementazione resero difficile l’interoperabilità di directory X.500 diverse, l’insuccesso del modello di rete OSI su cui erano basate le prime implementazioni (adattate in seguito a TCP/IP) assieme alla difficoltà della suite dei suoi protocolli di accesso (DAP, DSP, DOP, DISP) spinsero i membri del OSI-DS Working Group assieme all’IETF allo sviluppo di un protocollo di accesso più semplice LighterDAP ovvero LDAP. Le prime specifiche di LDAP vennero pubblicate nella RFC 1487 del luglio 1993. La prima implementazione diffusa ampiamente fu LDAPv2 pubblicata nella RFC 1777. Gli sviluppatori LDAP semplificarono il pesante X.500 DAP Protocol nelle seguenti aree: Funzionalità: semplificazione del protocollo rispetto a DAP con l’eliminazione di operazioni ridondanti o scarsamente usate del protocollo di origine Rappresentazione dei dati: la maggior parte degli elementi viene rappresentata come semplici stringhe di testo (wrappate all’interno di messaggi con codifica binaria per una maggiore efficienza) Codifica: viene utilizzato un sottoinsieme delle regole di codifica di X.500, semplificandone notevolmente l’implementazione Trasporto: LDAP “gira” su TCP che rispetto al poco diffuso OSI ha una implementazione notevolmente semplificata e performante Nel 1997 LDAP è entrato nella fase più matura della sua evoluzione con il rilascio della versione 3 (LDAPv3) che migliora LDAPv2 nelle seguenti aree: Internazionalizzazione: utilizzo del character set UTF-8, codifica dell’universale Unicode Referrals: meccanismo standard per fornire puntatori ad altri server che consente di implementare LDAP in una modalità bottom-up sullo stile dei server WWW Security: il supporto per SASL e TLS viene aggiunto per migliorare il livelli di sicurezza Estensibilità: LDAPv3 può essere esteso per supportare nuove operazioni o controlli In questi anni tutti i maggiori vendor di sistemi operativi e servizi di rete anno adottato lo standard LDAPv3 abbandonando definitivamente le directories proprietarie: Netscape Directory Server, Sun ONE Directory Server, Microsoft Active Directory, IBM Directory Server, Novell eDirectory, Oracle Internet Directory, OpenLDAP slapd server. Introduzione a LDAP Con il termine LDAP ci si riferisce alle seguenti cose: Lightweight Directory Access Protocol, un protocollo standard, estensibile, utilizzato per accedere a directory services Un set di modelli che forniscono una quida all’uso delle directory: information model che descrive cosa si può inserire in una directory; naming model che descrive come organizzare i dati nella directory; functional model che cosa si può fare con i dati della directory e security model che descrive come i dati possono essere protetti da accessi non autorizzati. LDAP Data Interchange Format (LDIF), un formato (text) standard per lo scambio di dati tra directory LDAP server software, commerciale o open-source LDAP application programming interface (APIs) utilizzate per lo sviluppi di applicazioni client LDAP Il protocollo LDAP Il protocollo LDAP è message-oriented. Il client inoltra un messaggio contenente una richiesta al server e questi processa la richiesta rispedendo il risultato al client con una serie di uno o più messaggi. Ad esempio, quando il client LDAP ricerca la directory per una specifica entry, spedisce un messaggio di richiesta al server che contiene un message ID univoco generato dal client. Il server preleva le informazioni richieste dal suo DB e la rispedisce al client con un ulteriore messaggio, seguito da un secondo messaggio detto result-code. Tutte le risposte dal server al client sono identificate dal message ID fornito dalla richiesta del client. Se la richiesta del client corrisponde a varie entry queste vengono spedite ciascuna in un messaggio distinto contenente il DN (distinguished name) dell’oggetto trovato. Il protocollo LDAP consente al client di inoltrare richieste multiple in una sola volta. In questo caso il client genera un message ID univoco per ciascuna richiesta. Le risposte del server contengono anche il message ID che viene utilizzato dal client per riordinare le risposte (le operazioni di sort dei risultati non sono di competenza del protocollo LDAP ma della LDAP-SDK). LDAP protocol operations Le operazioni supportate dal protocollo LDAP possono essere riassunte in 3 categorie: 1 2 3 operazioni di interrogazione: search, compare operazioni di update: add, dolete, modify, modify DN (=rename) operazioni di autenticazione e controllo: bind, unbind, abandon L’operazione di binding comprende il nome della directory entry con cui il client intende autenticarsi con le credenziali (password, certificati digitali, …) Combinando alcune di queste semplici operazioni LDAP, eventuali client directory enabled possono effettuare operazioni di notevole utilità per gli utenti. Ad esempio un client di posta elettronica potrebbe effettuare il lookup degli indirizzi di posta ed eventualmente dei certificati digitali in una directory. Modelli operativi di LDAP LDAP Information Model: definisce i tipi di dati e le unità di base dell’informazione che può essere archiviata in una directory. Le unità di base dell’informazione sono gli oggetti (utenti, stampanti, computers, …) i quali sono composti da attributi che possono avere uno o più valori. Lo schema regola l’appartenenza degli attributi agli oggetti (se devono o possono appartenere ad un oggetto). LDAP naming Model: definisce come i dati vengono organizzati nella directory e come ci si riferisce ad essi. La flessibilità offerta da LDAP consente di organizzare le entry (oggetti) in base alle proprie esigenze ( per tipologie di oggetti piuttosto che per posizione geografica degli stessi, …). Il modello specifica che gli oggetti devono essere organizzati sotto forma di albero rovesciato, un concetto paragonabile alla struttura di un file system Unix. Il naming model è importante e necessario ai fini di fornire un nome univoco a ciascuna entry della directory in modo che non nascano ambiguità nel riferirsi ad un determinato oggetto. In LDAP il riferimento ad una entry viene chiamato Distinguished Name (DN). cn=Mario Rossi,ou=people,dc=example,dc=com Leggendo un DN da sinistra a destra si segue il percorso dall’oggetto alla radice della directory. La parte più a sinistra del DN prende il nome di Relative Distinguished Name. Oggetti che risiedono al di sotto del medesimo contenitore (stesso parent) devono avere RDN diversi. LDAP Functional Model Descrive le operazioni che possono essere effettuate sulla directory per mezzo del protocollo LDAP. Le operazioni si dividono in tre gruppi: operazioni di interrogazione (ricerche nella directory e reperimento di informazioni); operazioni di update (aggiunta, modifica e cancellazioni di oggetti/entry); operazioni di autenticazione e controllo (processo di identificazione del client e controllo della sessione). Oltre a questi gruppi di operazioni la versione 3 del protocollo LDAP definisce un framework per l’aggiunta di nuovi tipi di operazioni al protocollo (LDAP extended operations). LDAP Security Model IL protocollo LDAP è orientato alla connessione, il client apre una connessione verso il server LDAP ed effettua varie operazioni nella stessa connessione. Una delle operazioni è quella dell’autenticazione del client, in base alla quale il server accorda determinati privilegi. Il processo di autenticazione verso un servizio di directory viene chiamato binding. Il processo di autenticazione semplice consiste nel fornire un DN con la relativa password. Il server localizza la entry nella directory corrispondente al DN fornito dal client e verifica se la password corrisponde a quella archiviata nell’attributo userPassword. Quando un client non si autentica viene effettuato il binding anonimo; generalmente il set di privilegi in questo caso è minimo oppure talmente restrittivo da impedire qualsiasi operazione di lettura o ricerca nella directory. LDAPv2 supporta solamente l’autenticazione semplice in cui DN e password sono trasmesse in chiaro dal client al server. LDAPv3 supporta invece vari metodi di autenticazione grazie all’adozione del frameword SASL. SASL fornisce un metodo standard per il supporto di vari protocolli di autenticazione. LDAP Working Group ha definito dei metodi di autenticazione minimi che devono essere supportati dai server LDAPv3. Nel documento (RFC 2829) i server LDAP vengono suddivisi in 3 gruppi distinti ciascuno con diversi requisiti: 1 directory servers pubblici (read only) possono accettare l’autenticazione anonima (senza password) 2 server che supportano l’autenticazione basata su password devono supportare il meccanismo SASL DIGEST-MD5 (RFC 2831) 3 server che richiedono sessioni cifrate e autenticazione devono implementare l’estensione StartTLS (RFC 2830). Essa consente al client LDAP di richiedere la cifratura di tutto il flusso di dati e di implementare una mutua autenticazione utilizzando certificati digitali a chiave pubblica. TLS consente al client di iniziare una connessione “in chiaro” e di negoziare la crittografia e l’autenticazione dopo che la sessione è stata stabilita. Ciò consente al server LDAP che supporta TLS di avere client sicuri e non sicuri sulla medesima porta (389 è la porta di default per le connessioni LDAP). LDIF LDAP Data Interchange Format è un formato standard (text based) di descrizione delle directory entry come definito dalla RFC 2849. Esso consente di esportare i dati (entry e attributi) da una directory all’altra anche se i server utilizzano formati DB diversi. Esistono due tipi principali di file LDIF. Il primo descrive un set di directory entry, l’altro una serie di update che descrivono le modifiche che devono essere applicate alle directory entry. LDAP Server Software Un server LDAP è un programma che implementa il protocollo LDAP e gestisce il database che ospita i dati della directory. La maggiorn parte dei server LDAP include una suite di applicativi che aiutano nella gestione della directory. LDAP API Ai fini di facilitare lo sviluppo di applicazioni directory enabled sono state definite della API standard per l’accesso e l’update delle directory. Esistono varie implementazioni della LDAP C API (in fase di draft per LDAPv3) accanto alle quali si affiancano la Java API di Netscape, il modulo Net::LDAP o PerLDAP, JNDI (Java Naming and Directory Interface) di JavaSoft e ADSI di Microsoft. Estensioni LDAPv3 Il processo di standardizzazione IETF richiede molto tempo, motivo per cui quando viene rilasciato uno standard (LDAPv3) è preferibile che le successive integrazioni vengano implementate come “estensioni” e cono come nuovo standard (es. LDAPv4). Il protocollo LDAP ha tre meccanismi che estendono le funzionalità “core” del protocollo: contols extended operations Simple Authentication and Security Layer (SASL) LDAP controls Gli LDAP controls sono informazioni extra che vengono allegate ad una operazione LDAP esistente in modo da modificarla. Ad esempio il controllo Server-Side-Sorting consente di modificare una query LDAP standard in modo che l’output venga ordinato dal server prima di essere spedito al client. Ogni controllo contiene un object identifier (OID) che identifica univocamente il tipo di controllo ed un flag che indica la criticità del controllo stesso. Se un client imposta il flag isCritical il server deve considerare il controllo nell’eseguire l’operazione; in caso contrario il server è libero di ignorare il controllo se non è in grado di processarlo. Controlli multipli possono essere inseriti in una singola operazione. LDAP extended operations A volte c’è la necessità di implementare delle funzionalità completamente nuove che non vengono supportare dalle operazioni LDAP standard. In questo caso vengono definite delle estensioni del protocollo. Ogni LPDA extended operation viene identificata univocamente da un OID. E’ possibile utilizzare LDAP controls anche con le extended operations oltre che con le operazioni standard. SALS Authentication Mechanisms Uno dei grossi limiti di LDAPv2 è il fatto di non supportare protocolli do autenticazione forte al di fuori di Kerberos v4 (scarsamente diffuso). L’unico metodo utilizzabile è quello di effettuare un binding su distinguished name (DN) con password in chiaro. In LDAPv3 invece che implementare un singolo metodo di autenticazione forte (LDAPv3) gli sviluppatori hanno preferito incorporare un framework di autenticazione chiamato Simple Authentication and Security Layer (SASL) che consente la coesistenza di più protocolli di autenticazione. SASL consente quindi di aggiungere autenticazione e sicurezza (opzionale) ai protocolli orientati alla connessione (come LPAP). Le specifiche del framework SASL sono contenute nella RFC 2222. Un SALS Mechanism descrive il flusso di informazioni necessarie a supportare un determinato metodo di autenticazione. I meccanismi SASL sono definiti per vari protocolli di autenticazione (Keberos v5, DIGEST-MD5, EXTERNAL…). La RFC 2892 descrive come SASL viene utilizzato all’interno di LDAPv3. DIGEST-MD5 è un metodo di autenticazione che non trasmette password in chiaro sulla rete. EXTERNAL è un meccanismo SASL che consente a LDAP di riutilizzare credenziali già stabilite da un protocollo di livello più basso (comne SSL o TSL). Tutti i server LDAPv3-compliant che supportano autenticazione basata su password devono supportare il meccanismo DIGEST-MD5. Root DSE La root DSE è una speciale directory entry che contiene informazioni sul server, tra le quali la lista di tutti i controlli LDAP, delle extended operations e dei meccanismi SASL supportati. I valori degli attributi supportedExtension, supportedControl e supportedSASMechanisms indicano le estensioni ed i meccanismi supportati dal server. Ciclo di vita di un directory service Il ciclo di vita di una directory può essere spezzato in tre fasi: design, deployment, maintenance. Fase di Design: raccolta di informazioni sull’ambiente di introduzione del servizio di directory, sorgenti di dati, utenti e applicazioni directory-enabled Directory needs. Il servizio dovrà coprire le esigenze degli applicativi che si intendono sviluppare e degli utenti che gli utilizzeranno Data. Qualsiasi servizio di directory avrà bisogno di dati. Ci sono buone probabilità che esistano già notevoli fonti di dati utili a popolare il servizio. E’ necessaria una operazione di catalogazione delle sorgenti di dati, di identificazione dei proprietari delle informazioni stesse. Schema. La directory nasce per supportare applicazioni directory-enabled. Le applicazioni hanno dei requisiti che riguardano i dati contenuti nella directory, il loro formato e il modo in cui vanno interpretati. Tali caratteristiche vengono definite nello schema della directory Namespace. E’ il metodo con cui si organizzano e si definiscono i riferimenti ai dati di una directory. Topology. Determina il numero di server, il modo in cui i dati della directory vengono suddivisi sui server e la locazione fisica dei server stessi. Replication. E’ il processo con cui i dati della directory vengono mantenuti consistenti sui vari server per garantire un servizio più affidabile e performante (bilanciamento delle query ad esempio) Security. Pianificazione di protezione dei dati contenuti nella directory Fase di Deployment: determinazione del vendor del servizio di directory, implementazione di una configurazione di test per prove di stress, scalabilità, performance, affidabilità, ridondanza, fault tolerance del sistema. La fase prevede di sottoporre il sistema ad un gruppo limitato di utenti ai fini di ricevere un feedback. Al termine della fase il servizio di directory viene messo in produzione. Choosing directory software. La scelta del software è importante e complessa. Il software deve essere in grado di soddisfare le esigenze stabilite nella fase di design compatibilmente con i costi. Considerare tutti i fattori sia tecnici e pratici. Non optare per soluzioni per cui non c’è stata una esperienza diretta (hands on) Piloting. Richiede il set-up (generalmente in scala ridotta) della directory frutto della fase di design ai fini di sottoporla al feedback di un gruppo ristretto di utenti. Il piloting consente di valutare la fattibilità delle decisioni prese in merito allo schema, namespace, topology e replication oltre a valutarne la compatibilità con le applicazioni. Durante la fase di piloting vengono testate performance e scalabilità della directory per meglio comprendere come il servizio potrebbe assorbire eventuali esigenze future. Analyzing costs. E’ fondamentale osservare i costi del servizio da tutti i punti di vista: vanno infatti presi in considerazione non solo i costi di implementazione, ma anche quelli di manutenzione, … Obtaining user feedback. Gli utenti sono coloro per cui viene fatto tutto questo lavoro di pianificazione ed implementazione: il loro feedback quindi è fondamentale per la riuscita dell’intero progetto. Moving to production. Durante la fase di deployment è necessario pianificare lo spostamento del servizio di directory dallo stato di pilot a quello di produzione. Il processo deve essere quanto più possibile trasparente ed incrementale. Maintenance: la fase di manutenzione è quella che si protrae più a lungo e spesso a questo importante aspetto viene data l’attenzione minore durante la fase di design. Al contrario la manutenzione dovrebbe essere presa seriamente in considerazione durante la fase di design in modod da minimizzarne i costi successivi. Data backups and disaster recovery. Un importante aspetto per mantenere un servizio affidabile è quello di effettuare backup regolari dei dati della directory. E’inoltre di vitale importanza la verifica dei backup per essere sicuri che i dati possano essere recuperati nel caso di un disastro. Deve essere inoltre previsto un piano di recovery dell’intera directory. Data maintenance. Il compito più importante di un servizio di directory è quello di fornire informazioni aggiornate, per cui devono essere messe a punto delle procedure che mantengano quanto più possibile la directory aggiornata (da fonti di dati esterne) Monitoring. Una directory deve essere performante, per cui possono essere necessarie delle operazioni di tuning. Troubleshooting. Anche le directory pianificate perfettamente possono incorrere in qualche problema. Il successo di un servizio di directory è strettamente legato ad una buona operazione di troubleshooting Changing requirements. Per la loro natura i servizi di directory devono adattarsi anche ad esigenze future. Ogni volta che si rende necessaria una estensione/modifica (ad esempio l’introduzione di una nuova applicazione directory enabled) è necessario introdurre un mini ciclo di design rivisitanto dati, schema, namespacem replication e security della directory. Design: directory needs Prima di iniziare a lavorare sull’implementazione di un servizio di directory è bene capire il motivo per cui sentiamo l’esigenza di questo servizio; tali esigenze saranno il frutto di una completo processo di analisi e dovranno essere ben presenti durante tutta la fase di pianificazione. Analisi dell’environment Il primo passo per una corretto lavoro di pianificazione consiste nel conoscere e capire l’ambiente in cui questo dovrà operare. I processo di esplorazione deve riguardare le seguenti aree: Unità organizzative e distribuzione geografica: conoscere a fondo le l’organizzazione aziendale e la distribuzione geografica delle stesse influisce in maniera determinante la pianificazione del servizio specie nel numero dei server, sulle politiche delle deleghe della directory, sulle modalità di pianificazione della manutenzione dei sistemi (specie per realtà worldwide), … Computers: creare inventari sui tipi di computer presenti, elencandone i ruoli, le necessità di upgrade, … La varietà dei sistemi che devono accedere al servizio di directory può determinare la scelta del directory server La rete: si deve ottenere la mappa della rete o della porzione di rete che è interessata dall’implementazione del servizio. Ogni segmento di rete deve essere etichettato con il tipo di link, ampiezza di banda, affidabilità e costo del link. Il servizio di directory dipende dalla rete per lo scambio di dati con gli applicativi oltre che tra i directory server stessi, per cui le sue caratteristiche influenzano pesantemente sul numero di server e sulla locazione degli stessi. Software applicativo: buona parte del processo di design del servizio di directory viene pilotata dalle necessità degli applicativi che si intendono far diventare directory-enabled Design:data Il servizio di directory è un database specializzato per cui una delle considerazioni più importanti della fase di design riguarda i dati ovvero la tipologia delle informazioni che verranno archiviate nella directory. Per dato si intende l’intera collezione di informazione archiviata nella directory. Per data element s’intende una porzione di dato mentre per data source o repository il sistema che archivia una collezione di data elements. Nella terminologia LDAP i data element corrispondono ai tipi di attributi (ad esempio il cognome di una persona, il tipo di processore di un elaboratore, …) mentre il loro valore attribute value. Pur vivendo nell’era dell’informazione raramente essa è disponibile nel momento e nel modo aspettato, a volte per eccesso di informazione (risulta difficile trovare quello che stiamo cercando), altre volte per mancanza di informazione (ciò che cerchiamo non è disponibile), altre volte ancora per una errata formattazione dei dati, obsolescenza, … Le linee guida adottate per la definizione dei tipi di dati che verranno archiviati del servizio di directory devono essere collezionate e descritte in un documento che deve coprire i seguenti punti: i dati che saranno (es. informazioni condivise da almeno una applicazione) e non saranno archiviati (es. dati con valori di dimensione > 10k) nella directory i modi di accesso ai dati (specie se si pianifica l’archiviazione di dati sensibili) ed i tipi di autenticazione e cifratura richiesti la modifica dei dati da parte di utenti o applicazioni ed i criteri per poter effettuare le modifiche (autenticazione, …) considerazioni di carattere legale per definire se ci sono tipologie di dati che non posso essere archiviati o che non possono essere visualizzate da alcune categorie di utenti definizione dei dati archiviati della directory e delle rispettive sorgenti esterne oltre che dei flussi e delle priorità di una sorgente rispetto ad un’altra definizione di un semplice processo per la gestione delle eccezioni non comprese nel documento Dopo aver definito la lista dei dati da includere nella directory vanno identificate le sorgenti da cui ottenere i valori dei data elements e la gestione delle relazioni tra le varie sorgenti. Sorgenti comuni di dati sono: altri servizi di directory (Novell Directory, Microsoft Active Directory, NIS, …) database files o fogli di calcolo applicazioni di collaborazione in possesso di database o directory built-in (email systems, calendar systems, …) utenti finali (spesso gli utenti costituiscono la migliore fonte per i dati che li riguardano personalmente, specialmente per quando riguarda i contatti come il telefono, indirizzo, …) E’ importante pensare a come i dati contenuti nella directory si relazionano con i dati archiviati nelle sorgenti presenti nell’organizzazione. Spesso le aziende soffrono problemi di ridondanza ove i dati sono archiviati in database multipli e scoordinati. Ai fini di pianificare con successo il servizio di directory ove sono presenti varie sorgenti contenenti il medesimo tipo di dati si possono seguire le seguenti tecniche: replicazione: in presenza di servizi di directory provenienti dallo stesso vendor o che utilizzano lo stesso protocollo di replicazione (come l’emergente standard LDUP IETF) vanno abilitate le funzionalità per mantenere consistenti i valori dei data elements tra i vari server (ottenendo ridondanza e bilanciamento del carico) sincronizzazione: è il processo attraverso cui le modifiche apportate su un sistema vengono propagate sugli altri. La sincronizzazione viene effettuata frequentemente ma la consistenza dei dati non è garantita come dal processo di replicazione. La sincronizzazione può essere effettuata in una o entrambe le direzioni e tra due o più sorgenti di dati. I prodotti di sincronizzazione sono disponibili da vari produttori di software (es. Microsoft Metadirectory Services) e generalmente consentono di aggiungere dei task al puro processo di allineamento dei dati (ad esempio se una persona viene aggiunta al database delle risorse umane non solo viene creata una utenza nel servizio di directory ma un trigger scatena eventi esterni alla directory come la creazione di una casella postale, di una home directory o concede l’accesso a determinate risorse di rete) batch updates: procedure complesse che non vengono eseguite molto spesso (ad esempio su base mensile) e coinvolgono il merge di dati provenienti da fonti di dati radicalmente diverse Design: schema Lo schema è un insieme di regole che determina il tipo di dati che può essere archiviato in un database o servizio di directory. Lo schema è importante perché può aiutare a mantenere l’integrità e la qualità dei dati archiviati. Lo schema aiuta inoltre a ridurre la duplicazione dei dati e fornisce una via ben documentata affinchè le applicazioni directory enabled possano accedere e modificare le collezioni di oggetti presenti nella directory. Ogni volta che viene richiesta al servizio di directory la modifica o l’inserimento di una entry esso controlla il contenuto attraverso le regole dello schema. Ogni volta che vengono comparati i valori di un attributo il servizio consulta lo schema per determinare l’algoritmo di comparazione da utilizzare. Lo schema può essere anche utilizzato per imporre dei limiti sulla dimensione, intervalli (range) e formato dei dati archiviati della directory. Ad esempio nel rispetto degli standard l’indirizzo email deve contenere un set specifico di caratteri e deve essere conforme ad un determinato formato (indirizzo@dominio). Elementi di una schema LDAP Nei servizi di directory basati su LDAP lo schema consiste in tipi di attributi, sintassi degli attributi, regole di comparazione degli attributi e classi di oggetti. Attributi Le directory entry contengono una collezione di tipi di attributi con relativi valori. I tipi di attributi (da ora semplicemente attributi) contengono elementi di dati specifici come il nome di una persona, il numero di telefono d’ufficio o il numero di copie/minuto di una stampante. In LDAP la definizione di un attributo comprendele seguenti informazioni: nome che identifica univocamente l’attributo object identifier (OID) che identifica univocamente l’attributo descrizione testuale sintassi per l’attributo set di regole di confronto che agiscono nelle operazioni di confronto e ricerca indicatore di utilizzo (per applicazioni o per il solo servizio di directory indicazione se l’attributo è single o multi valore restrizioni sul range o le dimensioni dei valori che possono essere archiviati nell’attributo Sintassi degli attributi Ad ogni attributo viene associata una sintassi che specifica esattamente come i dati vengono rappresentati.Come ogni attributo viene identificato da un OID altrettanto accade per le sintassi. La maggior parte degli attributi di una directory sono del tipo DirectoryString. Altre sintassi standard sono Binary, Boolean, CountryString, Integer, OctetString, … Regole Client e server LDAP devono utilizzare delle speciali regole per comparare i valori di attributi differenti. Ad esempio nella comparazione di nomi di file per un filesystem unix va tenuto conto che essi sono case sensitive mentre per un file system windows i nomi dei file non sono case sensitive. Tra le matching rules standard ricordiamo booleanMatch, caseIgnoreMatch, caseExactMatch, integerMatch, telephoneNumberMatch, … Classi di oggetti In LDAP le classi di oggetti vengono utilizzate per raggruppare informazioni in relazione tra loro. Tipicamente una classe corrisponde ad oggetti della vita reale ovvero persona, stampante, apparato di rete, …. Ogni directory entry appartiene ad una o più classi di oggetti. I nomi delle classi di oggetti a cui una entry appartiene vengono sempre listate come un valore per l’attributo speciale (di tipo multi-valued) chiamato objectclass. Il set di classi di oggetti associati ad un attributo segue le seguenti regole: determina quali tipi di attributi devono essere contenuti in una classe (ad esempio in una classe di tipo person il nome della persona è obbligatorio) determina quali tipi di attributo possono essere contenuti in una classe (in una classe person il numero di telefono è facoltativo) fornisce una via conveniente per i client della directory di prelevare informazioni relative ad un sottoinsieme di entry durante le operazioni di ricerca (ad esempio una ricerca per objectclass=person) In LDAP la definizione di object class include le seguenti informazioni: nome che identifica univocamente la classe descrizione testuale OID che identifica univocamente la classe set di tipi di attributi obbligatori set di attributi opzionali il tipo di classe (structural, auxiliary e abstract) Il “tipo” di una classe indica come la classe stessa viene utilizzata. Le structural classes descrivono solamente gli aspetti base di un oggetto: ad esempio possono venir utilizzate per porre delle restrizioni su dove una entry può venire archiviata lde DIT (directory information tree). La maggior parte delle classi sono di questo tipo. Le auxiliary classes non pongono restrizioni su dove una entry può essere archiviata e vengono utilizzate per aggiungere un set di attributi ad una entry che appartiene già ad una structural class. Ereditarietà delle classi Una classe può essere derivata da un’altra classe; in tal caso essa eredita alcune caratteristiche della classe da cui deriva. In questo caso si parla di subclassing oppure di object class ineritance. Ad esempio la classe inetOrgPerson definita nella maggior parte dei servizi di directory estende la classe person ed include ulteriori attributi per poter archiviare elementi comunemente utilizzati in Internet o nella maggior parte delle organizzazioni. La classe di livelli inferiore deve avere tutti gli attributi obbligatori nelle classi superiori e può utilizzare tutti i campi opzionali previsti da queste. In generale la classe da cui un’altra classe eredita alcune delle sue caratteristiche viene detta superclasse o classe superiore. Tutte le classi derivano da una classe speciale di tipo abstract detta top. La definizione della classe top consiste in un singolo attributo obbligatorio chiamato objectclass ai fini di assicurare che tutte le entry della directory conterranno almeno un valore per questo attributo. Schema predefiniti e definizione di nuovi elementi Le strutture degli schema vengono fornite da produttori di applicativi, documentazione standard sui servizi di directory (es. IETF) e dai vari produttori di servizi di directory. In fase di installazione di un servizio di directory vanno selezionati gli schema predefiniti in grado di soddisfare la compatibilità con il maggior numero di applicazioni e servizi directory enabled. Qualora gli schema predefiniti non coprano tutte le esigenze riscontrate in fase di pianificazione si renderà necessaria la definizione di classi ed attributi personalizzati. La creazione di nuove classi ed attributi comporta la definizione di una nomenclatura. Generalmente una buona strategia consiste nel prefiggere il nome dei nuovi elementi dello schema con una stringa che ricorda il nome dell’ente/organizzazione. In tal modo si limita la possibilità di collisione con le altre definizioni esistenti. Accanto alle problematiche di nomenclatura dei nuovi elementi va ricordato che ad ognuno di essi va assegnato un identificativo univoco OID. Gli OID vengono generalmente rilasciati dall’ente IANA. Essi sono del tipo 1.3.6.1.4.1.250. L’ente IANA rilascia l’identificativo della radice assegnata ad un determinato ente; all’ente spetta una ulteriore “ramificazione” per l’identificazione di classi, sintassi ed attributi (1.3.6.1.4.1.250.1, 1.3.6.1.4.1.250.2, 1.3.6.1.4.1.250.3, …) Design: namespace La pianificazione dello spazio di nomi è uno degli step più importanti. Il namespace di una directory impatta infatti sulla manutenzione dei dati, sulla flessibilità dell’applicazione delle ACL (access control list) e della replicazione, sull’abilità di soddisfare le applicazioni directory ebabled, sulla navigabilità della directory, … Eventuali errori di pianificazione del namespace devono essere rivisti in fase di design onde evitare costi e disagi non trascurabili se l’operazione viene fatta dopo la messa in produzione del servizio. Struttura del namespace Il modello del namespace LDAP deriva dallo standard X.500 ovvero una struttura gerarchica molto rigida. Un tipico namespace X.500 inizia dalla nazione come top della gerarchia seguita dalla provincia, città sino ad individuare singoli elementi come le persone. In pratica nello spazio di nomi LDAP la radice della gerarchia viene individuata da una nomenclatura che rispecchia un dominio DNS (generalmente quello aziendale). Nella nomenclatura LDAP una entry nella directory viene indicata con il nome di Relative Distinguished name (RDN). Ad esempio nella figura sottostante l’oggetto CN=Mario Rossi è RDN. Un RDN deve essere univoco al di sotto di un medesimo “parent”. Quando viene determinata la posizione del RDN rispetto al top della gerarchia del namespace combinando RDN con i nomi delle entry di tutti gli oggetti “padre” il nome risultante prende il nome di distinguished name (DN) ovvero: CN=Mario Rossi, OU=people, dc=example, dc=com Le più diffuse tipologie di organizzazione dello spazio di nomi di una directory rientrano tra le seguenti: - data organization: lo spazio di nomi fornisce una via per organizzare i dati. Ad esempio una porzione della directory potrebbe ospitare gli oggetti relativi alle persone, un’altra porzione contenere device quali stampanti o computers. Una tale organizzazione semplificherebbe la navigabilità della directory. - data partitioning: uno spazio di nomi gerarchico consente di partizionare la directory e di suddividerla tra più server (generalmente per siti geografici distinti) - data replication: strettamente legata al partizionamento della directory, consente di pianificare la struttura dello spazio di nomi tenendo in considerazione le problematiche di replicazione tra siti distinti - access control: grazie all’utilizzo delle Access Control List (ACLs) è possibile delegare l’amministrazione di porzioni dell’albero della directory. Ai fini di ottimizzare l’applicazione delle ACL è preferibile raggruppare gli oggetti in funzione di coloro che verranno preposti alla loro gestione. Design: Topology Design I servizi LDAP sono predisposti per supportare directory distribuite dove l’albero viene suddiviso attraverso molteplici server. La topologia del servizio di directory descrive il modo in cui essa viene frazionata tra i vari server e come questi vengono collocati nei vari siti dell’azienda/organizzazione. Una directory che risiede su più server viene chiamata directory distribuita. Quando un albero di directory viene suddiviso attraverso vari server ognuno di questi è responsabile per una singola porzione dell’albero, quindi viene ridotto il carico di lavoro che esso deve svolgere. Utilizzando questo principio di suddivisione in partizioni e assegnazione delle partizioni a vari server rende la directory maggiormente scalabile, in termini di numero di entry, rispetto alla soluzione con singolo server. Il servizio DNS opera in modo similare, ove ogni porzione dello spazio di nomi viene assegnato ad un singolo server che può eventualmente essere replicato per incrementare la disponibilità di servizio. L’unità di suddivisione di una directory dipende dall’implementazione utilizzata: dove Novell Directory usa il termine directory partition, lo standard X.500 usa il termine di naming context. Netscape Directory server v6 chiama queste unità databases mentre Microsoft Active Directory usa il termine domain. Tutti questi termini rappresentano essenzialmente la stessa cosa, qui si userà il termine directory partition. E’ importante tener presente che la directory stessa deve nascondere all’utente questo partizionamento, nel senso che dal punto di vista dell’utilizzatore finale (utente o applicazione) essa deve apparire come una singola, logica directory. Directory partition Per directory partition si intende una porzione completa (subtree) del directory information tree (DIT). Una singola entry risiede in una sola directory partition, a tutte le entry all’interno di una partizione condividono un unico “antenato” detto partition root. Utilizzando questo principio è possibile suddividere una singola vasta directory in molti partizioni minori ognuna delle quali verrà assegnata ad un server distinto sia per motivi di carico (query da parte dei client) che per motivi di garanzia di servizio. A sua volta un server non necessariamente deve contenere una singola partizione, ma potrebbe ospitarne più di una (ad esempio una copia read only della top-level partition e una copia master di una determinata organizational unit). Knowledge reference Sia lo standard LDAP che X.500 definiscono come knowledge reference i puntatori che stabiliscono le relazioni tra le varie partizioni di una directory. Esistono due tipi di knowledge reference: 1. immediate superior knowledge reference: puntatore verso l’alto del DIT verso la radice che collega una partizione al suo diretto superiore. Esso costituisce il gancio che dal top della partizione consente l’aggancio alla partizione “padre” 2. subordinate reference: puntatore verso il basso del DIT verso un’altra partizione, ovvero il gancio verso altre directory partiotions Le directory basate sullo standard LDAPv3 annunciano la partizione che essi detengono in na entry speciale chiamata rootDSE. Per scoprire le partizioni contenute in un server è sufficiente eseguire una query (scope=base) con filtro di ricerca (objectclass=*) Risoluzione dei nomi in directory distribuite La risoluzione dei nomi è il processo con cui una directory mappa un distinguished names (DN) fornito da un client ad un oggetto della directory. Il processo viene utilizzato nelle seguenti circostanze: per localizzare l’oggetto base di partenza per una query LDAP per localizzare una entry oggetto di modifica, cancellazione, rename o operazione di bind per localizzare il padre (parent) di una entry che deve essere aggiunta alla directory La DN presentata in questo modo prende il nome di purported name. Il client assume che esso esista, e sta alla directory controllare se questo corrisponde al vero. Nel caso più semplice il client contatta il directory server e presenta il DN di una entry contenuta nel server. Il processo di risoluzione è semplice: il server controlla che la entry esista a in caso positivo esegue l’azione richiesta dal client. Ad esempio, se un client tenta di leggere una entry tramite una query LDAP, il server controlla che la DN della entry sia in una delle partizioni che esso ospita; se così è, controlla la entry nel suo database. Se la entry esiste tutti gli attributi richiesti dal client vengono restituiti. In caso contrario viene restituito un errore del tipo “no such object”. Se il client presenta un nome (purported name) il cui DN non è in una delle directory partition ospitate dal server, questo deve usare tutti i knowledge reference disponibili per risolvere il nome stesso oppure supportare il client in modo che possa localizzare il server che possa risolvere il nome proposto. I collegamenti knowledge reference descrivono completamente come una directory partition è inserita all’interno di un DIT, in tal modo un server è sempre in grado di sapere se il passo successivo per il processo di risoluzione implica navigare in alto o in basso all’interno del DIT. LDAP Referrals e Search Result Continuation Reference sono porzioni di informazioni knowledge reference inoltrate da un server LDAP ad un client LDAP che indicano altri server da contattare ai fini di soddisfare la richiesta del client stesso. LDAP Referrals: quando un client LDAP inoltra una operazione LDAP ti aggiunta, modifica, cancellazione, o una ricerca con uno scope base-level, se il server non contiene la entry di destinazione, l’informazione di knowledge reference viene ritornata al client in un LDAP referral, ovvero un tipo speciale di messaggio di risultato LDAP che dirire il client ad un altro server che potrebbe soddisfare l’operazione richiesta. LDAP search result continuation reference: quando un client LDAP inoltra una query di tipo one-level o subtree ed il server è a conoscenza di altre partizioni di directory subordinate, le rispettive knowledge references vengono restituite al client come risultato della ricerca. In altre parolei due concetti sono molto simili: l’unica differenza significativa sta nel fatto che le LDAP referrals sono contenute in un LDAP result message mentre le altre come risultato di una ricerca. Le informazioni contenute in un referral o reference sono in forma LDAP Uniform Resource Locator (URL) come definito nella RFC 2255 e sono le seguenti: - host name del server da contattare - porta del server - base DN (nel caso di una operazione di search), o target DN (per operazioni di add, delete, modifica, …) Ad esempio se un client contatta il server2 per cercare l’albero dc=example,dc=com per tutte le entry con cognome Smith il referral potrebbe essere: ldap://server3.example.com:389/ou=Engineering%2Cdc=example%2Cdc=com Questa URL indica che il client dovrà contattare l’host server3.example.com sulla porta 389 e sottoporre una ricerca instradata al subtree ou=Engineering,dc=example,dc=com. Ogni virgola all’interno del DN viene sostituita dal codice di escape “%2C”. Design: Replication Il processo di replica delle directory consente di mantenere i dati di questa disponibili su vari server in modo da evitare single point of failure e per incrementare le performance, consentendo di avere copia della directory disponibile e “vicina” ad utenti e gruppi che la utilizzano. Attuando la replica, quindi la disponibilità dei dati della directory su più server distinti in luoghi diversi si incrementa l’affidabilità del servizio. Se uno dei server presenta un malfunzionamento, i client e le applicazioni directory-enabled possono contattare un altro server, La replica consente pure di non incorrere in un disservizio a causa di problemi di rete. Si pensi a due sedi di una azienda in due siti geografici distinti, ciascuna con il suo server, l’eventuale down del link tra i due siti non comporterà alcun disservizio, se non per un minimo disallineamento delle repliche tra i rispettivi server. Strategie di replica Single-master replication: in questo caso sono un server possiede una copia in scrittura della directory, le repliche ne contengono la rispettiva copia in sola lettura. Tutte le operazioni di ricerca, comparazione e bind possono venire soddisfatte da qualunque server (anche non master). L’implementazione di soluzioni single-master introduce un single point of failure corrispondente al server che possiede la copia in scrittura della directory. Multimaster replication: in questo caso è sempre disponibile più di una copia in scrittura della directory. I client possono inviare una operazione di update a qualsiasi replica. Diventa in questo caso responsabilità dei server assicurare che le modifiche vengano propagate in maniera consistente. La replica multimaster da un lato elmina il single point of failure, dall’altro introduce la complessità della risoluzione dei conflitti di update