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.
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 info@infomedia.it o farlo in autonomia allindirizzo http://mags.programmers.net/moduli/biograa
PROGRAMMING
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
Introduzione a Tomcat
Tomcat 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.
Massimo Nardone
mnardone@infomedia.it
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.
67
networking
FIGURA 2
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.
68
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.
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 applicazioni
Lutilizzo 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
69
networking
LISTATO 2
Esempio 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: massimo.mnardone@mycompany.com 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: roberto.rossi@mycompany.com 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: massimo.mnardone@mycompany.com
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:
<Realm className=org.apache.catalina. realm.JNDIRealm debug=99 connectionURL=ldap://localhost:389
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.
<security-constraint> <display-name>Example Security Constraint </display-name>
FIGURA 4
70
PROGRAMMING
FIGURA 5
<security-role>
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
<web-resource-collection> <web-resource-name>Protected Area</web-resource-name> <! Define the context-relative URL(s) to be protected > <url-pattern>/jsp/security/protected/*</url-pattern> <! If you list http methods, only those methods are protected > <http-method>DELETE</http-method> <http-method>GET</http-method> <http-method>POST</http-method> <http-method>PUT</http-method> </web-resource-collection> <auth-constraint> <! Anyone with one of the listed roles may access this area > <role-name>tomcat</role-name> <role-name>role1</role-name> </auth-constraint> </security-constraint>
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.
<! Default login configuration uses form-based authentication > <login-config> <auth-method>FORM</auth-method> <realm-name>Example Form-Based Authentication Area</realm-name> <form-login-config> <form-login-page>/jsp/security/protected/ login.jsp</form-login-page> <form-error-page>/jsp/security/protected/error. jsp</form-error-page> </form-login-config> </login-config>
Definiamo qui le regole di sicurezza, riferite alla applicazione web utilizzate per lautenticazione:
<! Security roles referenced by this web application >
RIQUADRO 1
71
networking
lutente 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.
Conclusioni
Abbiamo 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 ALLEGATO
ftp.infomedia.it
LDAP