Autenticazione LDAP su Tomcat

download Autenticazione LDAP su Tomcat

of 8

Transcript of Autenticazione LDAP su Tomcat

CP pensareprogettareprogrammare n. 143 febbraio 2005

Autenticazione LDAP su Tomcatdi Massimo NardoneCome autenticare un utente web, registrato su di un server LDAP per una determinata risorsa , del server HTTP Tomcat

Massimo Nardone ` E laureato in Scienze dellInformazione presso ` lUniversita di Salerno. Si ` e occupato di Security, Mobile ed implementazioni Web per molti anni come Security Chief Architect, Research and Software Engineer presso varie aziende di Informatica e Telecomunicazioni. Attualmente lavora come Technical Account Manager, Project Manager e Security Specialist per unazienda di servizi Mobile Finlandese. Si occupa inoltre di ricerca ed implementazione per la sicurezza dei protocolli, come assistente e supervisore delle esercitazioni, per lesame di Security of Communication Protocols presso lHelsinki University of Technology (HUT) in Finlandia.

pubblicato su WWW.INFOMEDIA.IT stampa digitale da Lulu Enterprises Inc. stores.lulu.com/infomediaInfomedia` Infomedia e limpresa editoriale che da quasi venti anni ha raccolto la voce dei programmatori, dei sistemisti, dei professionisti, degli studenti, dei ricercatori e dei professori dinformatica italiani. Sono pi` di 800 gli autori che hanno realizzato per le teu state Computer Programming, Dev, Login, Visual Basic Journal e Java Journal, molte migliaia di articoli tecnici, presentazioni di prodotti, tecnologie, protocolli, strumenti di lavoro, tecniche di sviluppo e semplici trucchi e stratagemmi. Oltre 6 milioni di copie distribuite, trentamila pagine stampate, fanno di questa impresa la pi` grande ed u inuente realt` delleditoria specializzata nel campo della a programmazione e della sistemistica. In tutti questi anni le riviste Infomedia hanno vissuto della passione di quanti vedono nella programmazione non solo la propria professione ma unattivit` vitale e un vero a divertimento. ` Nel 2009, Infomedia e cambiata radicalmente adottando ` un nuovo modello aziendale ed editoriale e si e organizzata attorno ad una idea di Impresa Sociale di Comunit` , a partecipata da programmatori e sistemisti, separando le attivit` di gestione dellinformazione gestite da un board a comunitario professionale e quelle di produzione gesti` te da una impresa strumentale. Questo assetto e in linea con le migliori esperienze internazionali e rende Infomedia ancora di pi` parte della Comunit` nazionale degli u a sviluppatori di software. ` Infomedia e media-partner di manifestazioni ed eventi in ambito informatico, collabora con molti dei pi` imporu tanti editori informatici italiani come partner editoriale e fornitore di servizi di localizzazione in italiano di testi in lingua inglese.

Limpaginazione automatica di questa rivista e realizzata al ` 100% con strumenti Open Source usando OpenOffice, Emacs, BHL, LaTeX, Gimp, Inkscape e i linguaggi Lisp, Python e BASH

For copyright information about the contents of Computer Programming, please see the section Copyright at the end of each article if exists, otherwise ask authors. Infomedia contents is 2005 Infomedia and released as Creative Commons 2.5 BY-NC-ND. Turing Club content is 2005 Turing Club released as Creative Commons 2.5 BY-ND. Le informazioni di copyright sul contenuto di Computer Programming sono riportate nella sezione Copyright alla ne di ciascun articolo o vanno richieste direttamente agli autori. Il contenuto Infomedia e 2005 Infome` dia e rilasciato con Licenza Creative Commons 2.5 BYNC-ND. Il contenuto Turing Club e 2005 Turing Club ` e rilasciato con Licenza Creative Commons 2.5 BY-ND. Si applicano tutte le norme di tutela dei marchi e dei segni distintivi. ` E in ogni caso ammessa la riproduzione parziale o totale dei testi e delle immagini per scopo didattico purch e vengano integralmente citati gli autori e la completa identicazione della testata. Manoscritti e foto originali, anche se non pubblicati, non si restituiscono. Contenuto pubblicitario inferiore al 45%. La biograa dellautore riportata nellarticolo e sul sito www.infomedia.it e di norma quella disponibi` le nella stampa dellarticolo o aggiornata a cura dellautore stesso. Per aggiornarla scrivere a [email protected] o farlo in autonomia allindirizzo http://mags.programmers.net/moduli/biograa

PROGRAMMING

Autenticazione LDAP su TomcatCome autenticare un utente web, registrato su di un server LDAP, per una determinata risorsa del server HTTP Tomcatdi Massimo Nardone

I

n questo articolo vogliamo mostrare come configurare uno dei server HTTP pi utilizzati al mondo, ovvero Apache Tomcat, per gestire i dati degli utenti e fare autenticazione degli stessi su di un server LDAP. Utilizzeremo le librerie Sun Microsystems JNDI per accedere e svolgere varie operazioni sul server LDAP, come ad esempio inserire nuovi utenti o modificare i dati di quelli esistenti.

FIGURA 1

LDAP directory tree

Introduzione a TomcatTomcat pu funzionare come server standalone o essere integrato nel web server Apache; un servlet container secondo le specifiche j2EE per applicazioni web. Non differisce da altri web server, se non nel fatto che fornisce un ambiente completo, veloce e molto meno pesante, rispetto ad altri web server, per lo sviluppatore che vuole lavorare con Java Servlet e pagine JSP. Diciamo che Tomcat uno dei prodotti open source pi utilizzati negli ambienti di produzione al mondo soprattutto per il fatto che segue gli standard e livelli di alta qualit per i prodotti di questo tipo. in grado di processare Java Server Pages e Servlet; le pagine JSP sono semplici pagine di testo che combi-

nano tag HTML con tag di scripting. Esse sembrano HTML, ma vengono compilate in Servlet Java alla prima invocazione. Le servlet invece rappresentano pezzi di programmi che girano sui server. Precedentemente si utilizzavano le CGI (Common Gateway Interface) per far girare applicazioni sui server; il vantaggio fondamentale nellutilizzare una Servlet che per server con alto traffico di dati le servlet possono essere eseguite con maggior rapidit rispetto alle applicazioni CGI. Questo perch invece di creare un processo separato per ogni CGI, con le Java servlet ogni richiesta dellutente verr invocata come un thread in un singolo processo daemon. Questo porter ad utilizzare al minimo le risorse del server per ogni richiesta.

Introduzione al Lightweight Directory Access Protocol (LDAP)Nel 1988 vari gruppi di normalizzazione definirono uno schema base dei servizi di directory per diversi sistemi e applicazioni, chiamato X.500. Questo standard inizialmente fu molto apprezzato nel mondo Internet. Nonostante ci, non riscosse il successo previsto, anche se rappresent il punto di partenza di successive implementazioni. NellX.500 laccesso alle informazioni avviene tramite il Directory Access Protocol (DAP), che per funzionare ha notevoli esigenze di risorse. Per superare la complessit dello standard X.500 e la pesantezza del protocollo DAP, fu creato presso la Michigan University il Lightweight

Massimo Nardone

[email protected]

laureato in Scienze dellInformazione presso lUniversit di Salerno. Si occupato di Security, Mobile ed implementazioni Web per molti anni come Security Chief Architect, Research and Software Engineer presso varie aziende di Informatica e Telecomunicazioni. Attualmente lavora come Technical Account Manager, Project Manager e Security Specialist per unazienda di servizi Mobile Finlandese. Si occupa inoltre di ricerca ed implementazione per la sicurezza dei protocolli, come assistente e supervisore delle esercitazioni, per lesame di Security of Communication Protocols presso lHelsinki University of Technology (HUT) in Finlandia dove vive e lavora da pi di 8 anni.

Computer Programming n. 143 - Febbraio 2005

67

networking

FIGURA 2

Ecco un esempio di unEntry completa:Core LDAP standardsdn: uid=mnardone,ou=people,dc=mycompany,dc=com objectClass: inetOrgPerson uid: mnardone sn: nardone cn: massimo mnardone mail: [email protected] userPassword: max0001

La Figura 1 mostra un esempio di LDAP directory tree. Come il Database Management System (DBMS) per Sybase, Oracle, Informix, o Microsoft usato per processare richieste e gestire i dati di un database, lLDAP server usato per processare richieste e gestire i dati del LDAP information directory. I due tipi pi comuni di directory server implementati con lo standard LDAP sono: Directory Access Protocol (LDAP). LDAP un protocollo che permette di accedere ad un directory service, ovvero un elenco in formato elettronico. Un directory service in pratica una specie di database in cui le informazioni sono memorizzate in forma descrittiva. LDAP si basa sul modello client-server. Uno o pi LDAP server che contengono dati formano ci che chiamato il directory information tree (DIT). La funzionalit molto semplice: il client si connette al server e fa una richiesta; il server, a sua volta, spedisce una risposta e/o un puntatore dove le informazioni aggiuntive sullutente possono essere trovate. Unutilit importante di LDAP sta nella possibilit di fornire un meccanismo di centralizzazione delle autenticazioni in una rete, dove pu essere presente una realt di servizi informatici eterogenei e distribuiti. LDAP ha il grosso vantaggio che le informazioni possono essere usate anche da applicazioni di natura diversa, quali addressbook, mail routing, Netscape Roaming Profiles, e che pu essere usato su piattaforme multiple (NT, Novel, Solaris, Linux). In pi LDAP pu assicurare un canale di trasmissione sicuro fra client e server implementato tramite TLS/SSL, il quale supporto fa parte della versione 3 (LDAPv3). LDAP vige sotto il controllo di IETF e quindi si evolve in modo naturale con levoluzione di Internet. Ricordiamo cosa non LDAP: Un rimpiazzamento generico per database relazionali Un file system per oggetti molto grandi Non ottimale per oggetti molto dinamici Una directory contiene oggetti o entry. Ogni entry contiene un Distinguished Name (DN), il quale agisce come chiave primaria per la entry in questione. Un esempio di entry pu essere:dn: uid=mnardone,ou=people,dc=mycompany,dc=com

Stand-alone LDAP server LDAP gateway server In aggiunta al protocollo di rete che supporta TCP/IP, lo standard LDAP definisce quattro modelli per la realizzazione della struttura dei dati. Per certi versi questi modelli si ispirano a quelli gi visti nellambito dello standard X.500 ma sono meno restrittivi. Ecco qui descritti i quattro modelli: Il Modello di informazione: definisce il tipo di dati che si possono inserire nella directory; Il Modello dei nomi: definisce come si organizzano e come ci si riferisce ai dati; Il Modello funzionale: definisce come si accede e si aggiornano le informazioni nella directory; Il Modello di sicurezza: definisce come le informazioni sono protette dallaccesso non autorizzato. In generale le operazioni LDAP che possono essere svolte sono: aggiornamento (come ad esempio modifica, aggiunta, cancellazione, cambio del DN); confronto di un attributo; ricerca; autenticazione e controllo (bind, unbind, abandon). La Figura 2 mostra il Core LDAP standard.

Accesso al LDAP Server utilizzando Sun JNDIPrima di tutto introduciamo linterfaccia Sun Microsystems JNDI. Il Java Naming and Directory InterfaceTM (JNDI) un API per la gestione delle funzionalit di naming e directory per applicazioni scritte in Java. Un servizio di naming e directory fornisce un modo naturale e comprensibile per identifica-

68

Computer Programming n. 143 - Febbraio 2005

PROGRAMMING

FIGURA 3

Architettura JNDI

ADSI permette ad applicazioni scritte in Java di accedere ad Active Directory di Microsoft che si basano sul modello COM. Per quanto riguarda la sicurezza, JNDI permette di lavorare in modo congiunto per la gestione delle directory con vari livelli di security. I programmi scritti utilizzando JNDI sono in generale divisi in tre sezioni: Context initialization, Binding, and Processing. Il Listato 1 ci mostra come scrivere un semplice esempio per stampare il contenuto di una ricerca nel LDAP utilizzando il metodo di autenticazione Simple.

LISTATO 1

Esempio in Java per stampare la ricerca dellutente mnardone nel LDAP Server

re ed associare nomi con i dati. I servizi di naming e directory lavorano su due livelli. Un livello server e un livello client. Il livello server responsabile della manutenzione e risoluzione delle associazioni nomioggetti, del controllo dellaccesso e della gestione delle operazioni eseguite sulla struttura del servizio di directory. Il livello client agisce come uninterfaccia che le applicazioni usano per comunicare col servizio. JNDI non inteso come alternativa ad altri servizi ma disegnato per fornire uninterfaccia comune per accedere a servizi esistenti, chiamati distributed objects systems come EJB, DNS, NDS, NIS(YP), CORBA, Java RMI o servizi di directory come ad esempio LDAP, Novell NetWare e NIS+. Larchitettura JNDI consiste di un API e di uninterfaccia Service Provider (SPI). Le applicazioni Java utilizzano lAPI JNDI per accedere ad una variet di servizi di naming e directory. La Figura 3 mostra lArchitettura JNDI in dettaglio.

import import import import

java.util.Hashtable; java.util.Enumeration; javax.naming.*; javax.naming.directory.*;

public class Search_JNDI { public static void main(String[] args) { try { Hashtable environment = new Hashtable(); environment.put(Context.INITIAL_CONTEXT_FACTORY, com.sun.jndi.ldap.LdapCtxFactory); environment.put(Context.PROVIDER_URL, ldap:// localhot:389); environment.put(Context.SECURITY_AUTHENTICATION, simple); environment.put(Context.SECURITY_PRINCIPAL, uid=mnardone,ou=people,dc=mycompany,dc=com); environment.put(Context.SECURITY_CREDENTIALS,massimo); DirContext ctx = new InitialDirContext(environment); SearchControls constraints = new SearchControls(); constraints.setSearchScope(SearchControls.SUBTREE_SCOPE); NamingEnumeration results = ctx.search(ou=people, dc=mycompany,dc=com,(sn=Nardone),constraints); while (results != null && results.hasMore()) { SearchResult sr = (SearchResult) results.next(); String dn = sr.getName() + ,ou=people,dc= mycompany,dc=com\n; System.out.println(Distinguished Name: +dn); Attributes attrs = sr.getAttributes(); for (NamingEnumeration ne = attrs.getAll();ne.hasMoreElements();) { Attribute attr = (Attribute)ne.next(); String attr_ID = attr.getID(); for (Enumeration values = attr.getAll();values.hasMoreElements();) { System.out.println(attr_ID+: + values.nextElement() + \n); } } } } catch(Exception e) { System.out.println(Error: + e); System.exit(1); } } }

Sempre di pi vi il problema della gestione di varie risorse elettroniche come ad esempio i dati degli utenti, dei macchinari delle reti, dei vari servizi e delle applicazioniLutilizzo di JNDI raccomandato per la gestione di informazioni degli utenti (numeri di telefono, info di security, indirizzi email, ecc), macchinari (indirizzi di rete, indirizzi IP, configurazioni varie, ecc), servizi, ecc. JNDI parte di Java Standard Extension e nella piattaforma Java, JNDI usato in HotJava versione 1.1 ed in altri componenti. JNDI usato anche da Enterprise API, come ad esempio Enterprise JavaBeans, Java Message Service, JDBC 2.0, ecc. Il pacchetto Java

Computer Programming n. 143 - Febbraio 2005

69

networkingLISTATO 2Esempio di un file LDIF# ecco qui un commento per lutente mnardone dn: uid=mnardone,ou=people,dc=mycompany,dc=com # Definiamo il top-level entry dn: dc=mycompany,dc=com objectClass: dcObject dc:mycompany # Definiamo unentry per contenere persone e lo chiamiamo people dn: ou=people,dc=mycompany,dc=com objectClass: organizationalUnit ou: people # Definiamo unentry per lutente Massimo Nardone dn: uid=mnardone,ou=people,dc=mycompany,dc=com objectClass: inetOrgPerson uid: mnardone sn: nardone cn: massimo mnardone mail: [email protected] userPassword: max0001 # Definiamo unentry per lutente Roberto Rossi dn: uid=rrossi,ou=people,dc=mycompany,dc=com objectClass: inetOrgPerson uid: rrossi sn: rossi cn: roberto rossi mail: [email protected] userPassword: roby0001 # Definiamo unentry per contenere gruppi LDAP e lo chiamiamo groups dn: ou=groups,dc=mycompany,dc=com objectClass: organizationalUnit ou: groups # Definiamo unentry per la regola tomcat dn: cn=tomcat,ou=groups,dc=mycompany,dc=com objectClass: groupOfUniqueNames cn: tomcat uniqueMember: uid= mnardone,ou=people,dc=mycompany,dc=com # Definiamo unentry per la regola role1 dn: cn=role1,ou=groups,dc=mycompany,dc=com objectClass: groupOfUniqueNames cn: role1 uniqueMember: uid= mnardone,ou=people,dc=mycompany,dc=com # Definiamo unentry per la regola role2 dn: cn=role2,ou=groups,dc=mycompany,dc=com objectClass: groupOfUniqueNames cn: role2 uniqueMember: uid= rrossi,ou=people,dc=mycompany,dc=com cn: massimo mnardone mail: [email protected]

Utilizzeremo il carattere # per inserire commenti nel file. Un attributo descrittivo pu essere un semplice attributo tipo, come ad esempio cn o objectClass o pu includere diverse opzioni come ad esempio cn;lang_en_US o userCertificate;binary. Possiamo anche specificare degli URL contenenti il valore attributo. Ad esempio per specificare il valore jpegPhoto ottenibile dal file /path/to/file.jpeg scriveremo:cn:< file:///path/to/file.jpeg

Il Listato 2 mostra il file LDIF utilizzato nella nostra demo. Il prossimo step sar quello di configurare il file Server.xml di Tomcat per utilizzare il JNDIrealm, in modo da permettere lautenticazione sul server LDAP. Supponiamo che una connessione anonima sia sufficente per ricercare alcune informazioni relative alllutente nel server LDAP. Ecco come abbiamo modificato il file Serverl.xml:

Configurazione di Tomcat per lAutenticazione LDAPVediamo adesso come configurare il web server Tomcat per fare autenticazione su di un LDAP server. Nel nostro caso abbiamo testato il tutto sia con OpenLDAP directory server (versione 2.1.30) che con il Netscape Directory versione 6. Nellesempio abbiamo installato Tomcat ed il server LDAP sulla stessa macchina. Partiamo creando uno schema per il server LDAP utilizzando un file in formato LDIF. Ricordiamo che LDIF (LDAP Data Interchange Format) utilizzato per creare uno schema nel server LDAP utilizzando un formato testo. Il formato di base del file LDIF il seguente:# comment dn: : :

Andremo poi a configurare un altro file di Tomcat (web.xml) per definire tutti i parametri per lautenticazione di una determinata risorsa di un utente registrato sul server LDAP. Definiamo qui anche le role di cui lutente dovr far parte allinterno del server DLAP per accedere alla risorsa. Nel nostro caso tomcat e role1 sono state definite come regole nel file web.xml. Example Security Constraint

FIGURA 4

La form-based per fare il login dellutente mnardone

Un esempio potrebbe essere:

70

Computer Programming n. 143 - Febbraio 2005

PROGRAMMING

FIGURA 5

Login come utente mnardone nel server LDAP

role1 tomcat

In questo modo, utilizzando il JNDIrealm sar determinata la dn dellutente (nel nostro caso uid=mnardone, ou=people, dc=mycompany, dc=com) sostituendo lo username nello userpattern. Si autenticher poi lutente utilizzando la dn appena creata e la password recevuta dallutente. Avverr poi la ricerca delle regole che valgono per

Protected Area /jsp/security/protected/* DELETE GET POST PUT tomcat role1

Server: OpenLDAP: http://www.openldap.org/ iPlanet - iPlanet Directory Server: http://www.iplanet.com/products/iplanet_directory/ home_2_1_1z.html Novell: NDS eDirectory: http://www.novell.com/products/nds/ IBM Software : Directory Server: http://www4.ibm.com/software/network/directory/ MS Active Directory: http://www4.ibm.com/software/network/directory/ slapd.com: http://www.slapd.com/ JavaLDAP Project: http://javaldap.sourceforge.net/ PGP Ldap server: http://rednest.rosinter.ru/pgp_ldap_server.htm Client: LDAP Browser/Editor: http://www.iit.edu/~gawojar/ldap/ GQ LDAP client: http://biot.com/gq/ ldap-abook (Perl): http://ldap-abook.sourceforge.net/ Rolodap (PHP4): http://rolodap.sourceforge.net/ ldapconsole (PHP): http://www.kalamazoolinux.org/projects/awilliam/ LDAP Explorer (PHP): http://igloo.its.unimelb.edu.au/LDAPExplorer/ LDAP Browser (Win32): http://www.ldapadministrator.com/index.php LDAP Browser (Java Applet): http://www.directoryapplications.com/browser/ sysadminsith.org: http://www.sysadminsith.org/software/last/ Software per lo sviluppo: Netscape Directory SDK: Source Code Release: http://www.mozilla.org/directory/ iPlanet Directory Developer Central: http://developers.sun.com/prodtech/index.html Novell DeveloperNet - NDS LDAP: http://developer.novell.com/edirectory/ IBM Software: http://www306.ibm.com/software/network/help-directory/ ActiveDirectory Programming: http://msdn.microsoft.com/library/default.asp?URL= /library/psdk/adsi/dsstartpage_1rg3.htm PerLDAP (Mozilla::LDAP): http://www.perldap.org/ Perl-LDAP (Net::LDAP): http://ldap.perl.org/ Java Naming and Directory Interface (JNDI): http://java.sun.com/products/jndi/index.jsp

Facciamo in modo che il login per una determinata risorsa di Tomcat sia effettuato attraverso una HTML Form-based come mostrato in Figura 4. FORM Example Form-Based Authentication Area /jsp/security/protected/ login.jsp /jsp/security/protected/error. jsp

Definiamo qui le regole di sicurezza, riferite alla applicazione web utilizzate per lautenticazione:

RIQUADRO 1

Lista dei software Client e Server LDAP pi comuni ed utilizzati al momento

Computer Programming n. 143 - Febbraio 2005

71

networkinglutente nel server LDAP. Se queste corrispondono a quelle che abbiamo configurato nel file web.xml, lautenticazione dellutente avr esito positivo ed avremo il risultato mostrato in Figura 5. Come abbiamo visto, abbiamo nel server LDAP tre regole: tomcat, role1 e role2. Visto che lutente rrossi contenuto solo nella regola role2 non configurata nel file web.xml, tale utente non potr accedere alla risorsa dove stato specificato che solo utenti appartenenti alle regole di sicurezza tomcat e role1 possano essere autenticati per la suddetta risorsa del web server.

BIBLIOGRAFIA & RIFERIMENTI[1] G. Carter, LDAP System Administration, OReilly & Associates, 2003 [2] R. Weltman e T. Dahbura, LDAP Programming with Java(TM), Addison-Wesley Pub Co, 2000 [3] P. Loshin, Big Book of Lightweight Directory Access Protocol (LDAP) RFCs, Morgan Kaufmann, 2000 [4] Sun Microsystems Inc, System Administration Guide: Naming and Directory Services (DNS, NIS, and LDAP), iUniverse.com, 2002 [5] R. Lee e S. Seligman, JNDI API Tutorial and Reference: Building Directory-Enabled Java(TM) Applications, Addison-Wesley Pub Co, 2000 [6] Tomcat, http://jakarta.apache.org/tomcat/ [7] OpenLDAP, http://www.openldap.org/ [8] JNDI tutorial, http://java.sun.com/products/jndi/tutorial/ [9] Netscape Directory SDK, http://developer. netscape.com/tech/directory/downloads.html [10] LDAP Guru, http://www.ldapguru.com/

ConclusioniAbbiamo mostrato in questo articolo come configurare uno dei web server pi utilizzati al momento, per fare autenticazione su di un LDAP Server. Ci auguriamo di avervi dimostrato con quanta semplicit, utilizzando le classi Java JNDI per accedere ad un LDAP Server, si possano effettuare svariate operazioni. La portabilit di LDAP, unite alla qualit ed alla semplicit di Tomcat, possono rilevarsi unottima soluzione per la gestione degli utenti, delle reti, dei macchinari o di altre risorse in alternativa ai database.

CODICE ALLEGATOftp.infomedia.itLDAP