12.07.2015 Views

Università degli Studi di Napoli Federico II Facoltà di ... - Scope

Università degli Studi di Napoli Federico II Facoltà di ... - Scope

Università degli Studi di Napoli Federico II Facoltà di ... - Scope

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

<strong>Università</strong> <strong>degli</strong> <strong>Stu<strong>di</strong></strong> <strong>di</strong> <strong>Napoli</strong> <strong>Federico</strong> <strong>II</strong><strong>Facoltà</strong> <strong>di</strong> Scienze MM.FF.NN.Corso <strong>di</strong> Laurea in InformaticaTesi Sperimentale <strong>di</strong> Laurea TriennaleAutenticazione su Grid me<strong>di</strong>ante certificati Robot X.509Relatore Can<strong>di</strong>datoProf. G. RussoLuca GerardoDr. S. Par<strong>di</strong> matr. 566/2636Anno accademico 2008/2009


RingraziamentiDesidero ringraziare il Prof. Guido Russo ed il Dott. Silvio Par<strong>di</strong> per laloro immensa <strong>di</strong>sponibilità e per la cortesia <strong>di</strong>mostratami durante losvolgimento dell'attività formativa. Ringrazio “i colleghi” della ControlRoom, in particolare Marco Alfano, per il supporto che mi hanno fornito.Ringrazio i compagni del corso <strong>di</strong> stu<strong>di</strong> con cui ho con<strong>di</strong>viso le mieesperienze universitarie e gli amici del “Sabato pomeriggio” per inumerosi consigli <strong>di</strong> vita che mi hanno dato e che continuano a darmi.Un ringraziamento speciale va alla mia famiglia, che ha creduto in me enelle mie capacità e che mi ha sostenuto moralmente ed economicamentein tutti questi anni. Ringrazio mia madre per i tanti caffè che mi hapreparato e mio padre per i numerosi momenti che mi ha de<strong>di</strong>cato dopopranzo. Ringrazio mio fratello per essere stato una guida, oltre cheuniversitaria, <strong>di</strong> vita; mia sorella Marilena e Rino per avermi regalato duenipotini che mi hanno permesso <strong>di</strong> sorridere anche nei momenti più<strong>di</strong>fficili, ed Antonella, con la speranza che me ne regali qualcuno anche lei.Infine, il ringraziamento più grande va a Bice, per il supporto morale chemi ha fornito, per aver creduto nelle mie capacità e per essermi statasempre vicino.A tutti, infinitamente grazie <strong>di</strong> cuore!!!


In<strong>di</strong>ce generale1. Introduzione...............................................................................................................32. Il Grid Computing.......................................................................................................62.1 Introduzione.........................................................................................................62.2 Il modello a clessidra...........................................................................................72.3 Il concetto <strong>di</strong> Virtual Organization.....................................................................133. L'infrastruttura ScoPE e le nuove comunità scientifiche.........................................163.1 Introduzione.......................................................................................................163.2 Il progetto SCoPE.............................................................................................163.3 L'architettura della Griglia Computazionale......................................................194. Il modello <strong>di</strong> sicurezza GSI ed il servizio VOMS.....................................................244.1 Introduzione.......................................................................................................244.2 I certificati X.509................................................................................................264.3 Public Key Infrastructure...................................................................................324.4 La mutua autenticazione server........................................................................344.5 Il servizio VOMS................................................................................................355. Un'estensione del servizio VOMS con certificati Robot..........................................415.1 Concetto <strong>di</strong> certificato Robot.............................................................................415.2 Estensione delle facility del VOMS...................................................................416. L'attività sperimentale..............................................................................................466.1 Descrizione dell'applicazione web....................................................................466.2 L'architettura della Web Application..................................................................516.3 Le tecnologie utilizzate......................................................................................536.4 Use Case...........................................................................................................556.5 Diagrammi <strong>di</strong> Cockburn.....................................................................................566.6 Class Diagram...................................................................................................616.7 Sequence Diagram...........................................................................................63Luca Gerardo 566/2636 Pagina 1 <strong>di</strong> 113


7. Testing e scenari applicativi.....................................................................................687.1 Validazione e Testing........................................................................................687.2 Applicazione per creare portali web <strong>di</strong> accesso alla GRID...............................708 Conclusioni...............................................................................................................749. Bibliografia...............................................................................................................7510. Appen<strong>di</strong>ce: Co<strong>di</strong>ce ...............................................................................................76Luca Gerardo 566/2636 Pagina 2 <strong>di</strong> 113


1. IntroduzioneLa presente tesi, effettuata presso il Data Center S.Co.P.E., ha l'obiettivo <strong>di</strong> stu<strong>di</strong>are esperimentare l'utilizzo <strong>di</strong> certificati robot in ambiente Grid senza perdere informazionisull'effettivo utilizzatore. È stata quin<strong>di</strong> proposta ed implementata una strategiaestendendo le funzionalità del servizio <strong>di</strong> Virtual Organization Membership tramite larealizzazione <strong>di</strong> un'applicazione web per l'iscrizione ad una Grid Virtual Organization.Tale applicazione prevede, per l'iscrizione dell'utente, l'associazione ad un certificatorobot piuttosto che l'identificazione tramite certificato personale.Attualmente, infatti, l'iscrizione ad una VO è concessa solo ad utenti in possesso <strong>di</strong> unceritificato personale rilasciato dall'autorità competente CA (Certification Autority)dopo che una RA (Registration Autority) abbia accertato la loro identità.Solo nel momento in cui si <strong>di</strong>spone <strong>di</strong> tale certificato, può essere effettuata unarichiesta <strong>di</strong> iscrizione ad una o più VO: una volta iscritti, è possibile sfruttare i servizida essa offerti.Dato che un certificato personale ha vali<strong>di</strong>tà annuale, ogni utente deve, <strong>di</strong> volta involta, richiederne il rinnovo all'autorità competente.La richiesta <strong>di</strong> rilascio del suddetto certificato da parte <strong>di</strong> un utente, al fine <strong>di</strong> potersfruttare le risorse hardware e software fornite da una VO, potrebbe essere visto comeun limite.L'obiettivo principale dell'applicazione da me realizzata è quello <strong>di</strong> ampliare i serviziofferti dalla VO e <strong>di</strong> rendere più veloce ed accessibile l'iscrizione e, <strong>di</strong> conseguenza,l'utilizzo dei servizi che vengono messi a <strong>di</strong>sposizione dell'utente, favorendo così lasua <strong>di</strong>ffusione ed ampliando così il suo bacino <strong>di</strong> utenza.Per poter raggiungere tale obiettivo, la mia applicazione prevede l'associazione <strong>di</strong> uncertificato Robot a più utenti, evitando quin<strong>di</strong> che questi ultimi richiedano uncertificato personale.Il certificato Robot è un certificato particolare salvato su un supporto fisso (e-tokenUSB) che è legato ad un'applicazione piuttosto che ad una persona.La problematica principale a cui si va incontro nel momento in cui si associa talecertificato a più persone contemporaneamente, è quella <strong>di</strong> tenere traccia dell'effettivoLuca Gerardo 566/2636 Pagina 3 <strong>di</strong> 113


utilizzatore del certificato.Infatti, attualmente, associare uno stesso certificato Robot a più utenti, comportal'impossibilità <strong>di</strong> risalire all'identità del singolo utente che ha utilizzato o stautilizzando il certificato in un preciso momento.La soluzione, adottata per risolvere il problema, è quella <strong>di</strong> creare un role univoco perciascun utente ed associare quin<strong>di</strong> tale role al certificato Robot, in modo da riuscire atener traccia delle operazioni effettuate dai singoli utenti che fanno uso <strong>di</strong> talecertificato.Il role utilizzato per ciascun utente è la propria mail. Questo fa sì che venga garantital'univocità.In particolare l'applicazione, da me sviluppata, offre la possibilità a qualsiasi utente <strong>di</strong>accedere ad una pagina <strong>di</strong> iscrizione, nella quale vengono richieste sia <strong>di</strong>verseinformazioni personali dell'utente, quali nome, cognome ed e-mail, sia l'esplicitarichiesta del certificato robot da usare per l'associazione del role a quest'ultimo.Il modello architetturale dell'applicazione da me realizzata è <strong>di</strong> tipo Client/Server.Il software è stato sud<strong>di</strong>viso in tre moduli, quali la User Interface per la presentazionedei dati, la businness logic che è il cuore dell'applicazione e che si occupa della logicaapplicativa, ed il terzo modulo che si occupa <strong>di</strong> tutto ciò che riguarda la persistenza deidati. Si è scelto l'utilizzo <strong>di</strong> tale architettura per favorire la portabilità, l'esten<strong>di</strong>bilità ela manutenibilità dell'applicazione stessa.I linguaggi utilizzati per lo sviluppo <strong>di</strong> tale applicazione sono stati:• html per la presentazione;• javaScript, linguaggio <strong>di</strong> scripting, utile oltre che per la realizzazionedell'interfccia, anche per un primo controllo dei dati “lato Client”, evitandocosì inutili passaggi <strong>di</strong> dati fra client e server nel caso in cui questi dovesseroessere errati;• MySQL: per la gestione del Database;• java, in particolare tecnologia servlet/JSP me<strong>di</strong>ante l'utilizzo <strong>di</strong> server basati sujava per la programmazione Web lato Server.È stato quin<strong>di</strong> necessario anche l'utilizzo <strong>di</strong> un Application Server, quale Tomcat. Si èscelto <strong>di</strong> utilizzare le servlet per motovi <strong>di</strong> efficienza e scalabilità, che esse forniscono,Luca Gerardo 566/2636 Pagina 4 <strong>di</strong> 113


e per l'ottima interazione con il server che si ottiene, visto che queste vengonoeseguite dallo stesso processo.Per il reperimento dei dati all'interno del database è stato utilizzato un linguaggio <strong>di</strong>interrogazione strutturato, quale SQL.La tesi è stata sud<strong>di</strong>visa principalmente in <strong>di</strong>eci capitoli, dove i primi tre risultanoessere introduttivi trattando argomenti come le griglie computazionali e l'infrastrutturaS.Co.Pe.Il quarto capitolo tratta la sicurezza in ambito grid e l'uso dei certificati nei medesimiambienti con relativa autenticazione.Il quinto capitolo tratta i certificati Robot e nel sesto capitolo vengono esposti glistrumenti e le tecniche utilizzate per lo sviluppo della suddetta applicazione nonchél'attività sperimentale.Il settimo capitolo si occupa del testing e dei possibili scenari applicativi.Infine i restanti tre capitoli sono relativi alle conclusioni, alla bibliografia ed al co<strong>di</strong>cein Appen<strong>di</strong>ce.Luca Gerardo 566/2636 Pagina 5 <strong>di</strong> 113


2. Il Grid Computing2.1 IntroduzioneLe Grid o griglie nascono inizialmente per sod<strong>di</strong>sfare richieste <strong>di</strong> potenza <strong>di</strong> calcolo, <strong>di</strong>memoria e <strong>di</strong> spazio fisico, presentate da applicazioni della scienza e dell'ingegneriaavanzata le quali, giorno dopo giorno, necessitano, in modo sempre più insistente, <strong>di</strong> talirequisiti per poter raggiungere i propri obiettivi.Il concetto <strong>di</strong> fondo delle Grid è collegare, su larga scala, risorse <strong>di</strong> calcolo eterogenee,<strong>di</strong>stanti tra loro e gestite da persone o enti <strong>di</strong>fferenti[1].Una Grid è una infrastruttura che mette a <strong>di</strong>sposizione <strong>degli</strong> utenti risorse <strong>di</strong> calcolo, <strong>di</strong>memoria e <strong>di</strong> spazio. Le stesse risorse possono essere utilizzate, in modo <strong>di</strong>fferente, aseconda dei vincoli posti sulla con<strong>di</strong>visione e sugli obiettivi prefissati.Uno <strong>degli</strong> aspetti importanti, <strong>di</strong> cui tale infrastruttura deve occuparsi, sono le funzioni <strong>di</strong>monitoraggio <strong>di</strong> tali risorse e la continuità del servizio, che essa deve garantire, in modotale che l'utente finale possa fare sempre affidamento sulla sua <strong>di</strong>sponibilità. Ultimoaspetto, ma non per importanza, <strong>di</strong> cui la Grid deve tener conto, è l'affidabilità, ovverola capacità <strong>di</strong> minimizzare quelli che sono i problemi che possono verificarsi in ambitoGrid, come un guasto <strong>di</strong> un componente hardware o software.La tecnologia Grid non può essere considerata una tecnologia rivoluzionaria in quantoessa contiene al suo interno tecnologie già esistenti quali il calcolo <strong>di</strong>stribuito, il webservices, internet e le <strong>di</strong>verse tecnologie crittografiche per la sicurezza <strong>di</strong> taleinfrastruttura. Per questa ragione, la tecnologia Grid viene definita una tecnologia “inprogress”.Il “life motive” che sta alla base della tecnologia Grid è la virtualizzazione. Essapermette <strong>di</strong> integrare sistemi eterogenei e geograficamente <strong>di</strong>stribuiti, facendo in modoche l'utente possa utilizzarli in modo del tutto trasparente.Esistono <strong>di</strong>versi tipi <strong>di</strong> Grid, quali:• le Grid computazionali o computational Grid;• le Grid <strong>di</strong> dati o data Grid;• le Grid <strong>di</strong> applicazioni e servizi.Una Grid computazionale è l'aggregazione <strong>di</strong> risorse computazionali <strong>di</strong>fferenti fra loro eLuca Gerardo 566/2636 Pagina 6 <strong>di</strong> 113


geograficamente <strong>di</strong>stribuite. Tale accorpamento <strong>di</strong> risorse viene sfruttato concedendopotenza <strong>di</strong> calcolo su richiesta agli utenti che lo desiderano.Una Grid <strong>di</strong> dati, invece, nasce per contenere e mettere a <strong>di</strong>sposizione <strong>degli</strong> utenti unagrande quantità <strong>di</strong> dati, <strong>di</strong>stribuita in domini <strong>di</strong>fferenti.Oltre alle Grid appena enunciate, ne esistono altre come, ad esempio, BioGrid, SensorGrid, Cluster Grid ed altre ancora che, con il passare del tempo, ampliano il loro bacino<strong>di</strong> utenza, favorendo così la loro <strong>di</strong>ffusione.Definizione tipica del Grid è “coor<strong>di</strong>nated resource sharing and problem solving indynamic, multi-instituzional virtual organizations”[2]. Come affermatoprecedentemente, per con<strong>di</strong>visione <strong>di</strong> risorse non si intende soltanto lo scambio <strong>di</strong> file,bensì l'accesso <strong>di</strong>retto a computer, software, dati ed altre risorse. Il concetto <strong>di</strong>“virtualizzazione” fa sì che l'utente creda, nel momento in cui usufruisce dei serviziofferti dalla grid, <strong>di</strong> avere a che fare con un unico e super potente calcolatore.2.2 Il modello a clessidraI gran<strong>di</strong> sistemi informatici sono sempre scomposti in sottosistemi che fornisconoservizi correlati. L'architettura del software influenza <strong>di</strong>versi fattori, quali prestazioni,affidabilità, sicurezza, protezione, <strong>di</strong>sponibilità e manutenibilità. A seconda delleesigenze, si cerca <strong>di</strong> sod<strong>di</strong>sfare alcuni <strong>di</strong> essi a <strong>di</strong>scapito <strong>degli</strong> altri, cercando comunque<strong>di</strong> trovare il giusto compromesso. L'architettura <strong>di</strong> una Grid è un architettura a strati,dove ognuno <strong>di</strong> essi mette a <strong>di</strong>sposizione dei servizi, me<strong>di</strong>ante la propria interfaccia,per gli strati superiori e beneficia <strong>degli</strong> stessi messi a <strong>di</strong>sposizione dagli strati inferiori.Un servizio messo a <strong>di</strong>sposizione da uno strato non è altro che l'insieme dei protocolliannessi “al comportamento” che esso implementa. L'approccio stratificato pre<strong>di</strong>ligeaspetti come la protezione, lo sviluppo incrementale del sistema, la manutenibilità e laportabilità: fino a quando le interfacce non vengono mo<strong>di</strong>ficate, è possibile sostituireogni strato con un altro ad esso equivalente senza influire negativamente sugli stratia<strong>di</strong>acenti. Essendo la protezione un requisito critico, si fa in modo che le risorse chedevono essere protette, vengano inserite nello strato più interno dell'architettura.L'architettura stratificata possiede anche <strong>degli</strong> svantaggi: solitamente gli strati interniLuca Gerardo 566/2636 Pagina 7 <strong>di</strong> 113


forniscono delle funzionalità basilari o, come nel nostro caso, delle risorse. Il più dellevolte, tali funzionalità sono richieste dalla maggior parte dei livelli. Con un approcciodel genere, la richiesta <strong>di</strong> una funzionalità da parte <strong>di</strong> uno strato situato ad un livello piùalto rispetto a quello preso in considerazione, comporterebbe l'interpretazione dellarichiesta ad ogni livello. Quin<strong>di</strong>, i servizi richiesti da un utente ad un livello superioredevono, per accedere ai servizi offerti dai livelli sottostanti, passare attraverso gli stratia<strong>di</strong>acenti. Per sopperire a queste problematiche, l'architettura Grid è organizzata inmodo tale da essere un'architettura a strati aperta. In tale architettura, gli strati cheforniscono servizi basilari sono resi accessibili non solo al livello a<strong>di</strong>acente, ma anche aquelli situati “più in alto”: verrà così favorita l'esten<strong>di</strong>bilità, l'interoperabilità e laportabilità. Ovviamente, oltre ai vantaggi appena esposti, questo tipo <strong>di</strong> architetturacomporta anche <strong>degli</strong> svantaggi: mo<strong>di</strong>ficare l'interfaccia <strong>di</strong> un livello al quale accedonopiù strati, significa mo<strong>di</strong>ficare anche tutti gli strati che sfruttano tali servizi.Per comprendere meglio la scomposizione in strati dell'architettura facciamo riferimentoalla seguente immagine:fig. 1Luca Gerardo 566/2636 Pagina 8 <strong>di</strong> 113


In figura 1 è possibile notare ciò che è stato descritto precedentemente: il livelloApplication sfrutta i servizi offerti dai livelli Connectivity, Resource e Collective,eliminando quelli che sono gli svantaggi <strong>di</strong> un'architettura stratificata chiusa a <strong>di</strong>scapitodella manutenibilità. In secondo luogo, sono evidenziati quanti e quali sono i livelli checostituiscono tale architettura, identificando quin<strong>di</strong> i componenti principali del sistema.Essendo il Grid una struttura che deve permettere relazioni <strong>di</strong> con<strong>di</strong>visione tra ipartecipanti, aspetto molto importante è giocato dall'interoperabilità. Nelle retiinformatiche l'interoperabilità è sinonimo <strong>di</strong> “protocolli comuni”, in<strong>di</strong> per cuil'architettura Grid è prima <strong>di</strong> tutto un'architettura <strong>di</strong> protocolli utilizzati per negoziare,usufruire e gestire relazioni <strong>di</strong> con<strong>di</strong>visione <strong>di</strong> risorse. Ciò che il Grid vuole garantire èla possibilità <strong>di</strong> iniziare e creare arbitrariamente relazioni <strong>di</strong> con<strong>di</strong>visione tra le parti,agevolando l'integrazione <strong>di</strong> nuovi partecipanti in modo <strong>di</strong>namico. In assenza <strong>di</strong>interoperabilità, gli utenti sono costretti a creare un accordo bilaterale <strong>di</strong> con<strong>di</strong>visione,impedendo che quest'ultimo possa essere esteso anche ad altre parti.La presenza <strong>di</strong> tali protocolli permette quin<strong>di</strong> <strong>di</strong> specificare come gli elementi, che sonoparte del sistema <strong>di</strong>stribuito, interagiscono fra <strong>di</strong> loro.Oltre a quelli che sono i protocolli, i servizi e l'interoperabilità, un ruolo fondamentalein ambito Grid è rivestito dalle APIs (Application Programming Interfaces) e dall'SDKs(Software Development Kits) che permettono agli sviluppatori <strong>di</strong> realizzare, in modoveloce e portabile, applicazioni per ambienti Grid corrette e robuste.Un progetto molto importante relativo al Grid Computing è stato Globus. GlobusToolkit, oltre a sviluppare e quin<strong>di</strong> a fornire protocolli fondamentali per gli ambientiGrid, offre un toolKit, e quin<strong>di</strong> <strong>degli</strong> strumenti <strong>di</strong> sviluppo software, per realizzareapplicazioni Grid portabili, robuste ed efficienti in modo veloce.I livelli dell'architettura Grid sono cinque e vengono <strong>di</strong> seguito descritti:• Il livello Fabric: fornisce le risorse messe a <strong>di</strong>sposizione dall'architettura, comead esempio risorse computazionali, sistemi <strong>di</strong> archiviazione e sensori, quandoci riferiamo alle risorse intese come entità fisiche; oppure file system<strong>di</strong>stribuiti, quando parliamo <strong>di</strong> risorse viste come entità logiche. Le risorsepresenti in questo livello dovrebbero mettere in atto meccanismi tali dapermettere agli utilizzatori <strong>di</strong> conoscere, quanto meno, la propria struttura ed ilLuca Gerardo 566/2636 Pagina 9 <strong>di</strong> 113


proprio stato; ed agli sviluppatori <strong>di</strong> implementare servizi <strong>di</strong> gestione dellerisorse per il controllo del QoS (Quality of Service).Le risorse che possono essere trovate in questo livello sono:• risorse <strong>di</strong> calcolo, richieste per eseguire programmi e monitorare econtrollore l'esecuzione dei processi creati;• risorse <strong>di</strong> archiviazione, per il salvataggio e reperimento <strong>di</strong> file. Ancheper questo tipo <strong>di</strong> risorse sono utili funzioni atte a rendere noto il lorostato e le caratteristiche hardware e software;• risorse <strong>di</strong> rete, per il trasferimento dati. Importanti, in questo caso, sonole funzioni <strong>di</strong> richiesta per determinare lo stato della rete ed il suocarico;• catalogs, specializzato all'archiviazione <strong>di</strong> risorse;• Il livello Connectivity: gioca un ruolo <strong>di</strong> fondamentale importanza all'internodella struttura stratificata perché racchiude i protocolli <strong>di</strong> comunicazione e <strong>di</strong>autenticazione in ambiente Grid. I protocolli <strong>di</strong> comunicazione qui presentipermettono lo scambio <strong>di</strong> dati tra le risorse del livello sottostante. L'insieme deiprotocolli <strong>di</strong> comunicazione è costituito da protocolli <strong>di</strong> rete, <strong>di</strong> trasporto e <strong>di</strong>applicazione. Vengono quin<strong>di</strong> utilizzati i protocolli presenti nello stack delmodello ISO/OSI: ci si riferisce, rispettivamente, ai protocolli IP ed ICMP peril livello <strong>di</strong> rete, TCP ed UDP per il livello <strong>di</strong> trasporto e DNS e OSPF ed altriper il livello <strong>di</strong> applicazione. Per quanto concerne, invece, i protocolli <strong>di</strong>autenticazione, questi forniscono meccanismi <strong>di</strong> sicurezza facendo in modo chevenga verificata sia l'identità delle risorse che <strong>degli</strong> utenti. Le soluzioni <strong>di</strong>autenticazione per una Virtual Organization dovrebbero possedere le seguenticaratteristiche:• Single sign on : consiste nel dare la possibilità all'utente <strong>di</strong> autenticarsial sistema un'unica volta, facendo in modo che successivamente possautilizzare le risorse presenti al livello Fabric senza la necessità <strong>di</strong>ulteriori autenticazioni;• Delegation : è un meccanismo che permette ad un utente <strong>di</strong> delegare unprogramma per lo svolgimento dei compito per cui è stato invocato,Luca Gerardo 566/2636 Pagina 10 <strong>di</strong> 113


facendo in modo che esso abbia, sulle risorse del sistema, le stesseautorizzazioni dell'utente che lo ha invocato;• Integration with various local securety solutions: ogni fornitore <strong>di</strong>risorsa può attuare delle soluzioni <strong>di</strong> sicurezza locale sulle singolerisorse. Le soluzioni <strong>di</strong> sicurezza adottate in ambiente Grid devonoessere capaci <strong>di</strong> interoperare con le soluzioni <strong>di</strong> sicurezza adottatelocalmente dalle singole risorse.• User-based trust relationschips: si intendono relazioni <strong>di</strong> fiducia basatasugli utenti. L'utilizzo da parte <strong>di</strong> un utente <strong>di</strong> più risorsecontemporaneamente non appartenenti allo stesso sito, non implical'interazione <strong>degli</strong> amministratori della sicurezza delle singole risorse.• Il livello Resource: tale livello poggia su quello connectivity, sfruttando quin<strong>di</strong>quelli che sono i servizi messi a <strong>di</strong>sposizione da quest'ultimo. In questo livellole risorse vengono prese in considerazione singolarmente. I protocolli quidefiniti sono utilizzati per la negoziazione delle risorse, per il loro controllo e<strong>di</strong>l loro monitoraggio. Principalmente i protocolli qui presenti si <strong>di</strong>vidono in duetipologie:• Information protocols, usati per reperire informazioni dalle singolerisorse come il loro stato, il loro carico, o la loro politica <strong>di</strong> utilizzo;• Management protocols, utilizzati per la gestione delle risorse o, permeglio <strong>di</strong>re, per la negoziazione dell'accesso alle risorse con<strong>di</strong>vise. Inquesta tipologia <strong>di</strong> protocolli sono presenti anche quelli che prevedono,come detto precedentemente, il monitoraggio dello stato delleoperazioni ed il loro controllo.• Il livello Collective: <strong>di</strong>versamente dal livello su cui poggia, il livello collectivesi concentra sull'interazione delle singole risorse e quin<strong>di</strong> considera unacollezione <strong>di</strong> risorse. Di conseguenza i protocolli qui definiti non sono associatialle singole risorse ma gestiscono appunto la loro interazione. In questo livellosono presenti <strong>di</strong>versi servizi:• Directory services: permette agli utenti <strong>di</strong> una Virtual Organization <strong>di</strong>effettuare ricerche <strong>di</strong> risorse per nome, per attributi, per carico o perLuca Gerardo 566/2636 Pagina 11 <strong>di</strong> 113


<strong>di</strong>sponibilità. I protocolli utilizzati per tali servizi sono il GRIP ed ilGRRP.• Co-allocation, scheduling and brokering services: tali servizipermettono agli utenti <strong>di</strong> una Virtual Organization l'allocazione <strong>di</strong> una opiù risorse per fini specifici e la schedulazione dei tasks sulle varierisorse. Il brokering services è un servizio che cerca, data una richiesta,le risorse adatte a sod<strong>di</strong>sfare, nel modo più efficiente, i compiti richiesti.• Monitoring and <strong>di</strong>agnostics services: utilizzato per monitorare le risorsein termini <strong>di</strong> errori verificatisi, <strong>di</strong> sovraccarico e <strong>di</strong> attacchi subiti.• Altri;• Il livello Applications: è l'ultimo livello dell'architettura stratificata ecomprende le applicazioni utente che operano in ambito Grid. Me<strong>di</strong>ante esse,l'utente accede a quelli che sono i servizi Grid. Dal punto <strong>di</strong> vista delprogrammatore, un'applicazione è definita e richiama i servizi messi a<strong>di</strong>sposizione dei livelli sottostanti. Come già detto precedentemente, ognilivello mette a <strong>di</strong>sposizione dei livelli superiori, delle interfacce per accedere aipropri servizi. Le applicazioni dell'ultimo livello possono, essendo l'architetturaGrid un 'architettura a strati aperta, accedere ai servizi messi a <strong>di</strong>sposizione daqualsiasi livello sottostante. Per servizi si intende la gestione delle risorse,l'accesso ai dati ed il reperimento delle risorse.Definita quella che è l'architettura <strong>di</strong> una Grid, possiamo rappresentare quest'ultima conun modello a clessidra (ve<strong>di</strong> fig. 2): è possibile notare un “collo <strong>di</strong> bottiglia” al centrodella clessidra. Questa parte della clessidra, che rappresenta gli strati Resource eConnectivity, e <strong>di</strong> conseguenza i protocolli in essi contenuti, è comunemente dettoanche middleware (strato centrale). All'interno del middleware troviamo quin<strong>di</strong> API edSDK. Poiché questi ultimi sono fondamentali per la realizzazione <strong>di</strong> una Grid, iprotocolli presenti negli strati Resource e Connectivity devono essere pochi e bendefiniti. Un middleware <strong>di</strong> ultima generazione utilizzato in ambito Grid è gLite.Luca Gerardo 566/2636 Pagina 12 <strong>di</strong> 113


fig. 2Il middleware ha il compito <strong>di</strong> “far interagire” le applicazioni utente con le risorse veree proprie.Esso fornisce• meccanismi <strong>di</strong> comunicazione ed autenticazione;• meccanismi per il monitoraggio delle singole risorse e per il loro reperimento;• informazioni inerenti al loro stato.Un middleware è principalmente costituito da due parti fondamentali: i servizi core ed iservizi collective.I servizi core consentono l'inserimento <strong>di</strong> risorse locali all'interno dell'infrastrutturaGrid, richiedendo management locale quali ad esempio start-up, aggiornamenti etroubleshooting.I servizi collective consentono agli utenti l'uso trasparente delle risorse <strong>di</strong> storage ecomputing.Entrambi i servizi saranno trattati in modo più approfon<strong>di</strong>to nel capitolo successivo.2.3 Il concetto <strong>di</strong> Virtual OrganizationIl motivo per cui nascono le griglie computazionali, come già detto, non è tanto peragevolare lo scambio <strong>di</strong> file, ma piuttosto per fornire un accesso <strong>di</strong>retto a computer,software, dati e altre risorse in modo tale da sopperire a quelle che sono leLuca Gerardo 566/2636 Pagina 13 <strong>di</strong> 113


problematiche che i campi della scienza e dell'ingegneria avanzata si trovano, giornodopo giorno, ad affrontare.Il termine Virtual Organization (VO) in<strong>di</strong>ca un insieme <strong>di</strong> in<strong>di</strong>vidui e/o istituzioni che,per poter raggiungere fini comuni, hanno bisogno <strong>di</strong> con<strong>di</strong>videre risorse hardware esoftware sulla base <strong>di</strong> regole ben definite[3]. Le VO <strong>di</strong>fferiscono fra loro in <strong>di</strong>mensione,numero <strong>di</strong> partecipanti, durata, struttura e fine o tipo <strong>di</strong> attività svolto. Ciò nonostanteesse sono accomunate da esigenze simili, quali, ad esempio, la necessità dell'esistenzasia <strong>di</strong> relazione <strong>di</strong> con<strong>di</strong>visione altamente flessibile <strong>di</strong> risorse, sia <strong>di</strong> livelli <strong>di</strong> controllosulle risorse con<strong>di</strong>vise nei quali sono inclusi gli accessi controllati, le delegazioni, el'applicazione <strong>di</strong> politiche locali e globali. Un esempio <strong>di</strong> VO può essere l'insieme <strong>degli</strong>ingegneri <strong>di</strong> una compagnia <strong>di</strong> progettazione aerea, <strong>di</strong>stribuiti su <strong>di</strong>versi centri, checon<strong>di</strong>vidono brevetti, risorse <strong>di</strong> calcolo e software <strong>di</strong> simulazione.fig. 3Un organizzazione può essere parte <strong>di</strong> una o più VO, decidendo <strong>di</strong> mettere a<strong>di</strong>sposizione dei partecipanti tutte o parte delle proprie risorse, siano essecomputazionali, <strong>di</strong> storage e quant'altro. La con<strong>di</strong>visione <strong>di</strong> risorse è con<strong>di</strong>zionale. Ilproprietario della risorsa può decidere <strong>di</strong> porre dei vincoli su come, quando e chi deveutilizzare quella specifica risorsa, così come “il consumatore” può porre dei vincoliLuca Gerardo 566/2636 Pagina 14 <strong>di</strong> 113


sulle risorse da in<strong>di</strong>viduare per poter sod<strong>di</strong>sfare le proprie esigenze e svolgere quin<strong>di</strong> ipropri task, come ad esempio il suo carico. Per poter implementare i vincoli appenacitati, si necessita <strong>di</strong> meccanismi che offrono la possibilità <strong>di</strong> esprimere politiche sia alfine <strong>di</strong> stabilire l'identità dei consumatori e/o delle risorse (in questo caso parliamo <strong>di</strong>autenticazione), sia al fine <strong>di</strong> determinare quali operazioni sono consentite ( in questocaso parliamo <strong>di</strong> autorizzazione). La stessa risorsa può essere usata in mo<strong>di</strong> <strong>di</strong>fferenti aseconda <strong>degli</strong> obiettivi della con<strong>di</strong>visione. É importante notare che le relazioni <strong>di</strong>con<strong>di</strong>visione possono variare nel tempo e questo giustifica la definizione <strong>di</strong> VO citataquando si è parlato <strong>di</strong> <strong>di</strong>namicità.fig. 4Nella fig. 4 è rappresentata la struttura <strong>di</strong> una VO. In essa è presente un manager checura la gestione, i membri della VO, ad ognuno dei quali possono essere associati uno opiù ruoli, e gli utenti che hanno la possibilità <strong>di</strong> accedere ai servizi offerti dalla VOme<strong>di</strong>ante User Interface. Non possono infine mancare quelle che sono le risorse dacon<strong>di</strong>videre per fornire i servizi ai partecipanti.Luca Gerardo 566/2636 Pagina 15 <strong>di</strong> 113


3. L'infrastruttura ScoPE e le nuove comunità scientifiche3.1 Introduzione<strong>Napoli</strong>, grazie all'<strong>Università</strong> <strong>degli</strong> <strong>Stu<strong>di</strong></strong> <strong>di</strong> <strong>Napoli</strong> <strong>Federico</strong> <strong>II</strong>, è uno dei centri <strong>di</strong>eccellenza nel settore scientifico. L'ateneo infatti ha dei centri <strong>di</strong> ricerca e <strong>di</strong> sviluppoubicati in <strong>di</strong>verse zone della città e collegati fra <strong>di</strong> loro grazie ad una infrastruttura adanello <strong>di</strong> fibra ottica con velocità <strong>di</strong> 2.4 Gbit/sec upgradabile fino a 10 Gbit/sec.fig. 5Tale collegamento garantisce un'ottima comunicazione fra le varie se<strong>di</strong> per lo scambioed il trattamento delle risorse. Per poter unire le sinergie dei <strong>di</strong>partimenti e le strutture <strong>di</strong>ricerca afferenti o in collaborazione con la <strong>Federico</strong> <strong>II</strong> e per supportare le esigenze <strong>di</strong>calcolo dei ricercatori, dei docenti e <strong>degli</strong> studenti, l'ateneo si è dotato <strong>di</strong> sistemi <strong>di</strong>calcolo e <strong>di</strong> storage ad alte prestazioni.Viene ideato così il progetto ScoPe.3.2 Il progetto SCoPEIl progetto SCoPE, il cui acronimo sta per “Sistema Cooperativo Distribuito ad altePrestazioni per Elaborazioni Scientifiche Multi<strong>di</strong>sciplinari”, è stato finanziato con iLuca Gerardo 566/2636 Pagina 16 <strong>di</strong> 113


fon<strong>di</strong> PON del 2000/2006 per la Ricerca Scientifica, Sviluppo, Sviluppo Tecnologico,Alta Formazione.L'architettura <strong>di</strong> SCoPE, sulla base <strong>di</strong> una preesistente infrastruttura <strong>di</strong> retemetropolitana, che connette al Gbit tutte le maggiori strutture <strong>di</strong> ricerca dell'ateneo,prevede <strong>di</strong> integrare le risorse <strong>di</strong> calcolo e storage attualmente <strong>di</strong>sponibili, con un nuovohardware ad alte prestazioni. Tali risorse verranno poi inglobate in unica piattaforma <strong>di</strong>tipo Grid, basata su middleware <strong>di</strong> nuova generazione.L'obbiettivo finale è quin<strong>di</strong> la realizzazione <strong>di</strong> un Data Center (Fig. 6) con un sistema <strong>di</strong>calcolo ad alte prestazioni, orientato ad applicazioni scientifiche multi<strong>di</strong>sciplinari, cheoperi secondo il para<strong>di</strong>gma Grid [nota], de<strong>di</strong>cato alla modellistica computazionale edalla gestione <strong>di</strong> gran<strong>di</strong> banche dati per le ricerche nelle aree applicative <strong>di</strong> interesse delprogetto e quin<strong>di</strong> a supporto della ricerca <strong>di</strong> base e delle piccole e me<strong>di</strong>e imprese.fig. 6Le quattro aree applicative del progetto sono:• Scienze del Microcosmo e Macrocosmo, le cui applicazioniriguardano tematiche quali:▪ Astrofisica: stu<strong>di</strong>o del modello <strong>di</strong> analisi dati nell'ambito dellastruttura cosmica su larga scala;▪ Fisica Subnucleare: l'attività consiste nello stu<strong>di</strong>o delleinterazioni protone-protone ad altissima energia pressol'accelleratore LHC (Large Hadron Collider) del CERNLuca Gerardo 566/2636 Pagina 17 <strong>di</strong> 113


(esperimento ATLAS);▪ Elettromagnetismo e telecomunicazioni: progetto in una rete <strong>di</strong>sensori in connessione wireless operanti in architettura Grid erealizzazione <strong>di</strong> un test-bed per una città sicura.Queste tematiche hanno un alto costo computazionale e richiedonoaccesso sequenziale a gran<strong>di</strong> quantità <strong>di</strong> dati.• Scienze dei materiali e dell'ambiente, il cui scopo riguarda losviluppo <strong>di</strong> meto<strong>di</strong> teorici e protocolli computazionali per lamodellazione delle proprietà strutturali e spettroscopiche <strong>di</strong> polimeri e<strong>di</strong> sistemi nanostrutturati.• Scienze della vita, prevede lo stu<strong>di</strong>o modellistico-computazionale deimeccanismi fondamentali alla base <strong>di</strong> processi <strong>di</strong> interesse biologico el'interfacciamento <strong>di</strong> database bioinformatici con meto<strong>di</strong> <strong>di</strong> simulazionemolecolare. Le tematiche affrontate sono l'analisi comparative <strong>di</strong>sequenze genomiche, l'analisi <strong>di</strong> proteomi, la proteomica funzionale.Il Data Center, realizzato su una poternte infrastruttura <strong>di</strong> calcolo fornito dalla Dell, èstato inaugurato il 1° Dicembre 2008 e si inserisce nel sistema <strong>di</strong> Grid Computingnazionali ed internazionali, confermandosi tra i centri più compleri d'Italia, grazie aglioltre 300 server, costituiti da doppia CPU quad core per un totale <strong>di</strong> 2432 core,raggruppati in 16 blade per chassis (fig 7), e 200 Terabyte <strong>di</strong> spazio <strong>di</strong>sco.fig. 7Il Data Center è parte della “struttura <strong>di</strong> calcolo avanzato dell'Italia Meri<strong>di</strong>onale e<strong>di</strong>nsulare per la ricerca e l'innovazione tecnologica basata su griglie computazionali adLuca Gerardo 566/2636 Pagina 18 <strong>di</strong> 113


alte prestazioni” denominata GRISU' (Griglia del Sud).Il progetto SCoPE si è concluso formalmente il 28 Febbraio 2009 e il Data Centerrealizzato è stato affidato dal Rettore in gestione operativa or<strong>di</strong>naria al CSI (Centro <strong>di</strong>Servizi <strong>di</strong> Ateneo) e ad un comitato scientifico che ne in<strong>di</strong>vidui le linee strategiche e <strong>di</strong>in<strong>di</strong>rizzo in coerenza con le finalità e con gli obiettivi elencati dagli accor<strong>di</strong> sottoscritti.3.3 L'architettura della Griglia ComputazionaleL'architettura del Data Center SCoPE è un'architettura stratificata aperta, la cuipeculiarità sta nell'agevolare l'esten<strong>di</strong>bilità, la manutenibilità, l'interoperabilità e laportabilità richieste dalla Griglia Computazionale.La piattaforma <strong>di</strong> tipo Grid su cui saranno inglobate le risorse gestite dal centro SCoPEsi basa su un middlware <strong>di</strong> nuova generazione.Middleware, costituisce l'insieme dei protocolli, servizi, API e SDKs necesari alfunzionamento dell'infrastruttura Grid. Fornisce meccanismi <strong>di</strong> autenticazione eautorizzazione e la possibilità <strong>di</strong> utilizzare le risorse implementando servizi atti alla loroscoperta e al loro utilizzo. É un software che gestisce tutte le risorse del calcolo<strong>di</strong>stribuito. Il middleware <strong>di</strong> SCoPE è un INFNGRID: garantisce• piena compatibilità con il middleware EGEE (gLite/LCG);• release e aggiornamenti/bugfix frequenti;• semplicità <strong>di</strong> integrazione con l'infrastruttura Grid italiana (Grid.it) edeuropea (EGEE);• <strong>di</strong>sponibilità <strong>di</strong> tool consolidati nati in ambito INFN ed utilizzati in<strong>di</strong>versi progetti ed infrastrutture Grid esistenti (GridICE, VOMS,DGAS Distributed Grid Accounting System);• supporto tecnico sulla release e sui tool con la possibilità <strong>di</strong> comunicare<strong>di</strong>rettamente con gli sviluppatori del middleware.L'architettura generale <strong>di</strong> un sito Grid mostra il middleware <strong>di</strong>viso in due areeprincipali:• servizi “core”;• servizi “collective”.Luca Gerardo 566/2636 Pagina 19 <strong>di</strong> 113


Vi sono inoltre servizi utili e a volte necessari al deployment e alla gestione delleinfrastrutture .fig. 8I servizi “core” sono servizi locali che permettono <strong>di</strong> con<strong>di</strong>videre, risorse <strong>di</strong> calcolo e <strong>di</strong>storage e virtual instruments. Sono presenti in tutti i siti e sono implementati da GridElement , dove per Grid Element si intende un host che:• fornisce uno o più servizi ( siano essi collective o core);• fornisce meto<strong>di</strong> per l'accesso a tali servizi• è in grado <strong>di</strong> rendere note informazioni sulle caratteristiche e sullo stato deiservizi;• è capace <strong>di</strong> interagire con altri elementi grid o con gli utenti <strong>di</strong>rettamente.I servizi core sono:▪▪repository pacchetti del middlware (YAIM) contiene una replica dei pacchettiINFNGRID e <strong>degli</strong> aggiornamenti del sistema operativo e tool automatici perl'installazione e l'aggiornamento dei no<strong>di</strong> Grid; consente inoltre l'installazioneautomatica del sistema operativo tramite PXE (sistema <strong>di</strong> boot remoto);servizi <strong>di</strong> computing (Computing Element e Worker Node): i ComputingElement rappresentano l'interfaccia Grid verso una Farm costituita da no<strong>di</strong> <strong>di</strong>Luca Gerardo 566/2636 Pagina 20 <strong>di</strong> 113


calcolo (Worker Node – WN) e gestiscono i job <strong>di</strong> calcolo tramite un batchqueuesystem, attraverso il quale è possibile partizionare l'insieme <strong>di</strong> risorse <strong>di</strong>calcolo (CPU) e definire delle policy <strong>di</strong> utilizzo da parte delle varie VO (CPUtime, numero <strong>di</strong> job concorrenti) me<strong>di</strong>ante la creazione <strong>di</strong> code batch. Essi sonodotati <strong>di</strong> certificato <strong>di</strong>gitale (rilasciato al momento dalla CA INFN) che attestal'atten<strong>di</strong>bilità delle transazioni. I Worker Node rappresentano host <strong>di</strong>sponibiliper l'esecuzione <strong>di</strong> job e vengono gestiti/allocati dai Computing Element(figura 9) contengono l'execution environment del processo <strong>di</strong> calcolo (librerie<strong>di</strong> esperimento, toolkit, etc.);fig. 9▪▪servizi <strong>di</strong> storage (Storage Element) costituiscono lo spazio <strong>di</strong> storage Grid;mettono a <strong>di</strong>sposizione, delle <strong>di</strong>verse VO, interfacce utili alla gestione dellospazio locale e fanno uso del protocollo GridFTP per il trasferimento <strong>di</strong> file.Ciascun Storage Element è fornito <strong>di</strong> certificato <strong>di</strong>gitale (rilasciato dalla CAINFN) che attesta l'atten<strong>di</strong>bilità delle transazioni e che permette la mutuaautenticazione;User Interface (UI) obiettivo principale è permettere l'accesso alle risorsemesse a <strong>di</strong>sposizione dalla Grid. Me<strong>di</strong>ante essa è possibile sottomettere,visualizzare e cancellare job, nonché recuperare il loro output. L''utente puòaccedere all'UI e sfruttare le risorse del Grid tramite collegamento remoto <strong>di</strong>una UI <strong>di</strong> infrastruttura o <strong>di</strong> gruppo (SSH, et..), oppure tramite un PC desktop onotebook personale configurato con i componenti della UI, ma non prima <strong>di</strong>aver installato il proprio certificato personale o <strong>di</strong> poter utilizzare un certificatoRobot.Luca Gerardo 566/2636 Pagina 21 <strong>di</strong> 113


fig. 10I servizi collective sono servizi <strong>di</strong>stribuiti o centralizzati che lavorano al <strong>di</strong> sopra dellerisorse locali costituendo l'infrastruttura <strong>di</strong>stribuita. Sono implementati da Grid Elemented hanno valenza collettiva. Essi permettono l'utilizzo “trasparente”, dal punti <strong>di</strong> vistadell'utente, delle risorse messe a <strong>di</strong>sposizione dalla Grid, quali Storage Element eComputing Element. Richiedono, inoltre, un team <strong>di</strong> management locale per garantire iservizi <strong>di</strong> start-up, <strong>di</strong> aggiornamento e <strong>di</strong> troubleshooting; il supporto agli utenti finali eai site-manager dei siti periferici e la continuità del servizio.I servizi collective sono:▪ servizio VOMS (Virtual Organization Membership Service) inserisceinformazioni aggiuntive nel certificato proxy <strong>di</strong> un utente, quali VO <strong>di</strong>appartenenza, gruppo, ruolo e privilegi facendo in modo, quin<strong>di</strong>, che lepolitiche <strong>di</strong> autorizzazioni si basino anche, ma non necessariamente, su questeinformazioni aggiuntive. Consente la gestione <strong>degli</strong> utenti tramite interfacciaweb e con un solo server VOMS è possibile gestire più VO;▪ servizi <strong>di</strong> allocazione dei job (Resource Broker) consentono il marchmaking,cioè consentono l'assegnazione <strong>di</strong> un job (seriale o parallelo) ad una risorsa <strong>di</strong>computing e/o storage, attraverso l'elaborazione <strong>di</strong> “requirement del job” o lo“stato della Grid”. Ciascun Resource Broker è fornito <strong>di</strong> certificato <strong>di</strong>gitale(rilasciato dalla CA INFN) che attesta l'atten<strong>di</strong>bilità delle transazioni econsente la mutua autenticazione;▪ servizi informativi (Information Index) forniscono le informazioni inerenti alloLuca Gerardo 566/2636 Pagina 22 <strong>di</strong> 113


▪stato, al carico e alle caratteristiche <strong>di</strong> ogni risorsa <strong>di</strong> calcolo presente nellaGrid tramite il servizio GRIS (Grid Resource Information Service). CiascunGRIS si registra presso un Information Index, il quale preleva le informazionida essi fornite in modo tale da esporre una visione globale delle risorse <strong>di</strong> tuttal'infrastruttura Grid;logical file catalog (LFC) fornisce servizi <strong>di</strong> naming ed un filesystem virtuale<strong>di</strong> alto livello per il mapping <strong>di</strong> nomi logici a file fisici <strong>di</strong>stribuiti sugli StorageElement della Grid.fig.11Luca Gerardo 566/2636 Pagina 23 <strong>di</strong> 113


4. Il modello <strong>di</strong> sicurezza GSI ed il servizio VOMS4.1 IntroduzioneGSI è l'acronimo <strong>di</strong> Grid Securety Infrastructure ed è parte <strong>di</strong> Globus Toolkit. Essodefinisce, come suggerisce la parola, l'architettura che fornisce le funzionalitànecessarie atte a garantire la corretta implementazione della sicurezza nelle griglie. Talearchitettura è stata progettata per raggiungere un determinato livello <strong>di</strong> sicurezza <strong>di</strong> cuigli ambienti grid necessitano. Essi sono:• Single Sign-On: l'utente deve essere capace <strong>di</strong> autenticarsi un'unica volta,facendo in modo che possa accedere alle risorse della griglia senza che vengarichiesto nuovamente l'autenticazione.• Delegation of privileges: Si vuole fare in modo che un'entità possa delegare ipropri privilegi sulle risorse ad una seconda entità per fare in modo chequest'ultima possa completare il lavoro che le è stato richiesto dalla primaentità. Ciò può essere fatto me<strong>di</strong>ante l'uso del certificato proxy. Il certificatoproxy unito alla chiave privata è chiamato proxy delle credenziali. Il proxydelle credenziali fornisce un accesso ristretto alle sole risorse <strong>di</strong> cui la secondaentità necessità per poter portare a termine il lavoro, sebbene i privilegi dellaprima entità siano molto più ampi. La delegazione dei privilegi siffatta è dettadelegazione delle credenziali.• Inter-domain security support: le soluzioni <strong>di</strong> sicurezza grid devono fornire ilsupporto necessario per l'interazione tra entità <strong>di</strong>sposte in domini <strong>di</strong> sicurezza<strong>di</strong>fferenti. L'accesso alle risorse locali è gestito da politiche <strong>di</strong> sicurezza locali.A tal proposito deve esserci un proxy sul sistema locale che fornisce accessoalle risorse locali a nome del client remoto.• Secure Communication: è necessario un sistema <strong>di</strong> sicurezza che garantiscauna comunicazione sicura per lo scambio <strong>di</strong> messaggi fra le entità.L'architettura GSI fornisce tale supporto facendo uso del protocollo TLS,acronimo <strong>di</strong> transport layer securety. Tale protocollo cifra la comunicazione dasorgente a destinazione.• Authentication and Authorization: le soluzioni <strong>di</strong> sicurezza in ambito GridLuca Gerardo 566/2636 Pagina 24 <strong>di</strong> 113


devono prevedere l'autenticazione e le autorizzazioni sicure e scalabili. Ilprocesso <strong>di</strong> autenticazione permette <strong>di</strong> stabilire l'identità <strong>di</strong> un'entità all'internodella griglia. Diversi modelli <strong>di</strong> autenticazione sono conosciuti nelle reti. Unaautenticazione semplice prevede l'inserimento <strong>di</strong> username e password. Altritipi <strong>di</strong> autenticazione più complesse fanno uso <strong>di</strong> crittografia a chiavisimmetriche, come Kerberos, che fornisce autenticazioni ad applicazioniclient/server. Attualmente negli ambienti Grid l'autenticazione viene fattame<strong>di</strong>ante PKI (Public Key Infrastructure). Questa tecnologia fa uso, perl'autenticazione delle entità, dei certificati X.509. L'autorizzazione avviene solodopo l'esito positivo dell'autenticazione. Essa prevede la verifica dei privilegiassociati all'entità autenticatasi per l'utilizzo delle risorse presenti nella griglia.• Uniform credentials: in ambienti grid è necessario che sia presente unostandard per rappresentare le credenziali <strong>di</strong> un'entità. GSI utilizza i certicatiX.509 per rappresentare tali credenziali.Luca Gerardo 566/2636 Pagina 25 <strong>di</strong> 113


4.2 I certificati X.509Per ottenere i <strong>di</strong>versi meccanismi <strong>di</strong> sicurezza in ambito Grid si utilizzano i certificatiX.509. Essi servono per verificare l'identità <strong>di</strong> soggetti e per consentire l'accesso allerisorse della Grid solo alle entità autorizzate. Tali certificati sono sempre firmati da unaterza parte fidata, detta Certification Autority (CA), della quale entrambi si fidano. Ilcontenuto <strong>di</strong> un certificato <strong>di</strong>gitale X.509 è mostrato nella figura sottostante.fig. 12I certificati sono costituiti da <strong>di</strong>verse informazioni, quali:• Version: specifica la versione del certificato X.509. Se sono utilizzate delleestensioni all'interno del certificato, allora si tratta della versione 3. Se èpresente l'identificatore univoco allora si tratta della versione 2. Diversamente,se sono utilizzati solo i “campi base” allora si tratta della versione 1.• Serial Number: ogni CA assegna, al certificato che rilascia, un numero seriale.Così facendo il nome della CA, insieme al numero seriale, identificanoLuca Gerardo 566/2636 Pagina 26 <strong>di</strong> 113


univocamente un certificato rilasciato dalla CA in questione.• AlgorithmIdentifier: identifica l'algoritmo usato all'interno del certificato. Setroviamo, ad esempio, la stringa “md5withRSAEncryption” significa che èstato utilizzato l'algoritmo RSA per la generazione della coppia <strong>di</strong> chiavi(pubblica e privata) e md5 come algoritmo <strong>di</strong> hashing.• Issuer: in<strong>di</strong>ca la CA che ha rilasciato il certificato.• Vali<strong>di</strong>ty: in<strong>di</strong>ca il tempo <strong>di</strong> vali<strong>di</strong>tà del certificato. Tale campo è scomposto indue sottocampi: “not valid after” che in<strong>di</strong>ca il limite superiore <strong>di</strong> vali<strong>di</strong>tà delcertificato e “not valid before” che in<strong>di</strong>ca il limite inferiore <strong>di</strong> vali<strong>di</strong>tà delcertificato.• Subject: contiene il nome del propietario del certificato o dell'organizzazioneche ne ha fatto richiesta.• SubjectPublicKeyInfo: questo campo contiene la chiave pubblica delproprietario del certificato.• IssuerUniqueId: questo campo è opzionale e contiene, se usato, l'id che la CAassocia al certificato all'atto della sua generazione.• SubjectUniqueId: specifica l'id univoco associato al proprietario. Anche questocampo è opzionale.• Extension: opzionale. Esso in<strong>di</strong>ca la presenza <strong>di</strong> ulteriori campi oltre a quellibase.• CertificateSignature: è la firma <strong>di</strong>gitale della CA che rilascia il certificato<strong>di</strong>gitale. Praticamente la CA non fa altro che calcolare l'hash dell'interocertificato, escludendo solo questo campo, e firmando tale funzione con lapropria chiave privata. Questa campo è detto anche autenticatore o blocco <strong>di</strong>autenticazione. Nel momento in cui un utente vuole verificare l'autenticità delcertificato, non fa altro che usare la chiave pubblica della CA, che ha firmato ilcertificato, per accedere all'hash del certificato. A questo punto, applicherà lafunzione <strong>di</strong> hash specificata nel campo AlgorithmIdentifier e confronterà il suorisultato con quello all'interno del campo CertificateSignature. Se i due valoricoincidono, allora il certificato è considerato fidato. Questa tecnica vieneutilizzata dagli utenti che fanno uso della chiave pubblica del certificato, perLuca Gerardo 566/2636 Pagina 27 <strong>di</strong> 113


verificare l'autenticità dello stesso. Nel caso in cui fosse mo<strong>di</strong>ficato parte delcertificato, i due valori hash non coinciderebbero più e quin<strong>di</strong> il certificatosarebbe considerato non valido. La figura successiva illustra ciò che è statodescritto poc'anzi.fig 13I certificati X.509 fanno uso, da quanto si è potuto notare, della crittografia a chiavepubblica, detta anche crittografia asimmetrica. Essa nasce per sopperire alleproblematiche che si incontrano con la crittografia a chiave simmetrica. Quest'ultimotipo <strong>di</strong> crittografia fa uso <strong>di</strong> una sola chiave, detta chiave segreta, la quale è con<strong>di</strong>visafra le parti che vogliono scambiarsi dei messaggi ed soltanto questa è utilizzata percrittografare e decrittografare il messaggio. Diversamente, gli algoritmi a chiavepubblica fanno uso, come già detto, <strong>di</strong> una coppia <strong>di</strong> chiavi: una viene utilizzata percrittografare il messaggio, solitamente la chiave pubblica (ma non obbligatoriamente), eLuca Gerardo 566/2636 Pagina 28 <strong>di</strong> 113


l'altra, solitamente la chiave privata, per decrittografare il messaggio. Uno schema <strong>di</strong>crittografia a chiave pubblica prevede sei elementi:• Testo in chiaro: è il messaggio dato in input all'algoritmo.• Algoritmo <strong>di</strong> crittografia: è l'algoritmo che permette la crittografia delmessaggio.• Chiave pubblica e privata: sono la coppia <strong>di</strong> chiavi utilizzate per la crittografiae decrittografia del messaggio date in input rispettivamente all'algoritmo <strong>di</strong>crittografia o decrittografia utilizzato.• Testo cifrato: è il messaggio crittografato ottenuto me<strong>di</strong>ante l'applicazionedell'algoritmo <strong>di</strong> crittografia che accetta in input il testo in chiaro ed una delledue chiavi.• Algoritmo <strong>di</strong> decrittografia: accetta in input il testo cifrato e la chiave che nonè stata utilizzata per crittografare il messaggio. Produce come output il testo inchiaro.Nel momento in cui l'utente A vuole inviare un messaggio all'utente B, A non deve farealtro che crittografare il messaggio facendo uso della chiave pubblica <strong>di</strong> B. Questomodo <strong>di</strong> agire garantisce a B la segretezza dei dati. Infatti solo B potrà decrittografare ilmessaggio. Quin<strong>di</strong> un male intenzionato, pur essendo a conoscenza sia dell'algoritmo <strong>di</strong>crittografia e <strong>di</strong> decrittografia, che della chiave pubblica del destinatario, non potrebbecomunque decrittografare il messaggio, visto che l'unico modo per poterlo decifrare èutilizzando la chiave privata del destinatario. Questo garantisce la privatezza dei dati manon l'autenticità.Per fare in modo che sia garantita l'autenticità dei dati, prendendo ancora inconsiderazione la situazione precedente, dove l'utente A vuole inviare un messaggioall'utente B, prima <strong>di</strong> inviarlo, l'utente A deve crittografare il messaggio con la propriachiave privata, in modo tale che, il ricevente possa decifrare tale messaggio me<strong>di</strong>ante lachiave pubblica del mittente. Visto che l'algoritmo <strong>di</strong> decrittografia prende in input iltesto cifrato e la chiave non usata per crittografare il messaggio, allora l'utente B ha lacertezza che tale messaggio sia stato inviato effettivamente dall'utente A.Le figure successive illustrano ciò che è stato appena detto.Luca Gerardo 566/2636 Pagina 29 <strong>di</strong> 113


fig . 14fig. 15Luca Gerardo 566/2636 Pagina 30 <strong>di</strong> 113


Per garantire sia l'autenticità che la segretezza dei dati contemporaneamente, bisognaquin<strong>di</strong> applicare l'algoritmo a chiave pubblica due volte. Con ciò si intende <strong>di</strong>re chestavolta A utilizzerà la propria chiave privata per crittografare il messaggio, garantendol'autenticità <strong>di</strong> quest'ultimo; dopo<strong>di</strong>ché crittograferà nuovamente il messaggioutilizzando la chiave pubblica <strong>di</strong> B, destinatario del messaggio, garantendo così anche lasegretezza dei dati. L'unico svantaggio <strong>di</strong> questo approccio è la doppia applicazionedell'algoritmo a chiave pubblica, già <strong>di</strong> per se complesso.In realtà negli ambienti Grid, anziché utilizzare i certificati <strong>di</strong>gitali X.509, sonoadoperati i “certificati Proxy X.509”. Ciò è fatto per sod<strong>di</strong>sfare, in modo ancora piùesaustivo, quelle che sono le esigenze attuali della Grid. Un certificato proxy, inparticolare, è usato per sod<strong>di</strong>sfare il requisito <strong>di</strong> Single Sign-On e delegare in modo<strong>di</strong>namico i propri privilegi sulle risorse del Grid ad altre entità. Dato che la chiaveprivata <strong>di</strong> un certificato <strong>di</strong>gitale X.509 è protetta da password, per evitare <strong>di</strong> immetterlaad ogni muta autenticazione, si ricorre all'uso del certificato proxy. Il formato delcertificato proxy è simile a quello del certificato X.509. Questo permette, alleapplicazioni che fanno uso dei certificati X.509, <strong>di</strong> utilizzare anche i certificati proxy.Essendo simile il formato dei due certificati, anche il certificato proxy contiene unnumero seriale. Al fine <strong>di</strong> ottenere l'unicità, sia il numero seriale che il nome univocosono generati usando l'hash della chiave pubblica. Il certificato proxy <strong>di</strong>fferiscedall'X.509 per vari aspetti: innanzitutto il certificato proxy è generato dall'utente anzichédalla CA; in secondo luogo, nel campo Subject è immesso un nome univoco, l'unicitàdel quale è garantita anteponendo il nome del proprietario del certificato alla stringaunivoca; inoltre il certificato proxy ha vali<strong>di</strong>tà limitata, solitamente do<strong>di</strong>ci ore.La vali<strong>di</strong>tà limitata consente <strong>di</strong> conservare la chiave privata nel sistema locale senzautilizzare alcun algoritmo <strong>di</strong> crittografia, in quanto alla scadenza del certificatocorrisponde la generazione <strong>di</strong> una nuova coppia <strong>di</strong> chiavi, rendendo obsoleta la vecchia.Questo comporta che nel caso in cui qualcuno dovesse impossessarsi della chiaveprivata, avrebbe comunque un tempo limitato per utilizzarla in modo scorretto. Infine ilcertificato proxy definisce un ulteriore campo, ProxyCertInfo che, se presente, in<strong>di</strong>cache tale certificato è un proxy. Esso è costituito da un sottocampo, proxyPolicy.Quest'ultimo campo è <strong>di</strong>viso in due parti: una specifica la politica <strong>di</strong> utilizzo, cioèLuca Gerardo 566/2636 Pagina 31 <strong>di</strong> 113


specifica l'uso che può essere fatto <strong>di</strong> tale certificato per le autorizzazioni; l'altra partein<strong>di</strong>ca il linguaggio usato per l'espressione della politica.Così come per testare la vali<strong>di</strong>tà <strong>di</strong> un certificato <strong>di</strong>gitale X.509 si ricorre all'uso dellachiave pubblica della CA emittente, allo stesso modo per verificare l'autenticità delcertificato proxy, si utilizza la chiave pubblica del proprietario.Per poter creare un certificato proxy, a partire da un certificato <strong>di</strong>gitale, quest'ultimodeve essere salvato nella propria User Interface. Esiste una cartella specifica nel qualesalvarlo. All'atto dell'esecuzione del comando per la creazione del certificato proxy(voms-proxy-init), è richiesto l'uso della chiave privata associata al certificato <strong>di</strong>gitale.Anch'essa è tenuta nel sistema in modo criptato e protetta da password. Immessa talepassword, è generato il certificato proxy che, come già detto, possiede una nuova coppia<strong>di</strong> chiavi, in modo tale che, per qualsiasi uso della chiave privata, non sia necessario“l'intervento umano”. E' possibile ottenere informazioni da questo certificato proxyme<strong>di</strong>ante l'esecuzione del comandovoms-proxy-infoed è possibile <strong>di</strong>struggere un certificato proxy utilizzando il comandogrid-proxy-destroy.4.3 Public Key InfrastructureLa Public Key Infrastructure (PKI) fornisce agli utenti la possibilità <strong>di</strong> comunicare inmodo sicuro me<strong>di</strong>ante l'utilizzo della chiava pubblica e privata. Questa architetturacoinvolge una terza parte fidata , la Certification Autority (CA), che emette i certificati.Supponiamo che un utente riceva un certificato <strong>di</strong> un altro utente e voglia verificare chela firma sul certificato sia stata apposta da una CA fidata. Nel caso in cui l'utente nonritiene la CA fidata, allora me<strong>di</strong>ante l'utilizzo della PKI può avere la certezza dellaveri<strong>di</strong>cità della firma <strong>di</strong> tale CA. Per capire ciò è necessario esporre la struttura PKI.Essa segue una struttura gerarchica per stabilire la catena <strong>di</strong> fiducia delle entità.Luca Gerardo 566/2636 Pagina 32 <strong>di</strong> 113


fig. 16Al livello più basso <strong>di</strong> tale gerarchia troviamo gli utenti finali o gli enti, possessori deicertificati <strong>di</strong>gitali. Al livello successivo, ci sono le CA che sono autorizzate a rilasciarecertificati a livello regionale. Ognuna <strong>di</strong> queste CA possiede anch'essa un certificato<strong>di</strong>gitale. Esso è firmato a sua volta da una CA del livello superiore e così via. Si vienecosì a costituire una gerarchia chiamata catena <strong>di</strong> fiducia (chain of trust). In definitiva,quanto più si sale tanto minore sarà il numero <strong>di</strong> CA che troveremo a quel livello eminore sarà il numero a cui ogni CA rilascerà certificati. Alla ra<strong>di</strong>ce della gerarchiatroviamo la CA root, <strong>di</strong> cui tutti si fidano. Per capire l'utilità dell'architettura PKI,consideriamo nuovamente l'esempio sopracitato: l'utente che vuole constatare laveri<strong>di</strong>cità della firma della CA, può richiederne il certificato. Questo certificato èfirmato a sua volta, come esposto nella gerarchia, da una CA del livello superiore. Diconseguenza l'utente può risalire la gerarchia fino a quando non troverà una CA fidata.Se non ne viene riscontrata alcuna, nemmeno quella root, allora il certificato può essereconsiderato non fidato.Luca Gerardo 566/2636 Pagina 33 <strong>di</strong> 113


4.4 La mutua autenticazione serverDato che, come detto più volte, una grid è un insieme <strong>di</strong> persone, organizzazioni,apparati hardware e software che interagiscono fra loro, bisogna rendere queste ultime ilpiù sicure possibile. Questo implica che ciascuna entità che prende parte a taleinterazione deve essere certa dell'identità <strong>di</strong> ogni altro. Nelle grid ciò viene fattome<strong>di</strong>ante l'utilizzo dei certificati <strong>di</strong>gitali X.509. Il sistema <strong>di</strong> mutua autenticazione,utilizzato nelle grid, si basa sullo scambio dei certificati personali. Nel momento in cuidue elementi della grid, A e B, vogliono interagire fra loro, si devono autenticaremutuamente. È definita mutua autenticazione perché ognuna delle parti deveautenticarsi nei confronti dell'altra. Supponiamo che sia prima A ad autenticarsi neiconfronti <strong>di</strong> B. È necessario, innanzitutto, creare un canale <strong>di</strong> comunicazione fra loro. Aquesto punto A presenta il proprio certificato a B, che verificherà la veri<strong>di</strong>cità delcertificato nel seguente modo:i. controllando se la CA che ha firmato il certificato è riconosciuta come“fidata” (o trusted). Se tale CA non viene ritenuta atten<strong>di</strong>bile perverificare la sua genuinità si ricorre a “PKI”;ii. calcolando l'hash del certificato facendo uso dell'algoritmo <strong>di</strong>chiaratoall'interno del certificato;iii. decriptando la firma <strong>di</strong>gitale del certificato me<strong>di</strong>ante la chiave pubblicacontenuta in esso;iv. confrontando i due hash;I passi appena elencati sono da considerarsi conseguenziali, ovvero non è possibilepassare da un punto a quello successivo se la con<strong>di</strong>zione del primo non vienesod<strong>di</strong>sfatta. Tale sod<strong>di</strong>sfacimento, quin<strong>di</strong>, è una “con<strong>di</strong>cio sine qua non” perl'avanzamento al punto successivo. Le cause per le quali una delle con<strong>di</strong>zioni potrebbenon essere sod<strong>di</strong>sfatta, sono <strong>di</strong>verse. Considerando il primo step, B potrebbe non risaliread una Certification Autority fidata e ciò implicherebbe la non genuinità del certificato.Per quanto concerne l'ultimo punto, potrebbe non essere sod<strong>di</strong>sfatto il matching dei duehash, implicando la manomissione del certificato. Diversamente, se tutte le con<strong>di</strong>zioniLuca Gerardo 566/2636 Pagina 34 <strong>di</strong> 113


sono sod<strong>di</strong>sfatte, B ha la certezza che il certificato sia atten<strong>di</strong>bile.Un' altra questione è, poi, risalire al reale utilizzatore del certificato. Potrebbe infattiesserne entrato in possesso un altro utente. A tal proposito, affinché B abbia la certezzadel fatto che l'utilizzatore del certificato ne sia realmente il possessore, è necessario cheinvii un messaggio, costituito da testo casuale, ad A chiedendogli <strong>di</strong> crittografarlo con lapropria chiave privata.Considerando che la crittografia a chiave pubblica prevede l'utilizzo <strong>di</strong> due chiavi, dellequali una per la crittografia e l'altra per la decrittografia, in modo in<strong>di</strong>fferente, occorrecrittografare con la chiave privata del mittente il messaggio che potrà, a sua volta,essere decrittografato solo attraverso l'utilizzo della chiave pubblica associata. Quin<strong>di</strong>,supponendo che A abbia crittografato il messaggio, inviato da B, con la propria chiaveprivata, B, ricevuto il messaggio, lo decrittograferà con la chiave pubblica presente nelcertificato. Se il testo ricevuto coincide con quello inviato, B ha la certezza chel'interlocutore sia realmente il proprietario del certificato.Infine considerando che la CA garantisce l'autenticità del certificato e che la stessaassocia la chiave pubblica <strong>di</strong> A all'identità <strong>di</strong> A, l'autenticazione <strong>di</strong> A nei confronti <strong>di</strong> Bpuò considerarsi terminata. Ovviamente, trattandosi <strong>di</strong> mutua autenticazione, B deveseguire lo stesso proce<strong>di</strong>mento per autenticarsi nei confronti <strong>di</strong> A4.5 Il servizio VOMSVOMS sta per Virtual Organization Memberschip Service. Esso è un sistema per lagesione delle autorizzazioni all'interno <strong>di</strong> collaborazioni multiistituzionali. Il sistemaVOMS è costituito dalle seguenti parti:• User Server, che riceve le richieste dagli utenti e ritorna informazionecirca questi;• User Client, che contatta il server presentandogli un certificato utenteper ottenere una lista <strong>di</strong> role, groups e capability;• Administration Client, usato dall'amministratore della VO. Esso dà lapossibilità <strong>di</strong> aggiungere nuovi gruppi, cambiare ruoli ecc;• Administration Server, che accetta le richieste dagli utenti e mo<strong>di</strong>fica ildatabase.Luca Gerardo 566/2636 Pagina 35 <strong>di</strong> 113


fig 17Il VOMS fornisce un database contenente utenti, ruoli, privilegi ed un insieme <strong>di</strong>strumenti per accedere e manipolare i dati all'interno del database. Un requisito moltoimportante, dal punto <strong>di</strong> vista dell'utente, è la creazione <strong>di</strong> certificati proxy. Per ottenereciò si fa uso del comando vosm-proxy-init usato al posto <strong>di</strong> grid-proxy-init.fig. 18Come quest'ultimo, il primo comando permette <strong>di</strong> creare un certificato proxy utente. La<strong>di</strong>fferenza sta nel fatto che usando il primo comando, il certificato proxy contieneLuca Gerardo 566/2636 Pagina 36 <strong>di</strong> 113


informazioni aggiuntive (extension information) presenti nel server VOMS. Inparticolare, questo certificato proxy contiene, oltre alle informazioni <strong>di</strong> base perl'autenticazione, anche informazioni inerenti al ruolo e alle capacità associate all'utente.Tali credenziali sono compatibili anche con quelle applicazioni grid che non fanno usodelle informazioni aggiuntive prelevate dal server VOMS.fig. 19Luca Gerardo 566/2636 Pagina 37 <strong>di</strong> 113


fig. 20Il certificato proxy ottenuto me<strong>di</strong>ante l'utilizzo del comando grid-proxy-init noncontiene, invece, informazioni inerenti alla VO.Come già detto, per essere parte <strong>di</strong> una VO e per poter dunque usufruire delle risorsepresenti nella grid, un utente deve essere innanzitutto in possesso <strong>di</strong> un certificato<strong>di</strong>gitale, solitamente caricato in un browser. Me<strong>di</strong>ante un'interfaccia web, l'utentesottomette la richiesta <strong>di</strong> registrazione ad una VO. A questo punto il manager della VOLuca Gerardo 566/2636 Pagina 38 <strong>di</strong> 113


decide se accettare o meno la richiesta. Accettata la richiesta, l'utente <strong>di</strong>viene parte dellaVO a cui si è iscritto. L'operazioni che il manager può eseguire è, oltre alla possibilità <strong>di</strong>accettare o meno le richieste utenti, la creazione <strong>di</strong> gruppi e ruoli. I gruppi presenti nelserver VOMS sono gerarchici, cioè se l'utente A appartiene al gruppo S e quest'ultimo èsottogruppo <strong>di</strong> T, allora l'utente A appartiene anche al gruppo T. Da ciò si deduce che unutente può essere parte <strong>di</strong> più gruppi contemporaneamente.Allo stesso modo, è possibile associare più ruoli allo stesso gruppo.Le seguenti immagini mostrano l'interfaccia web del server VOMS Unina:fig. 21Luca Gerardo 566/2636 Pagina 39 <strong>di</strong> 113


fig. 22Come <strong>di</strong>cevamo precedentemente, il server VOMS fornisce un database per la gestione<strong>degli</strong> utenti iscritti ad una determinata VO. All'interno <strong>di</strong> tale database sono presenti<strong>di</strong>verse tabelle, fra le quali:• Usr che contiene informazioni inerenti agli utenti;• groups che contiene informazioni inerenti ai gruppi;• capabilities che contiene informazioni inerenti alle capacità;• roles che contiene informazioni inerenti ai ruoli.Queste sono le tabelle principali che il VOMS fornisce per la gestione <strong>di</strong> utenti, gruppi,privilegi e ruoli.Luca Gerardo 566/2636 Pagina 40 <strong>di</strong> 113


5. Un'estensione del servizio VOMS con certificati Robot5.1 Concetto <strong>di</strong> certificato RobotCome già detto nei capitoli precedenti, i certificati X.509 sono usati per sod<strong>di</strong>sfare lerichieste del modello <strong>di</strong> sicurezza GSI, utilizzato in ambito Grid.Oltre ai certificati <strong>di</strong>gitali X.509, ne esistono altri, detti certificati Robot, anch'essiX.509, che <strong>di</strong>fferiscono dai primi per la modalità d'uso, anche se la procedura per larichiesta <strong>di</strong> questi ultimi è la stessa <strong>di</strong> quella che bisogna effettuare per poter ottenere uncertificato <strong>di</strong>gitale X.509. Tali certificati sono stati introdotti da qualche anno affinché leapplicazioni potessero usufruirne e, in particolare, affinché queste ultime potesserosvolgere dei compiti automatizzati a nome dell'utente. Dato che, come già detto, uno deirequisiti del modello GSI è l'autenticazione, anche un'applicazione deve essere in grado<strong>di</strong> autenticarsi per poter ottenere le rispettive autorizzazioni. Il processo <strong>di</strong>autenticazione è necessario al fine <strong>di</strong> portare a termine il proprio compito e svolgere,dunque, le proprie operazioni facendo uso delle risorse della Grid. Il certificato Robot, a<strong>di</strong>fferenza del classico certificato <strong>di</strong>gitale X.509, è salvato su un supporto fisso (e-tokenUSB), ed è legato ad un'applicazione piuttosto che ad una persona. Per evitare problemi,nel caso in cui dovesse essere smarrito il token USB, il certificato Robot in esso salvatoè criptato me<strong>di</strong>ante password. In verità è possibile salvare all'interno dello stesso tokenUSB più certificati: uno per ogni applicazione. Così come si preferiscono ai certificati<strong>di</strong>gitali X.509 i rispettivi certificati proxy, creati a partire dai primi, allo stesso modoun'applicazione, anziché utilizzare i certificati Robot, pre<strong>di</strong>lige l'uso dei certificatiproxy, creati a partire dai certificati salvati su token USB.5.2 Estensione delle facility del VOMSAttualmente, sia grazie ai certificati <strong>di</strong>gitali personali X.509, sia grazie al VOMS, èpossibile sod<strong>di</strong>sfare tutti i requisiti previsti dal modello architetturale <strong>di</strong> sicurezza GSI,quali:• single sign on;• delegazione;• Integration with various local securety solutions;Luca Gerardo 566/2636 Pagina 41 <strong>di</strong> 113


• User-based trust relationschips• non ripu<strong>di</strong>o;• virtualizzazione <strong>degli</strong> utenti;• privatezza dei messaggi;• integrità dei messaggi;Oltre alla possibilità <strong>di</strong> accedere alla Griglia me<strong>di</strong>ante certificati personali X.509, neesiste un'altra che permette l'accesso agli utenti oltre che alle applicazioni, me<strong>di</strong>antecertificati Robot. L'uso <strong>di</strong> questi certificati, però, sino ad oggi, è stato limitato alle soleapplicazioni. Permettere, infatti, l'uso <strong>di</strong> tali certificati ad uno o più utenticontemporaneamente invece che ad una applicazione, comporterebbe il nonsod<strong>di</strong>sfacimento dei requisiti <strong>di</strong> sicurezza richiesti dal modello GSI. Bisogna tenerpresente, infatti, che il certificato Robot ha un unico responsabile: il richiedente ovveroil possessore. Le informazioni contenute in un proxy, generato a partire dal certificatoRobot da parte <strong>di</strong> qualsiasi utente, sarebbero inerenti al solo responsabile, tralasciando,quin<strong>di</strong>, quelle dell'effettivo utilizzatore. Vengono meno, così facendo, <strong>di</strong>versi requisitirichiesti dal modello GSI, quali:• assenza della tracciabilità delle operazioni svolte dall'utente;• assenza della possibilità <strong>di</strong> bannare un utente;• impossibilità <strong>di</strong> imporre vincoli <strong>di</strong> utilizzo sulle risorse e quin<strong>di</strong> impossibilità<strong>di</strong> esprimere politiche sulle autorizzazioni e sui permessi in base all'identitàdell'utente;• impossibilità <strong>di</strong> risalire all'identità dell'effettivo utilizzatore del certificato;Volendo rappresentare quanto appena detto me<strong>di</strong>ante l'ausilio <strong>di</strong> una tabella, avremo:cert. pers.X.509cert. RobotX.509Single sign on SI SIDelegazione SI SISegretezza dei dati SI SILuca Gerardo 566/2636 Pagina 42 <strong>di</strong> 113


Non ripu<strong>di</strong>o SI NOAutenticità dei dati SI NOPossibilità <strong>di</strong> revoca dei <strong>di</strong>rittiSINO(Autenticazione e Autorizzazione)Tracciabilità attività utenteSINO(Au<strong>di</strong>ting e Accounting)Possibilità <strong>di</strong> esprimere politiche <strong>di</strong> SINOautorizzazione in base all'identità dell'utentePossibilità <strong>di</strong> esprimere vincoli d'uso sulle SINOrisorse in base all'identità dell'utentePossibilità <strong>di</strong> risalire all'effettivo utilizzatore SINOdel certificatoAutenticazione in base all'identità dell'utente SI NOPossibilità d'uso del certificato nelle Griglie inbase allo stato attualeSINOLa precedente tabella confronta le due tipologie <strong>di</strong> certificato, sottolineando il nonsod<strong>di</strong>sfacimento <strong>di</strong> <strong>di</strong>versi requisiti <strong>di</strong> sicurezza richiesti dagli ambienti Grid nelmomento in cui un utente, che non sia il responsabile, fa uso del certificato Robot.È possibile evincere da tale tabella, dunque, il perché della modalità <strong>di</strong> utilizzo, limitatoalle sole applicazioni, <strong>di</strong> tale certificato.L'obiettivo <strong>di</strong> questa tesi è facilitare agli utenti, me<strong>di</strong>ante l'uso dei certificati Robot,l'accesso alla Griglia e, allo stesso tempo, non compromettere, i requisti <strong>di</strong> sicurezzaprecedentemente esposti.Per poter raggiungere tale obiettivo, si vuole fare in modo che, all'atto del loginme<strong>di</strong>ante UI da parte dell'utente, venga generato un proxy contenente informazioniaggiuntive, tali da poter risalire all'effettivo utilizzatore del certificato e da potersod<strong>di</strong>sfare tutti i requisiti <strong>di</strong> sicurezza.Si è dovuto, quin<strong>di</strong>, realizzare un'applicazione web che permettesse all'utente <strong>di</strong>sottomettere sia una richiesta <strong>di</strong> utilizzo del certificato Robot, sia, <strong>di</strong> conseguenza, unarichiesta <strong>di</strong> iscrizione alla VO relativa, per poter usufruire delle sue risorse. Per renderepossibile ciò, viene presentato all'utente un form che richiede le informazioni personali,Luca Gerardo 566/2636 Pagina 43 <strong>di</strong> 113


compreso l'in<strong>di</strong>rizzo e-mail. Bisogna inoltre scegliere, fra quelli <strong>di</strong>sponibili nell'elenco,il certificato Robot da usare per accedere alla Griglia. Se tale richiesta sarà accoltadall'amministratore, le informazioni relative all'utente saranno, me<strong>di</strong>ante la medesimaapplicazione Web, mantenute all'interno del server VOMS: in particolare, la maildell'utente sarà usata per creare un nuovo ruolo. A questo punto, all'atto del logindell'utente me<strong>di</strong>ante UI, sarà possibile creare un proxy con informazioni aggiuntive(extension information) prelevate dal server VOMS. In realtà, dovendo rispettare ancorauna volta il modello GSI, il proxy non sarà creato a partire dal certificato Robot, bensìdal proxy generato a partire dal certificato Robot.Per creare, dunque, il proxy, in modo del tutto trasparente all'utente, si farà uso delcomandovoms-proxy-init -- voms “nome VO”:/Role= “ruolo associato all'utente”All'atto dell'esecuzione <strong>di</strong> tale comando, sarà contattato il Server VOMS relativo,ottenendo così informazioni aggiuntive da inserire all'interno del proxy. Prima <strong>di</strong>valutare tale richiesta, sarà però necessario che l'utente si autentichi nei confronti delServer e viceversa (mutua autenticazione). Ovviamente il Server possiede un propriocertificato per autenticarsi, mentre l'utente farà uso del proxy, creato a partire dalcertificato Robot all'atto del login sulla UI. Avvenuta, con esito positivo,l'autenticazione, il Server VOMS provvederà a creare un nuovo proxy a partire dalquello presentatogli, inserendo in esso informazioni aggiuntive: in particolare il ruoloche è stato specificato nel comando precedentemente esposto.Il concetto chiave è quello <strong>di</strong> avere un ruolo per ciascun utente. Avendo usato comeruolo la mail, ed essendo quest'ultima un identificativo univoco dell'utente, l'inserimento<strong>di</strong> tale ruolo nelle informazioni aggiuntive del proxy, permetterà il sod<strong>di</strong>sfacimento deirequisiti <strong>di</strong> sicurezza, quali ad esempio la tracciabilità. Di conseguenza sarà possibileconoscere l'effettivo utilizzatore del certificato in qualsiasi istante.Il raggiungimento <strong>di</strong> tale obiettivo comporterà <strong>di</strong>versi vantaggi, quali:• l'utente non dovrà più richiedere alcun certificato, evitando quin<strong>di</strong> tutto l'iterper tale richiesta;• sarà velocizzato e soprattutto facilitato l'accesso alle Griglie dal punto <strong>di</strong> vistadell'utente;Luca Gerardo 566/2636 Pagina 44 <strong>di</strong> 113


• sarà incentivata la <strong>di</strong>ffusione dell'uso delle Griglie, ampliando così il lorobacino d'utenza.In tal modo, oltre ai vantaggi ottenuti, saranno sod<strong>di</strong>sfatti anche i requisiti del modelloGSI, ovvero:• la possibilità <strong>di</strong> tracciare l'attività dell'effettivo utilizzatore del certificato;• la possibilità <strong>di</strong> bannare un utente me<strong>di</strong>ante il ruolo assegnatogli;• la possibilità <strong>di</strong> porre dei vincoli <strong>di</strong> utilizzo sulle risorse della Griglia me<strong>di</strong>anterestrizioni applicate al ruolo;• la possibilità <strong>di</strong> risalire all'effettivo utilizzatore del certificato Robot.La soluzione poc'anzi esposta, quin<strong>di</strong>, giustifica l'introduzione dei certificati Robot ed illoro utilizzo da parte <strong>degli</strong> utenti, risolvendo, così, tutti gli interrogativi che vi erano inmerito.Luca Gerardo 566/2636 Pagina 45 <strong>di</strong> 113


6. L'attività sperimentale6.1 Descrizione dell'applicazione webL'applicazione web da me sviluppata prevede innanzi tutto una pagina de<strong>di</strong>cataall'utente (fig 23), me<strong>di</strong>ante la quale quest'ultimo può sottomettere una richiesta <strong>di</strong>iscrizione alla VO. Per poter sottomettere tale richiesta, l'utente deve compilare il formche gli viene proposto nella suddetta pagina inserendo le proprie informazioni, quali:nome, cognome, in<strong>di</strong>rizzo <strong>di</strong> posta elettronica. Deve inoltre scegliere, fra quelli<strong>di</strong>sponibili, il certificato Robot da utilizzare per sfruttare successivamente le risorsedella VO e “spuntare” la casella relativa al consenso, così da accettare le regole impostedalla VO.fig. 23Luca Gerardo 566/2636 Pagina 46 <strong>di</strong> 113


Cliccando il bottone conferma, se i dati immessi risultano essere corretti, saràvisualizzato un messaggio che informa l'utente <strong>di</strong> seguire le istruzioni che gli vengonofornite(fig 24).fig. 24Questa operazione comporterà l'inserimento dei dati utente all'interno del database delVOMS. In particolare all'interno della tabella request_pen<strong>di</strong>ng da me creata. Tale tabellaconterrà nome, cognome, in<strong>di</strong>rizzo e-mail, data richiesta, certificato scelto per accederealla griglia e un campo inerente alla conferma della richiesta dell'utente.A questo punto, utilizzando l'in<strong>di</strong>rizzo <strong>di</strong> posta elettronica fornito nella paginaprincipale, sarà inviata, all'utente, una e-mail nella quale verrà chiesto <strong>di</strong> confermare o<strong>di</strong>s<strong>di</strong>re la richiesta <strong>di</strong> iscrizione alla VO me<strong>di</strong>ante i link relativi. Ciò è fatto per evitareche qualcuno sottometta richieste a nome <strong>di</strong> altri utentiNel caso in cui l'utente confermi la richiesta me<strong>di</strong>ante il link relativo, sarà mo<strong>di</strong>ficato uncampo della riga relativa all'utente nella tabella request_pen<strong>di</strong>ng, in modo tale che larichiesta utente possa essere visualizzata nella pagina principale dell'amministratore.Infatti, se l'utente non conferma la sottomissione della richiesta, quest'ultima non saràmai presa in considerazione dall'amministratore perché non visualizzata.Diversamente, se l'utente usa il link relativo all'annullamento della richiesta, la rigacorrispondente della tabella request_pen<strong>di</strong>ng sarà cancellata.La pagina principale dell'amministratore si presenta sotto forma tabellare(fig. 26) edogni riga rappresenta una richiesta utente. Ciascuna riga conterrà le informazioniinserite dall'utente all'atto della sottomissione della richiesta. A questo puntol'amministratore, in base a queste informazioni, deciderà se accogliere o meno larichiesta dell'utente spuntando, rispettivamente, l'opzione “Accept” o “Reject”.Ad operazione conclusa, anche l'amministratore visualizzerà un messaggio(fig. 25) cheLuca Gerardo 566/2636 Pagina 47 <strong>di</strong> 113


lo informerà dell'operazione conclusa.fig. 25fig. 26Nel caso in cui la richiesta utente non sia accolta dall'amministratore, la rigacorrispondente a tale richiesta, presente nella tabella request_pen<strong>di</strong>ng del database delVOMS, sarà cancellata.Diversamente, se la richiesta utente è accettata, l'in<strong>di</strong>rizzo e-mail fornito all'atto dellasottomissione della richiesta <strong>di</strong> iscrizione, sarà usato come “ruolo” da associare alcertificato Robot scelto anch'esso in fase <strong>di</strong> sottomissione della richiesta.In particolare, tale operazione si rifletterà nel database inserendo l'utente nella tabellausr ed il ruolo nella tabella roles, associando, quin<strong>di</strong>, l'utente al gruppo principale e ilruolo al certificato Robot.Luca Gerardo 566/2636 Pagina 48 <strong>di</strong> 113


In tal modo, sarà possibile tenere traccia delle operazioni svolte dall'utente nella VO.A questo punto, per consentire un accesso “trasparente” alla Grid, si è fatto in modo cheall'atto del login sulla UI, l'utente eviti il management del certificato. Si vuole infatti cheall'atto dell'accesso venga generato automaticamente il proxy del certificato Robot conle estensioni VOMS, evitando che questo venga fatto esplicitamente dall'utente.Per rendere possibile quanto appena detto, si è dovuto mo<strong>di</strong>ficare, nella cartella utente,il file “.bashrc” in modo tale che quest'ultimo chiami, a sua volta, lo script “grisu-initshell.pl”passandogli un parametro inerente al ruolo da associare al proxy creato apartire dal certificato Robot. Questo script, scritto il Perl, richiama a sua voltaun'applicazione scritta in C: “chvo2”. Questa applicazione non fa altro che accedere,me<strong>di</strong>ante apposite librerie, al token usb nel quale è salvato il certificato, al fine <strong>di</strong>generare un proxy a partire da esso. Successivamente la stessa applicazione richiama ilcomando per generare il proxy contenente le “voms extension” presentando al serverVOMS il proxy generato precedentemente. A questo punto il server restituisce il nuovoproxy e viene dato il controllo della shall all'utente.Supponendo che un utente abbia richiesto <strong>di</strong> utilizzare il certificato Robot e che la suamail sia lgerardo_at_unina.it, l'immagine successiva mette in evidenza quanto dettofin'ora: mette in risalto, cioè, la creazione del proxy del certificato Robot con “vomsextension” me<strong>di</strong>ante il solo accesso alla UI da parte dell'utente.Fig. 27Luca Gerardo 566/2636 Pagina 49 <strong>di</strong> 113


fig. 28Le due figure precedenti mostrano quanto appena detto. All'atto del login me<strong>di</strong>ante UIda parte dell'utente è creato un proxy del certificato Robot con informazioni aggiuntive:la mail dell'utente è usata come ruolo.Luca Gerardo 566/2636 Pagina 50 <strong>di</strong> 113


6.2 L'architettura della Web ApplicationL'architettura su cui si basa la Web Application realizzata è Client/Server a trelivelli(three-tier):• Il primo livello è de<strong>di</strong>cato alla presentazione dei dati.• Il secondo livello de<strong>di</strong>cato alla logica applicativa• Il terzo livello de<strong>di</strong>cato alla gestione dei datifig. 29Si ha quin<strong>di</strong> bisogno <strong>di</strong> un Web Server, un' Application Server ed un DataBase (Fig. 29).L'ambiente, in cui il sistema opera, poggia su un unico server fisico con SistemaOperativo Red Hat AS 5.0, sul quale sono installati sia Tomcat, come ApplicationServer, che MySQL come RDBMS.Il Web Server accetta richiesta da parte dei Client e invia a questi ultimi ciò che gli èstato richiesto. Non avendo una propria logica applicativa, esso non è capace <strong>di</strong>interpretare il co<strong>di</strong>ce presente all'interno delle pagine e per tale ragione presenta paginepuramente statiche: pagine HTML contenenti testi o immagini.Il Client sottomette le richieste me<strong>di</strong>ante il Web Browser così come, me<strong>di</strong>antequest'ultimo, ha la possibilità <strong>di</strong> ottenere risposte dal Web Server.L'Application Server si occupa della logica applicativa. In particolare esso offre unambiente per poter sviluppare ed eseguire applicazioni web che solitamente, come pureLuca Gerardo 566/2636 Pagina 51 <strong>di</strong> 113


nel nostro caso, sono three-tier e dove ciascun livello, come già detto precedentemente,ha un compito ben preciso.L'Application Server utilizzato è Tomcat. Sia per la sua robustezza sia per il fatto cherisulta essere <strong>di</strong>sponibile per Sistemi Operativi Windows e Linux, e sia perchè esso èattualmente l'Application Server più <strong>di</strong>ffuso.A <strong>di</strong>re il vero, Tomcat è un Servlet Container ed un JSP Engine. E' quin<strong>di</strong> capace <strong>di</strong>eseguire, lato server, applicazoni web basate su tecnologia J2EE e costituite dacomponenti Servlet e da pagine JSP.Oltre a Tomcat esistono alti Application Web come ad esempio Jboss e GlassFishPer quanto concerne la gestione dei dati è stato utilizzato l'RDMB(Relational DatabaseManagement System) MySQL.L'applicazione Web è stata sviluppata secondo il para<strong>di</strong>gma MVC(Model-View-Control), traendo così i vantaggi insiti in esso. Questo Design Pattern è una linea guidaper la sud<strong>di</strong>visione delle responsabilità fra le <strong>di</strong>verse classi che compongonol'applicazione web. Seguendo tale Design Pattern, infatti, l'applicazione viene sud<strong>di</strong>visain tre componenti principali:• model: rappresenta le classi che si interessano dei dati nu<strong>di</strong> e cru<strong>di</strong>;• view: è la porzione dell'applicazione de<strong>di</strong>cata alla rappresentazione dei dati.Qui sono presenti le classi che, a partire dai dati contenuti nel “model”, offronouna presentazione della pagina all'utente;• controller: questa categoria <strong>di</strong> classi si interessa dell'interazione con l'utente.Tenendo presente il pattern Observer, il para<strong>di</strong>gma MVC prevede che le classicontroller siano <strong>degli</strong> “Observer” che ricevono coman<strong>di</strong>(eventi) dall'utente eallo stesso modo, le view siano <strong>degli</strong> “Observer” delle classi model.Luca Gerardo 566/2636 Pagina 52 <strong>di</strong> 113


fig. 30Sviluppando in tal modo l'applicazione, le richieste poste dall'utente saranno gestitedalla servlet(controller), la quale provvederà a istanziare dei bean(Model) cheserviranno poi alle JSP(View) per la presentazione dei dati.6.3 Le tecnologie utilizzatePer lo sviluppo dell'applicazione web si è fatto uso delle seguenti tecnologie:• JSP/Servlet: JSP è l'acronimo <strong>di</strong> JavaServer Page. Questa è una tecnologia javaper lo sviluppo <strong>di</strong> applicazioni Web che forniscono contenuti <strong>di</strong>namici.Me<strong>di</strong>ante i suoi tag, è possibile inserire all'interno delle pagine funzioni oco<strong>di</strong>ce Java. Alla tecnologia JSP è correlata quella Servlet. Infatti, all'atto dellachiamata <strong>di</strong> una JSP, quest'ultima viene tradotta in una Servlet. Per tale ragioneanche le JSP hanno bisogno <strong>di</strong> un Servlet Container oltre ad aver bisogno <strong>di</strong> un“motore JSP”. Utilizzando Tomcat, quest'ultimo contiene già al suo interno siaun motore JSP che un Servlet Container. JSP è una tecnologia alternativa aPHP o ad esempio ad ASP. La <strong>di</strong>fferenza sostanziale <strong>di</strong> queste tecnologie stanell'architettura interna del Software che costituisce l'applicazione Web. L'uso,Luca Gerardo 566/2636 Pagina 53 <strong>di</strong> 113


infatti, <strong>di</strong> JSP e Servlet offre vantaggi non in<strong>di</strong>fferenti, quali:• velocità <strong>di</strong> sviluppo;• prestazioni;• portabilità;• ed altri aspetti inerenti alla qualità interna ed esternadell'applicazione Web;• JavaScript: fu originariamente sviluppato da Brendan Eich della NetscapeComunication con il nome <strong>di</strong> Mocha e successivamente <strong>di</strong> LiveScript, ma inseguito è stato rinominato "JavaScript". È un linguaggio <strong>di</strong> scripting orientatoagli oggetti e comunemente utilizzato nei siti Web. Esso risulta avere unasintassi molto vicina a quella Java. La caratteristica principale <strong>di</strong> questolinguaggio è che un linguaggio interpretato. Il co<strong>di</strong>ce viene quin<strong>di</strong> eseguito aruntime senza la necessità <strong>di</strong> essere compilato. Un aspetto molto importante èche il co<strong>di</strong>ce JavaScript lato client viene eseguito dal client, senza, quin<strong>di</strong>, lanecessità sollecitare il server. Esso risulta essere uno standard ISO.• HTML: è l'acronimo <strong>di</strong> HyperText Markup Language. E' un linguaggio usatoper per la stesura dei documenti ipertestuali <strong>di</strong>sponibili nel World Wide Web. Èun linguaggio <strong>di</strong> markup, vale a <strong>di</strong>re che descrive il contenuto delle pagine web• CSS: è l'acrinimo <strong>di</strong> Casca<strong>di</strong>ng Style Sheet, cioè fogli <strong>di</strong> stile. Essi vengonousati per definire la rappresentazione dei fogli dei documenti HTML, XHTMLe XML. Il loro utilizzo è necessario al fine <strong>di</strong> separare i contenuti dellaformattazione dal resto, permettendo, quin<strong>di</strong>, una programmazione più chiara.• MySql: è un RDBMS(Relational DataBase Management System) <strong>di</strong>sponibie siaper sistemi Unix che per sistemi Windows. Le sue principali caratteristichesono:• capacità <strong>di</strong> gestire gran<strong>di</strong> quantità <strong>di</strong> dati;• utilizzo <strong>di</strong> sistemi <strong>di</strong> protezione e autorizzazione per l'accesso aidati stessi.• Con<strong>di</strong>visione dei dati fra più utenti e applicazioni;Il modello relazionale si basa sulle relazione dei dati. Insieme al modellorelazionale è stato introdotto il linguaggio SQL(Structured Query Language),Luca Gerardo 566/2636 Pagina 54 <strong>di</strong> 113


6.4 Use Caseche offre la possibilità <strong>di</strong> effettuare inserimenti, mo<strong>di</strong>fiche e reperimento <strong>di</strong>informazioni dalle tabelle che costituiscono la base <strong>di</strong> dati.fig. 31Luca Gerardo 566/2636 Pagina 55 <strong>di</strong> 113


Me<strong>di</strong>ante il <strong>di</strong>agramma precedente (fig. 31), è possibile visualizzare quali sono gliutenti che utilizzano il sistema e cosa essi possono fare. In rosso sono state evidenziatele funzionalità aggiunte al “sistema base” me<strong>di</strong>ante la nostra applicazione web.Con quest'ultima, infatti, l'utente ha la possibilità <strong>di</strong> sottomettere una richiesta <strong>di</strong>iscrizione alla VO senza l'uso del certificato personale. Allo stesso modo l'admin puòaccettare gli utenti senza certificato che richiedono l'iscrizione alla VO.6.5 Diagrammi <strong>di</strong> Cockburna) Richiesta iscrizione alla Vo senza certificato personale.ObiettivoPrecon<strong>di</strong>zioniCon<strong>di</strong>zioni <strong>di</strong>successoCon<strong>di</strong>zioni <strong>di</strong>fallimentoAttorePrimarioTriggerRichiesta iscrizione alla VO senza certificatopersonaleL'utente sottomette la richiesta <strong>di</strong> iscrizioneall'amministratore della VO.L'utente è posizionato con il browser web sulla pagina<strong>di</strong> iscrizione.L'utente visualizza la pagina <strong>di</strong> avvenuta sottomissionedella richiesta.L'utente non sottomette la richiesta <strong>di</strong> iscrizione.UtenteL'utente riempie il form con i propri dati e clicca sulbottone “Conferma”Descrizione deipassiN°Passo Azione Utente Azione Sistema1 Azione Trigger2 Riempie il formLuca Gerardo 566/2636 Pagina 56 <strong>di</strong> 113


con i propri dati eclicca sul bottone“Conferma”3 Controlla,salva i datiutente ed inviae-mail perconferma4 L'utente clicca sullink “ConfermaRichiesta”presente nellamail5 Visualizza pagina<strong>di</strong> avvenutasottomissionedella richiesta.EstensioniN°Passo Azione Utente Azione Sistema3,1,1 Visualizzamessaggio <strong>di</strong>errore per il campo“Nome”3,2,1 Visualizzamessaggio <strong>di</strong>errore per il campo“Cognome”3,3,1 Visualizzamessaggio <strong>di</strong>errore per il campoLuca Gerardo 566/2636 Pagina 57 <strong>di</strong> 113


“Mail”3,4,1 Visualizzamessaggio <strong>di</strong>errore per il campo“Certificato Robot”3,5,1 Visualizzamessaggio <strong>di</strong>errore per il campo“Accetta RegoleVO”3,6,1 Visualizzamessaggio <strong>di</strong>errore perché lamail è giàassociata alCertificato Robotscelto3,7,1 Il sistema noninvia la mailperché non valida4,1,1 L'utente clicca sullink “AnnullaRichiesta”presente nella mail4,1,2 Visualizza paginache confermala rinuncia <strong>di</strong>iscrizione.b) Accetta utente senza certificato nella VOObiettivoAccetta utente senza certificato nella VOL'utente è iscritto alla VOLuca Gerardo 566/2636 Pagina 58 <strong>di</strong> 113


Precon<strong>di</strong>zioniCon<strong>di</strong>zioni <strong>di</strong>successoCon<strong>di</strong>zioni <strong>di</strong>fallimentoAttorePrimarioTriggerL'utente deve aver sottomesso una richiesta <strong>di</strong>iscrizione.Visualizza la pagina con il messaggio “OperazioneConclusa”.L'admin non accetta la richiesta dell'utente.AdminL'admin si posiziona alla pagina principaleDescrizione deipassiN°Passo Azione Admin Azione Sistema1 Azione trigger2 Visualizzala paginaprincipale3 Sceglie l'opzione“Accept” e cliccasul bottone“Conferma”4 Iscrive l'utentealla VO5 Associa l'utenteal gruppo6 Controlla e creail ruolo7 Assegna il ruoloal certificatoRobot8 Visualizza laLuca Gerardo 566/2636 Pagina 59 <strong>di</strong> 113


pagina checonfermal'operazioneEstensioniN°PassoAzioneUtente3,1,1 Sceglie l'opzione“Reject” e cliccasul bottone“Conferma”AzioneSistemaVisualizza lapagina checonfermal'operazioneSubVariationN°PassoAzioneUtenteAzioneSistema5,1,1 Controlla ma noncrea il ruoloperché giàpresente e va allostep 7Luca Gerardo 566/2636 Pagina 60 <strong>di</strong> 113


6.6 Class DiagramI due <strong>di</strong>agrammi delle classi successivi descrivono il sistema dal punto <strong>di</strong> vista statico.Permettono <strong>di</strong> conoscere i componenti del sistema ed i loro legami. In particolare si ècercato <strong>di</strong> avere un basso accoppiamento ed un'alta coesione in modo tale da influirepositivamente sulla qualità interna del co<strong>di</strong>ce.a) Class Diagram relativo all'utente:b) Class Diagram relativo all'admin:Luca Gerardo 566/2636 Pagina 61 <strong>di</strong> 113


Luca Gerardo 566/2636 Pagina 62 <strong>di</strong> 113


6.7 Sequence DiagramLuca Gerardo 566/2636 Pagina 63 <strong>di</strong> 113


Luca Gerardo 566/2636 Pagina 64 <strong>di</strong> 113


Sequence UserLuca Gerardo 566/2636 Pagina 65 <strong>di</strong> 113


Luca Gerardo 566/2636 Pagina 66 <strong>di</strong> 113


I <strong>di</strong>agrammi <strong>di</strong> sequenza descrivono il sistema dal punto <strong>di</strong> vista <strong>di</strong>namico. Permettono<strong>di</strong> descrivere, quin<strong>di</strong>, le interazioni che vi sono fra i vari oggetti ed in particolare imessaggi che quest'ultimi si scambiano, per ottenere il risultato desiderato.Da notare che in ogni Sequence Diagram si è evitato <strong>di</strong> rappresentare la creazione <strong>di</strong>oggetti RequestDispatcher e HttpSevletRequest, utili a re<strong>di</strong>rezionare il flusso <strong>di</strong>controllo e a passare riferimenti <strong>di</strong> oggetti, al fine <strong>di</strong> migliorare la leggibilità del<strong>di</strong>agramma. In sostituzione è stata usata una freccia con stereotipo dovequesto sta ad in<strong>di</strong>care che il flusso <strong>di</strong> controllo viene passato all'oggetto che ha verso <strong>di</strong>se la freccia entrante e che a questo oggetto vengono passati dei riferimenti <strong>di</strong> altrioggetti in modo tale da poter richiamare i loro meto<strong>di</strong>.Luca Gerardo 566/2636 Pagina 67 <strong>di</strong> 113


7. Testing e scenari applicativi7.1 Validazione e TestingAl termine della fase <strong>di</strong> progettazione e <strong>di</strong> implementazione, sono stati effettuati dei testsull'applicazione. La prima funzionalità che è stata testata è quella relativaall'immissione dei dati personali dell'utente all'atto della sottomissione della richiesta <strong>di</strong>iscrizione. Innanzi tutto si è cercato <strong>di</strong> sottomettere la richiesta, omettendo uno o piùdati relativi all'utente. Ciò che è stato ottenuto è un messaggio <strong>di</strong> errore relativo allaparte del form che non è stata compilata. Le immagini successive mostrano quelli chesono i messaggi <strong>di</strong> errore ottenuti durante la fase <strong>di</strong> testing.fig.32fig. 33fig. 34Luca Gerardo 566/2636 Pagina 68 <strong>di</strong> 113


fig. 35fig. 36Si è cercato poi <strong>di</strong> inserire una e-mail (a sua volta usata come ruolo) già presente sia frale richieste pendenti, sia fra quelli nella tabella relativa ai ruoli. Nel primo caso vienevisualizzato un messaggio <strong>di</strong> errore (fig. 37), mentre nel secondo caso si ha ugualmentela visualizzazione dello stesso messaggio <strong>di</strong> errore solo se il ruolo è già associato alcertificato Robot che è stato scelto all'atto della sottomissione della richiesta.fig. 37A questo punto si è cercato <strong>di</strong> testare i link presenti nella mail inviata all'utente. Se illink è usato per la prima volta, allora il sistema mostra la pagina che informa l'utente odell'avvenuta sottomissione della richiesta o della cancellazione della stessa, a secondadel link utilizzato. Se a questo punto si utilizza uno dei due link, il sistema mostra unapagina contenente un messaggio che comunica all'utente che il link non è più validoperché scaduto. Per quanto riguarda la parte dell'applicazione relativaall'amministratore, sono state testate le uniche due possibilità che l'amministratore ha asua <strong>di</strong>sposizione. Quin<strong>di</strong> prendendo in considerazione più richieste utente, si è fatto inLuca Gerardo 566/2636 Pagina 69 <strong>di</strong> 113


modo che alcune <strong>di</strong> esse fossero accolte ed altre, invece, fossero rifiutate. È stato poifatto un controllo sulla tabella del database request_pen<strong>di</strong>ng al fine <strong>di</strong> constatare che lerighe relative a tutte le richieste visualizzate dall'amministratore nella pagina principale,fossero state cancellate. A questo punto è stato controllato se, per le richieste accettate,fossero stati effettuati i giusti inserimenti nel database: in particolare è stato controllatoche l'utente fosse stato inserito all'interno della tabella usr, così come è stato controllatoche il ruolo fosse stato creato ed associato al gruppo in modo corretto.Infine, essendo stata eseguita la parte relativa alla sottomissione della richiesta da partedell'utente ed essendo quest'ultima stata accolta dall'amministratore, è stato effettuato unultimo test relativo all'accesso dell'utente alla Grid me<strong>di</strong>ante User Interface comedescritto nel paragrafo 6.1. Anche il risultato <strong>di</strong> questo test è risultato positivo. Si èavuto infatti l'accesso alla griglia in modo del tutto trasparente all'utente ed è statoassociato in modo corretto il role al certificato Robot.7.2 Applicazione per creare portali web <strong>di</strong> accesso alla GRIDPer poter valorizzare al meglio l'applicazione realizzata e per poter incentivarel'ampliamento del bacino <strong>di</strong> utenza delle Grid, lo scenario applicativo principaleriguarda la realizzazione <strong>di</strong> portali web che permettano l'accesso ai servizi Grid agliutenti che non sono in possesso <strong>di</strong> un certificato <strong>di</strong>gitale personale. Attualmente perpoter accedere alla Griglia, si ha bisogno <strong>di</strong> un certificato personale <strong>di</strong>gitale. La prassiper poter ottenere il certificato non incoraggia sicuramente gli utenti ad avvicinarsi agliambienti Grid. È necessario infatti, per poterne ottenere uno, recarsi innanzi tutto pressouna Registratin Autority che ha il compito <strong>di</strong> accertare l'identità dell'utente. Quest'ultimaprovvederà successivamente a sottomettere la richiesta alla Certification Autority laquale provvederà ad emettere il certificato. Solo a questo punto l'utente potràsottomettere una richiesta <strong>di</strong> iscrizione ad una VO per ottenere l'accesso alle risorsemesse a <strong>di</strong>sposizione da quest'ultima. Diversamente, grazie all'applicazione da mesviluppata, gli utenti non hanno alcuna necessità <strong>di</strong> richiedere un certificato personale:viene infatti offerta, a più utenti contemporaneamente, la possibilità <strong>di</strong> richiederel'accesso alla Grid me<strong>di</strong>ante lo stesso certificato Robot.Il certificato Robot è associato ad un unico utente e fino ad oggi è stato usato solo perLuca Gerardo 566/2636 Pagina 70 <strong>di</strong> 113


permettere alle applicazioni <strong>di</strong> svolgere dei tasks automatizzati sulla griglia a nomedell'utente. Esso è conservato in un token USB e criptato con password. Qualsiasi tipo<strong>di</strong> accesso a tale token, senza l'uso <strong>di</strong> apposite librerie, renderebbe il suo contenutoinutilizzabile.Attualmente, l'opportunità concessa a più utenti <strong>di</strong> utilizzare lo stesso certificato Robot,comporterebbe la generazione <strong>di</strong> proxy contententi informazioni relative al solopossessore del certificato, piuttosto che all'effettivo utilizzatore: non sarebbe piùpossibile, quin<strong>di</strong>, risalire all'effettivo utilizzatore del certificato, perdendo così latracciabilità delle operazioni svolte dall'utente nella griglia; sarebbe inoltrecompromessa la possibilità <strong>di</strong> esprimere politiche <strong>di</strong> accesso a risorse o servizi sullabase dell'identità dell'utente.L'applicazione da me sviluppata offre una soluzione ai problemi esposti poc'anzi,aggiungendo una nuova funzionalità al VOMS, e propone nuovi scenari <strong>di</strong> utilizzo <strong>di</strong>questi certificati.La soluzione adottata per sopperire alle problematiche appena descritte è quella <strong>di</strong>inserire informazioni aggiuntive all'interno del proxy, generato a partire dal certificatoRobot, in modo tale da poter risalire comunque all'effettivo utilizzatore del certificato eda poter esprimere politiche <strong>di</strong> accesso a risorse o servizi.Per fare ciò, tale applicazione prevede una pagina <strong>di</strong> iscrizione dove l'utente va aspecificare, oltre alle informazioni personali, la propria e-mail.Queste informazioni saranno usate dall'applicazione per fare in modo che venganoinserite all'interno del server VOMS: in particolare la mail dell'utente sarà usata percreare un nuovo ruolo, che sarà poi associato al certificato Robot. A questo punto,all'atto della generazione del proxy a partire la certificato Robot, sarà contattato il serverVOMS che provvederà ad aggiungere, alle informazioni già presenti nel certificato, ilruolo.I vantaggi ottenuti dall'adozione <strong>di</strong> questa soluzione sono <strong>di</strong>versi: l'utente non ha più lanecessità <strong>di</strong> richiedere un certificato personale con conseguente <strong>di</strong>sinteressamento dellasua gestione; l'accesso alla griglia risulta molto più semplice, veloce e trasparente. Tuttociò permette, grazie ai vantaggi esposti poc'anzi, un ampliamento del bacino <strong>di</strong> utenzadella grigliaLuca Gerardo 566/2636 Pagina 71 <strong>di</strong> 113


Un possibile scenario applicativo, oltre a quello citato nel paragrafo 6.1 che prevedel'accesso alla griglia, per gli utenti sprovvisti <strong>di</strong> certificato, me<strong>di</strong>ante UI a riga <strong>di</strong>comando, è l'accesso alla griglia stessa me<strong>di</strong>ante un portale Web. La funzionalitàaggiuntiva, data al server VOMS, infatti, potrebbe essere sfruttata da un portale WEB inmodo tale da consentire l'accesso alle risorse della griglia anche ad utenti che non sonoin possesso <strong>di</strong> un certificato <strong>di</strong>gitale personale.fig. 38In particolare, dopo la sottomissione al VOMS, della richiesta da parte dell'utente, nellaquale viene specificato principalmente il certificato Robot a cui l'utente vuole associarsie la propria e-mail, i dati raccolti saranno salvati, come già detto, all'interno del server: aquesto punto la mail, utilizzata come ruolo, sarà associata al certificato Robot.Luca Gerardo 566/2636 Pagina 72 <strong>di</strong> 113


Ora, essendo il portale l'unico punto <strong>di</strong> accesso alla griglia, l'utente, per poter sfruttare iservizi offerti da quest'ultima, dovrà innanzi tutto autenticarsi nei confronti del portale,inserendo le proprie credenziali, quali username e password. L'immissione corretta deidati comporta la generazione <strong>di</strong> un nuovo proxy, creato a partire dal certificato Robot.Me<strong>di</strong>ante questo proxy, il portale contatta il VOMS e richiede a quest'ultimo <strong>di</strong>associare al certificato, il ruolo relativo all'utente. Il server VOMS, basandosi sui dati asua <strong>di</strong>sposizione, provvederà a creare un nuovo proxy con le informazioni aggiuntive.Solo a questo punto l'utente avrà la possibilità <strong>di</strong> accedere alle risorse della Grid.Avendo inserito all'interno del proxy il role relativo all'utente, sarà possibile sia tracciarel'attività da lui svolte all'interno della Grid, sia esprimere politiche <strong>di</strong> sicurezza sullabase della sua identità, in particolare del ruolo.I vantaggi ottenuti grazie all'adozione del portale Grid, consistono nell'accessotrasparente alle risorse computazionali dell'infrastruttura Grid, agevolando la <strong>di</strong>ffusione<strong>di</strong> questo nuovo para<strong>di</strong>gma agli utilizzatori anche meno esperti.Attualmente già esistono User Interface basate su portale web, che mettono a<strong>di</strong>sposizione dell'utente le stesse operazioni fornite dalla UI a riga <strong>di</strong> comando, ma inmodo più user-friendly. Considerando, quin<strong>di</strong>, l'alto grado <strong>di</strong> portabilità fornitadall'applicazione da me sviluppata, si intende progettare un'implementazione <strong>di</strong>quest'ultima in modo da integrarla con i portali già esistenti, consentendo, quin<strong>di</strong>, <strong>di</strong>accedere ai servizi grid in modo semplice, veloce e trasparente anche agli utenti che nonfanno uso <strong>di</strong> una User Interface a riga <strong>di</strong> comando. L'integrazione <strong>di</strong> questo servizio conle UI ampiamente utilizzate via web, inciderebbe, in modo ancora più marcato,sull'accrescimento del bacino <strong>di</strong> utenza dei siti Grid. Infatti, la maggior parte delleorganizzazioni scientifiche, che necessitano delle risorse messe a <strong>di</strong>sposizione dai sitiGrid, non hanno particolare conoscenza della Unix Shell, preferendo tipi <strong>di</strong> interazioni<strong>di</strong>fferenti. Inoltre, l'adozione <strong>di</strong> questa politica <strong>di</strong> utilizzo, consentirebbe agli utenti <strong>di</strong>evitare la prassi burocratica necessaria per ottenere un certificato <strong>di</strong>gitale personale ed ilsuo management. In definitiva, l'ulteriore sviluppo e deployment dell'applicazioneincentiverebbe qualsiasi tipi <strong>di</strong> utente ad interfacciarsi agli ambienti Grid.Luca Gerardo 566/2636 Pagina 73 <strong>di</strong> 113


8 ConclusioniNel seguente lavoro <strong>di</strong> tesi è stata trattata la problematica <strong>di</strong> accesso ai sistemi Gridtramite certificato Robot. E' stata effettuata un analisi critica che ha messo in lucealcune debolezze dei certificati robot relativamente alla per<strong>di</strong>ta <strong>di</strong> informazioni sugliutenti finali. Tali problematiche sono state affrontate stu<strong>di</strong>ando ed implementando unastrategia basata sulle VOMS extension, per rendere più espressivi i proxy usati inambito Grid, generati a partire da certificati robot. In particolare sono state estese,tramite una java application, le funzionalità del server <strong>di</strong> Virtual OrganizationMembership introducendo il concetto <strong>di</strong> associazione a certificato robot da parte <strong>di</strong>persone fisiche.Il software è stato implementato con successo, insieme con tutta la casistica <strong>di</strong> accesso e<strong>di</strong> errore, ed è stato altresì testato in tutte le sue funzionalità.Nell'ambito <strong>di</strong> questo lavoro, è stato quin<strong>di</strong> creato un co<strong>di</strong>ce per la user-interface ingrado <strong>di</strong> lavorare con i supporti USB-Token (necessari per ospitare certificati robot) e <strong>di</strong>creare proxy utilizzando le nuove estensioni VOMS pre<strong>di</strong>sposte.Tale co<strong>di</strong>ce rappresenta un motore da applicare come base per la creazione <strong>di</strong> portaliweb e <strong>di</strong> servizi <strong>di</strong> cloud computing su piattaforma Grid, basati su autenticazionetramite certificati robot.Software e strategie sono stati testati con successo in un semplice caso d'uso su una userinterface locale per consentire l'accesso ai servizi grid ad utenti non dotati <strong>di</strong> certificato.Gli sviluppi futuri prevedono l'imme<strong>di</strong>ata applicazione del VOMS esteso e del motore<strong>di</strong> generazione proxy, per la creazione <strong>di</strong> user web-based ed interface userfriendly.Luca Gerardo 566/2636 Pagina 74 <strong>di</strong> 113


9. Bibliografia[1] SCOPE:URL: http://www.scope.unina.it[2] The Anatomy of the Grid - Enabling Scalable Virtual OrganizationsIan Foster e Carl Kesselman Steven Tuecke.[22] PON 2000-2006:URL: http://www.ponricerca.it/Public/PonRicerca/F1329/F1329.aspx[3] GRID: Ian Foster e Carl Kesselman (ed.), The Grid: Blueprint for a New ComputingInfrastructure, 2003, ISBN 1558609334.URL: http://it.wikipe<strong>di</strong>a.org/wiki/GRID; http://www.grid.it[4] GLOBUS: I. Foster: “Globus Toolkit Version 4: Software for Service-OrientedSystems”, IFIP International Conference on Network and Parallel Computing, Springer-Verlag LNCS 3779, pp 2-13, 2005URL: http://www.globus.org/[5] MIDDLEWARE: R. Baldoni, corso Sistemi Operativi <strong>II</strong>, lezioni all’<strong>Università</strong> LaSapienza.URL: http://www.<strong>di</strong>s.uniroma1.it/~baldoni/SO<strong>II</strong>-middleware.pdf[6] PSE: Stratis Gallopoulos, Elias Houstis and John Rice: "Computer as Thinker/Doer:Problem-Solving Environments for Computational Science" IEEE ComputationalScience and Engineering, Summer, 1994.URL: http://www-cgi.cs.purdue.edu/cgi-bin/acc/pses.cgi[7] SCE: Longsong Lin; Decker, K.M.; Jognson, M.J.; Domain, C.; Souffez, Y.: "ISCN:towards a <strong>di</strong>stributed scientific computing environment", in High PerformanceComputing on the Information Superhighway, 1997. HPC Asia apos;97Volume , Issue ,28 Apr-2 May 1997.URL: http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.31.3183Luca Gerardo 566/2636 Pagina 75 <strong>di</strong> 113


10. Appen<strong>di</strong>ce: Co<strong>di</strong>ceform.css:/*Document : formCreated on : 26-ott-2009, 9.25.55Author : lucaDescription:*/.inputField, .selectBox, .searchField {border: 1px solid rgb(200,200,200);}.submitButton {font-size: x-small;font-weight: bold;background-color: white;}.searchSubmitButton {font-weight: bold;background-color: white;}.form tr{}.form td{pad<strong>di</strong>ng: .5ex;}table .form{border: 1px solid rgb(200,200,200);}.labels{color: #505050;pad<strong>di</strong>ng-right: 1ex;}.fields{}layout.css/*Document : layoutCreated on : 26-ott-2009, 9.27.27Author : luca*/body{font-family: "Lucida Grande", verdana, lucida, helvetica, sans-serif;font-size: 9pt;background-color: white;color: black;max-width: 775px;min-width: 775px;text-align: center;margin-left: auto;margin-right: auto;pad<strong>di</strong>ng:0;}#header, #body, #menu,#footer,#messages{Luca Gerardo 566/2636 Pagina 76 <strong>di</strong> 113


clear:both;pad<strong>di</strong>ng: 0;}#header{color: #505050;}#headerTitle {float:left;font-size: 9pt;color: white;background-color: #1b5790;text-align: left;width: 775px;}#vaInfo {font-size: smaller;font-weight: bold;float:left;pad<strong>di</strong>ng: .5em;color: #d2dcf3}#adminDN{font-weight: bold;color: white;}#voInfo{clear: both;float: left;}#headerInfo {clear: both;float: left;text-align:left;font-size: smaller;pad<strong>di</strong>ng-left: .5em;background-color: #ececec ;}#voName {color: white;font-weight: bold;}.voName{color: #006600;font-weight: bold;font-size: larger;}#helpMenuItem {}#menu{pad<strong>di</strong>ng: 0;float:left;background-color: #ccdeaf;color: black;width: 100%;}#messages{pad<strong>di</strong>ng:.1em .1em 0 0;min-height: 2em;font-size: 8pt;font-weight: bold;}#body{Luca Gerardo 566/2636 Pagina 77 <strong>di</strong> 113


}#footer{margin-top: 1em;border-top: 1px solid rgb(200,200,200);font-size: xx-small;background-color: white;color: #505050;}#leftBar {<strong>di</strong>splay: block;float: left;width: 12%;pad<strong>di</strong>ng-bottom: 0px;pad<strong>di</strong>ng-left: 0px;pad<strong>di</strong>ng-right: 0px;min-height:520px;}.leftBarHeader{text-align: center;font-weight: bold;color: #325B0A;pad<strong>di</strong>ng-top: .5ex;pad<strong>di</strong>ng-bottom: .5ex;background-color: #ccdeaf;}#userGroupsLeftBar{font-size: 8pt;border: 1px solid rgb(200,200,200);text-align: left;}#centerPane {float: left;<strong>di</strong>splay: block;width: 84%;margin-left: 2%;pad<strong>di</strong>ng-right: 0px;text-align:left;}#oneColCenterPane{min-height:520px;}#createUserPane {float: left;font-size: 8pt;}#searchResultsPane, #searchGroupsResultsPane, #searchRolesResultsPane{clear: both;pad<strong>di</strong>ng-top: 1em;}#searchUsersPane, #searchGroupsPane, #searchRolesPane, #searchUserAttributesPane{float: left;}#createGroupPane, #createRolePane, #createUserPane, #manageAttributeClassesPane{float: right;font-size: 8pt;margin-bottom: 1ex;max-width: 50%;}#listAttributeDescriptionsPane{margin-top: 2em;}.separator{Luca Gerardo 566/2636 Pagina 78 <strong>di</strong> 113


clear: both;height: 1ex;}#addACLEntryBox, #addDefaultACLEntryBox{float:right;}#leftBar a:hover{text-decoration: underline;}#leftBar a{pad<strong>di</strong>ng: .5em;}#leftBar .<strong>di</strong>sabledLink{pad<strong>di</strong>ng: .5em;}link.css/*Document : linkCreated on : 26-ott-2009, 9.28.33Author : luca*/.vomsLink {font-weight: bold;text-decoration: none;<strong>di</strong>splay: block;}.vomsLink:HOVER {font-weight: bold;text-decoration: underline;}.navBarLink {font-weight: bold;text-decoration: none;pad<strong>di</strong>ng-left: .5ex;pad<strong>di</strong>ng-right: .5ex;}.navBarLink:HOVER {text-decoration: underline;}.actionLink {font-weight: normal;text-decoration: none;}.actionLink:HOVER {font-weight: normal;text-decoration: underline;}.<strong>di</strong>sabledLink {<strong>di</strong>splay: inline;font-weight: bold;text-decoration: underline;<strong>di</strong>splay: block;color: rgb(155,155,155);}a,A {color: #456aac;text-decoration: none;Luca Gerardo 566/2636 Pagina 79 <strong>di</strong> 113


}a:HOVER{text-decoration: underline;}registration.css/*Document : registrationCreated on : 26-ott-2009, 9.31.15Author : luca*/#regDN{color: #006600;}#regCA, #regEmail {}.regLabel{color: #505050;font-weight: bold;}dt{margin-top: 1em;}dd{font-size: smaller;}stileForm.css:/*Document : stileFormCreated on : 24-ott-2009, 18.04.40Author : luca*/.root {<strong>di</strong>splay: block;border-left-color: red;border-left-style: solid;border-left-width: 1px;}style.css:/*Document : styleCreated on : 26-ott-2009, 9.33.15Author : luca*/@IMPORT url("layout.css");@IMPORT url("tables.css");@IMPORT url("menu.css");@IMPORT url("link.css");@IMPORT url("form.css");@IMPORT url("registration.css");.userDN {Luca Gerardo 566/2636 Pagina 80 <strong>di</strong> 113


text-align: left;font-size: small;}.userCA {font-size: x-small;color: #505050;}.userEmail{font-size: smaller;font-weight: bold;}.resultsHeader {font-size: xx-small;<strong>di</strong>splay: block;float: right;margin-bottom: .5ex;}.resultsFooter {font-size: xx-small;<strong>di</strong>splay: block;float: right;margin-top: .5ex;}.resultsCount {<strong>di</strong>splay: table-cell;pad<strong>di</strong>ng-left: 1ex;pad<strong>di</strong>ng-right: 1ex;}.resultsNavBarButton {<strong>di</strong>splay: inline;}.roleCell {margin-top: .1em;}.role {<strong>di</strong>splay: block;float: left;clear: both;font-weight: bold;}.group {text-align: left;font-weight: bold;}.action {<strong>di</strong>splay: block;float: right;font-size: x-small;}.roleAssign {font-size: x-small;float: right;clear: both;text-align: right;margin-top: .5em;}.roleAssign .submitButton {font-size: x-small;}.roleAssign .selectBox {font-size: x-small;}Luca Gerardo 566/2636 Pagina 81 <strong>di</strong> 113


.subscribeGroups {<strong>di</strong>splay: block;font-size: x-small;text-align: right;margin-top: .5em;}.subscribeGroups .submitButton {font-size: x-small;}.subscribeGroups .selectBox {font-size: x-small;}.header {<strong>di</strong>splay: block;clear: both;width: 100%;font-weight: bold;color: #505050;}.header1{<strong>di</strong>splay: block;clear: both;width: 100%;font-weight: bold;color: #505050;border-bottom: 1px solid rgb(200,200,200);margin-bottom: 1em;}.header2 {<strong>di</strong>splay: block;clear: both;width: 100%;font-weight: bold;color: #505050;margin-top: 1em;margin-bottom: 1em;}.header3{<strong>di</strong>splay: block;clear: both;width: 100%;font-weight: bold;color: #505050;margin-bottom: 1em;}.label {color: #505050;font-weight: bold;text-align: right;}.labels {color: #505050;text-align: right;}.deleteUserForm {text-align: right;}.deleteUserForm .submitButton {font-size: x-small;}.detailsBlock .submitButton {font-size: x-small;Luca Gerardo 566/2636 Pagina 82 <strong>di</strong> 113


}.attributeName {text-align: left;font-weight: bold;}.attributeValue {font-weight: bold;}.errorMessages {margin: 0;pad<strong>di</strong>ng: 0;pad<strong>di</strong>ng-left: 1em;pad<strong>di</strong>ng-right: 1em;font-weight: bold;text-align: center;}.errorMessage{font-weight: bold;pad<strong>di</strong>ng: .1em;pad<strong>di</strong>ng-left: 1ex;pad<strong>di</strong>ng-right: 1ex;}.errorMessage .message{<strong>di</strong>splay: none;}.errorMessage .detailedMessage {background-color: #ffffff;color: #cc0000;<strong>di</strong>splay: inline;pad<strong>di</strong>ng: .1em;pad<strong>di</strong>ng-left: 1ex;pad<strong>di</strong>ng-right: 1ex;}.messages {color: #006600;background-color: white;<strong>di</strong>splay: inline;text-align: center;pad<strong>di</strong>ng-left: 1ex;pad<strong>di</strong>ng-right: 1ex;}.panel{font-size: 8pt;background-color: white;color: black;}.panelHeader{background-color: #ccdeaf;color: #325B0A;;float: left;font-weight: bold;}.panelContent{pad<strong>di</strong>ng-left: 1ex;pad<strong>di</strong>ng-right: 1ex;pad<strong>di</strong>ng-top: .5ex;pad<strong>di</strong>ng-bottom: .5ex;border-left: 1px solid rgb(200,200,200);border-right: 1px solid rgb(200,200,200);border-bottom: 1px solid rgb(200,200,200);}.panelTitle{Luca Gerardo 566/2636 Pagina 83 <strong>di</strong> 113


float: left;pad<strong>di</strong>ng-left: 1ex;pad<strong>di</strong>ng-top: .5ex;pad<strong>di</strong>ng-bottom: .5ex;}.panelButton{float: right;pad<strong>di</strong>ng-right: 1ex;pad<strong>di</strong>ng-top: .5ex;pad<strong>di</strong>ng-bottom: .5ex;}.panel .inputField,.selectBox,.caSelectBox,.submitButton{font-size: 8pt;}.admin .userDN{font-size: smaller;font-weight: bold;}.admin .userCA{font-size: x-small;}.voMembershipInfo, .genericAttributesInfo{pad<strong>di</strong>ng-left: 2em;}.highlight{color: #006600;font-weight: bold;}.configurationInfo{background-color: #ececec ;}table.css/*Document : tablesCreated on : 26-ott-2009, 9.32.25Author : luca*/.table {width: 100%;pad<strong>di</strong>ng: 0px;<strong>di</strong>splay: table;border-bottom: 1px solid rgb(200,200,200);/* border-left: 1px solid rgb(200,200,200); */}.tableHeader {font-weight: bold;text-align: center;<strong>di</strong>splay: table-cell;border-bottom: 1px solid rgb(200,200,200);/* border-right: 1px solid rgb(200,200,200); */background-color: #ccdeaf;}.tableHeaderRow {<strong>di</strong>splay: table-row;}.tableHeaderRow td{font-weight: bold;Luca Gerardo 566/2636 Pagina 84 <strong>di</strong> 113


text-align: left;<strong>di</strong>splay: table-cell;border-bottom: 1px solid rgb(200,200,200);/*border-top: 1px solid rgb(200,200,200);border-right: 1px solid rgb(200,200,200);*/color: #505050;pad<strong>di</strong>ng: .2ex;}.tableRowEven {<strong>di</strong>splay: table-row;background-color: white;}.tableRowEven td{<strong>di</strong>splay: table-cell;text-align: left;/* border-right: 1px solid rgb(200,200,200); */pad<strong>di</strong>ng: .5ex;}.tableRowOdd td{<strong>di</strong>splay: table-cell;text-align: left;pad<strong>di</strong>ng: .5ex;}.tableRowOdd {background-color: #ececec ;<strong>di</strong>splay: table-row;}table{<strong>di</strong>splay: table;clear: both;}tr{<strong>di</strong>splay: table-row;}td{<strong>di</strong>splay: table-cell;}colgroup{<strong>di</strong>splay: table-column-group;}col{<strong>di</strong>splay: table-column;}menù.css:/*Document : menuCreated on : 26-ott-2009, 9.30.18Author : luca*/.menuItem {font-weight: bold;<strong>di</strong>splay: inline;float: left;Luca Gerardo 566/2636 Pagina 85 <strong>di</strong> 113


text-align: center;pad<strong>di</strong>ng: .5em;}#helpMenuItem {<strong>di</strong>splay: inline;float: right;font-weight: bold;text-align: center;}.menuItem a{color: #325B0A;}.menuItem a:HOVER{color: black;text-decoration: underline;}checkFormDatiUser.jsfunction checkForm(){//riferimento al tag form... ora uso questo per riferirmi ai suoi campi!!!var form = document.SubmitRequestForm;var nome = form.Nome.value;var cognome = form.Cognome.value;var mail = form.mailUser.value;//riferimento al tag select presente all'interno del formvar menu = form.certifRobot;//valore della checkbox all'interno del form. E' true se selezionato, false<strong>di</strong>versamentevar box = form.regAcc.checked;// Espressione regolare dell'emailvar email_reg_exp = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-]{2,})+\.)+([a-zA-Z0-9]{2,})+$/;//spiegazione dell'espressione regolare :la <strong>di</strong>vido in parti:// ^([a-zA-Z0-9_\.\-])+ ==> ritorna true se la stringa comincia con uno o piùcaratteri appartenenti// appartenenti all'insieme// \@ ==> ritorna true se c'è il carattere "@"// (([a-zA-Z0-9\-]{2,})+\.)+ ==> ritorna true se la parte <strong>di</strong> expr reg "[a-zA-Z0-9\-]" è "matchata"//(ritrovata,ripetuta) ALMENO due volte dopo<strong>di</strong>che c'è il carattere "."//tutto questo ripetuto una o più volte(" il carattere '+' <strong>di</strong> expr")// ([a-zA-Z0-9]{2,})+$/ ==> ritorna true se la parte <strong>di</strong> expr reg "[a-zA-Z0-9\-]" è"matchata"//(ritrovata,ripetuta) ALMENO due volte, il tutto ripetuto una o//più volte("carattere '+' "). E così che deve terminare la stringa// (" carattere '$' ")if ( (nome == "") || (nome == "undefined") ){alert("Il campo Nome è obbligatorio.")return false;}else if ( (cognome == "") || (cognome == "undefined") ){alert("Il campo Cognome è obbligatorio.")return false;}else if( !email_reg_exp.test(mail) || (mail == "") || (mail == "undefined") ) {alert("Inserire un in<strong>di</strong>rizzo email corretto.");return false;}else if(menu.selectedIndex == 0){alert("Scegliere un certificato dal menù.");Luca Gerardo 566/2636 Pagina 86 <strong>di</strong> 113


eturn false;}else if(box == false){alert("Bisogna accettare le regole della VO.");return false;}else {return true;}}-->index.jsp:Document : indexCreated on : 16-nov-2009, 19.26.18Author : luca--%>Iscrizione VO studentiIscrizionealla VO studentiuninaWelcome to voms-admin registration for the studentiVO.To access the VO resources, you must agree to the VO's Usage Rules.Please fill out all fields in the form below and click on the submitbutton at the bottom of the page.After you submit this request, you will receive an email with instructions on howto proceed.Your request will not be forwarded to the VO managers until you confirm that youLuca Gerardo 566/2636 Pagina 87 <strong>di</strong> 113


have a valid emailaddress by following those instructions.IMPORTANT:By submitting this information you agree that it may be <strong>di</strong>stributed to and storedbyVO and site administrators. You also agree that action may be taken to confirm theinformation youprovideis correct, that it may be used for the purpose of controlling access to VOresources and that it maybeused to contact you in relation to this activity.Nome:Cognome:In<strong>di</strong>rizzo e-mail:Scegli Certificato Robot:Luca Gerardo 566/2636 Pagina 88 <strong>di</strong> 113


Mi attengo alle regole della VO.errorPage.jspDocument : errorPageCreated on : 23-nov-2009, 15.43.01Author : luca--%>


Iscrizionealla VO studentiunina Spiacenti, iparametri immessinon sono correttiSpiacenti, i parametri immessi non sono corretti!!!Ritornare alla pagina e inserire i parametri in modo corretto...servletController.java/** To change this template, choose Tools | Templates* and open the template in the e<strong>di</strong>tor.*/import java.io.IOException;import java.io.PrintWriter;import javax.mail.MessagingException;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import bean.*;import java.io.FileOutputStream;import java.io.PrintStream;import javax.servlet.RequestDispatcher;/**** @author luca*/public class servletController extends HttpServlet {/*** Processes requests for both HTTP GET and POST methods.* @param request servlet request* @param response servlet response* @throws ServletException if a servlet-specific error occurs* @throws IOException if an I/O error occurs*/protected void processRequest(HttpServletRequest request, HttpServletResponseresponse)throws ServletException, IOException {doPost(request,response);response.setContentType("text/html;charset=UTF-8");PrintWriter out = response.getWriter();try {/* TODO output your page hereout.println("");out.println("");out.println("Servlet servletController");out.println("");out.println("");out.println("Servlet servletController at " + request.getContextPath () +"");out.println("");Luca Gerardo 566/2636 Pagina 90 <strong>di</strong> 113


out.println("");*/} finally {out.close();}}// /*** Handles the HTTP GET method.* @param request servlet request* @param response servlet response* @throws ServletException if a servlet-specific error occurs* @throws IOException if an I/O error occurs*/protected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {doPost(request,response);processRequest(request, response);}/*** Handles the HTTP POST method.* @param request servlet request* @param response servlet response* @throws ServletException if a servlet-specific error occurs* @throws IOException if an I/O error occurs*/protected void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {//processRequest(request, response);String nome = null;String cognome = null;String email = null;String accetta = null; // gli sarà assegnato il valore della checkboxlong certificato =-1;long id_last_insert_user=-1;Database database =new Database();if (request.getParameter("cmd").equals("requestUseCertificate")){//prendo i parametri dal form e li inserisco nel bean//utente per poi usarle in seguito//creo il beannome = request.getParameter("Nome");cognome = request.getParameter("Cognome");email = request.getParameter("mailUser");//email = email.replaceAll("%40", "@");//certificato = Integer.valueOf(request.getParameter("value")).intValue();certificato = (Long.parseLong(request.getParameter("certifRobot")));//certificato = (int)Long.parseLong(request.getParameter("certifRobot"));utenteBean user = new utenteBean();user.setNome(nome);user.setCognome(cognome);//certifRobot contiene l'id del certificato della tab usruser.setCertificato(certificato);user.setMail(email);user.setAccettaRegoleVo(request.getParameter("regAcc"));//associo l'oggetto user(utenteBean) all'oggetto requestrequest.setAttribute("user",user);request.setAttribute("flagUtente","invalido");//passo i dati alla servlet checkDatiUser per il loro controllo//uso l'url rewriting perchè se in seguito volessi usare la stessa//servlet per altri controlli basterebbe cambiare il comando che leLuca Gerardo 566/2636 Pagina 91 <strong>di</strong> 113


viene passatoRequestDispatcher rd = getServletContext().getRequestDispatcher("/checkDatiUser?cmdControl=request");rd.include(request, response);if/*(*/((request.getAttribute("flagUtente")).equals("valido") ) /*&&(request.getAttribute("flagUtente").equals("valido")))*/{//richiamo la query per l'inserimento e visualizzo la pagina che informa l'utente//dell'esito positivo dell'immissione della richiestaid_last_insert_user =database.insertRequestPen<strong>di</strong>ng(nome,cognome,email,certificato);//Richiamo la servlet per l'invio della mailRequestDispatcher rd2 = getServletContext().getRequestDispatcher("/mail?id="+id_last_insert_user);rd2.include(request, response);database.closeConnection();response.sendRe<strong>di</strong>rect("./requestAccepted.jsp");}else{database.closeConnection();chiamo la pagina che visualizza l'errore!!!response.sendRe<strong>di</strong>rect("./errorPage.jsp");}}database.closeConnection();}/*** Returns a short description of the servlet.* @return a String containing servlet description*/public String getServletInfo() {return "Short description";}// }checkDatiUser.java/** To change this template, choose Tools | Templates* and open the template in the e<strong>di</strong>tor.*/import java.io.IOException;import java.io.PrintWriter;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import bean.*;import java.io.FileOutputStream;import java.io.PrintStream;import java.util.*;import java.util.regex.Pattern;/**** @author luca*/public class checkDatiUser extends HttpServlet {/*** Processes requests for both HTTP GET and POST methods.* @param request servlet request* @param response servlet responseLuca Gerardo 566/2636 Pagina 92 <strong>di</strong> 113


* @throws ServletException if a servlet-specific error occurs* @throws IOException if an I/O error occurs*/protected void processRequest(HttpServletRequest request, HttpServletResponseresponse)throws ServletException, IOException {doPost(request,response);response.setContentType("text/html;charset=UTF-8");PrintWriter out = response.getWriter();try {/* TODO output your page hereout.println("");out.println("");out.println("Servlet checkDatiUser");out.println("");out.println("");out.println("Servlet checkDatiUser at " + request.getContextPath () + "");out.println("");out.println("");*/} finally {out.close();}}// /*** Handles the HTTP GET method.* @param request servlet request* @param response servlet response* @throws ServletException if a servlet-specific error occurs* @throws IOException if an I/O error occurs*/protected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {doPost(request,response);processRequest(request, response);}/*** Handles the HTTP POST method.* @param request servlet request* @param response servlet response* @throws ServletException if a servlet-specific error occurs* @throws IOException if an I/O error occurs*/protected void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {//processRequest(request, response);Database database =new Database();if (request.getParameter("cmdControl").equals("request")){utenteBean utente = (utenteBean)request.getAttribute("user");String email = utente.getMail();long certificato =utente.getCertificato();boolean flagMail = false;boolean flagMailResponse=false;String flagUtente = null;//espressione regolare per validare l'e-mail dal punto <strong>di</strong> vista sintatticoString regExpr ="[a-zA-Z0-9._%-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}";//controllo sintattico dell'emailif (Pattern.matches(regExpr, email)){flagMail = true;Luca Gerardo 566/2636 Pagina 93 <strong>di</strong> 113


}//controllo l'email//controllo se è già stata fatta una richiesta con la stessa mail//o se è già presente un role associato a qeusta e-mailif(certificato!=0 && flagMail){flagMailResponse = database.getResponseEmail(email,certificato);database.closeConnection();if( utente.getNome().equals("") || utente.getCognome().equals("") ||utente.getCertificato() == 0 || (!(utente.getAccettaRegoleVo()!=null)) ||flagMailResponse!=true ){flagUtente = "invalido";request.setAttribute("flagUtente",flagUtente);//da quello che ho capito è qui il problema...ve<strong>di</strong> perchè//entra in questo if se inserisco tutti i parametri in modo//corretto...se proprio devi,scrivi su file i parametri!!!//cmq dopo togli tutti quegli if nella servlet Controller}else {flagUtente = "valido";request.setAttribute("flagUtente",flagUtente);}}else {flagUtente ="invalido";request.setAttribute("flagUtente",flagUtente);}}database.closeConnection();}/*** Returns a short description of the servlet.* @return a String containing servlet description*/public String getServletInfo() {return "Short description";}// }mail.java/** To change this template, choose Tools | Templates* and open the template in the e<strong>di</strong>tor.*/import bean.*;import java.io.FileOutputStream;import java.io.IOException;import java.io.PrintStream;import java.io.PrintWriter;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.mail.*;import javax.mail.internet.*;import java.util.*;/**** @author luca*/public class mail extends HttpServlet {/*** Processes requests for both HTTP GET and POST methods.Luca Gerardo 566/2636 Pagina 94 <strong>di</strong> 113


* @param request servlet request* @param response servlet response* @throws ServletException if a servlet-specific error occurs* @throws IOException if an I/O error occurs*/protected void processRequest(HttpServletRequest request, HttpServletResponseresponse)throws ServletException, IOException {doPost(request, response);response.setContentType("text/html;charset=UTF-8");PrintWriter out = response.getWriter();try {/* TODO output your page hereout.println("");out.println("");out.println("Servlet mail");out.println("");out.println("");out.println("Servlet mail at " + request.getContextPath () + "");out.println("");out.println("");*/} finally {out.close();}}// /*** Handles the HTTP GET method.* @param request servlet request* @param response servlet response* @throws ServletException if a servlet-specific error occurs* @throws IOException if an I/O error occurs*/protected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {doPost(request, response);processRequest(request, response);}/*** Handles the HTTP POST method.* @param request servlet request* @param response servlet response* @throws ServletException if a servlet-specific error occurs* @throws IOException if an I/O error occurs*/protected void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {//processRequest(request, response);try {//processRequest(request, response);long request_id = Long.parseLong(request.getParameter("id"));utenteBean utente = (utenteBean) request.getAttribute("user");//server smtpString mailHost = "mail.unina.it";//destinatario mailString to = utente.getMail();// Creazione <strong>di</strong> una mail sessionProperties props = new Properties();props.put("mail.smtp.host", "localhost");Luca Gerardo 566/2636 Pagina 95 <strong>di</strong> 113


Session session = Session.getDefaultInstance(props);// Creazione del messaggio da inviareMimeMessage message = new MimeMessage(session);message.setSubject("Conferma Iscrizione VO Studenti!!!");String body = "Prima <strong>di</strong> essere definitavemente inoltrata la tua richiesta alVOMS Studenti Unina" +"bisogna che tu confermi quest'ultima me<strong>di</strong>ante il seguente link:"+"Conferma richiesta"+"Se invece ritiene <strong>di</strong> non aver richiesto nulla <strong>di</strong> tutto ciò usa ilseguente link:"+"Annulla richiesta";message.setContent(body,"text/html");//message.setText("Questa e-mail è stata inviata dalla mia applicazione java!!!");//message.setContent("Questa riga è stata scritta in HTML", "text/html");//message.setContent("Anche questa!!!", "text/html");//message.setContent(" Link text ", "text/html");//message.setContent("Gerardo Luca ", "text/html");// Aggiunta <strong>degli</strong> in<strong>di</strong>rizzi del mittente e del destinatarioInternetAddress fromAddress = new InternetAddress("spar<strong>di</strong>@na.infn.it");InternetAddress toAddress = new InternetAddress(to);message.setFrom(fromAddress);message.setRecipient(Message.RecipientType.TO, toAddress);// Invio del messaggioTransport.send(message);} catch (MessagingException ex) {ex.printStackTrace();}}/*** Returns a short description of the servlet.* @return a String containing servlet description*/public String getServletInfo() {return "Short description";}// }Database:/** To change this template, choose Tools | Templates* and open the template in the e<strong>di</strong>tor.*/package bean;/**** @author luca*/import java.io.FileOutputStream;import java.io.PrintStream;import java.sql.*;import java.util.*;public class Database {private String nomeDB; // Nome del Database a cui connettersiprivate String nomeUtente; // Nome utente utilizzato per la connessione al Databaseprivate String pwdUtente; // Password usata per la connessione al Databaseprivate String errore; // Raccoglie informazioni riguardo l'ultima eccezionesollevataLuca Gerardo 566/2636 Pagina 96 <strong>di</strong> 113


private Connection db = null; // La connessione con il Databasepublic Database() {this.nomeDB = "studentivomsdb";this.nomeUtente = "root";this.pwdUtente = "*********";errore = "";}public String getErrore(){return this.errore;}// Apre la connessione con il Databasepublic void connetti() {try {if(db==null){// Carico il driver JDBC per la connessione con il database MySQLClass.forName("com.mysql.jdbc.Driver");// La connessione necessita della passworddb = DriverManager.getConnection("jdbc:mysql://localhost:3306/" + nomeDB + "?user="+ nomeUtente +"&password=" + pwdUtente);// La connessione è avvenuta con successo}}catch (Exception e) { errore = e.getMessage(); }}public void closeConnection(){if(db!=null){try {db.close();db = null;} catch (SQLException ex) {ex.printStackTrace();}}}//querypublic ResultSet getCertRobot() throws SQLException{ResultSet result = null;this.connetti();Statement stmt = db.createStatement();result = stmt.executeQuery("select userid,cn from usr where cn LIKE '%Robot%'");return result;}public boolean getResponseEmail(String email, long certificatoRobot){this.connetti();ResultSet result = null;int count = 0;int countM = 0;long rid=0;//trasformo la mail in "role" perchè mi servirà dopoString emailMo<strong>di</strong>f= email.replaceAll("@", "_at_");try {Statement stmt = db.createStatement();result = stmt.executeQuery("select count(*) mail from request_pen<strong>di</strong>ng where maillike '"+ email+"'");if(result.next()){count = result.getInt(1);}stmt.close();//cancella le successive righeif (count == 0) {//vuol <strong>di</strong>re che non c'è una richiesta pendente con la stessa mail//e quin<strong>di</strong> controllo se questo role è già associato al certifRobot//passato al metodo (che sarebbe il certif scelto dall'utente)!!!stmt = db.createStatement();Luca Gerardo 566/2636 Pagina 97 <strong>di</strong> 113


esult =stmt.executeQuery("select rid from roles where role like'"+emailMo<strong>di</strong>f+"'");if(result.next()){ //se la query ritorna un valore...rid=result.getLong(1);}else{ //vuol <strong>di</strong>re che resul.next()=null!!! quin<strong>di</strong> assegno io il val a rid//per evitare l'eccezione. Cmq questo significa che non esiste quel//role nel db!!!rid=0;}result.close();if (rid == 0){ //vuol <strong>di</strong>re che non esiste alcun role con la stessa email!!!return true;//qun<strong>di</strong> la mail è ok e ripasso il flusso <strong>di</strong> controllo//per il check <strong>degli</strong> altri parametri}else{ //vuol <strong>di</strong>re che già esiste questo role e quin<strong>di</strong> devo//vedere se è già associato al certificato robot passatomi// N.B. ricorda che il cert robot è "un utente" nella tab usr!!!result = stmt.executeQuery("select count(*) " +"from m " +"where userid= "+certificatoRobot+" and rid="+rid);if(result.next()){countM=result.getInt(1);}if(countM==0){return true; // il ruolo esiste ma non è associato al certRobot richiesto//dall'utente quin<strong>di</strong> do l'ok al chiamante <strong>di</strong> proseguire//con il controllo <strong>degli</strong> altri dati utente!!!}else{ //esiste già un ruolo associato al certif robot e quin<strong>di</strong>// non accetto la richiesta dell'utente!!!return false;}}}} catch (SQLException ex) {ex.printStackTrace();}return false; //se count!=0 cioè esiste già quella mail nella tab delle//richieste pendenti!!!}public long insertRequestPen<strong>di</strong>ng(String nome, String cognome, String email, longcertRobot){long id_last_user=-1;try {java.util.Date dateUtil=new java.util.Date();java.sql.Date dateSql=new java.sql.Date(dateUtil.getTime());this.connetti();String sql = "INSERT INTO request_pen<strong>di</strong>ng(nome, cognome, mail, certif_robot,data_request) VALUES(?,?,?,?,?)";//Creazione dello statementPreparedStatement mystat = db.prepareStatement(sql,Statement.RETURN_GENERATED_KEYS);mystat.setString(1, nome);mystat.setString(2, cognome);mystat.setString(3, email);mystat.setLong(4, certRobot);mystat.setDate(5, dateSql);//Esecuzione dello statementmystat.executeUpdate();ResultSet rs = mystat.getGeneratedKeys();while(rs.next()){id_last_user = rs.getLong(1);Luca Gerardo 566/2636 Pagina 98 <strong>di</strong> 113


}rs.close();//Chiusura dello statementmystat.close();} catch (SQLException ex) {ex.printStackTrace();}return id_last_user;}public ResultSet getRequestPen<strong>di</strong>ng(){ResultSet result = null;try {this.connetti();String sql = "SELECT * " +"FROM request_pen<strong>di</strong>ng " +"WHERE confirm_request like 'YES' " +"ORDER BY request_id";Statement stmt = db.createStatement();result = stmt.executeQuery(sql);} catch (SQLException ex) {ex.printStackTrace();}return result;}//ritorna il nome del certificato in base all'id passatopublic String getNomeCertRobot(long id_certificato) throws SQLException{ResultSet result = null;this.connetti();Statement stmt = db.createStatement();result = stmt.executeQuery("select cn from usr where userid= '"+id_certificato+"'");result.next();String nome =result.getString(1);this.closeConnection();return nome;}public void deleteRequestPen<strong>di</strong>ng(long request_id){try {this.connetti();String sql = "DELETE FROM request_pen<strong>di</strong>ng " +"WHERE request_id= ?";PreparedStatement mystat=db.prepareStatement(sql);mystat.setLong(1, request_id);mystat.executeUpdate();//this.closeConnection();} catch (SQLException ex) {ex.printStackTrace();}}//mi da le info dell'utente richiedente in base all'id della tab request_pen<strong>di</strong>ngche gli passopublic ResultSet getUserRichiedente(long request_id){ResultSet result = null;try {this.connetti();Statement stmt = db.createStatement();result = stmt.executeQuery("select * from request_pen<strong>di</strong>ng where request_id = " +request_id);} catch (SQLException ex) {ex.printStackTrace();}return result;}Luca Gerardo 566/2636 Pagina 99 <strong>di</strong> 113


public void confirmRequestPen<strong>di</strong>ng(long idUser){try {String sql = "update request_pen<strong>di</strong>ng set confirm_request='YES' where request_id=?";this.connetti();PreparedStatement mystat = db.prepareStatement(sql);mystat.setLong(1, idUser);//Esecuzione dello statementmystat.executeUpdate();//Chiusura dello statementmystat.close();} catch (SQLException ex) {ex.printStackTrace();}}public boolean checkRequestPen<strong>di</strong>ng(long idUser){ResultSet result = null;String app=null;try {this.connetti();Statement stmt = db.createStatement();result = stmt.executeQuery("select confirm_request from request_pen<strong>di</strong>ng whererequest_id = " + idUser);if(result.next()){app = result.getString(1);}else{//Non esiste più la riga con quell'id ==> la richiesta è già stata confermata orifiutatareturn false;}stmt.close();result.close();} catch (SQLException ex) {ex.printStackTrace();}if(app.equals("YES")){return false;}return true;}//ritorna il rid del role se nella tab roles esiste già un ruolo uguale a quellopassato//altrimenti ritorna -1public long isRole(String mail){long rid=-1;try {ResultSet result = null;mail = mail.replaceAll("@", "_at_");int count = 0;try {this.connetti();Statement stmt = db.createStatement();result = stmt.executeQuery("select count(*), rid from roles where role like '" +mail + "'");} catch (SQLException ex) {ex.printStackTrace();}if (result.next()) {count = result.getInt(1);if(count > 0){rid = result.getLong(2);}}Luca Gerardo 566/2636 Pagina 100 <strong>di</strong> 113


esult.close();} catch (SQLException ex) {ex.printStackTrace();}return rid;}public void insertIntoM(long certif_robot, long gid, long rid){String sql;this.connetti();try {//N.B. In questo caso lo userid sarebbe il certificato Robot che viene visto comese//fosse un utente!!!//devi vedere le rid ==-1 vuol <strong>di</strong>re che sto facendo l'inserimento completo e quin<strong>di</strong>//devi valutare anche questa ipotesi facendo un if. if rid != -1 fa i questo//else definisci nuovamente sql ma stavolta con due soli punti interrogativiif(rid!=-1){sql = "INSERT INTO m(userid, gid, rid) VALUES(?,?,?)";PreparedStatement mystat = db.prepareStatement(sql);mystat.setLong(1, certif_robot);mystat.setLong(2, gid);mystat.setLong(3, rid);//Esecuzione dello statementmystat.executeUpdate();//Chiusura dello statementmystat.close();}else{sql = "INSERT INTO m(userid, gid) VALUES(?, ?)";PreparedStatement mystat = db.prepareStatement(sql);mystat.setLong(1, certif_robot);mystat.setLong(2, gid);//Esecuzione dello statementmystat.executeUpdate();//Chiusura dello statementmystat.close();}} catch (SQLException ex) {ex.printStackTrace();}}public ResultSet getGid(){ResultSet result = null;try {this.connetti();Statement stmt = db.createStatement();result = stmt.executeQuery("select <strong>di</strong>stinct gid from groups");} catch (SQLException ex) {ex.printStackTrace();}return result;}public ResultSet getAdmin(){ResultSet result = null;this.connetti();String sql = "select adminid from admins where adminid != 3 and adminid != 4 orderby adminid";try {Statement stmt = db.createStatement();result = stmt.executeQuery(sql);} catch (SQLException ex) {ex.printStackTrace();Luca Gerardo 566/2636 Pagina 101 <strong>di</strong> 113


}return result;}public long insertIntoUsr(String nome, String cognome, String mail){long id_last_user = -1;this.connetti();try {String stringa = null;String nomeCompleto = nome+" "+cognome;stringa = "/C=IT/O=LOCAL/OU=user_of_robot_certificate/L=<strong>Federico</strong><strong>II</strong>/CN=" +nomeCompleto;String sql = "INSERT INTO usr(dn, cn, mail) VALUES(?, ?, ?)";PreparedStatement mystat = db.prepareStatement(sql,Statement.RETURN_GENERATED_KEYS);mystat.setString(1, stringa);mystat.setString(2, nomeCompleto);mystat.setString(3, mail);//mi prendo anche l'id dell'utente appena inserito nella tab usrmystat.executeUpdate();ResultSet rs = mystat.getGeneratedKeys();while(rs.next()){id_last_user = rs.getLong(1);}rs.close();mystat.close();} catch (SQLException ex) {ex.printStackTrace();}return id_last_user;}public long insertIntoRoles(String mail){long last_insert_id = -1;try {this.connetti();mail = mail.replaceAll("@", "_at_");String sql = "INSERT INTO roles(role) VALUES(?)";PreparedStatement mystat = db.prepareStatement(sql,Statement.RETURN_GENERATED_KEYS);mystat.setString(1, mail);mystat.executeUpdate();ResultSet rs = mystat.getGeneratedKeys();while (rs.next()) {last_insert_id = rs.getLong(1);}rs.close();mystat.close();} catch (SQLException ex) {ex.printStackTrace();}//ritorno l'id del role appena inseritoreturn last_insert_id;}}utenteBean.java/** To change this template, choose Tools | Templates* and open the template in the e<strong>di</strong>tor.Luca Gerardo 566/2636 Pagina 102 <strong>di</strong> 113


*/package bean;import java.sql.*;/**** @author luca*/public class utenteBean {String nome = "";String cognome = "";String mail = "";String ca = "NULL";String dn = null;String accettaRegoleVo = null;long certificato = -1;Date data = null;//meto<strong>di</strong> getpublic String getNome(){return this.nome;}public String getCognome(){return this.cognome;}public String getMail(){return this.mail;}public String getCa(){return this.ca;}public String getDn(){return this.dn;}public long getCertificato(){return this.certificato;}public Date getData(){return this.data;}public String getAccettaRegoleVo(){return accettaRegoleVo;}//meto<strong>di</strong> setpublic void setNome(String nome){this.nome = nome;}public void setCognome(String cognome){this.cognome = cognome;}public void setMail(String mail){this.mail = mail;}public void setDn(String dn){this.dn = dn;}public void setCertificato(long certificato){this.certificato = certificato;}public void setData(Date data){this.data = data;}public void setAccettaRegoleVo(String acc){accettaRegoleVo=acc;Luca Gerardo 566/2636 Pagina 103 <strong>di</strong> 113


}}indexAdmin.jspIscrizione VO studentiIscrizionealla VO studentiuninaWelcome to voms-admin registration for the studenti VO. RichiestependentiRequest_idNomeCognomeEmailCertificato RobotAcceptReject


while(rs.next()){i++;if(i%2 != 0){%> insertionSuccesful.jsp


Author : luca--%>Iscrizione VO studentiIscrizionealla VO studentiunina OperazioneconclusaOperazione conclusa!servletControllerAdmin.java/** To change this template, choose Tools | Templates* and open the template in the e<strong>di</strong>tor.*/import java.io.IOException;import java.io.PrintWriter;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import bean.*;import java.util.Enumeration;import java.util.LinkedList;import javax.servlet.RequestDispatcher;/**** @author luca*/public class servletControllerAdmin extends HttpServlet {/*** Processes requests for both HTTP GET and POST methods.Luca Gerardo 566/2636 Pagina 106 <strong>di</strong> 113


* @param request servlet request* @param response servlet response* @throws ServletException if a servlet-specific error occurs* @throws IOException if an I/O error occurs*/protected void processRequest(HttpServletRequest request, HttpServletResponseresponse)throws ServletException, IOException {response.setContentType("text/html;charset=UTF-8");PrintWriter out = response.getWriter();try {/* TODO output your page hereout.println("");out.println("");out.println("Servlet servletControllerAdmin");out.println("");out.println("");out.println("Servlet servletControllerAdmin at " + request.getContextPath () +"");out.println("");out.println("");*/} finally {out.close();}}// /*** Handles the HTTP GET method.* @param request servlet request* @param response servlet response* @throws ServletException if a servlet-specific error occurs* @throws IOException if an I/O error occurs*/protected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {processRequest(request, response);}/*** Handles the HTTP POST method.* @param request servlet request* @param response servlet response* @throws ServletException if a servlet-specific error occurs* @throws IOException if an I/O error occurs*/protected void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {//processRequest(request, response);//Non uso la programmazione generica(ovvero l'uso dei parametrici)//a causa della versione <strong>di</strong> java che risiede sul server!!!//so cmq che quì ci saranno solo oggetti LongLinkedList accettati = new LinkedList();LinkedList rifiutati = new LinkedList();if (request.getParameter("cmd").equals("acceptUseCertificate")){//LE UNICHE COSE CHE RICEVO DALLA PAGINA PRECEDENTE SONO I RADIO BUTTON!!!/** ECCO COSA FARE:* PER TUTTI I BOTTONI PRESENTI PRENDI IL LORO VALORE.* PER CIASCUNO VEDI SE È DIVERSO DA NULL E DIVERSO DALLA STRINGA* reject. SE È COSÌ ALLORA INSERISCILO IN UNA LISTA* A QUESTO PUNTO SETTI LE LISTE COME ATTRIBUTO A REQUEST E PASSI IL CONTROLLO ADLuca Gerardo 566/2636 Pagina 107 <strong>di</strong> 113


UN'ALTRA SERVLET* CHE PENSERÀ AD USARE QUESTA LISTA CHE CONTIENE GLI ID DI TUTTI QUELLI CHE SONO* STATI ACCETTATI. QUELLI CHE NON VENGONO ACCETTATI SARANNO INSERITI IN UNA* ALTRA LISTA E SI PROVVEDERÀ A "DISPATCHARE" IL CONTROLLO ALLE DUE SERVLET* CHE GESTISCONO LE DUE LISTE**/Enumeration e =request.getParameterNames();//long app=-1;while(e.hasMoreElements()){String app1 = (String) e.nextElement();if(!(app1.equals("cmd"))){if(request.getParameter(app1).equals("accept")){//inserisci nella lista <strong>degli</strong> accettatiaccettati.add(Long.valueOf(app1));}else{//inserisci nella lista dei non ammessirifiutati.add(Long.valueOf(app1));}}}request.setAttribute("listaAccettati", accettati);request.setAttribute("listaRifiutati", rifiutati);//chiamo la servlet che si occupa <strong>di</strong> cancellare le richiesteRequestDispatcher rd =getServletContext().getRequestDispatcher("/cancellaRichiesta");rd.include(request, response);//chiamo la servlet che provvede ad inserire i dati nel DBRequestDispatcher rd2=getServletContext().getRequestDispatcher("/inserisciUtente");rd2.include(request, response);response.sendRe<strong>di</strong>rect("./insertionSuccesful.jsp");}}/*** Returns a short description of the servlet.* @return a String containing servlet description*/public String getServletInfo() {return "Short description";}// }inserisciUtente.java/** To change this template, choose Tools | Templates* and open the template in the e<strong>di</strong>tor.*/import java.io.IOException;import java.io.PrintWriter;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import bean.*;import java.sql.*;import java.util.*;Luca Gerardo 566/2636 Pagina 108 <strong>di</strong> 113


**** @author luca*/public class inserisciUtente extends HttpServlet {/*** Processes requests for both HTTP GET and POST methods.* @param request servlet request* @param response servlet response* @throws ServletException if a servlet-specific error occurs* @throws IOException if an I/O error occurs*/protected void processRequest(HttpServletRequest request, HttpServletResponseresponse)throws ServletException, IOException {doPost(request,response);response.setContentType("text/html;charset=UTF-8");PrintWriter out = response.getWriter();try {/* TODO output your page hereout.println("");out.println("");out.println("Servlet inserisciUtente");out.println("");out.println("");out.println("Servlet inserisciUtente at " + request.getContextPath () +"");out.println("");out.println("");*/} finally {out.close();}}// /*** Handles the HTTP GET method.* @param request servlet request* @param response servlet response* @throws ServletException if a servlet-specific error occurs* @throws IOException if an I/O error occurs*/protected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {doPost(request,response);processRequest(request, response);}/*** Handles the HTTP POST method.* @param request servlet request* @param response servlet response* @throws ServletException if a servlet-specific error occurs* @throws IOException if an I/O error occurs*/protected void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {//processRequest(request, response);Database db = new Database();ResultSet result = null;ResultSet rs_gruppi = null;Luca Gerardo 566/2636 Pagina 109 <strong>di</strong> 113


ResultSet rs_admin = null;long app=-1;long certif_robot;long rid; //nel caso in cui esiste già questo ruololong gid; //è il gid della tabella groups!!!long last_insert_id_into_usr;long last_insert_id_into_roles;String nome,cognome,mail;LinkedList listaAccettati = new LinkedList();//Lista <strong>di</strong> tutti i gruppi presenti per usare il nuovo ruolo in ogni gruppoLinkedList gruppi = new LinkedList();listaAccettati = (LinkedList) request.getAttribute("listaAccettati");//prendo un'iteratore per scorrere la lista <strong>degli</strong> utenti accettati//quì dentro c'è l'id della tab request_pen<strong>di</strong>ngIterator i = listaAccettati.iterator();Iterator i2 = null; //questo lo usa per la lista gruppirs_gruppi = db.getGid();try {while (rs_gruppi.next()) { //inserisco tutti i gruppi nella lista gruppigruppi.add(Long.valueOf(rs_gruppi.getLong(1)));}rs_gruppi.close();} catch (SQLException ex) {ex.printStackTrace();}//prendo un iteratore per scorrere la lista gruppi!!!while(i.hasNext()){ //per ogni utente accettato!!!i2 = gruppi.iterator();app = ((Long)i.next()).longValue(); //ora ho l'id della tab request_pen<strong>di</strong>ngrelativo all'utenteresult = db.getUserRichiedente(app);//ora in result ho le info dell'utente ed ho due possibilità://o esiste già il role per l'utente perchè si è già associato a qualche altrocertif robot//oppure il role non esiste e quin<strong>di</strong> devo fare linserimento "per intero"!!!try {if (result.next()) { //sicuramente result non è null!!!nome = result.getString(2);cognome = result.getString(3);mail = result.getString(4);certif_robot = result.getLong(5);rid = db.isRole(mail);if(rid != -1){//vuol <strong>di</strong>re che il role esiste già e quin<strong>di</strong> lo devo solo associare al certif robot//perchè se esiste il role, dato che è univoco, esiste già anche lo user!!!while(i2.hasNext()){ //per ogni gruppo presente in groupsgid = ((Long)i2.next()).longValue(); //prendo il giddb.insertIntoM(certif_robot, gid, rid); //e inserisco nella tab m//se non lo voglio fare per ogni gruppo ma solo per il gruppo <strong>di</strong> default//(che è OBBLIGATORIO) ed il gruppo per gli studenti (nel mio caso 3)//basta mettere una clausula where nella query!!!}}else{ //vuol <strong>di</strong>re che il role = -1 =>non esiste alcun role del genere nel DB// e quin<strong>di</strong> devo fare l'inserimento per interolast_insert_id_into_usr = db.insertIntoUsr(nome, cognome, mail);//inserisci il ruolo e mi faccio dare il lastInsertIdlast_insert_id_into_roles = db.insertIntoRoles(mail);//adesso faccio l'ultimo inserimento in m e lo faccio per tutti i gruppi//RIPETO che se non voglio farlo per tutti i gruppi ma solo per quello <strong>di</strong>//default (l'1 che è obbligatorio) e per quello previsto per gli//utenti che useranno il certificato robot(il 3 nel mio caso) basta//mo<strong>di</strong>ficare la query relativa.Luca Gerardo 566/2636 Pagina 110 <strong>di</strong> 113


while(i2.hasNext()){ //per ogni gruppo presente in groupsgid = ((Long)i2.next()).longValue(); //prendo il giddb.insertIntoM(certif_robot, gid, last_insert_id_into_roles); //e inserisco nellatab m//se non lo voglio fare per ogni gruppo ma solo per il gruppo <strong>di</strong> default//(che è OBBLIGATORIO) ed il gruppo per gli studenti (nel mio caso 3)//basta mettere una clausula where nella query!!!}}}} catch (SQLException ex) {ex.printStackTrace();}//cancello l'utente accettato dalla tab req_pen<strong>di</strong>ng perchè il suo inserimento//nel db è stato completato!!!db.deleteRequestPen<strong>di</strong>ng(app);db.closeConnection();}/*Database db = new Database();Enumeration e =request.getParameterNames();long app=-1;//oppure//request.getParameterMap();//long app = Long.parseLong(request.getParameter("scelta3"));response.setContentType("text/html;charset=UTF-8");PrintWriter out = response.getWriter();out.println(" prova ");out.println("");//devo evitare <strong>di</strong> processare il parametro cmd//da che sarà l'ultimo basta che metto una con<strong>di</strong>zione nell'ifwhile(e.hasMoreElements()){String app1=(String) e.nextElement();if(!(app1.equals("cmd"))){out.println(" Il il valore <strong>di</strong> "+app1+" è " + request.getParameter(app1)+"");if(request.getParameter(app1).equals("reject")){db.deleteRequestPen<strong>di</strong>ng(Long.parseLong(app1));}}}out.print("");out.println("");out.close();*/}/*** Returns a short description of the servlet.* @return a String containing servlet description*/public String getServletInfo() {return "Short description";}// }cancellaRichiesta.java/** To change this template, choose Tools | Templates* and open the template in the e<strong>di</strong>tor.*/Luca Gerardo 566/2636 Pagina 111 <strong>di</strong> 113


import java.io.IOException;import java.io.PrintWriter;import java.util.*;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import bean.*;/**** @author luca*/public class cancellaRichiesta extends HttpServlet {/*** Processes requests for both HTTP GET and POST methods.* @param request servlet request* @param response servlet response* @throws ServletException if a servlet-specific error occurs* @throws IOException if an I/O error occurs*/protected void processRequest(HttpServletRequest request, HttpServletResponseresponse)throws ServletException, IOException {doPost(request,response);response.setContentType("text/html;charset=UTF-8");PrintWriter out = response.getWriter();try {/* TODO output your page hereout.println("");out.println("");out.println("Servlet cancellaRichiesta");out.println("");out.println("");out.println("Servlet cancellaRichiesta at " + request.getContextPath () +"");out.println("");out.println("");*/} finally {out.close();}}// /*** Handles the HTTP GET method.* @param request servlet request* @param response servlet response* @throws ServletException if a servlet-specific error occurs* @throws IOException if an I/O error occurs*/protected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {doPost(request,response);processRequest(request, response);}/*** Handles the HTTP POST method.* @param request servlet request* @param response servlet response* @throws ServletException if a servlet-specific error occursLuca Gerardo 566/2636 Pagina 112 <strong>di</strong> 113


* @throws IOException if an I/O error occurs*/protected void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {//processRequest(request, response);Database db=new Database();LinkedList listaRifiutati = new LinkedList();listaRifiutati =(LinkedList) request.getAttribute("listaRifiutati");Iterator i = listaRifiutati.iterator();long app=-1;while (i.hasNext()){//dato che i.next() mi ritorna un tipo Object => faccio il cast a Long//e poi lo trasformo in long!!!app = ((Long)i.next()).longValue();//cancello l'utente!!!db.deleteRequestPen<strong>di</strong>ng(app);}db.closeConnection();}/*** Returns a short description of the servlet.* @return a String containing servlet description*/public String getServletInfo() {return "Short description";}// }Luca Gerardo 566/2636 Pagina 113 <strong>di</strong> 113

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!