UNIVERSITÀ DEGLI STUDI DI BRESCIA FACOLTÀ DI INGEGNERIA CORSO DI LAUREA SPECIALISTICA IN INGEGNERIA INFORMATICA DIPARTIMENTO DI ELETTRONICA PER L’AUTOMAZIONE CONTROLLO D’ACCESSO BASATO SU RUOLI (RBAC) IN UN APPLICATION SERVER J2EE (JAVA 2 ENTERPRISE EDITION): STUDIO ED IMPLEMENTAZIONE Studente: Giacomo Carlotti Matricola: 52916 Relatore: prof. Pietro Baroni Correlatori: ing. Andrea Mauro ing. Pietro Martinelli ANNO ACCADEMICO 2004/2005 A mia madre e a mio padre Pagina 2 Ringraziamenti Ringrazio sentitamente il prof. Pietro Baroni e l’ing. Andrea Mauro per la stima e la fiducia che hanno dimostrato avere nei miei confronti. Un ringraziamento particolare va all’ing. Pietro Martinelli per la sua disponibilità ed i suoi preziosi consigli. Pagina 3 INDICE INDICE....................................................................................................... 4 CAPITOLO 1 INTRODUZIONE............................................................. 11 1.1 Il contesto della tesi: la sicurezza dell’informazione............................ 12 1.2 Le proprietà della sicurezza dell’informazione.................................... 14 1.2.1 Autenticazione .................................................................................. 14 1.2.2 Controllo degli accessi / Autorizzazione........................................... 14 1.2.3 Confidenzialità (privacy e segretezza) .............................................. 15 1.2.4 Integrità ............................................................................................. 15 1.2.5 Responsabilità & Non ripudio........................................................... 16 1.2.6 Disponibilità...................................................................................... 17 1.3 Politiche, modelli e meccanismi ............................................................. 18 1.4 Gli obiettivi della tesi .............................................................................. 20 1.5 Il piano di lavoro ..................................................................................... 21 CAPITOLO 2 IL CONTROLLO D’ACCESSO TRADIZIONALE ........... 23 2.1 Il controllo d’accesso............................................................................... 24 2.1.1 2.2 L’ontologia di base............................................................................ 24 I principi fondamentali ........................................................................... 25 2.2.1 Il minimo privilegio (Least privilege)............................................... 26 2.2.2 La separazione dei compiti (Separation of duty) .............................. 26 2.3 Breve storia del controllo d’accesso tradizionale ................................. 27 2.3.1 Matrice di controllo........................................................................... 28 2.3.2 Reference monitor e security kernel ................................................. 29 2.3.3 Il modello di Bell-LaPadula .............................................................. 31 Pagina 4 2.3.4 Modello d’integrità di Biba............................................................... 32 2.3.5 TCSEC: il MAC e il DAC ................................................................ 33 2.3.5.1 DAC (Discretionary Access Control) ........................................... 33 2.3.5.2 MAC (Mandatory Access Control)............................................... 34 2.3.6 Modello di Clark e Wilson................................................................ 35 2.3.7 Politica del muro cinese e modello di Brewer e Nash ...................... 36 CAPITOLO 3 IL MODELLO RBAC ORIGINALE.................................. 39 3.1 Il primo modello RBAC.......................................................................... 40 3.1.1 Utenti, ruoli ed operazioni ................................................................ 40 3.1.2 Gerarchie di ruoli .............................................................................. 41 3.1.3 Descrizione formale .......................................................................... 43 3.1.4 Il principio del minimo privilegio..................................................... 45 3.1.5 Separazione dei compiti .................................................................... 45 3.2 Differenza tra ruoli e gruppi .................................................................. 46 3.3 Confronto tra RBAC, MAC e DAC....................................................... 47 3.3.1 RBAC vs DAC.................................................................................. 47 3.3.2 RBAC vs MAC ................................................................................. 48 CAPITOLO 4 RBAC96 FRAMEWORK ................................................ 49 4.1 Il framework RBAC................................................................................ 50 4.2 Panoramica dei modelli .......................................................................... 50 4.2.1 RBAC0 .............................................................................................. 51 4.2.2 RBAC1 .............................................................................................. 52 4.2.3 RBAC2 .............................................................................................. 55 4.2.4 RBAC3 .............................................................................................. 55 4.3 Descrizione formale................................................................................. 56 4.3.1 RBAC0 .............................................................................................. 56 4.3.2 RBAC1 .............................................................................................. 57 Pagina 5 4.3.3 RBAC2 .............................................................................................. 57 4.3.4 RBAC3 .............................................................................................. 57 CAPITOLO 5 LO STANDARD RBAC PROPOSTO DAL NIST............ 59 5.1 Presentazione dello standard ................................................................. 60 5.2 Panoramica dei modelli .......................................................................... 60 5.2.1 Core RBAC ....................................................................................... 61 5.2.2 Hierarchical RBAC ........................................................................... 62 5.2.3 Constrained RBAC ........................................................................... 64 5.2.3.1 Static Separation of Duty (SSD) ................................................... 64 5.2.3.2 Dynamic Separation of Duty (DSD) ............................................. 65 5.3 Modello concettuale ................................................................................ 66 5.3.1 Core RBAC ....................................................................................... 67 5.3.2 Hierarchical RBAC ........................................................................... 69 5.3.3 Constrained RBAC ........................................................................... 71 5.4 Specifiche funzionali ............................................................................... 72 5.4.1 Core RBAC ....................................................................................... 73 5.4.2 Hierarchical RBAC ........................................................................... 75 5.4.3 Static Separation of Duty (SSD) ....................................................... 77 5.4.4 Dynamic Separation of Duty (DSD) ................................................ 78 5.5 I packages................................................................................................. 79 CAPITOLO 6 ANALISI CRITICA DEL MODELLO ............................... 83 6.1 Attivazione e disattivazione dei ruoli .................................................... 84 6.2 Le gerarchie ............................................................................................. 85 6.2.1 Gerarchia ed attivazione dei ruoli ..................................................... 86 6.2.2 Gerarchia e disattivazione dei ruoli................................................... 86 6.2.3 Gerarchia e separazione dei compiti ................................................. 88 6.2.4 Gerarchia e permessi ......................................................................... 90 Pagina 6 6.3 Separazione dei compiti e permessi ....................................................... 92 6.4 I permessi in un sistema ad oggetti........................................................ 93 6.5 Aggiunta e rimozione di elementi del modello...................................... 95 6.6 I vincoli..................................................................................................... 96 6.6.1 GTRBAC (Generalized Temporal RBAC) ....................................... 96 6.6.2 La separazione dei compiti storica.................................................... 97 6.6.3 Tassonomia dei vincoli ..................................................................... 98 6.6.4 I vincoli in un sistema ad oggetti .................................................... 101 6.7 Il formato dei vincoli............................................................................. 102 6.7.1 XACML 2.0 (eXtensible Access Control Markup Language)........ 103 6.7.2 La mutua esclusione........................................................................ 104 6.7.3 La Blacklist di Crampton ................................................................ 105 CAPITOLO 7 ESTENSIONE DEL MODELLO: UNA PROPOSTA..... 108 7.1 Premessa ................................................................................................ 109 7.2 L’architettura ........................................................................................ 109 7.2.1 Parte statica ..................................................................................... 111 7.2.2 Parte dinamica................................................................................. 112 7.3 L’attivazione dei permessi.................................................................... 114 7.4 Le scelte di definizione del modello ..................................................... 117 7.5 Il framework .......................................................................................... 119 7.5.1 Le funzioni ...................................................................................... 119 7.5.2 I packages........................................................................................ 121 CAPITOLO 8 LA TECNOLOGIA J2EE .............................................. 122 8.1 La piattaforma J2EE ............................................................................ 123 Pagina 7 8.2 L’architettura J2EE.............................................................................. 124 8.3 L’Application Programming Model.................................................... 127 8.3.1 Livello Client .................................................................................. 129 8.3.2 Livello Web..................................................................................... 129 8.3.3 Livello Business .............................................................................. 130 8.3.4 Livello EIS ...................................................................................... 131 8.4 Le API J2EE .......................................................................................... 132 8.4.1 JDBC (Java DataBase Connectivity) .............................................. 132 8.4.2 RMI (Remote Method Invocation).................................................. 135 8.4.3 Java IDL (Interface Definition Language)...................................... 136 8.4.4 JNDI (Java Naming and Directory Interface) ................................. 137 8.4.5 JMS (Java Message Service)........................................................... 137 8.5 Servlet API: il package javax.servlet................................................... 137 8.5.1 HttpServletResponse ....................................................................... 140 8.5.2 HttpServletRequest ......................................................................... 140 8.5.3 Sessioni utente................................................................................. 140 8.5.3.1 HttpSession ................................................................................. 141 8.5.3.2 Durata di una sessione utente...................................................... 142 8.5.4 Filter ................................................................................................ 142 8.5.5 Eventi di tipo HTTP session ........................................................... 143 8.6 JSP (Java Server Pages) ....................................................................... 144 8.6.1 8.7 Compilazione di una pagina JSP..................................................... 144 Autorizzazione in J2EE ........................................................................ 145 8.7.1 Modello di autorizzazione di base................................................... 145 8.7.2 JAAS (Java Authentication and Authorization Service)................. 146 CAPITOLO 9 L’IMPLEMENTAZIONE DEL MODELLO ESTESO...... 148 9.1 Motivazioni ............................................................................................ 149 Pagina 8 9.2 Architettura del sistema ....................................................................... 150 9.3 I package ................................................................................................ 153 9.4 Descrizione dell’implementazione ....................................................... 156 9.4.1 Il web plug-in .................................................................................. 157 9.4.2 Il motore statico .............................................................................. 159 9.4.3 Il motore dinamico .......................................................................... 161 9.4.4 Il gestore e il monitor delle sessioni................................................ 164 9.4.5 Note implementative ....................................................................... 165 9.5 Il database .............................................................................................. 165 9.5.1 9.6 I vincoli supportati ed il loro formato ............................................. 166 I tool amministrativi ............................................................................. 167 9.6.1 AdminTool ...................................................................................... 167 9.6.2 SessionMonitor ............................................................................... 169 9.7 I file di configurazione .......................................................................... 170 CAPITOLO 10 10.1 TEST E CONCLUSIONI ............................................. 172 Testing .................................................................................................... 173 10.1.1 Motore statico: Casi d’uso .............................................................. 174 10.1.2 Motore Statico: Casi d’uso.............................................................. 177 10.1.3 Risultati ........................................................................................... 177 10.2 Considerazioni finali ............................................................................. 178 10.3 L’attualità del tema............................................................................... 179 10.4 Sviluppi futuri ....................................................................................... 181 INDICE DELLE FIGURE ....................................................................... 182 INDICE DELLE TABELLE .................................................................... 184 Pagina 9 BIBLIOGRAFIA E RIFERIMENTI.......................................................... 185 APPENDICE A JAVADOC ................................................................... 195 APPENDICE B.1 DIAGRAMMI UML DEI PACKAGES ....................... 196 APPENDICE B.2 DIAGRAMMI UML DELLE CLASSI......................... 197 Pagina 10 CAPITOLO 1 INTRODUZIONE Prima di entrare nel dettaglio delle attività svolte per il raggiungimento degli obiettivi della tesi viene fornita una breve descrizione del contesto in cui essa si pone, in modo da inquadrare correttamente dal punto di vista concettuale il lavoro effettuato. A questo scopo verranno elencati in modo ordinato ed organico gli obiettivi della presente trattazione ed infine verrà illustrato il piano di lavoro seguito durante lo svolgimento delle diverse attività necessarie alla realizzazione dell’intero progetto. Pagina 11 1.1 Il contesto della tesi: la sicurezza dell’informazione Non è certo necessario dimostrare che al giorno d’oggi una parte sempre maggiore delle attività umane viene realizzata, controllata, o coadiuvata dall'utilizzo di sistemi informatici. Per questa ragione risulta particolarmente importante comprendere quanto siano sicuri questi sistemi. Il problema ovviamente diviene sempre più critico, mano a mano che il valore delle informazioni scambiate in forma digitale cresce. La sicurezza dell'informazione ha attraversato un lungo periodo di gestazione in cui veniva considerata un'arte più che una scienza, da apprendere tramite l'esperienza e non tramite lo studio. Solo pochi studi pionieristici stendevano le basi dei metodi formali che negli ultimi anni sono stati sviluppati. Questo, unito all'intrinseca difficoltà della materia, spiega il motivo per cui gran parte degli approcci al tema della sicurezza dell'informazione sono basati su esperienza e conoscenza euristica più che su tecniche raffinate. Il principale settore della sicurezza che vanta una lunga tradizione nell'uso dei metodi formali è il campo della crittografia, che non sorprendentemente è molto più avanzato e stabile degli altri. Se questo metodo pragmatico di procedere ha funzionato per anni, lo sviluppo esplosivo dei sistemi collegati in rete e di dispositivi con potenza e versatilità francamente inimmaginabili solo pochi anni fa ha reso necessario e urgente lo sviluppo di un'ingegneria della sicurezza informatica, dove il termine “ingegneria” va inteso nel suo senso tradizionale di scienza applicata, con definizione formale di concetti, metodi e tecniche conosciute, esplorate da una ampia letteratura scientifica, e globalmente diffuse. Per capire che cos'è la sicurezza informatica è necessario prima di tutto conoscere in modo chiaro la differenza ed il rapporto che esiste tra dati ed informazioni, ovvero i due elementi centrali attorno a cui la sicurezza informatica nasce ed acquista significato: i dati rappresentano le informazioni, mentre le informazioni sono la conoscenza contenuta nei dati. Le informazioni sono la base su cui viene Pagina 12 condotta l'attività economica, cioè sono politicamente, commercialmente e personalmente sensibili per lo sviluppo aziendale. Per questi motivi le informazioni sono un bene di grande valore per l'azienda e devono essere protette adeguatamente. La “Sicurezza” è tutto ciò che riguarda la protezione dei beni aziendali e quindi la sicurezza informatica (o dell'informazione) è il ramo della Sicurezza focalizzato sulla protezione di questo particolare tipo di bene. Questa definizione implica che l'azienda conosca con precisione tutti i propri beni ed il loro valore, ma l'esperienza insegna che nella complessità di una realtà aziendale in molti casi non è così. Questa osservazione generale è assolutamente vera anche per la sicurezza informatica, ecco perché l'analisi dei rischi è parte integrante e necessaria della strategia di sviluppo della sicurezza informatica e non. Per quanto le tecniche fino ad oggi elaborate possano offrire alti standard di sicurezza, queste non sono infallibili e soprattutto non possono uscire dai confini del sistema stesso. Per questo motivo il concetto di “sicurezza dell’informazione” deve essere esteso ben oltre l’informatica in senso ristretto, ovvero l’hardware, il software e le reti di computer, andando a interessarsi dell’intero processo di gestione dei dati e delle informazioni messo in atto da un’organizzazione. Rientrano quindi a pieno titolo nell’ingegneria della sicurezza anche considerazioni di sicurezza ambientale, gestione dell’informazione non digitale, procedure nella gestione delle risorse umane, eccetera. In effetti, i filtri della sicurezza dell’informazione operano come un’interfaccia tra le persone ed i processi del sistema e devono gestire entrambe le variabili. Come si può immaginare, si tratta di un processo complesso, costoso ed esposto a sviste anche gravi. Alla luce dei concetti esaminati possiamo dunque definire la sicurezza informatica come il connubio di prevenzione e individuazione di azioni non autorizzate verso il sistema informatico. Gli obiettivi di prevenzione ed autorizzazione si concretizzano nelle “Politiche di sicurezza” e nei “Meccanismi di sicurezza”, ovvero un insieme di regole e procedure che sanciscono a tutti i livelli quali azioni sono permesse e quali proibite. Pagina 13 1.2 Le proprietà della sicurezza dell’informazione Sia nella letteratura accademica che nella pratica gli obiettivi della sicurezza dell'informazione sono normalmente descritti in termini di autenticazione, controllo degli accessi (o autorizzazione), confidenzialità (privacy e segretezza), integrità, responsabilità, non ripudio e disponibilità. I paragrafi seguenti forniscono una panoramica di ognuna delle proprietà appena elencate. 1.2.1 Autenticazione L’autenticazione è il processo che permette di determinare con certezza l’identità di un utente del sistema. Ovviamente questo processo può essere più o meno sicuro e di conseguenza la probabilità di autenticare correttamente un utente può essere più o meno alta a seconda delle differenti implementazioni del sistema. Generalmente un soggetto che desidera autenticarsi deve provare di conoscere un certo dato oppure deve possedere un determinato “oggetto”. Il sistema deve essere in grado di riconoscere queste informazioni come valide ed utilizzarle per identificare in modo univoco l’utente. Va infine sottolineato il fatto che, anche se fino ad ora si è sempre parlato di “utente”, non è detto che questo sia necessariamente una persona, come la parola lascia intendere. Infatti a seconda del contesto in cui ci si trova ad operare è possibile autenticare ad esempio un applicativo, un calcolatore, un nodo di rete, un pacchetto IP ed altre numerose e disparate tipologie di entità. 1.2.2 Controllo degli accessi / Autorizzazione Il controllo degli accessi è il processo che permette di definire e controllare i diritti e i privilegi di accesso alle risorse e ai servizi del sistema. Questo processo necessita ovviamente di una qualche forma di autenticazione per poter funzionare, in quanto assume che l’identità dell’utente sia già stata verificata a monte. Quello che è necessario fare nell’ambito del controllo d’accesso è Pagina 14 verificare se un soggetto ha o meno i permessi per accedere a certi dati del sistema e/o compiere determinate operazioni su di essi. Questo è proprio il tema centrale della presente trattazione, se ne parlerà quindi ampiamente nei capitoli successivi. 1.2.3 Confidenzialità (privacy e segretezza) La confidenzialità è la proprietà che permette di garantire che l’accesso alle risorse e ai servizi del sistema sia permesso solo alle entità autorizzate. Questa definizione in realtà può essere mal interpretata e può far pensare che la confidenzialità ed il controllo d’accesso siano in pratica la stessa cosa. In realtà, mentre lo scopo del processo di autorizzazione è quello di bloccare l'accesso a risorse e servizi del sistema da parte di utenti non autorizzati, in questo caso il fine principale è quello di non permettere agli utenti non autorizzati di venire a conoscenza dell'esistenza di queste informazioni sensibili. I termini "privacy" e "segretezza" sono a volte utilizzati per distinguere tra la protezione dei dati personali degli utenti (privacy) e la protezione dei dati appartenenti all'organizzazione (segretezza). La confidenzialità è un concetto molto ben definito e la ricerca nel campo della sicurezza informatica si è spesso concentrata su questo punto, tanto che alle volte i termini confidenzialità e sicurezza sono stati perfino utilizzati come sinonimi. 1.2.4 Integrità L’integrità consiste nel di garantire che non vengano eseguite modifiche non autorizzate ai dati protetti contenuti nel sistema. In altri termini l’integrità si può definire come la capacità di un sistema di rendere possibile la modifica di risorse e dati solo a persone autorizzate, e anche a queste solo in modo autorizzato onde garantire la consistenza di questi dati con le funzioni gestite dal sistema. Secondo Clark e Wilson [7] l'integrità c'e' quando: "nessun utente del sistema, anche se autorizzato, è in grado di modificare dati, altrimenti i beni (le informazioni) dell'azienda andrebbero persi o corrotti." Pagina 15 Un'altra prestigiosa definizione di integrità dei dati si può trovare nell'Orange Book [1]: "Integrità è quando i dati informatici sono identici ai dati dei documenti originali da cui sono stati estratti, e non sono esposti ad accidentali o maliziose alterazioni o distruzioni". In questo caso l'integrità è sinonimo di robustezza verso l'esterno. I dati raccolti in un sistema informatico dovrebbero riflettere esattamente delle realtà esistenti al di fuori del sistema informatico. Tuttavia è impossibile garantire questa proprietà unicamente attraverso meccanismi interni al sistema informatico. Per aggiungere maggiore confusione, alcune aree della sicurezza informatica hanno adottato la loro propria nozione di integrità; per esempio la sicurezza della comunicazione la definisce come: la rilevazione e correzione delle modifiche, imputazioni, cancellazioni o riproduzioni dei dati trasmessi, comprendendo manipolazioni e casuali errori di trasmissione. Si può osservare come, partendo da questa posizione, la presenza (o assenza) di una struttura di autorizzazione non incida sulla natura del problema da risolvere, né sui rispettivi meccanismi di sicurezza. Come si può notare dalle definizioni appena riportate, è' abbastanza difficoltoso dare una caratterizzazione precisa di integrità. In generale il termine integrità vuol dire assicurarsi che tutto sia come deve essere. Restringendo il campo nei confini della sicurezza informatica, quello che si deve fare in pratica è prevenire "scritture" non autorizzate. L’integrità risiede dunque nell’"essere autorizzati a fare ciò che stiamo facendo" e nel "seguire le corrette procedure". Di fatto l'Integrità è spesso un prerequisito per altre proprietà della Sicurezza. Per esempio un attaccante potrebbe cercare di aggirare i controlli per la confidenzialità modificando il sistema operativo o la tavola di controllo degli accessi referenziata dal sistema operativo. Quindi aver protetto l'integrità del sistema operativo o della tavola di controllo accessi permette ad esempio la confidenzialità. 1.2.5 Responsabilità & Non ripudio La responsabilità è la proprietà che permette di ricollegare ogni singola azione sull’informazione contenuta nel sistema al soggetto che l’ha compiuta. Pagina 16 È possibile trovare questo requisito, particolarmente importante nel mondo del commercio elettronico, in un documento storico come l'Orange Book: "Responsabilità significa controllare le informazioni in modo selettivo e protetto, così che azioni che influenzano la sicurezza possano essere ricollegate al diretto responsabile". Per essere in grado di soddisfare questo requisito il sistema deve prima di tutto identificare ed autenticare l'utente, ma oltre a questo deve mantenere una "traccia di verifica" degli eventi rilevanti per la sicurezza. Infatti se si verificasse una violazione della sicurezza, le informazioni raccolte nella traccia di verifica devono permettere di identificare il colpevole ed i passi che quest’ultimo ha compiuto per compromettere il sistema. A questo punto entra in gioco la proprietà del non ripudio, che assicura l’impossibilità da parte di chi ha prodotto dei dati di negare della creazione di questi ultimi. Si può dunque affermare che la responsabilità implica il non ripudio, in quanto non è possibile identificare un utente come origine di un’azione dannosa per la sicurezza del sistema, se non si può provare con certezza la sua colpevolezza. 1.2.6 Disponibilità Secondo la definizione del CTCPEC (Canadian Trusted Computer Product Evaluation Criteria) [91] la disponibilità è "la proprietà secondo cui le informazioni sono sempre accessibili senza eccessivi ritardi quando necessario". Le definizione ISO (International Organization for Standardization) [92] è quasi identica: è la proprietà delle informazioni di essere accessibili ed utilizzabili a richiesta di un ente autorizzato. Nel contesto della sicurezza si vuole dunque assicurare che la prevenzione nei confronti degli attaccanti non impedisca agli utenti legittimi di avere un accesso ragionevole ai loro sistemi. Questo per prevenire disturbi del servizio. Allargando in questo campo la definizione ISO, la prevenzione diventa finalizzata a rendere sempre disponibile l'accesso autorizzato alle risorse senza comportare dei ritardi nelle operazioni time-critical. Infatti sono abbastanza frequenti attacchi che paralizzano un server per sovraccarico di richieste di connessione "bloccando" la Pagina 17 disponibilità delle informazioni, con gravi conseguenza per le realtà in cui la disponibilità è l'aspetto principale della sicurezza informatica. Va infine sottolineato il fatto che la disponibilità è in qualche modo un obiettivo in conflitto con i precedenti, in quanto impone che il sistema non solo debba garantire l’accesso soltanto agli utenti autorizzati, ma che allo stesso tempo non possa mai negare l'autorizzazione per un accesso corretto. Inoltre, l'accesso deve essere consentito tempestivamente, dove la definizione esatta di “tempestivamente” dipende dal dominio del problema. Esiste in letteratura il concetto di Maximum Waiting Time proprio introdotto a questo proposito. È necessario prestare dunque attenzione ai casi in cui una sicurezza troppo "stretta" rischia di generare di per sé stessa disturbi/ritardi del servizio. Spesso vengono utilizzati i termini “exposure” per indicare il fallimento nella condizione di confidenzialità, “compromise” per il fallimento nella relazione di integrità, e “denial of service” per la mancanza di disponibilità. 1.3 Politiche, modelli e meccanismi Come già anticipato il progetto relativo alla tesi si inserisce nell’ambito del controllo d’accesso. Quando si prende in considerazione un qualsiasi sistema di controllo d’accesso, bisogna tenere presente tre aspetti differenti: 1. la politica di controllo d’accesso 2. il modello di controllo d’accesso 3. il meccanismo di controllo d’accesso La politica (o “policy”) non è altro che un insieme di requisiti, che specificano come dev’essere gestito l’accesso alle informazioni, ovvero chi e in quali circostanze può fare che cosa su di esse. Le politiche di controllo d’accesso sono molto varie e cambiano anche in modo netto da un’applicazione all’altra. Inoltre sono dinamiche per natura, poiché cambiano nel tempo per riflettere l’evoluzione dei diversi fattori economici, legali e sociali, che influenzano le organizzazioni alle quali si devono applicare. Ad ogni modo, poiché le politiche non possono essere determinate con esattezza in anticipo, i sistemi di controllo d’accesso devono essere progettati per poter essere configurati e personalizzati, in modo da Pagina 18 essere abbastanza flessibili per potersi adattare ad una grande varietà di politiche di accesso. Per rendere operative le direttive di una politica è necessario definire dei meccanismi di controllo d’accesso, che traducano in atto i requisiti specificati da queste ultime. Vi sono numerosi meccanismi di controllo d’accesso, ognuno dei quali comporta dei vantaggi e degli svantaggi in termini di flessibilità e capacità di adattarsi certe tipologie di politiche. In generale un meccanismo richiede che vi siano degli attributi di controllo d’accesso per utenti e risorse, come ad esempio degli identificatori, delle etichette o più in generale dei metadati. Questi elementi vengono utilizzati dalla logica di controllo per verificare se un utente ha o meno il diritto di compiere una certa operazione su un oggetto protetto del sistema. Ovviamente, affinché ciò avvenga, devono essere state specificate a priori delle regole che il meccanismo va a verificare ogni volta che è necessario. Le modalità con cui questo insieme di regole si può definire, modificare e controllare sono un fattore discriminante per valutare la flessibilità e l’efficacia di un meccanismo di controllo d’accesso. Per analizzare un sistema di controllo d’accesso e per valutarne la caratteristiche è tuttavia preferibile ragionare su qualcosa di più astratto e concettuale di un meccanismo. A questo scopo viene definito un modello di controllo d’accesso. Generalmente i modelli vengono descritti in modo da prevedere numerose scelte implementative, fornendo un framework concettuale sul quale ragionare per capire quali requisiti delle politiche di controllo d’accesso essi possono supportare. I modelli sono di interesse sia per gli utenti finali, che per i produttori di software, in quanto facilitano la comunicazione fra questi ultimi essendo una sorta di linguaggio intermedio comprensibile da entrambi. Sono quindi un ponte tra il livello di astrazione delle politiche e quello dei meccanismi di controllo d’accesso. Gli utenti vedono i modelli come un modo non ambiguo di definire i requisiti di controllo d’accesso, mentre i produttori di software li utilizzano come specifiche di design ed implementazione. Pagina 19 1.4 Gli obiettivi della tesi Nei paragrafi precedenti si è cercato di fornire una panoramica delle diverse problematiche che comporta la gestione di un qualunque sistema informatico dal punto di vista della sicurezza. Quello che si voleva mettere in luce è la grande complessità della materia, che oltre ad abbracciare una vasta gamma di argomenti, non è ancora formalmente consolidata in molte sue aree. La continua evoluzione tecnologica e la proposta incalzante di modelli teorici sempre più articolati rendono il lavoro certamente più interessante, ma allo stesso tempo lo complicano notevolmente. I contributi maggiori per la sicurezza informatica si sono avuti finora dalla crittografia, una scienza che ha una storia alle spalle e che quindi ha avuto il tempo di consolidarsi negli anni, anche se non bisogna dimenticare che gli studi in materia sono ancora molto produttivi ed hanno ricevuto un grande impulso proprio negli ultimi tempi. Purtroppo la crittografia non viene in aiuto quando si parla di controllo d’accesso, in quanto si applica solamente ad alcune delle proprietà descritte nei paragrafi precedenti, quali l’autenticazione, l’integrità, la confidenzialità e il non ripudio. Il problema dell’autorizzazione è stato forse quello più trascurato, anche se ovviamente non sono mancati studi in questo campo. Tuttavia negli ultimi anni c’è stata un’inversione di tendenza e un’attenzione sempre maggiore si è concentrata sul controllo d’accesso. Il motivo principale è da ricercarsi nelle dimensioni sempre crescenti dei sistemi informatici soprattutto in ambito civile, commerciale ed industriale, che ha evidenziato come le tecniche finora implementate non fossero del tutto adeguate per la gestione di questi tipi di applicazioni. A questo si aggiunge l’introduzione di normative volte alla tutela della riservatezza dei dati e della privacy degli utenti, che le aziende si trovano a dover rispettare in tempi molto brevi. Per tutti questi motivi la perdita di risorse, espressa in ore uomo, per la gestione e l’amministrazione dei sistemi informatici si è fatta sempre maggiore e la necessità di studiare nuove tecniche per migliorare la situazione si è fatta più pressante rispetto al passato, essendo ora spinta anche da esigenze economiche. Pagina 20 Si arriva dunque all’argomento centrale della tesi, ovvero al controllo d’accesso basato su ruoli, l’RBAC (Role Based Access Control). Questo modello è stato proposto per la prima volta agli inizi degli anni Novanta per venire incontro alle esigenze delle organizzazioni commerciali e governative. Nel decennio scorso però non ebbe un grande successo e gli studi sull’argomento non vennero seguiti con l’attenzione che meritavano. Soltanto negli ultimi anni l’interesse su questa tecnologia è cresciuto notevolmente e numerosi ricercatori stanno dando il loro contributo per migliorarla sempre più e portarla ad uno stadio maturo e consolidato. Come si sarà certamente capito si è ancora lontani dalla definizione di uno standard RBAC general-purpose e la presente trattazione si pone come primo obiettivo quello di fornire un modello RBAC il più aggiornato possibile, elaborando una sintesi degli studi attualmente in corso sulla materia. In secondo luogo si vuole fornire un’implementazione del modello affinché si possa utilizzare in un application server J2EE (Java 2 Enterprise Edition) il controllo d’accesso basato su ruoli. Gli obiettivi del presente lavoro possono essere definiti in modo più dettagiato come segue: • Studiare un modello di controllo d’accesso basato su ruoli generalpurpose, che inglobi tutte le caratteristiche dei modelli più recentemente sviluppati; • Proiettare il modello elaborato su un insieme di interfacce organizzate ordinatamente in diversi packages (in linguaggio Java); • Fornire un’implementazione in linguaggio Java del modello per un application server J2EE (Java 2 Enterprise Edition); • Sviluppare una piccola applicazione di prova per testare il funzionamento del sistema. 1.5 Il piano di lavoro Il piano di lavoro da seguire per portare a termine il progetto illustrato nel paragrafo precedente prevede innanzitutto uno studio approfondito sia dei modelli di controllo d’accesso tradizionali, sia di quelli relativi al tema centrale della tesi, Pagina 21 ovvero all’RBAC. Si cercherà di porre l’attenzione sull’evoluzione temporale dei diversi modelli, mettendone in luce le novità, i pregi ed i difetti. Terminata questa fase si procederà ad un’analisi critica del modello RBAC così com’è stato elaborato nella sua ultima versione, illustrandone gli aspetti ancora critici e passando in rassegna gli ultimi sviluppi nei diversi settori di ricerca. Alla luce degli studi effettuati, sarà infine possibile proporre un proprio modello generalpurpose di controllo d’accesso basato su ruoli. A questo punto si potrà passare all’implementazione e al testing dello standard RBAC definito, in modo da poterne valutare l’efficacia. La tabella seguente mostra nel dettaglio le diverse attività del piano di lavoro e fornisce un’indicazione percentuale del carico di lavoro assegnato a ciascuna di esse. Attività Carico di lavoro (%) Studio ed analisi dei sistemi di controllo d’accesso tradizionale Studio ed analisi dei modelli di controllo d’accesso basato su ruoli proposti in passato. Analisi critica dello standard RBAC 5 20 20 Definizione a seguito degli studi effettuati di un proprio standard RBAC general-purpose 20 Studio delle tecnologie J2EE 10 Implementazione del modello adottato 20 Sviluppo di un’applicazione di testing 5 TOTALE 100 Tabella 1-1. Piano di lavoro Pagina 22 CAPITOLO 2 IL CONTROLLO D’ACCESSO TRADIZIONALE Questo capitolo ha lo scopo di introdurre al controllo d’accesso. Innanzitutto viene definito un background terminologico di base, al fine di poter descrivere con proprietà di linguaggio un modello di controllo d’accesso. In secondo luogo vengono illustrati i principi fondamentali, che stanno alla base di questa disciplina. Infine viene presentata un breve storia del controllo d’accesso, in modo da poter apprezzare l’evoluzione tecnologica che ha portato alla definizione del controllo d’accesso basato su ruoli, ovvero l’argomento centrale della presente trattazione. Pagina 23 2.1 Il controllo d’accesso Prima di entrare nel dettaglio delle tecniche del controllo d’accesso è bene ricordare le seguenti definizioni: • L’accesso è la capacità di agire su una risorsa, come ad esempio leggerla, modificarla, eliminarla o rinominarla. • Il controllo d’accesso è il modo attraverso il quale questa capacità viene regolata. In particolare definisce i meccanismi che permettono di dare e revocare diverse tipologie di permessi e di vietare o consentire l’accesso ad una risorsa in base ai permessi precedentemente assegnati. • Un modello di controllo d’accesso è una rappresentazione astratta sia degli elementi del sistema, sia di quelli relativi alla sicurezza, ovvero di tutti quei dati che sono rilevanti per il trattamento delle informazioni classificate e memorizzate nel sistema stesso. Un modello deve dunque cercare di catturare le caratteristiche ed i comportamenti del sistema di controllo e fornirne un rappresentazione logica I paragrafi seguenti forniscono una definizione dell’ontologia di base e dei principi fondamentali del controllo d’accesso. 2.1.1 L’ontologia di base Nel corso degli anni si è sviluppata una terminologia abbastanza consolidata per descrivere i diversi elementi, che vanno a comporre un modello di controllo d’accesso. La quasi totalità dei modelli di controllo d’accesso finora sviluppati si basa sulle nozioni di utenti (users) soggetti (subjects), oggetti, (objects), operazioni (operations) e permessi (permissions) e sulle relazioni che intercorrono tra esse. Vengono dunque riportate le definizioni relative a ciascuno degli elementi appena citati: • Un utente è una persona che accede al sistema. In molte architetture un utente può effettuare login multipli, anche con identificativi differenti. • Una sessione è una singola istanza di interazione tra un utente ed il sistema Pagina 24 • Un soggetto è un processo che interagisce con il sistema per conto di un utente, come se fosse quest’ultimo. Un utente può quindi avere più soggetti in esecuzione, anche se ha effettuato un solo login. Ad esempio un client per la posta elettronica può interagire in background con il sistema, mentre l’utente naviga utilizzando un browser. Ogni programma aperto dall’utente per il sistema è un soggetto differente. • Un oggetto è una qualsiasi risorsa del sistema accessibile da parte degli utenti. Ad esempio sono oggetti i files, le periferiche, i database, ma lo possono essere anche i singoli record contenuti in questi ultimi, dipende dalla grana che si vuole utilizzare e della specifica applicazione. Gli oggetti sono tradizionalmente considerati come delle entità passive, che contengono e ricevono informazione, ma alcuni modelli di controllo d’accesso permettono di trattare come oggetti anche programmi, stampanti ed altre entità attive. • Un’operazione è un processo invocato da un soggetto. • Un permesso (o privilegio) è un’autorizzazione ad attivare una certa azione sul sistema. Volendo fare un’analisi più dettagliata è necessario sottolineare il fatto che in realtà un permesso non è altro che una combinazione tra un oggetto ed una operazione. Infatti una stessa operazione applicata a due oggetti differenti rappresenta due permessi distinti. Allo stesso modo due differenti operazioni applicate allo stesso oggetto necessitano di due permessi differenti. 2.2 I principi fondamentali Un modello di controllo d’accesso ben strutturato deve ovviamente facilitare il compito dell’amministratore di sistema, rispecchiando il più possibile la realtà organizzativa che questi deve gestire e permettendogli di specificare in tempi ragionevolmente rapidi vincoli e permessi. Inoltre, un buon modello deve anche fornire supporto e nel caso migliore anche guidare al rispetto dei principi fondamentali del controllo d’accesso: - il minimo privilegio (least privilege) - la separazione dei compiti (separation of duty) Pagina 25 I prossimi paragrafi ne forniscono una descrizione dettagliata. 2.2.1 Il minimo privilegio (Least privilege) Il principio del minimo privilegio afferma che si devono assegnare ad ogni utente solamente i permessi strettamente necessari per lo svolgimento dei suoi compiti all’interno dell’organizzazione. Si tratta dunque di una pratica amministrativa consolidatasi negli anni, che consiste nell’assegnare in modo selettivo i permessi agli utenti, in modo da evitare che un singolo individuo possa avere la possibilità di compiere azioni non necessarie per il proprio lavoro e al contempo potenzialmente dannose per il sistema. Per rispettare le indicazioni fornite da questo principio fondamentale per la sicurezza dell’informazione è necessario innanzitutto individuare correttamente quali sono i compiti che ogni individuo deve svolgere; in secondo luogo si deve procedere all’assegnazione dei soli permessi ritenuti necessari in base allo studio appena effettuato. Ovviamente questo è un compito tutt’altro che facile ed è necessaria una notevole esperienza per configurare correttamente un sistema. La stretta aderenza al principio del minimo privilegio vorrebbe anche che uno stesso individuo avesse differenti livelli di privilegi in istanti diversi, a seconda della compito che sta svolgendo. È inoltre altrettanto importante che i permessi assegnati ad un utente non persistano al di là del tempo durante il quale sono necessari per lo svolgimento del suo lavoro. Ovviamente una gestione dinamica dei privilegi aggiunge ulteriore complessità al sistema e lavoro aggiuntivo per l’amministratore, tuttavia garantire permessi maggiori rispetto a quelli strettamente necessari può causare problemi di sicurezza sia all’integrità dei dati, che alla loro confidenzialità. Per questi motivi non è possibile prescindere da questo principio fondamentale. 2.2.2 La separazione dei compiti (Separation of duty) Il principio della separazione dei compiti viene applicato da tempo in sistemi commerciali, industriali e governativi e la sua utilità per la sicurezza dell’informazione è stata ampiamente riconosciuta e dimostrata. Lo scopo è quello Pagina 26 di evitare che all’interno di un’organizzazione un’unica persona possa recare danno a quest’ultima perseguendo i sui interessi personali. Si vuole fare in modo che l’unica evenienza in cui ciò possa accadere sia in corrispondenza di una collusione tra diversi individui. Il principio dunque afferma che non si devono assegnare ad una stessa persona i permessi per svolgere compiti che potrebbero recare danno all’intera organizzazione. Si può affermare che questo principio non è altro che un deterrente alla frode, in quanto essa può avvenire solamente nei casi in cui esiste un’opportunità di collusione tra le capacità operative di figure con diverse competenze. Per rendere meglio l’idea si può affermare che un particolare set di transazioni non deve poter essere eseguito da un solo individuo, ma deve essere suddiviso su almeno due persone distinte. La separazione dei compiti permette quindi di definire politiche di controllo d’accesso nelle quali sono presenti conflitti d’interesse. Un conflitto d’interesse può sorgere ogni volta che un utente cerca di ottenere diversi permessi associati a ruoli che non possono però essere ricoperti da uno stesso soggetto per motivi di sicurezza. Vi sono due tipi di separazione dei compiti, quella statica e quella dinamica. Nel primo caso è semplicemente necessario assegnare a priori ad ogni individuo un insieme di permessi, in modo da rispettare i vincoli imposti dal principio di separation of duty. Il secondo tipo è invece più complesso, in quanto la verifica di queste regole non è fatta a priori, bensì durante tutto l’arco di funzionamento del sistema. Il vantaggio è ovviamente quello di introdurre una maggiore flessibilità, che in certi casi applicativi può essere auspicabile se non indispensabile. 2.3 Breve storia del controllo d’accesso tradizionale La storia del controllo d’accesso è piuttosto recente e può essere fatta risalire attorno agli inizi degli anni Settanta. A quei tempi infatti iniziavano a diffondersi i primi grandi sistemi di condivisione dati per applicazioni governative, Pagina 27 commerciali e militari, che avevano la necessità di garantire la sicurezza delle informazioni da esse gestite. I prossimi paragrafi presentano in ordine cronologico i modelli di controllo d’accesso più significativi, che sono stati proposti nel corso degli anni. 2.3.1 Matrice di controllo Il primo lavoro che ha prodotto una definizione matematica formale di controllo d’accesso è stato quello di Lampson [2] nel 1969, che ha introdotto i concetti di soggetto ed oggetto e ha proposto l’utilizzo di una matrice di controllo d’accesso per filtrare le richieste dei diversi soggetti, in modo da proteggere gli oggetti del sistema dagli accessi indesiderati. La matrice non è altro che una rappresentazione concettuale dei permessi legati a tutte le possibili coppie < x,y > dove x è un soggetto ed y e un oggetto del sistema. La tabella seguente mostra un esempio tratto dal testo originale di Lampson. General ledger Alice Payroll R,W Bob R,W Charles R Accounts receivable Accounts payable R R R R R R Tabella 2-1. Esempio di matrice di controllo d'accesso di Lampson I diritti di accesso previsti erano semplicemente la scrittura e la lettura, rispettivamente W ed R., mentre le caselle vuote stavano ad indicare l’assenza di entrambi i permessi. Il sistema doveva semplicemente controllare se un certo utente aveva o meno il permesso di leggere o scrivere su un determinato oggetto, andando a consultare il campo opportuno della tabella, e consentire o meno l’operazione richiesta. Pagina 28 2.3.2 Reference monitor e security kernel Nel 1972 con l’Anderson Report [4] sono stati stato introdotti due importanti concetti per la sicurezza informatica, che ancora oggi non hanno perso il loro valore e sono utilizzati come linea guida per il design e l’implementazione dei sistemi di controllo d’accesso: il reference monitor ed il security kernel. Il reference monitor può essere visto sotto due ottiche differenti, ma complementari: • In primo luogo fornisce un modello astratto delle proprietà che deve avere un meccanismo di controllo d’accesso altamente affidabile. • In secondo luogo può essere utilizzato come linea guida nel design, nello sviluppo e nell’analisi delle applicazioni che forniscono servizi di sicurezza. La figura seguente riporta uno schema che illustra l’architettura di un reference monitor. Figura 2-1. Il reference monitor Pagina 29 Il reference monitor non è altro che un concetto astratto, secondo il quale tutti gli accessi che un soggetto fa verso gli oggetti del sistema sono autorizzati utilizzando l’informazione contenuta in una base di controllo d’accesso (access control base). È previsto inoltre un altro repository di informazioni (audit file) relativo alla memorizzazione della storia degli accessi effettuati. Essendo un’astrazione il reference monitor non detta una politica di controllo d’accesso particolare e non definisce alcun aspetto implementativo. Si preoccupa invece di fornire tre requisiti fondamentali che devono essere rispettati: 1. completezza 2. isolamento 3. verificabilità Il principio della completezza richiede che un soggetto possa accedere ad un oggetto solamente passando attraverso il reference monitor. Il principio dell’isolamento afferma invece che la funzione di filtraggio degli accessi del reference monitor deve essere impenetrabile, ovvero non deve essere possibile ad un attaccante di inserirsi nel meccanismo di controllo degli accessi e modificarlo in qualsiasi modo. L’implementazione di un security kernel può essere un modo per soddisfare questo requisito. Il security kernel non è altro che un’implementazione minima delle funzioni di sistema rilevanti dal punto di vista della sicurezza. La figura seguente mostra l’architettura di un security kernel. Figura 2-2. Il security kernel Pagina 30 Si può notare come il security kernel sia posizionato appena al di sopra dell’hardware e al di sotto delle funzioni non critiche dal punto di vista della sicurezza, implementate nel sistema operativo. Infine il principio della verificabilità afferma che deve essere possibile provare che l’implementazione soddisfa i due precedenti requisiti. 2.3.3 Il modello di Bell-LaPadula Un report della RAND Corporation [3] del 1970 fornisce un’attenta analisi circa la sicurezza dei sistemi informatici del Dipartimento della Difesa americano. In questo documento viene definito per la prima volta un metodo per implementare un controllo d’accesso multilivello sulle risorse condivise di un sistema. Venivano distinti gli accessi locali da quelli remoti e si supponeva che l’autenticazione avvenisse mediante password. I livelli di accesso proposti erano “confidential”, “secret” e “top-secret”. Ogni utente poteva accedere alle diverse risorse in base al suo grado. Nel 1973 Bell e LaPadula [5], ispirandosi probabilmente al documento appena citato, proposero dunque un nuovo modello di controllo d’accesso multilivello basato su “etichette di sicurezza”. Il modello prevede che ad ogni soggetto e ad ogni oggetto del sistema venga assegnata un’etichetta, che rappresenta il suo livello di sicurezza. Le etichette sono dunque organizzate in modo gerarchico, ad esempio si può avere la seguente classificazione (partendo dal livello più alto fino a quello più basso): top-secret (TS), secret (S), confidential (C), unclassified (U). Definite ed assegnate le etichette, devono essere rispettate le seguenti due proprietà: 1. simple security property: un soggetto può accedere in lettura a tutti gli oggetti che hanno un livello di sicurezza non superiore a quello assegnatogli. 2. *(star) property: un soggetto può accedere in scrittura solamente agli oggetti che hanno un livello di sicurezza non inferiore a quello assegnatogli. Pagina 31 Un’ultima considerazione va fatta in merito alla differenza che il sistema fa tra utenti e soggetti. Infatti un utente assegnato ad esempio al livello TS, può potenzialmente leggere e scrivere tutti gli oggetti del sistema. Quando però l’utente accede al sistema, diventa un soggetto e come tale deve sottostare alle due proprietà appena illustrate. La figura seguente mostra i privilegi di accesso in scrittura (w) e in lettura (r) di un utente ed un soggetto di livello TS. Figura 2-3. Utente VS Soggetto Se un soggetto di livello TS volesse ad esempio scrivere un oggetto di livello S o C, dovrebbe dunque cambiare il livello della propria sessione degradandolo quanto è necessario. 2.3.4 Modello d’integrità di Biba Anche se il modello di Bell-LaPadula controlla le scritture dell’informazione contenuta negli oggetti del sistema, in realtà quello che offre è un servizio di confidenzialità in termini di protezione dalle letture non autorizzate. Infatti, utilizzando questo modello, non vi è alcun modo di prevenire modifiche non autorizzate delle informazioni. Per questa ragione nel 1977 Biba [36] propose un nuovo modello di controllo d’accesso complementare a quello di Bell-LaPadula, in cui lo scopo primario era quello di preservare l’integrità dei dati, sacrificando la loro confidenzialità. Pagina 32 Ad ogni soggetto e oggetto del sistema, analogamente a quanto accadeva per il modello di Bell-LaPadula, dovevano essere assegnate delle etichette, che rappresentavano un certo livello di integrità. Soddisfatto questo prerequisito, dovevano essere rispettate le seguenti proprietà, simmetriche rispetto alle precedenti: 1. simple integrity property: un soggetto può accedere in lettura a tutti gli oggetti che hanno un livello di sicurezza non inferiore a quello assegnatogli. 2. integrity *(star) property: un soggetto può accedere in scrittura solamente agli oggetti che hanno un livello di sicurezza non superiore a quello assegnatogli. In questo modo le scritture provenienti dai livelli inferiori non sono più autorizzate, così come le letture dai livelli superiori a quelli inferiori. 2.3.5 TCSEC: il MAC e il DAC Nel 1985 il DoD (Department of Defense) americano rese pubblico un documento, il TCSEC [1] (Trusted Computer Systems Evaluation Criteria), che definiva due differenti modelli di controllo d’accesso, il MAC (Mandatory Access Control) e il DAC (Discretionary Access Control). Il primo era stato progettato allo scopo di adattarsi meglio alle esigenze militari, mentre il secondo era stato pensato per applicazioni commerciali e governative. I paragrafi seguenti forniscono una breve descrizione di entrambi i modelli. 2.3.5.1 DAC (Discretionary Access Control) Il DAC è un meccanismo che consente ad un utente di permettere o vietare ad altri utenti l’accesso agli oggetti di sua proprietà. Il controllo è “discrezionale” nel senso che un utente che possiede un determinato permesso di accesso su un oggetto ha la possibilità di trasmettere questo permesso ad un altro utente. In alcuni casi il proprietario di un oggetto può decidere di trasmettere tutti o alcuni dei suoi privilegi d’accesso ad altri utenti, senza però dare loro il permesso di estendere questi ultimi ad altri utenti. Pagina 33 Non è dunque necessario l’intervento dell’amministratore di sistema nel processo di assegnazione e revoca dei permessi. Ad ogni modo l’amministratore è colui che possiede tutti gli oggetti del sistema e può violare a piacimento le diverse restrizioni d’accesso. I sistemi DAC sono quelli a cui siamo più abituati: i meccanismi dei permessi UNIX e le ACL di Windows sono sistemi DAC. 2.3.5.2 MAC (Mandatory Access Control) Il MAC deriva direttamente dal modello di Bell-LaPadula ed è un meccanismo per restringere l’accesso agli oggetti di un sistema basato sulla sensibilità dell’informazione in essi contenuta e sull’autorizzazione esplicita degli utenti ad accedere alle informazioni appartenenti ad un preciso livello di sensibilità. In un sistema MAC gli oggetti hanno dunque un loro livello di segretezza e gli utenti hanno un loro livello di accesso. Esiste inoltre una figura che nei sistemi DAC non è prevista, il “security officer”, che è l’unico a poter gestire e modificare i livelli d’accesso. Le regole d’accesso che vengono generalmente usate sono le seguenti: 1. No read up: l’utente non può leggere informazioni con un livello d’accesso superiore al suo. 2. No write down: l’utente non può scrivere informazioni con un livello d’accesso inferiore al suo. Un’altra versione ugualmente espressiva delle regole imposte da un modello MAC è invece la seguente: 1. Security Rule: un utente non può leggere informazioni il cui livello d’accesso più elevato del suo 2. Minus Property: un utente non può spostare informazioni da un livello di sicurezza ad un livello di sicurezza più basso, ma può spostarle solamente ad un livello più alto. Quest’ultima proprietà implica ovviamente la proprietà di “no write down”, mentre la prima è identica alla “no read up”. Pagina 34 2.3.6 Modello di Clark e Wilson Nel 1987 Clark e Wilson [7] pubblicarono un documento in cui si criticava il modello DAC proposto dal DoD per le applicazioni commerciali, portando come motivazione principale il fatto che l’attenzione maggiore in questo ambito deve essere rivolta all’integrità dell’informazione. Proposero dunque un nuovo modello di controllo d’accesso, che aveva come obiettivo principale quello di garantire che gli oggetti del sistema fossero modificati solamente da personale autorizzato. Il modello di Clark e Wilson si basa su due principi fondamentali: 1. le transazioni ben formate 2. la separazione dei compiti Le transazioni ben formate assicurano che i dati modificati da un utente passino da uno stato valido ad un altro stato, anch’esso valido, al termine dell’esecuzione della transazione. L’unità base del controllo d’accesso secondo Clark e Wilson è la tripla <user, operation, object>, ovvero <utente, procedura di trasformazione, oggetto protetto del sistema>, così come si può osservare bella figura seguente. Figura 2-4. Tripla di controllo d’accesso secondo Clark e Wilson Clark e Wilson proposero nove regole per garantire l’integrità dei dati, ma prima di elencarle è necessario dare le seguenti definizioni: • TP (Transformation Procedure): procedura di trasformazione. • CDI (Constrianed Data Item): dato di sistema protetto, la cui integrità deve quindi essere preservata. • UDI (unconstrained Data Item): dato di sistema non protetto, la cui integrità non è assicurata. Pagina 35 • IVP (Integrity Verification Procedure): procedure di verifica dell’integrità dei dati. Le regole definite dal modello sono dunque le seguenti: 1. per ogni CDI deve esistere una IVP che assicuri che il dato è in uno stato consistente; 2. ogni TP che modifica un CDI deve essere certificata, ovvero deve assicurare di modificare il dato lasciandolo in uno stato consistente; 3. un CDI può essere modificato solo da una TP certificata; 4. ogni TP certificata deve fare il log delle modifiche effettuate su un CDI; 5. ogni TP che prende in input un UDI deve essere certificata per assicurare che trasformerà l’UDI in CDI portando l’oggetto in uno stato consistente; 6. solo TP certificate possono modificare gli UDI; 7. un utente può accedere ai CDI solo attraverso TP per le quali è stato autorizzato; 8. ogni utente deve essere autenticato dal sistema prima di eseguire una TP; 9. solo l’amministratore può autorizzare gli utenti ad utilizzare una TP. Le transazioni ben formate mettono in luce il fatto che è non è sufficiente effettuare controlli a livello di letture e scritture gestite da sistema operativo, ma che è necessario spostare l’attenzione sul livello applicativo, assicurandosi che le informazioni siano modificate solo dalle transazioni autorizzate. Per quanto riguarda infine la separazione dei compiti, che è già stata definita in precedenza, si sottolinea il fatto che è la prima volta nella storia del controllo d’accesso che questo importantissimo principio vene enunciato chiaramente e posto alla base di un modello. 2.3.7 Politica del muro cinese e modello di Brewer e Nash Nel 1989 Brewer e Nash [11] identificarono una politica di controllo d’accesso per impedire i conflitti di interesse nell’ambito delle attività di consultazione delle informazioni fra diversi istituti bancari e compagnie assicurative. Si voleva Pagina 36 impedire che una stessa persona potesse accedere alla informazioni riservate di diverse compagnie ed utilizzarla a proprio vantaggio. La politica del muro cinese mira dunque ad evitare il flusso di informazioni che può dare luogo a conflitti di interesse. Le informazioni riservate vengono classificate in categorie di conflitto di interesse, dette COI (Conflict of Interest Category). Ogni compagnia appartiene ad una COI ed ogni COI contiene due o più compagnie. Quello che si deve impedire è dunque che una stessa persona legga informazioni riservate da più compagnie della stessa COI. Valgono le seguenti considerazioni: • Un utente, fino a quando non ha letto alcuna informazione di una COI, può accedere ai dati di qualsiasi compagnia in essa contenuta. • Una volta che un utente ha letto le informazioni di una certa compagnia facente capo ad un determinata COI, non portà più accedere ai dati delle altre compagnie della stessa COI. • Tutti gli utenti possono leggere le informazioni pubbliche di tutte le compagnie. La politica del muro cinese regola dunque le letture dell’informazione. Il modello di Brewer e Nash include questa politica e la estende, andando a vincolare anche le scritture, in modo da preservare anche l’integrità dei dati. Vengono infatti definite due regole, una per le letture ed una per le scritture: 1) Regola di lettura: un soggetto S può accedere in lettura ad un oggetto O solo se vale una delle seguenti due affermazioni: a. O appartiene alla stessa compagnia di altri oggetti precedentemente letti da S. b. O appartiene ad una COI, della quale S non ha ancora letto alcun oggetto. 2) Regola di scrittura: un soggetto S può accedere in scrittura da un oggetto O solo se valgono entrabe le seguenti affermazioni: a. S può leggere O secondo la regola di lettura. b. Nessun altro oggetto può essere letto, se non quelli facenti capo alla stessa compagnia di O. Pagina 37 Quest’ultima regola è stata introdotta per prevenire attacchi di tipo “cavallo di troia”. Si può infine notare il fatto che il modello di Brewer e Nash non fa distinzione tra utente e soggetto e che le politiche di sicurezza sulle letture si applicano non solo alle singole sessioni, ma rimangono valide per tutta la vita dell’utente all’interno del sistema. Pagina 38 CAPITOLO 3 IL MODELLO RBAC ORIGINALE Dopo aver illustrato i principi fondamentali del controllo d’accesso tradizionale ed averne fornito una breve storia, ci si concentra sul tema centrale della tesi, l’RBAC appunto. Nella prima parte di questo capitolo verrà presentato il documento originale che ha dato vita al controllo d’accesso basato su ruoli. Nella seconda parte invece verrà fatto un confronto tra le principali tecniche di controllo d’accesso tradizionali, il MAC e il DAC, e quelle innovative introdotte con l’RBAC. Pagina 39 3.1 Il primo modello RBAC Nel 1992 Ferraiolo e Kuhn [15], due studiosi del NIST (National Institute of Standards and Technology), presentarono uno studio in cui si prospettava un utilizzo differente dei concetti di utenti, operazioni e gruppi. Questi ultimi presero il nome di “ruoli” e venivano usati come intermediari tra i primi e le seconde. Si trattò di fatto del primo modello RBAC proposto nella storia del controllo d’accesso. 3.1.1 Utenti, ruoli ed operazioni Prima di entrare nel dettaglio del funzionamento del primo modello di controllo d’accesso basato su ruoli è opportuno dare una definizione dei termini chiave, che verranno utilizzati da qui in avanti per riferirsi alle entità principali che lo vanno a comporre. Si tratta di una rivisitazione di parte dell’ontologia di base data per il controllo d’accesso generico. In un modello RBAC si possono individuare i seguenti elementi fondamentali: 1. Un utente è un soggetto (entità fisica) facente parte di un’organizzazione. 2. Un ruolo è un insieme di operazioni che un utente (o un insieme di utenti) può eseguire nel contesto dell’organizzazione di cui fa parte. 3. Una operazione (o transazione) è una procedura, alla quale viene associato un certo set di dati, che viene definito con il termine oggetto. Va notato il fatto che una transazione non è accomunabile a semplici operazioni di lettura o di scrittura, in quanto queste ultime non fanno riferimento a nessun oggetto in particolare. Una transazione ha senso solo se è riferita ad un particolare oggetto. Operazioni uguali fatte su oggetti diversi sono dunque transazioni differenti. Le operazioni sono allocate ai diversi ruoli dall’amministratore di sistema, che si preoccupa anche di assegnare i vari utenti ai diversi ruoli presenti all’interno dell’organizzazione. Allo stesso modo l’amministratore può revocare in qualsiasi momento l’appartenenza (o “membership”) di un utente ad un determinato ruolo e può aggiornare il set di transazioni associate a quest’ultimo. Pagina 40 Infine va sottolineato il fatto che esistono relazioni molti-a-molti tra utenti, ruoli, transazioni ed oggetti del sistema; in particolare: • Ad un utente possono essere assegnati più ruoli • Un ruolo può essere ricoperto da diversi utenti • Ad ogni ruolo possono essere associate diverse operazioni • Una operazione può essere eseguita da diversi ruoli • Una operazione può operare su più oggetti • Un oggetto può essere manipolato per mezzo di diverse operazioni La figura seguente mostra le relazioni molti-a-molti, che sussistono tra utenti, ruoli, operazioni ed oggetti del sistema. Oggetto 1 Appartenenza Operazione 1 Ruolo 1 Oggetto 2 Operazione 2 Operazione 3 Utente 1 Utente 2 Utente 3 Ruolo 2 Figura 3-1. Relazioni tra utenti, ruoli, transazioni ed oggetti di sistema 3.1.2 Gerarchie di ruoli Spesso all’interno di un’organizzazione ci sono delle operazioni, che possono essere svolte da tutti gli utenti. In questo caso sarebbe necessario replicare le stesse transazioni in tutti i ruoli definiti nel sistema. Ovviamente ciò non è auspicabile, in quanto complicherebbe di molto la gestione da parte dell’amministratore, mentre lo scopo di RBAC è quello di semplificarla al massimo, fornendo un modello il più vicino possibile alla realtà organizzativa sulla quale si vuole esercitare il controllo d’accesso alle informazioni. Per venire incontro a questa esigenza si è deciso di rendere possibile un’organizzazione gerarchica dei ruoli, che permette a ruoli più specializzati di ereditare da altri ruoli tutte le loro operazioni. Così facendo si semplifica Pagina 41 notevolmente la gestione delle attività comuni a tutti gli utenti dell’organizzazione. Quello che accade quando un ruolo discende da un altro è mostrato nella figura seguente. RUOLO A (Padre) Set di transazioni d el padre RUOLO B (Figlio) Set di transazioni specifiche del figlio Set di transazioni del figlio Figura 3-2. Gerarchia di ruoli Un esempio di gerarchia tratto dal documento originale di Ferraiolo e Kuhn è mostrato nella figura seguente, in cui vengono mostrate le dipendenze tra le diverse figure professionali presenti all’interno di un ospedale. Pagina 42 Figura 3-3. Esempio di gerarchia tra ruoli 3.1.3 Descrizione formale Per chiarire i concetti espressi nei paragrafi precedenti, si vuole ora dare una semplice descrizione formale del Role-Based Access Control. Per prima cosa si danno le seguenti definizioni: • Subject = insiene dei soggetti • Role = insieme dei ruoli • Tran = insieme delle transazioni (o operazioni) • AR(s: subject) = ruolo attivo del il soggetto s Pagina 43 • RA(s: subject) = insieme dei ruoli autorizzati del soggetto s • TA(r: role) = insisme delle transazioni autorizzate per il ruolo r • Exec(s:subject, t:tran) = esecuzione della transazione t da parte del soggetto s In secondo luogo, per ognuno degli insiemi appena elencati, devono valere le seguenti regole: • Un soggetto può ricoprire un solo ruolo attivo per volta • Un soggetto può essere autorizzato a ricoprire più ruoli • Un ruolo può essere autorizzato ad eseguire più transazioni Le liste dei ruoli autorizzati e della transazioni autorizzate per ogni ruolo vengono gestite dall’amministratore di sistema, che può aggiungere e togliere elementi dagli insiemi RA e TA in qualsiasi momento. Il ruolo attivo del soggetto, invece cambia durante l’esecuzione ed è alla base del meccanismo di controllo d’accesso RBAC. Infatti, ogni volta che un utente tenta di eseguire un’operazione su un oggetto, devono essere verificate le seguenti condizioni: 1. “Role Assignment”: un soggetto può eseguire una transazione solo se ha assegnato un qualche ruolo attivo. ∀s: subject, t: tran exec(s, t) ⇒ AR(s) ≠ ∅ 2. “Role Authorization”: il ruolo attivo del soggetto dev’essere stato autorizzato, ovvero deve comparire nella lista dei ruoli autorizzati ∀s: subjec AR(s) ⊆ RA(s) 3. “Transaction Authorization”: un soggetto può eseguire una transazione solo se quest’ultima fa parte delle transazioni autorizzate per il ruolo attivo che esso ricopre. ∀s: subject, t: tran exec(s, t) ⇒ t ∈ TA (AR(s)) Con le regole appena elencate si è dunque certi che vengono eseguite solamente le transazioni autorizzate. Inoltre va notato il fatto che l’implicazione delle regole 1 e 3 esprime una condizione di tipo “solo se” e non “se e solo se”, quindi non è detto che la transazione venga effettivamente eseguita, anche se valgono le condizioni espresse. Infatti queste ultime non escludono la possibilità di aggiungere ulteriori restrizioni all’esecuzione delle transazioni, dipendenti dal contesto operativo del Pagina 44 sistema. Questa è un’ulteriore prova della grande flessibilità del Role-Based Access Control. 3.1.4 Il principio del minimo privilegio Il principio del minimo privilegio è essenziale per garantire l’integrità dell’informazione ed afferma che ad ogni utente non bisogna dare maggiori privilegi di quelli strettamente necessari ad eseguire i compiti che deve svolgere. Per applicare correttamente questo principio è necessario innanzitutto indagare su quali sono effettivamente i compiti che devono essere svolti da un utente, in seconda istanza determinare qual è il minimo privilegio da assegnare all’utente, affinché possa svolgere questi compiti ed infine assegnare l’utente ad un dominio, che abbia i privilegi richiesti e niente di più. Un sistema RBAC supporta dunque il principio del minimo privilegio, in quanto è possibile assegnare un utente ad un ruolo, al quale sono associate le sole transazioni indispensabili allo svolgimento del suo lavoro all’interno dell’organizzazione. 3.1.5 Separazione dei compiti Un meccanismo RBAC può essere usato da un amministratore di sistema per rinforzare la politica di separazione dei compiti (“separation of duty”). Il set di transazioni da gestire opportunamente per rispettare i vincoli introdotti da questa politica di controllo d’accesso variano a seconda del caso specifico. È dunque necessario prendere in considerazione di volta in volta ogni singola realtà organizzativa ed ovviamente solamente alcune ben precise operazioni dovranno essere ristrette nell’ambito della politica di separazione dei compiti. La separazione dei compiti, come si è detto in precedenza, può essere statica o dinamica. Il primo caso è quello più semplice, per cui è necessario solamente assegnare a priori ad ogni individuo un insieme di ruoli e ad ogni ruolo un set di transazioni possibili, in modo da rispettare le regole di “separation of duty”. Il secondo è invece più complesso, in quanto la verifica di queste regole può essere fatta solamente durante il funzionamento del sistema, ma d’altro canto introduce una maggiore flessibilità, che in certi casi applicativi può essere auspicabile se Pagina 45 non indispensabile. In realtà il documento originale di Sandhu non spiega nel dettaglio come un sistema RBAC possa essere configurato per supportare la separazione dinamica dei compiti, ma lascia comunque intendere che ciò può avvenire assegnando ad uno stesso utente anche ruoli che generano conflitti di interesse e verificando poi run-time che questo utente non ricopra entrambi i ruoli contemporaneamente. Appare dunque evidente come il controllo d’accesso basato su ruoli possa perfettamente adattarsi ad una politica di separation of duty sia statica, che dinamica. 3.2 Differenza tra ruoli e gruppi Leggendo le definizioni fornite nel paragrafo precedente, può non essere del tutto chiaro quale sia la differenza tra ruoli e gruppi di utenti, dove questi ultimi non sono altro che l’unità di controllo d’accesso più frequentemente adottata in molti dei sistemi comunemente utilizzati. La differenza principale esistente fra la maggior parte delle implementazioni di gruppi ed il concetto di ruoli va ricercata nel fatto che i primi sono tipicamente trattati come una collezione di utenti e non come un insieme di permessi. Un ruolo in realtà è entrambe le cose, ovvero racchiude in sé sia i permessi che gli utenti, ai quali questi ultimi vengono assegnati in modo indiretto. I ruoli sono dunque degli intermediari tra gli insiemi dei permessi e degli utenti. Una seconda differenza tra ruoli e gruppi risiede nel grado di facilità con la quale è possibile determinare l’elenco degli utenti e dei permessi appartenenti all’insieme (ruolo o gruppo) in questione. Questa differenza è ovviamente una conseguenza della prima, ma è utile come “prova del nove” per capire se un sistema di controllo d’accesso appartiene all’una o all’altra tipologia. Infatti, per poter parlare di ruolo, deve essere altrettanto facile (o difficile) determinare il relativo insieme di utenti ed il relativo insieme di permessi. Inoltre il controllo dell’appartenenza di un utente e l’assegnazione di un permesso ad un ruolo devono essere operazioni abbastanza centralizzate, ovvero concentrate in un numero limitato di utenti rispetto alle dimensioni globali del sistema che si deve gestire. Pagina 46 Si pensi ad esempio ad un sistema Unix. Per determinare l’appartenenza dei diversi utenti ai vari gruppi è sufficiente guardare i file “/etc/passwd” ed “/etc/group”. L’informazione circa i permessi assegnati ai diversi gruppi è invece dispersa su tutto il file system. Inoltre l’assegnamento dei permessi ai gruppi è altamente decentralizzato. Appare dunque chiaro come in questo caso non si possa in alcun modo parlare di “ruoli”, secondo la definizione che si è fornita. 3.3 Confronto tra RBAC, MAC e DAC Mentre il MAC è appropriato per applicazioni militari, in quanto riflette i diversi livelli di sicurezza della gerarchia militare, il DAC viene spesso considerato il meccanismo di controllo d’accesso che si sposa meglio con le applicazioni civili ed industriali. In realtà il DAC risulta essere inadeguato per molte applicazioni commerciali e civili, mentre il MAC non offre la flessibilità che talvolta è richiesta anche in ambito militare. Nasce quindi la necessità di un nuovo meccanismo di controllo degli accessi, che sia più appropriato per le applicazioni militari e non. L’RBAC è la risposta a questa esigenza. 3.3.1 RBAC vs DAC Molto spesso le decisioni riguardanti il controllo d’accesso vengono determinate in base al ruolo che i singoli utenti hanno all’interno dell’organizzazione, ovvero in base ai loro doveri, alle loro responsabilità e alla loro qualifica. Una politica di controllo d’accesso RBAC si basa infatti sulle funzioni che un utente deve svolgere all’interno di un’organizzazione, ovvero sul suo ruolo. È questa la principale differenza tra DAC e RBAC. Infatti in molte applicazioni commerciali e civili gli utenti finali non possiedono l’informazione che possono leggere e manipolare, ma la loro qualifica li autorizza a farlo: è il sistema RBAC che possiede gli oggetti, ovvero i contenitori di informazione, ed è sempre quest’ultimo che autorizza o meno l’accesso degli utenti, assegnati ai diversi ruoli, agli oggetti. Inoltre, proprio perché gli utenti non posseggono le informazioni, non possono propagare i loro diritti d’accesso ad altri utenti. Pagina 47 3.3.2 RBAC vs MAC L’RBAC è molto più simile al MAC, infatti alcuni sostengono persino che sia una forma di MAC con un singolo livello d’accesso. Questa tesi sembra avvalorata dal fatto che assegnare un utente ad uno o più ruoli e specificare le operazioni che competono ad ogni ruolo è del tutto analogo a distribuire gli utenti su vari livelli di sensibilità ed assegnare ad ogni oggetto un’etichetta in base alla sensibilità dell’informazione in essi contenuta. Ciò è vero, ma la differenza tra MAC ed RBAC in realtà è più sottile: l’RBAC si preoccupa maggiormente di regolare l’accesso alle funzioni, che operano sulle informazioni contenute negli oggetti, e non strettamente dell’accesso alle informazioni stesse. Infatti mentre nel MAC ci si preoccupa di stabilire chi può leggere che cosa e di vietare la scrittura ad un livello inferiore, in un sistema RBAC l’obiettivo principale è proteggere l’integrità dell’informazione, stabilendo chi può fare che cosa su quale informazione. Pagina 48 CAPITOLO 4 RBAC96 FRAMEWORK Viene ora descritto il framework RBAC proposto nel 1996 dal NIST (National Institute of Standards and Technology). Si tratta di un passo importante verso una definizione univoca ed universalmente accettata del controllo d’accesso basato su ruoli. Nel capitolo sono illustrate dettagliatamente le componenti fondamentali dei modelli in cui il framework è suddiviso, ognuno accompagnato da descrizione formale. Pagina 49 una 4.1 Il framework RBAC Nel 1996 Sandhu [19] propose assieme a Coyne, Feinstein e Youman un primo framework per il controllo d’accesso basato su ruoli. L’idea principale fu quella di dividere in quattro modelli il modello originale, in modo da trattare separatamente le diverse funzionalità che quest’ultimo doveva mettere a disposizione. Si tratta di un’evoluzione importante rispetto al modello originale, in cui non c’era alcuna classificazione e tutto era concentrato in un’unica architettura, per i seguenti motivi: 1. un sistema in cui tutto è unificato è più difficile da configurare ed amministrare 2. se si desiderano apportare funzionalità aggiuntive, il modello cresce ancora di complessità 3. la modularità facilita sia l’aggiunta di nuove funzionalità, sia la composizione in tutte le possibili varianti di quelle già esistenti Nei prossimi paragrafi verranno presi in esami i diversi modelli, che compongono il framework RBAC96. 4.2 Panoramica dei modelli Il framework RBAC96 si compone dei seguenti modelli: 1) RBAC0: funzionalità di base 2) RBAC1: gerarchia fra ruoli 3) RBAC2: vincoli 4) RBAC3: modello unificato L’RBAC0 racchiude in sé tutte le caratteristiche necessarie per avere un sistema di controllo d’accesso basato su ruoli. L’RBAC1 invece aggiunge al modello base la possibilità di definire gerarchie tra ruoli, mentre l’RBAC2 introduce una serie di vincoli sulle entità e le relazioni del modello. Infine l’RBAC3 non è altro che il contenitore di tutti i precedenti modelli. La figura seguente mostra le dipendenze esistenti fra i diversi modelli del framework. Pagina 50 Figura 4-1. RBAC96 Framework I paragrafi seguenti analizzano più dettagliatamente i singoli modelli. 4.2.1 RBAC0 L’RBAC0 è detto anche “modello base” e non fa altro che definire le entità principali del controllo d’accesso basato su ruoli ed elencare le relazioni che le legano. Rispetto al modello RBAC originale vi sono due novità: le sessioni ed i permessi. Le sessioni non sono altro che dei contenitori, che tengono traccia dei ruoli attivati da un utente durante l’interazione con il sistema. In alcuni documenti non si parla di sessioni, ma di soggetti. I due concetti potrebbero sembrare molto differenti fra loro; in realtà sono la medesima cosa, in quanto il termine soggetto è utilizzato per sottolineare il fatto che un utente può avere diverse istanze, con le quali accede contemporaneamente al sistema, dotate tutte degli stessi permessi. Queste istanze, non sono altro che i soggetti, ovvero le sessioni. Per quanto riguarda invece i permessi, si può affermare che essi non sono altro che le operazioni/transazioni del modello RBAC originale. Infatti ai ruoli venivano assegnate direttamente delle transazioni, specificando che un’operazione eseguita su un oggetto differente non poteva essere considerata la stessa transazione. Per non dare adito a confusione ed eliminare la possibilità di fraintendere questa sottile distinzione, si è deciso di introdurre il concetto di permesso, che esprime appunto la possibilità manipolare le informazioni contenute negli oggetti del sistema. Pagina 51 Per completezza segue un elenco esaustivo degli elementi di base dell’ RBAC0: • Users (insieme U): utenti del sistema. Un utente è identificato in questo caso con un essere umano, anche se il concetto può essere esteso a macchine, reti o agenti intelligenti autonomi. • Roles (insieme R): ruoli dell’organizzazione. Un ruolo è identificato con un determinato compito all’interno di un’organizzazione, al quale è legata una certa semantica riguardo la responsabilità e l’autorità che esso rappresenta. • Permissions(insieme P): permessi di accesso. Un permesso è la possibilità di eseguire un’operazione su uno o più oggetti protetti. • Sessions (insieme S): sessioni utente. Una sessione non è altro che un sottoinsieme dei ruoli attivabili dall’utente. Ogni sessione è associata da un unico utente, mentre un utente può attivare più sessioni contemporaneamente. Le relazioni che legano fra loro gli elementi del modello base sono invece le seguenti: • UA (User Assignment): relazione che assegna un utente ad un ruolo. • PA (Permission Assgnment): relazione che assegna un permesso ad un ruolo. • user: relazione che lega un utente alle sessioni da lui create. • roles: relazione che lega una sessione ai ruoli dell’utente attivati nella stessa. 4.2.2 RBAC1 Il modello RBAC1 aggiunge rispetto all’RBAC0 la possibilità di definire una gerarchia fra ruoli. Le relazioni gerarchiche sono relazioni di eredità di permessi. In particolare se un ruolo r1 discende da un ruolo r2, allora l’insieme dei permessi di r2 è incluso in quello dei permessi di r1, mentre l’insieme degli utenti di r1 è incluso in quello degli utenti di r2. Ciò vuol dire che se un utente appartiene ad un ruolo che discende da un altro, è come se fosse stato assegnato anche a quest’ultimo e può usufruire dei permessi ad esso collegati. Pagina 52 La figura seguente mostra un esempio di gerarchia tratto dal documento originale del 1996. Figura 4-2. Esempi di gerarchia di ruoli Pagina 53 La struttura della gerarchia può essere più o meno complicata, in modo da adattarsi perfettamente alla realtà organizzativa, che si deve gestire. La figura seguente, sempre tratta dal documento originale dell’RBAC96 framework, mostra una serie di gerarchie di complessità crescente. Figura 4-3. Gerarchie di complessità crescente Pagina 54 4.2.3 RBAC2 L’RBAC2 introduce infine la possibilità di aggiungere dei vincoli al modello base. In generale viene prospettata la possibilità di agire su ognuna della relazioni presenti nel modello, ma non viene fornito un elenco preciso ed esaustivo dei vincoli che devono essere supportati. Alcuni vincoli che vengono citati nel documento originale sono i seguenti: • separazione dei compiti statica e dinamica, in particolare legata a coppie di ruoli mutuamente esclusivi • vincoli di cardinalità, in particolare inerenti al numero massimo o minimo di utenti, che possono essere assegnati ad un ruolo, o di permessi che possono essere assegnati ad uno stesso ruolo • vincoli di prerequisito, in particolare vincoli che impongono ad un utente di avere già assegnati uno o più ruoli ben precisi, prima di potersi vedere assegnato un certo altro ruolo In questo ambito viene sottolineato il fatto che i legami gerarchici fra ruoli possono essere anche considerati dei vincoli. Infatti le relazioni di eredità impongono al ruolo figlio di portare con sé anche tutti i permessi, che erano stati assegnati al ruolo padre. 4.2.4 RBAC3 L’RBAC3 è l’unione dei precedenti tre modelli e viene anche definito “modello consolidato”, in quanto ingloba tutte le funzionalità del controllo d’accesso basato su ruoli, ovvero le gerarchie ed i vincoli La figura seguente, anch’essa tratta come le precedenti dal documento originale del 1996, mostra l’architettura dell’RBAC3, all’interno della quale si possono individuare i singoli modelli RBAC0, RBAC1 e RBAC2. Pagina 55 Figura 4-4. RBAC 3: unione dei modelli RBAC 0, 1, 2 4.3 Descrizione formale Di ognuno dei modelli presentati nei paragrafi precedenti viene ora fornita una descrizione formale. 4.3.1 RBAC0 Il modello si compone dei seguenti elementi: • Users (U), Roles (R), Permissions (P) e Sessions (S), ovvero gli insiemi di utenti, ruoli, permessi e sessioni. • PA ⊆ P x R, relazione molti-a-molti di assegnazione permessi-ruoli. • UA ⊆ U x R, relazione molti-a-molti di assegnazione utenti-ruoli. • user: S Æ U, funzione di mapping tra gli utenti e le relative sessioni. • roles: S Æ 2R, funzione di mapping tra una sessione ed i ruoli attivati dall’utente in quella sessione. Formalmente: roles (si) ⊆ { r ∈ R | (user (si), r) ∈ UA}. Pagina 56 4.3.2 RBAC1 Il modello si compone dei seguenti elementi: • Users (U), Roles (R), Permissions (P) e Sessions (S), ovvero gli insiemi di utenti, ruoli, permessi e sessioni. [Invariato rispetto all’RBAC0] • PA ⊆ P x R, relazione molti-a-molti di assegnazione permessi-ruoli. [Invariato rispetto all’RBAC0] • UA ⊆ U x R, relazione molti-a-molti di assegnazione utenti-ruoli. [Invariato rispetto all’RBAC0] • user: S Æ U, funzione di mapping tra gli utenti e le relative sessioni. [Invariato rispetto all’RBAC0] • RH ⊆ R x R, ordine parziale sull’insieme dei ruoli, detto anche relazione di ereditarietà; si indica con il simbolo ”≥”. • roles: S Æ 2R, funzione di mapping tra una sessione ed i ruoli attivati dall’utente in quella sessione. Formalmente: roles (si) ⊆ { r ∈ R | ∃r’ ≥ r : (user (si), r’) ∈ UA}. 4.3.3 RBAC2 Il modello aggiunge rispetto all’RBAC0 i vincoli precedentemente discussi, che vanno a determinare se i vari elementi (entità e relazioni) che lo compongono sono accettabili, oppure no. Non viene fornita in questo caso una descrizione dei vincoli supportati, in quanto nel documento originale questi ultimi non sono stati formalizzati ed elencati con precisione. 4.3.4 RBAC3 Quest’ultimo modello non è altro che l’unione dei precedenti, quindi la sua descrizione formale è direttamente ricavabile da quelle fornite nei paragrafi precedenti: • Users (U), Roles (R), Permissions (P) e Sessions (S), ovvero gli insiemi di utenti, ruoli, permessi e sessioni. [RBAC0] Pagina 57 • PA ⊆ P x R, relazione molti-a-molti di assegnazione permessi-ruoli. [RBAC0] • UA ⊆ U x R, relazione molti-a-molti di assegnazione utenti-ruoli. [RBAC0]] • user: S Æ U, funzione di mapping tra gli utenti e le relative sessioni. [RBAC0] • RH ⊆ R x R, ordine parziale sull’insieme dei ruoli, detto anche relazione di ereditarietà; si indica con il simbolo ”≥”. [RBAC1] • roles: S Æ 2R, funzione di mapping tra una sessione ed i ruoli attivati dall’utente in quella sessione. Formalmente: roles (si) ⊆ { r ∈ R | ∃r’ ≥ r : (user (si), r’) ∈ UA}.[RBAC1] • VINCOLI [RBAC2] Pagina 58 CAPITOLO 5 LO STANDARD RBAC PROPOSTO DAL NIST In questo capitolo viene descritto lo standard RBAC proposto dal NIST (National Institue of Standards and Technology) allo scopo di unificare e condensare le caratteristiche del controllo d’accesso basato su ruoli in un unico documento. Dopo aver illustrato l’architettura del sistema ed aver presentato una panoramica delle sue componenti, si procederà ad una descrizione del modello concettuale sul quale quest’ultima è basata. Infine verranno descritte le specifiche funzionali dello standard e l’organizzazione in packages dei suoi componenti principali. Pagina 59 5.1 Presentazione dello standard Nel 2000 un gruppo di studiosi del NIST (National Institue of Standards and Technology) e di altri enti di standardizzazione composto da Ferraiolo, Sandhu, Gavrila, Kuhn e Chandramouli, ha proposto uno standard RBAC [23] allo scopo di unificare le caratteristiche principali del controllo d’accesso basato su ruoli universalmente riconosciute ed implementate in una parte significativa di prodotti commerciali. La descrizione formale dello standard, così come viene proposta nel documento ufficiale, è suddivisa in due parti principali: 1) La prima definisce il modello concettuale dell’RBAC, offrendone una trattazione del tutto teorica e formale. 2) La seconda illustra invece la specifica funzionale degli elementi costituivi dell’RBAC e le loro caratteristiche distintive, in modo da permettere la creazione, la modifica e la manutenzione di un vero e proprio sistema di controllo d’accesso basato su ruoli. Sia il modello concettuale che le specifiche funzionali sono organizzate in quattro sezioni (tre principali, di cui una divisa in due sotto-sezioni): 1) Core RBAC 2) Hierarchical RBAC 3) Constrained RBAC a) Static Separation of Duty (SSD) b) Dynamic Separation of Duty (DSD) Ognuna di queste sezioni descrive un modello fondamentale di controllo d’accesso con caratteristiche ben distinte dagli altri e ad essi complementare. Infatti è possibile comporre i diversi modelli fra loro per ottenere un sistema più o meno complesso e ricco di funzionalità, in modo da adattarsi alle più disparate esigenze di utilizzo. 5.2 Panoramica dei modelli Questo standard sarà alla base di quello proposto ed adottato, nonché implementato, nella presente trattazione, di conseguenza se ne desidera fornire un Pagina 60 resoconto attento e puntuale. Per questo motivo, prima di entrare nel dettaglio del modello concettuale e delle specifiche formali dello standard, risulta certamente utile offrire una panoramica delle sue componenti principali. 5.2.1 Core RBAC Il core RBAC comprende gli elementi essenziali del controllo d’accesso. Il concetto base dell’RBAC è ovviamente la possibilità di assegnare agli utenti i ruoli e a questi ultimi i permessi; gli utenti ereditano quindi indirettamente i permessi dai ruoli che possono ricoprire. Le relazioni utenti-ruoli e ruoli-permessi sono di tipo molti-a-molti, ciò implica che: • un utente può essere assegnato a più ruoli • un ruolo può essere ricoperto da più utenti • un permesso può essere assegnato a diversi ruoli • un ruolo può avere più permessi. Oltre ai concetti di utente, ruolo e permesso fa parte del core RBAC anche quello di sessione, che permette un’attivazione e un disattivazione selettiva dei ruoli facenti capo ad uno specifico utente. Infine va sottolineato il fatto che non c’è alcuna restrizione relativa all’attivazione dei ruoli del sistema, di conseguenza ogni utente può attivarne contemporaneamente diversi e quindi usufruire dei relativi permessi. Il core RBAC contiene dunque tutte quelle funzioni necessarie alla descrizione delle strutture appena definite e alla loro gestione. Il core RBAC racchiude in sé tutte quelle caratteristiche, che vanno a costituire il tradizionale controllo d’accesso basato su ruoli, così come è stato implementato sin nei primi sistemi, giungendo pressoché inalterato attraverso le diverse generazioni di software fino ad oggi. L’unica diversità rispetto al primo modello del 1992 è la possibilità di attivare più di un ruolo all’interno di una sessione utente. È dunque una tecnologia solida ed ampiamente sperimentata e validata sul campo. Pagina 61 5.2.2 Hierarchical RBAC L’RBAC gerarchico aggiunge ulteriori requisiti al core RBAC per supportare la gerarchia dei ruoli. Formalmente – dal punto di vista matematico – una gerarchia è un ordine parziale definito su un insieme di ruoli in cui il figlio eredita dal padre i relativi permessi ed il padre include il figlio nella lista dei suoi discendenti. Lo standard prevede due tipi di gerarchia, quella generale e quella limitata. General Hierarchical RBAC: permette di definire in modo arbitrario un ordine parziale tra ruoli ed utilizzarlo come gerarchia; ciò include anche la possibilità di avere ereditarietà multipla sia nelle relazioni utenti-ruoli, che in quelle ruolipermessi. L’ereditarietà multipla ha alcune importanti proprietà da tenere presente. La prima riguarda a possibilità di comporre un ruolo utilizzando diversi ruoli con minori permessi; questo può essere utile in un’organizzazione all'interno della quale vi sono funzioni che ne inglobano al loro interno altre di minore importanza. Una seconda proprietà è il trattamento uniforme degli assegnamenti utenti-ruoli e delle relazioni di ereditarietà fra ruoli. Ciò permette, se lo si desidera, di includere nella gerarchia dei ruoli anche gli utenti, trattandoli uniformemente a questi ultimi: è come se un utente, anziché vedersi assegnati i ruoli, ereditasse da essi i permessi, come se fosse esso stesso un ruolo. Limited Hierarchical RBAC: pone delle restrizioni all’ordine parziale da utilizzare come gerarchia tra ruoli. I vincoli utilizzati possono variare a seconda della specifica implementazione, ma generalmente si impone che la gerarchia abbia una struttura ad albero o a foresta, evitando così l’ereditarietà multipla. Le figure seguenti esemplificano tre diversi tipi di gerarchia: 1. ad albero 2. ad albero invertito 3. a reticolo Pagina 62 Figura 5-1. Gerarchia ad albero Figura 5-2. Gerarchia ad albero invertito Figura 5-3. Gerarchia a reticolo Pagina 63 L’RBAC gerarchico è stato introdotto come modello fondamentale, in quanto nella pratica capita molto di frequente che diversi ruoli abbiano permessi in comune. Senza una gerarchia i permessi dovrebbero essere ridefiniti in modo identico per ogni singolo ruolo ed ovviamente questo causerebbe un notevole spreco di risorse per la gestione del sistema. Infatti si perderebbe molto tempo non solo nel definire i permessi ed assegnarli a diversi ruoli, ma soprattutto nell’amministrazione degli stessi: le modifiche comuni dovrebbero essere ripetute su ogni singolo ruolo con il rischio non improbabile di commettere eventuali errori. Per migliorare l’efficienza e l’efficacia della gestione del sistema è dunque indicato implementare la gerarchia fra ruoli, soprattutto se esso è di grandi dimensioni. 5.2.3 Constrained RBAC Il Constrained RBAC agglunge al modello base la separazione dei compiti. Vi sono due tipi di separazione dei compiti, quella statica e quella dinamica, che verranno descritte nei paragrafi seguenti. 5.2.3.1 Static Separation of Duty (SSD) La Static Separation of Duty viene utilizzata per definire politiche di controllo d’accesso nelle quali sono presenti conflitti d’interesse. Un esempio classico che richiede la presenza della SSD è la definizione di ruoli mutuamente esclusivi, che diventa indispensabile quando una determinata operazione può essere iniziata da un certo utente, ma conclusa (o approvata) da un altro, come avviene per molte transazioni bancarie. In questi casi la SSD permette di definire delle regole per cui non è possibile assegnare a priori due ruoli conflittuali ad uno stesso utente. Un’ultima precisazione va fatta nel caso in cui sia presente una gerarchia di ruoli: i vincoli devono essere verificati non solo sui permessi assegnati direttamente al singolo ruolo, ma anche su quelli ereditati secondo la gerarchia a cui esso appartiene. Un modo per prevenire i conflitti di interesse tra ruoli è quello di imporre dei vincoli sull’assegnazione di un utente ad un ruolo. Questi vincoli possono essere Pagina 64 espressi in modi molto differenti fra loro. Ad ogni modo nello standard proposto dal NIST i vincoli specificati da un SSD sono espressi mediante una coppia <role-set, n> dove role-set è un insieme di ruoli, mentre n è un numero intero che esprime quanti ruoli, tra quelli presenti nell’insieme, possono al massimo essere assegnati ad uno stesso utente. Se ad esempio si vuole esprimere il vincolo di due ruoli mutuamente esclusivi, si dovranno inserire questi ultimi nel role-set e si dovrà porre n uguale a uno, in modo tale che uno soltanto dei due ruoli possa essere assegnato ad un determinato utente. Dal punto di vista delle politiche di sicurezza la SSD si presenta come uno strumento valido ed affidabile per gestire i conflitti di interesse e semplificare la separazione dei compiti assegnati ai diversi ruoli del sistema. Generalmente i vincoli statici vengono imposti sulle operazioni amministrative, che potrebbero minare le politiche di Separation of Duty ad alto livello organizzativo, in quanto sono le operazioni più critiche dal punto di vista della sicurezza. 5.2.3.2 Dynamic Separation of Duty (DSD) La Dynamic Separation of Duty viene utilizzata, come la SSD, per limitare i permessi a disposizione dei singoli utenti. Quello che cambia è il contesto all’interno del quale vengono imposte queste limitazioni. La DSD infatti pone delle restrizioni sui permessi, mettendo dei vincoli sui ruoli che possono essere attivati all’interno di una stessa sessione dell’utente. I vincoli della DSD sono espressi anch’essi in modo del tutto simile alla SSD, ovvero tramite una coppia <role-set, n> dove role-set è un insieme di ruoli, scelti tra quelli assegnati all’utente, mentre n è un numero intero, che rappresenta il numero massimo di ruoli attivabili dall’utente all’interno di una stessa sessione. Le proprietà definite da una DSD forniscono un valido supporto al principio del minimo privilegio, poiché fanno in modo che un utente possa esercitare di volta in volta diversi permessi a seconda dei differenti compiti che deve svolgere. Ciò assicura che i permessi non persistano oltre il tempo in cui sono richiesti per svolgere un determinato compito. Questo aspetto del minimo privilegio è anche conosciuto come “temporary revocation of trust” (revoca temporanea di fiducia) ed in passato è stato solitamente trascurato, in quanto non esistevano validi Pagina 65 supporti per la sua definizione ed attuazione. Grazie alla DSD è invece possibile supportare anche questo aspetto del principio del minimo privilegio Va infine sottolineato il fatto che la SSD permette di evitare un conflitto d’interesse a priori, ovvero quando un utente viene assegnato ad un ruolo, al contrario la DSD permette di assegnare ad un utente ruoli che possono causare conflitti di interesse se attivati simultaneamente, ma che non lo fanno se vengono resi operativi in modo indipendente. Il controllo dinamico permette quindi di avere una maggiore flessibilità ed efficienza nel controllo d’accesso. 5.3 Modello concettuale Il modello concettuale viene definito per un duplice scopo: 1. definire un vocabolario standardizzato di termini da utilizzare nella fase successiva di stesura delle specifiche 2. definire una classificazione delle specifiche dell’RBAC in modo da individuare diversi modelli di controllo d’accesso, ognuno con caratteristiche peculiari È importante notare fin da subito il fatto che il modello di riferimento definisce una tassonomia delle caratteristiche dell’RBAC, che possono andare a costituire un insieme di packages da sviluppare anche separatamente. Questo tema verrà approfondito in seguito. Nei paragrafi che seguono sono invece passati in rassegna i quattro modelli fondamentali, dei quali si è data una panoramica in precedenza, fornendo per ognuno di essi una descrizione formale. Infatti ogni modello viene sistematicamente suddiviso nelle seguenti componenti: 1) un insieme di elementi base 2) un insieme di relazioni tra gli elementi base definiti nel punto precedente 3) un insieme di funzioni amministrative, che mappano istanze di un elemento base con istanze di altri elementi base. Ognuna della componenti viene quindi analizzata singolarmente. Pagina 66 5.3.1 Core RBAC Elementi di base: • USERS (utenti del sistema): un utente è identificato in questo caso con un essere umano, anche se il concetto può essere esteso a macchine, reti o agenti intelligenti autonomi. • ROLES (ruoli dell’organizzazione): un ruolo è identificato con un determinato compito all’interno di un’organizzazione, al quale è legata una certa semantica riguardo la responsabilità e l’autorità che esso rappresenta. • OBJECTS (oggetti del sistema): un oggetto è un’entità che riceve o contiene informazione. • OPERATIONS (operazioni sugli oggetti del sistema): un’operazione è un programma eseguibile che svolge un certa funzione per l’utente che lo invoca. • PERMISSIONS (permessi di accesso): un permesso è la possibilità di eseguire un’operazione su uno o più oggetti protetti. • SESSIONS (sessioni utente): una sessione è un sottoinsieme dei ruoli attivabili dall’utente. Ogni sessione è associata da un unico utente, mentre un utente può attivare più sessioni contemporaneamente. Relazioni tra gli elementi di base: • UA (User Assignment): assegnazione di un ruolo ad un utente (o viceversa). • PA (Permission Assignment): assegnazione di un permesso ad un ruolo (o viceversa). • user_sessions: funzione che restituisce le sessioni attivate dall’utente. • session_roles: funzione che restituisce i ruoli attivati da una sessione. La figura seguente illustra gli elementi base del core RBAC e le relazioni che li legano. In particolare la doppia freccia indica le relazioni molti-a-molti, mentre la freccia singola indice una relazione uno-a-molti. Pagina 67 Figura 5-4. Core RBAC Segue ora una descrizione formale del core RBAC, che comprende tutte le funzioni amministrative necessarie al corretto funzionamento del sistema: • USERS, ROLES, OPS e OBS, gli insiemi di utenti, ruoli, operazioni ed oggetti. • UA ⊆ USERS x ROLES, una relazione di mapping molti-a-molti dell’assegnazione utenti-ruoli. • Assigned_users: (r:ROLES) Æ 2USERS, funzione di mapping di un ruolo sui suoi utenti. Formalmente: assigned_users(r) = {u ∈ USERS | (u, r) ∈ UA}. • PRMS = 2(OPS x OBS), l’insieme dei permessi. • PA ⊆ PRMS x ROLES, una relazione di mapping molti-a-molti dell’assegnazione permessi-ruoli. • Assigned_permissions (r: ROLES) Æ 2PRMS, funzione di mapping di un ruolo sui suoi permessi. Formalmente: assigned permissions(r) = {p ∈ PRMS | (p, r) ∈ PA}. • Ob(p: PRMS) Æ {op ⊆ OPS}, funzione di mapping permessi-operazioni, che restituisce l’insieme di operazioni associate al permesso p. • Ob(p: PRMS) Æ {ob ⊆ OBS}, funzione di mapping permessi-oggetti, che restituisce l’insieme di oggetti associati al permesso p. • SESSIONS, l’insieme delle sessioni. Pagina 68 • User_sessions (u: USERS) Æ 2SESSIONS, la funzione di mapping tra un utente ed il suo insieme di sessioni. • Session_roles (s: SESSIONS) Æ 2ROLES, la funzione di mapping tra una sessione ed i ruoli attivati. Formalmente: session_roles (si) ⊆ { r ∈ ROLES | (user_sessions (si), r) ∈ UA}. • Avail_session_perms (s:SESSIONS) Æ 2PRMS, funzione che restituisce i permessi disponibili ad un utente durante una sessione. 5.3.2 Hierarchical RBAC Elementi di base: • Tutti gli elementi di base del core RBAC • Relazioni tra gli elementi di base • Tutte le relazioni del core RBAC • ROLE HIERARCHY (gerarchia tra ruoli): definisce una relazione di ereditarietà tra ruoli. L’ereditarietà è espressa in termini di permessi, ovvero il ruolo figlio eredita i permessi del padre e li tramanda ai suoi discendenti. La figura seguente mostra la relazione di gerarchia tra ruoli che sia aggiunge al modello del core RBAC visto in precedenza. Pagina 69 Figura 5-5. Hierarchical RBAC Segue ora una descrizione formale del hierarchical RBAC, che comprende tutte le funzioni amministrative necessarie al corretto funzionamento del sistema: • RH ⊆ ROLES x ROLES, ordine parziale sull’insieme dei ruoli, detto anche relazione di ereditarietà ed indicato con “≥”. Inoltre si ha: r1 ≥ r2 ⇒ authorized_permissions(r2) ⊆ authorized_permissions(r1) ∧ authorized_users(r1) ⊆ authorized_users(r2). • authorized_users(r: ROLES) Æ 2USERS, funzione di mapping tra un ruolo ed il corrispondente insieme di utenti in presenza di una gerarchia tra ruoli. Formalmente authorized_users(r) ={u ∈ USERS | r’ ≥ r , (u,r’) ∈ UA} • authorized_permissions(r: ROLES) Æ 2PRMS, funzione di mapping tra un ruolo ed il corrispondente insieme di permessi in presenza di una gerarchia tra ruoli. Formalmente authorized_users(r) ={p ∈ PRMS | r’ ≥ r , (p,r’) ∈ PA}. • [Ereditarietà non multipla] in presenza di una gerarchia fra ruoli limitata in modo tale da evitare l’ereditarietà multipla, va aggiunto il vincolo che permette ad un ruolo di ereditare i permessi da un solo altro ruolo: r1 ≥ r ∧ r2 ≥ r ⇒ r1 = r2. Pagina 70 5.3.3 Constrained RBAC Il constrained RBAC aggiunge la separazione dei compiti al modello base. Come illustrato nella figura seguente i nuovi vincoli che si vanno ad aggiungere al modello possono benissimo convivere con la presenza di una gerarchia fra ruoli. Ovviamente in questo caso sarà maggiormente complesso verificare il rispetto dei vincoli a causa della presenza dell’ereditarietà tra ruoli. Elementi base: • SSD, insieme dei vincoli per la static separation of duty • DSD, insieme dei vincoli per la dynamic separation of duty Relazione tra gli elementi base: • Nessuna relazione aggiuntiva Figura 5-6. Constrained RBAC: SSD Pagina 71 Figura 5-7. Constrained RBAC: DSD Segue ora una descrizione formale del constrained RBAC, che comprende tutte le funzioni amministrative necessarie al corretto funzionamento del sistema: • [SSD semplice] SSD ⊆ (2ROLES x N), un insieme di vincoli SSD, che impongono che nessun utente possa avere assegnati più di ‘n’ ruoli all’interno del role set ‘rs’, formalmente ∀(rs, n)∈SSD, ∀ t ⊆ rs : |t| ≥ n ⇒ ∩r∈t assigned_users(r) = ∅ • [SSD con gerarchia fra ruoli] viene ridefinita la precedente formulazione utilizzando i ruoli autorizzati, anziché semplicemente quelli assegnati agli utenti: ∀(rs, n)∈SSD, ∀ t ⊆ rs : |t| ≥ n ⇒ ∩r∈t authorized_users(r) = ∅ • [DSD] DSD ⊆ (2ROLES x N), un insieme di vincoli DSD, che impongono che nessun utente possa attivare più di ‘n’ ruoli all’interno del role set ‘rs’ Formalmente si ha che: o ∀rs ∈ 2ROLES , n ∈ N (rs, n) ∈ DSD ⇒ |rs| ≥ n o ∀ s ∈ SESSIONS, ∀rs ∈ 2ROLES , ∀role_subset ∈ 2ROLES, ∀ n ∈ N, (rs, n) ∈ DSD, role_subset ⊆ rs, role_subset ⊆ session_roles ⇒ |role_subset| ≤ n 5.4 Specifiche funzionali Le specifiche funzionali definiscono i requisiti che deve avere una implementazione del controllo d’accesso basato su ruoli per rispettare lo standard Pagina 72 descritto dal modello concettuale. Nel paragrafo precedente è stato illustrato quest’ultimo suddividendolo in quattro modelli fondamentali, ognuno dei quali era formato da tre componenti astratti: gli elementi base, le relazioni e le funzioni amministrative. A questo punto è dunque necessario mappare il modello concettuale e le sue componenti astratte in requisiti funzionali concreti, che permettano di implementare correttamente lo standard RBAC definito. In questo paragrafo viene definita la semantica di varie funzioni per creare e mantenere i diversi componenti del modello RBAC (elementi base e relazioni), nonché per supportare le funzioni di amministrazione del sistema. Tutte queste funzioni posso essere organizzate ordinatamente in diversi packages, in modo da rispettare i diversi livelli di astrazioni così come definiti nel modello concettuale. Possono essere individuate tre categorie principali funzioni: 1) Administrative functions (funzioni amministrative): creano e mantengo gli elementi base del modello RBAC e le loro relazioni, permettendo di costruire i diversi componenti. 2) Supporting System Functions (funzioni di sistema): supportano i costrutti del modello RBAC durante l’interazione dell’utente con il sistema (es. gestione degli attributi di sessione e logica decisionale del controllo d’accesso). 3) Review functions (funzioni di reportistica): visualizzano i risultati prodotti dalle azioni delle altre funzioni. 5.4.1 Core RBAC 1) Funzioni amministrative Creazione e manutenzione degli elementi base Gli elementi d base sono gli utenti, i ruoli, le operazioni e gli oggetti. Devono essere dunque presenti tutte le operazioni di creazione ed eliminazione di utenti e ruoli, mentre non si gestiscono le funzioni per creare ed eliminare le operazioni e gli oggetti di sistema, in quanto si suppone che questi siano già presenti nel sistema. Di conseguenza le uniche funzioni da implementare in questo caso sono le seguenti: • addUser Pagina 73 • deleteUser • addRole • deleteRole Creazione e manutenzione delle relazioni Le relazioni principali del core RBAC sono l’assegnazione utente-ruolo e ruolipermesso; dovranno quindi essere presenti le seguenti funzioni per creare e distruggere queste relazioni: • assingUser • deassignUser • grantPermission • revokePermssion 2) Funzioni di sistema Queste funzioni sono necessarie per la gestione delle sessioni utente e per prendere le decisioni di controllo d’accesso. In primo luogo è necessario poter attivare e disattivare un ruolo di un utente all’interno di una sua sessione. Ancora prima deve quindi essere possibile creare una sessione, che per default dovrà attivare un set di ruoli dell’utente per iniziare la stessa. Ovviamente l’insieme di ruoli di default potrà poi essere alterato tramite l’utilizzo delle funzioni di attivazione e disattivazione. Infine dovrà essere presente una funzione che controlli se l’utente in quella sessione ha il permesso di accedere ad un oggetto di sistema o di svolgere una determinata operazione. Le funzioni di sistema sono dunque le seguenti: • CreateSession • AddActiveRole • DropActiveRole • CheckAccess 3) Funzioni di reportistica Quando vengono creati degli assegnamenti utente-ruolo o delle istanze di relazioni permesso-ruolo, deve essere possibile verificare l’esistenza di queste ultime sia dal punto di vista degli utenti, che da quello dei ruoli. Inoltre deve Pagina 74 essere possibile vedere il risultato delle funzioni di supporto sistema per determinare il valore di certi attributi delle sessioni in corso, come ad esempio i ruoli attivi di un utente. Per questo motivo è necessario implementare le seguenti funzioni: • assignedUsers • assignedRoles • rolePermissions • userPermissions • sessionActiveRoles • sessionPermissions • roleOperationsOnObject • userOperationsOnObject In realtà solo le prime due funzioni devono essere obbligatoriamente implementate, mentre tutte le successive non sono indispensabili per il corretto funzionamento del sistema, ma sono comunque di grande utilità per facilitarne la gestione. 5.4.2 Hierarchical RBAC 1) Funzioni amministrative Le funzioni amministrative richieste dall’RBAC gerarchico includono tutte le funzioni amministrative del core RBAC. Va sottolineato il fatto che la semantica della funzione deassignUser() deve essere ridefinita, poiché la presenza della gerarchia dei ruoli dà vita al concetto di “ruoli autorizzati” per un utente. In altre parole un utente può ereditare i permessi di ruoli, che non gli sono stati assegnati direttamente, ma che fanno parte della gerarchia dalla quale discende un ruolo assegnatogli direttamente. Un’importante caratteristica è dunque quella di poter deassegnare da un utente non solo i ruoli assegnatigli direttamente, ma anche quelli ereditati. Le funzioni amministrative aggiuntive, rispetto a quelle già presenti nel core RBAC riguardano la creazione e la manutenzione dell’ordine parziale che viene usato come gerarchia fra ruoli e sono le seguenti: • addInheritance Pagina 75 • deleteInheritance • addAscendant • deleteAscendant • addDescendant • deleteDescendant Il modello prevede anche la possibilità di porre vincoli sull’ordinamento parziale utilizzato per creare la gerarchia tra ruoli. Solitamente si fa in modo che la struttura di quest’ultima sia ad albero, evitando in questo modo di avere ereditarietà multipla tra ruoli. Per avere una gerarchia limitata è dunque necessario modificare le diverse funzioni in modo che ogni ruolo accetti un solo genitore. 2) Funzioni di sistema Le funzioni di sistema per l’RBAC gerarchico sono le stesse del core RBAC e forniscono le stesse funzionalità. Solamente le funzioni createSession e addActiveRole devono essere ridefinite a causa della presenza della gerarchia fra i ruoli. Infatti l’attivazione di un ruolo può implicare o meno (la scelta non è definita) quella dei ruoli da cui esso discende secondo la gerarchia esistente. 3) Funzioni di reportistica Tutte le funzioni di reportistica definite per il core RBAC rimangono valide. Ad esse vanno aggiunte una le funzioni per rilevare la corretta configurazione della gerarchia dei ruoli. In primo luogo l’insieme degli utenti che appartengono ad un stesso ruolo include non solo quelli assegnati direttamente a quest’ultimo, ma anche tutti quelli assegnatigli indirettamente. Analogamente i ruoli assegnati ad un utente comprendono anche tutti quelli ereditati indirettamente. Per le stesse ragioni l’insieme dei permessi relativi ad un singolo ruolo non include solo quelli assegnatigli direttamente, ma anche quelli ottenuti tramite l’ereditarietà della gerarchia, e questi si riflettono sugli utenti che sono stati assegnati a quel ruolo. Le funzioni di reportistica aggiuntive sono dunque le seguenti: • authorizedUsers • authorizedRoles Pagina 76 5.4.3 Static Separation of Duty (SSD) 1) Funzioni amministrative Le funzioni amministrative per il modello RBAC con SSD senza gerarchia fra ruoli includono tutte quelle del core RBAC. L’unico accorgimento è il fatto che la funzione assingUser deve incorporare la verifica dei vincoli della SSD. È possibile definire un vincolo SSD tramite un nome, un insieme di ruoli ed una cardinalità; il primo è semplicemente un’etichetta identificativa del vincolo stesso, mentre la cardinalità esprime il numero massimo di ruoli, scelti all’interno dell’insieme specificato, che un utente può attivare contemporaneamente. Vi sono dunque funzioni amministrative aggiuntive, necessarie alla creazione e alla cancellazione dei vincoli SSD, all’aggiunta e alla rimozione dei ruoli facenti parte di questi ultimi, nonché all’impostazione del valore della loro cardinalità. Segue un elenco delle funzioni appena illustrate: • createSSDSet • deleteSSDSet • addSSDRoleMember • deleteSSDRoleMember • setSSDCardinality Nel caso in cui si volesse gestire l’RBAC gerarchico (sia nel caso generale che in quello limitato) le funzioni introdotte da quest’ultimo producono lo stesso risultato con una sola eccezione: i vincoli che intervengono sulla gerarchia e quelli di SSD devono essere verificati contemporaneamente ogni volta che queste funzioni vengono invocate. 2) Funzioni di sistema Le funzioni di sistema sono le stesse di quelle già presentate per il core RBAC. 3) Funzioni di reportistica Tutte la funzioni di reportistica per il core RBAC sono necessarie per il corretto funzionamento dell’SSD RBAC. Oltre a queste funzioni base ne vanno aggiunte Pagina 77 delle altre per ottenere l’elenco dei vincoli SSD, quello dei ruoli assegnati ad ognuno di questi ultimi e la relativa cardinalità. Ecco dunque l’elenco delle funzioni di reportistica aggiuntive: • SSDRoleSets • SSDRoleSetRoles • SSDRoleSetCardinality 5.4.4 Dynamic Separation of Duty (DSD) 1) Funzioni amministrative La semantica della creazione di un vincolo DSD è identica a quella relativa al modello SSD. La differenza risiede nel contesto in cui viene fatto il controllo sui vincoli; infatti, mentre per l’SSD RBAC questo veniva attivato durante l’assegnazione di un utente ad un ruolo, ora è inserito al momento dell’attivazione di un ruolo all’interno di una sessione. Di seguito è riportato l’elenco delle funzioni amministrative che devono essere implementate per il modello DSD RBAC: • createDSDSet • deleteDSDSet • addDSDRoleMember • deleteDSDRoleMember • setDSDCardinality 2) Funzioni di sistema Le funzioni di sistema del core RBAC (createSession, addActiveRole e deleteActiveRole) devono essere presenti anche per il DSD RBAC, ovviamente se non si prevede di utilizzare anche la gerarchia tra ruoli; in tal caso deve essere preso come base il modello gerarchico dell’ RBAC. In entrambi i casi queste funzioni devono essere modificate, in modo da verificare anche i vincoli imposti dalla DSD. Per esempio la funzione di creazione di una nuova sessione deve verificare che il set di ruoli attivati per default non violi i vincoli della DSD; lo stesso vale per la funzione di attivazione di un nuovo ruolo. Pagina 78 3) Funzioni di reportistica Tutte le funzioni di reportistica del core RBAC sono necessarie anche per il modello DSD. In aggiunta a queste ultime vi sono altre tre funzioni, una per avere l’elenco dei vincoli DSD creati, un’altra per ottenere l’insieme dei ruoli assegnati a questi ultimi ed un’ultima per conoscerne la cardinalità: • SystemRBAC.DSDRoleSets • DSDSet.DSDRoleSetRoles • DSDSet.DSDRoleSetCardinality 5.5 I packages Come anticipato nei paragrafi precedenti lo standard RBAC proposto dal NIST può essere organizzato in modo organico in diversi packages. I quattro componenti fondamentali (core, hierarchical, SSD e DSD) possono essere direttamente mappati su rispettivi packages, disposti secondo la gerarchia illustrata nella figura seguente, in modo da sfruttare il meccanismo dell’ereditarietà per propagare le caratteristiche di un livello superiore della gerarchia ai livelli sottostanti più specializzati. Pagina 79 Figura 5-8. Packages dello standard RBAC In particolare le caratteristiche del core RBAC devono essere propagate su tutta la gerarchia dei packages, in quanto comprendono funzioni base dalla quali dipende il corretto funzionamento dell’intero sistema. È poi possibile scegliere se implementare in aggiunta al package principale anche l’RBAC gerarchico (generale o limitato), la SSD (con o senza gerarchia) o la DSD, combinando i diversi modelli in tutti i modi possibili. Ogni componente può dunque essere implementato opzionalmente con l’unica eccezione del core RBAC, che deve essere incluso in ogni package. Va infine sottolineato il fatto che questo è un approccio funzionale alla suddivisione in packages dello standard e che di conseguenza per passare ad un’implementazione reale e funzionante dovranno essere apportate delle modifiche strutturali per adattare lo schema concettuale all’architettura dell’applicazione. La tabella seguente mostra un riassunto delle diverse funzioni che un sistema RBAC deve implementare per seguire lo standard proposto dal NIST organizzate secondo la distribuzione in packages appena illustrata. Pagina 80 Funzioni Package Core Funzioni Funzioni di Funzioni di amministrative sistema reportistica • Add user • Create session • Assigned users • Delete user • Delete session • Assigned roles • Add role • Add active role • Role permissions • Delete role • Drop active • User permissions • Assign user role • Session roles • Deassign user Check access • Session permission • Grant permission • Role operations on • Revoke permission • object • User operations on object • Add inheritance • Create session • Authorized users • Delete inheritance • Add active role • Authorized roles • Add ascendant • Role permissions Add descendant • User permissions • Role operations on Hierarchical • (general) object • User operations on object Hierarchical • Add inheritance (limited) SSD SSD (general hierarchy) / / • Assign user • Ssd role sets • Create SSD set • Ssd role set roles • Delete SSD set • Ssd role set cardinality • AddSsdRoleMember • DeleteSsdRoleMember • SetSsdSetCardinality • Assign user • Add inheritance • Create SSD set • AddSsdRoleMember • SetSsdSetCardinality / / / Pagina 81 SSD (limited • Add inheritance / hierarchy) DSD • Create DSD set • Create session • Delete DSD set • Add active role • • AddDsdRoleMember • DeleteDsdRoleMember • SetDsdSetCardinality DSD (general / / • • • Create session • Add active role Dsd role sets Dsd role set roles Dsd role set cardinality / hierarchy) DSD (limited hierarchy) / / / Tabella 5-1. Funzioni e packages dello standard RBAC Pagina 82 CAPITOLO 6 ANALISI CRITICA DEL MODELLO In questo capitolo verranno discusse tutte le problematiche non ancora messe in luce riguardanti lo standard RBAC presentato in precedenza. Si tratta di una discussione critica sulle possibili varianti di cui si deve tener conto, se si vuole procedere ad una implementazione funzionante e non banale del modello stesso. Appare dunque evidente come la distanza tra teoria e pratica sia a volte non indifferente e dunque si può apprezzare quanto lavoro sia ancora necessario prima di tradurre in atto una teoria in apparenza lineare e facilmente applicabile. Pagina 83 6.1 Attivazione e disattivazione dei ruoli Uno dei primi problemi che si devono affrontare non appena si decide di implementare un qualsiasi modello di RBAC è quello relativo alle tempistiche relative all’attivazione e alla disattivazione dei ruoli. L’attivazione non è un meccanismo particolarmente complesso, in quanto un ruolo viene di norma attivato all’occorrenza, ovvero quando l’utente richiede di agire su una risorsa protetta ed i privilegi necessari sono legati ad un suo ruolo non ancora attivo. In questo caso, una volta verificato il rispetto di eventuali vincoli, quest’ultimo deve essere attivato. Un’attenzione particolare va prestata nel definire i ruoli che vengono attivati di default all’inizio di ogni sessione utente. Questo insieme di ruoli non deve assolutamente violare nessun vincolo, altrimenti un utente potrebbe nel peggiore dei casi non riuscire nemmeno ad accedere al sistema. Per evitare che ciò accada si può procedere in due modi differenti: 1. Effettuare un controllo d’integrità all’avvio del sistema, che segnali eventuali inconsistenze dello stesso. 2. Attivare un ruolo di default alla volta, in modo che, qualora un vincolo non sia rispettato, si possa procedere alla disattivazione del/i ruolo/i incriminato/i. Per quanto riguarda invece il meccanismo di disattivazione, si possono individuare due principali varianti: 1. La prima scelta possibile è quella di attivare un ruolo e non disattivarlo mai, se non in presenza di un vincolo (ad esempio di separazione dei compiti) per cui sia necessario farlo, in modo da poterne attivare un altro. 2. La seconda alternativa consiste, contrariamente al caso precedente, nel disattivare ogni ruolo non appena il privilegio resosi necessario è stato utilizzato. La prima soluzione sovraccarica meno il sistema rispetto alla seconda, che impone una continua attivazione e disattivazione dei ruoli. L’unico difetto potrebbe essere Pagina 84 quello di non supportare pienamente il principio del minimo privilegio, poiché in un certo istante un utente ha più permessi di quelli realmente necessari. Tuttavia, se si percorre la seconda strada, si incorre nello spiacevole inconveniente di attivare e disattivare continuamente un ruolo, nel caso in cui l’utente utilizzi più volte, durante una sua sessione, i privilegi dello stesso. Essendo questa evenienza tutt’altro che improbabile, si corre il rischio di sovraccaricare parecchio il sistema e rallentarne l’esecuzione con gravi disservizi per gli utenti. Infine per completezza va fatta un’ultima considerazione, anche se ovvia, ovvero va ricordato il fatto che si possono studiare numerosi altri metodi per gestire il meccanismo di attivazione e disattivazione dei ruoli. Ad esempio si può pensare di disattivare un ruolo dopo un certo lasso di tempo, che può essere calcolato rispetto all’istante di attivazione, oppure rispetto all’ultimo utilizzo di un suo permesso, ma anche in base ad altre politiche. Tutte queste soluzioni, oltre a complicare il modello, non fanno altro che caricare il sistema di lavoro, in quanto aggiungono vincoli che devono essere controllati, di conseguenza è bene utilizzarli solo nei casi specifici, in cui si ritiene che siano strettamente necessari. 6.2 Le gerarchie L’RBAC gerarchico permette di definire gerarchie di ruoli anche molto complesse. Da un lato questa caratteristica è certamente un aspetto positivo del modello, in quanto ne fa crescere la flessibilità, che si concretizza in una maggiore aderenza alla realtà organizzativa che si deve amministrare. Dall’altro lato però ne aumenta la complessità, poiché l’ereditarietà tra ruoli va ad influenzare le altre relazioni del modello ed i vincoli su di esse. Infatti da un punto di vista pratico le relazioni di ereditarietà tra ruoli possono essere considerate dei vincoli sulla relazione PA (Permission Assigment) del modello RBAC. Ogni volta che un ruolo viene assegnato ad un altro come figlio, o come padre, è come se fosse stato aggiunto un vincolo che impone al figlio di avere tutti i permessi del padre, oltre a quelli assegnatigli direttamente. I paragrafi seguenti analizzano alcuni problemi che si vengono a creare quando si introduce la gerarchia tra ruoli all’interno di un modello RBAC. Pagina 85 6.2.1 Gerarchia ed attivazione dei ruoli Una delle prime scelte da compiere in relazione all’introduzione della gerarchia tra ruoli riguarda l’attivazione di questi ultimi. Il problema sembra banale, ma si vedrà nei paragrafi seguenti come questa scelta abbia delle ripercussioni anche su altri elementi del modello. Quando un utente attiva un determinato ruolo all’interno di una sua sessione è necessario decidere se attivare anche i ruoli dai quali esso discende oppure no. Entrambe le scelte possono trovare delle giustificazioni plausibili in base al contesto applicativo di interesse. Nel primo caso si può pensare che, se un utente cerca di attivare il permesso relativo ad un certo ruolo, avrà in seguito bisogno di utilizzare anche i permessi dei ruoli padri, in quanto completano il quadro delle attività che l’utente solitamente svolge. Attivando in un unico momento tutta la gerarchia dei ruoli da cui discende quello esplicitamente richiesto, il sistema viene sgravato di un buon carico di lavoro, poiché non deve ripetere più volte il processo di attivazione. Nel secondo caso invece questa ottimizzazione prestazionale viene meno, ma l’aderenza al principio del minimo privilegio è maggiore, in quanto non si verifica mai un’attivazione di permessi non esplicitamente richiesti e ogni utente ha in un preciso istante soltanto i privilegi di accesso che gli sono strettamente necessari. Considerazioni del tutto analoghe possono essere fatte nel caso di una gerarchia limitata. Anzi, questa osservazione dà modo di sottolineare il fatto che possono esistere anche delle soluzioni intermedie rispetto alle due appena prospettate. Ad esempio si può decidere di attivare in automatico solo parte della gerarchia dei ruoli padre secondo criteri di volta in volta differenti. Tuttavia questi meccanismi sempre più flessibili hanno come effetto collaterale una maggiore complessità del modello e conseguentemente un maggior carico di lavoro per il sistema. È bene dunque introdurre queste tecniche solamente in casi particolari, dove ce ne sia realmente bisogno. 6.2.2 Gerarchia e disattivazione dei ruoli Il problema inverso a quello precedente riguarda la disattivazione dei ruoli in presenza di una gerarchia. In particolare si deve scegliere se disattivare o meno i Pagina 86 ruoli padre ogni qualvolta viene disattivato un ruolo figlio. Vi possono essere diversi meccanismi per la disattivazione dei ruoli, tra i quali i seguenti risultano essere i principali: 1. i ruoli padri non vengono mai disattivati automaticamente in corrispondenza di una disattivazione di un ruolo figlio 2. un ruolo padre viene sempre disattivato automaticamente, ogni qualvolta un ruolo figlio viene disattivato 3. un ruolo padre viene disattivato in automatico solamente quando sono stati disattivati tutti i suoi ruoli figli 4. un ruolo padre viene disattivato automaticamente se e solo se era stato attivato a causa dell’attivazione di un ruolo figlio e quest’ultimo viene disattivato Ovviamente si potrebbe proseguire con l’elenco ed individuare meccanismi di disattivazione sempre più complessi, ma valgono le stesse considerazioni fatte in precedenza sul carico di lavoro, che si va a riversare sul sistema. Inoltre una gestione complessa di questi meccanismi, che sono basilari per il modello, potrebbe portare ad implementazioni non correttamente funzionanti, con falle di sicurezza dannose per l’intero sistema. NOTA: La scelta riguardo l’attivazione e la disattivazione (implicite o esplicite) dei ruoli padre non è semplicemente una questione tecnica, ma implica una visione differente circa il concetto di gerarchia ed ereditarietà. Se ad esempio ci si pone in un’ottica del tutto simile a quella di un linguaggio ad oggetti, l’attivazione dei permessi dei ruoli padri dovrebbe essere automatica, in quanto il ruolo figlio è visto come una specializzazione del padre e quindi ne ingloba tutte le funzionalità. Se invece si considerano i ruoli come semplici contenitori di permessi e se le relazioni gerarchiche fra di essi sono viste semplicemente come un modo per evitare di assegnare più volte gli stessi privilegi a ruoli differenti, allora non ci si deve scandalizzare se si decide di attivare i permessi di un ruolo alla volta, senza seguirne la gerarchia. Dunque l’ereditarietà è vista in questo caso come una Pagina 87 tecnica amministrativa e non funzionale, come al contrario accedeva in precedenza. 6.2.3 Gerarchia e separazione dei compiti L’impatto più evidente che una gerarchia tra ruoli ha sul modello RBAC è certamente quello relativo alla separazione dei compiti. Il fatto che i ruoli figli ereditino tutti i permessi dei padri complica notevolmente il processo di verifica dei vincoli statici e dinamici (SSD e DSD). Quando un ruolo viene inserito nella gerarchia dei discendenti di un altro ruolo, il sistema si deve assicurare che i vincoli relativi alla separazione dei compiti siano ancora rispettati. Per quanto riguarda la SSD il problema è stato affrontato da Kuhn nel 1997 [54]ed il risultato della ricerca si è concretizzato nelle formulazione delle seguenti proprietà: Proprietà 1. due ruoli possono essere mutuamente esclusivi solo se uno non eredita l’altro (direttamente o indirettamente). Proprietà 2. se ci sono due ruoli mutuamente esclusivi, non ce ne può essere un terzo che eredita da entrambi i relativi permessi. Proprietà 3. se è rispettata la SSD, allora lo è anche la DSD, in quanto se un utente è autorizzato a ricoprire solo uno dei due ruoli non potrà mai averli entrambi attivati contemporaneamente. Proprietà 4. se ci sono due ruoli mutuamente esclusivi, non può esistere all’interno del sistema un ruolo “root” che eredita i permessi di tutti gli altri ruoli. Con l’introduzione della DSD i problemi aumentano, in quanto le proprietà appena elencate non è detto che valgano ancora: dipende dalla modalità di attivazione dei ruoli che è stata scelta. Infatti se si decide di non attivare implicitamente anche i ruoli padre ogni volta che viene attivato un ruolo figlio, le prime due proprietà e la quarta perdono di veridicità. Nel primo caso, se due ruoli mutuamente esclusivi si ereditano (direttamente o indirettamente), uno dei due può essere tranquillamente attivato senza coinvolgere Pagina 88 l’altro. Se successivamente l’utente dovesse cercare di attivare l’altro ruolo, i vincoli DSD verrebbero controllati e, in base alla politica scelta, il primo verrebbe disattivato per poter attivare il secondo. Per quanto riguarda la seconda proprietà, se ci sono due ruoli mutuamente esclusivi, ce ne può comunque essere un terzo che eredita da entrambi i permessi. Infatti, quando quest’ultimo viene attivato, nessuno dei due ruoli mutuamente esclusivi viene coinvolto e non si crea alcun conflitto. Non ci sono problemi nemmeno se uno di questi due ruoli viene attivato in un secondo momento; se infine si cerca di attivare anche il secondo, allora si dovrà procedere alla disattivazione del primo per non violare il vincolo DSD. Infine valgono considerazioni del tutto analoghe per la quarta proprietà. Infatti può esistere ed essere attivato un ruolo “root”, se questo non comporta l’attivazione automatica di tutti gli altri ruoli, fra i quali alcuni mutuamente esclusivi. La terza proprietà rimane invece sempre valida. È ovvia ma molto importante, poiché mette in luce il fatto che la separazione statica dei compiti semplifica di molto il funzionamento del sistema. Infatti il controllo dei vincoli deve essere effettuato solo una volta all’avvio, in quanto durante l’esecuzione non accadrà mai che un utente possa attivare ruoli mutuamente esclusivi, in quanto non gli sono stati assegnati. Tutte le proprietà rimangono invece valide qualora sia fatta la scelta opposta, ovvero quella di attivare tutti i ruoli padri assieme al figlio. In questo caso i vincoli DSD verrebbero violati e non sarebbe possibile portare a termine il processo di attivazione. Per risolvere queste situazioni di conflitto è possibile fare due scelte: 1. non supportare l’RBAC gerarchico e la DSD contemporaneamente. 2. effettuare un’attivazione selettiva dei ruoli padri, che non causano violazioni dei vincoli DSD. La seconda opzione può sembrare risolutiva, ma nasconde il fatto che bisogna comunque definire una politica per selezionare quale ruolo padre si deve attivare fra quelli che sono in conflitto. Il problema non è di facile soluzione e deve essere affrontato per ogni caso specifico. Pagina 89 Come ultima considerazione rimane da sottolineare il fatto che la violazione di una delle proprietà appena discusse, anche nei casi in cui è possibile bypassarle, può essere sintomo di una cattiva configurazione del sistema, a meno che non sia stata prevista e studiata attentamente. 6.2.4 Gerarchia e permessi Un tentativo per risolvere i problemi che insorgono con l’introduzione dell’RBAC gerarchico è stato fatto nel 2003 da Crampton [85], il quale propone di alterare il meccanismo di ereditarietà dei permessi. Secondo questa architettura, quando un ruolo discende da un altro non è detto, che possa ereditare tutti i permessi di quest’ultimo. I permessi vengono dotati di un “verso” che definisce la loro “ereditabilità”. Infatti l’insieme dei permessi viene suddiviso in tre classi disgiunte: 1. P+: permessi che si possono ereditare dal padre al figlio 2. P-: permessi che si possono ereditare dal figlio al padre 3. P0: permessi che non si possono ereditare In questo modo è possibile definire gerarchie anche complesse, evitando di creare conflitti con altri vincoli, in particolare quelli di separazione dei compiti. Si noti inoltre il fatto che questo schema ingloba l’RBAC classico, che era composto solamente dai permessi di tipo P+. Un esempio renderà il tutto più chiaro. Prendiamo due permessi p1 e p2 ed associamoli a due ruoli, rispettivamente r1 ed r2. Se i permessi sono di tipo P+ avremo la situazione classica dell’RBAC gerarchico, dove un ruolo r3 eredita tutti i permessi dai padri r1 ed r2, dando luogo ad eventuali conflitti qualora r1 ed r2 fossero mutuamente esclusivi. La figura seguente mostra la situazione appena illustrata. Pagina 90 figli • p1, p2 ∈ P+ • (p1, r1) ∈ PA • (p2, r2) ∈ PA Albero rovesciato padri Figura 6-1. Interpretazione standard dei permessi RBAC Se al contrario si definisce p1 come appartenente alla classe P-, allora sarà possibile creare un ruolo r3 e farlo discendere sia da r1 che da r2, senza violare alcun vincolo di separazione dei compiti, in quanto p2 non sarà attivabile da r3. La figura seguente chiarisce il concetto appena espresso. figli • p1 ∈ P+ • (p1, r1) ∈ PA • p2 ∈ P• (p2, r2) ∈ PA Albero rovesciato padri Figura 6-2. Modello dei permessi RBAC modificato La classe cui appartiene un permesso può essere interpretata in due modi differenti: 1. La classificazione dei permessi non è altro che un vincolo che altera la gerarchia tra ruoli (e questo era già stato previsto dallo standard RBAC proposto dal NIST). Pagina 91 2. La classificazione dei permessi è una vincolo di attivazione posto direttamente sui permessi assegnati ai differenti ruoli del modello. Anche se ad una prima analisi la prima interpretazione può sembrare quella più corretta, in realtà lo è la seconda, in quanto la gerarchia è fra ruoli e non fra permessi, quindi non viene alterata. L’azione di questi nuovi vincoli è invece direttamente sui permessi. Si discuterà comunque più avanti di questa tipologia di vincoli in modo più approfondito. Un’ultima considerazione riguarda invece le modifiche che dovrebbe subire il modello per poter gestire le classi di permessi. Il problema riguarda i permessi di classe P-, ovvero quelli attivabili nel senso inverso a quello delle normali relazioni di ereditarietà. In questo caso un ruolo padre dovrebbe poter attivare un permesso di un ruolo figlio, ma ciò non avviene mai secondo il processo di attivazione dell’RBAC standard. Sarebbe dunque necessario modificare questo meccanismo, in modo tale da ricercare i permessi a disposizione di un utente non solo tra i ruoli assegnatigli esplicitamente ed i ruoli padri, ma anche tra i ruoli figli. Ovviamente valgono anche in questo caso le stesse considerazioni fatte in precedenza, per cui introdurre maggiore complessità nel modello comporta un carico di lavoro maggiore per il sistema, che deve essere evitato, se non nei casi in cui è strettamente necessario. 6.3 Separazione dei compiti e permessi Anche in assenza di gerarchia uno stesso permesso può essere assegnato a più ruoli e se questo permesso è determinante per la mutua esclusione di due ruoli, possono nascere problemi dovuti alla violazione dei vincoli di separazione dei compiti. Nel 1997 Kuhn [54] ha fornito un classificazione delle diverse modalità con cui i privilegi possono essere condivisi tra i ruoli mutuamente esclusivi e tutti gli altri ruoli: 1. D/D (disjoint / disjoint): un permesso assegnato ad un ruolo coinvolto in un vincolo di mutua esclusione non può essere assegnato né all’altro ruolo mutuamente esclusivo, né a nessun altro ruolo. Pagina 92 2. D/S (disjoint / shared): un permesso assegnato ad un ruolo coinvolto in un vincolo di mutua esclusione non può essere assegnato all’altro ruolo mutuamente esclusivo, ma può essere assegnato ad un altro ruolo non coinvolto nel vincolo di mutua esclusione. 3. S/D (shared / disjoint): un permesso assegnato ad un ruolo coinvolto in un vincolo di mutua esclusione può essere assegnato all’altro ruolo mutuamente esclusivo (ci deve essere ovviamente almeno un permesso differente tra i due ruoli!), ma non può essere assegnato ad alcun altro ruolo non coinvolto nel vincolo di mutua esclusione. 4. S/S (shared / shared): un permesso assegnato ad un ruolo coinvolto in un vincolo di mutua esclusione può essere assegnato sia all’altro ruolo mutuamente esclusivo, sia a qualsiasi altro ruolo. La condizione di sicurezza che deve essere verificata consiste ovviamente nell’impedire ad uno stesso utente di vedersi assegnare dei privilegi che creano un conflitto di interesse e che quindi fanno da discriminante per l’individuazione di ruoli mutuamente esclusivi. Lo studio si concentra sulla prima e sulla quarta configurazione, che vengono definite rispettivamente esclusione completa (complete esclusion) ed esclusione parziale (partila exclusion). L’analisi effettuata da Kuhn ha prodotto i seguenti due importantissimi risultati: 1. l’esclusione completa è una condizione necessaria e sufficiente per il rispetto della condizione di sicurezza. 2. l’esclusione parziale è una condizione necessaria ma non sufficiente per garantire la condizione di sicurezza. 6.4 I permessi in un sistema ad oggetti Fino ad ora si sono analizzate alcune problematiche relative alla corretta configurazione dei permessi in un sistema di controllo d’accesso basato su ruoli. Non si è però ancora posto il problema relativo alle entità che i privilegi d’accesso vogliono proteggere. Si è detto che un permesso non è altro che un’operazione che si può eseguire su un oggetto del sistema, ma è necessario definire con precisione cosa si intende per quest’ultimo. Pagina 93 Per rispondere a questa domanda bisogna prima di tutto definire il contesto in cui deve funzionare il meccanismo di controllo d’accesso che si desidera implementare. In un sistema in cui gli oggetti sono tutti statici il problema non si pone, basta associare ad ognuno di essi un identificativo ed il gioco è fatto. In un sistema ad oggetti, invece bisogna distinguere tra classi ed istanze. Ovviamente vi possono essere tre alternative: 1. Si gestiscono permessi relativi solamente alle classi: in questo caso tutte le istanze di oggetti appartenenti alla stessa classe godranno degli stessi permessi e l’identificativo sarà il nome della classe. 2. Si dettagliano i permessi a livello delle singole istanze: in questo caso sarà necessario dare un identificativo ad ognuna di queste ultime. 3. Si sceglie una soluzione ibrida, in cui si possono gestire permessi sia riferiti alle singole istanze, che alle classi di oggetti. Vi possono essere due sottocasi: a. Gli identificativi sono misti ed il sistema non si preoccupa se sono riferiti ad un’istanza o a una classe. b. Si crea una sorta di gerarchia a due livelli di permessi, per cui alcuni permessi sono a livello di classe ed altri a livello di istanza. La prima soluzione è senza dubbio la più semplice, ma anche la meno flessibile. La seconda alternativa è tuttavia troppo specializzata e richiederebbe uno sforzo di configurazione notevole, se non addirittura insostenibile. Infatti per definire semplicemente un permesso di classe, come nel caso precedente, ora sarebbe necessario specificarlo per ogni singola istanza di oggetti facenti parte della stessa classe. Ciò ovviamente non è accettabile, quindi si deve necessariamente ricorrere alla terza soluzione, scegliendo una delle due proposte. La prima è più facilmente gestibile, in quanto il controllo RBAC viene effettuato basandosi semplicemente su un nome identificativo, senza preoccuparsi che si tratti di classe o istanza. Il secondo invece è più articolato, ma anche più flessibile. Pagina 94 6.5 Aggiunta e rimozione di elementi del modello Ulteriori problemi insorgono allorquando si eliminano elementi (entità e relazioni) dal sistema di controllo RBAC. Se ciò avviene a sistema non in funzione, ovviamente non vi sono particolare ripercussioni, ma ciò accade molto raramente. Nella maggior parte dei casi questi cambiamenti avvengono con il sistema attivo e con utenti che vi stanno lavorando. I casi principali da analizzare sono i seguenti: 1. Eliminazione di un utente 2. Eliminazione di un ruolo 3. Eliminazione di un permesso 4. Eliminazione dell’appartenenza di un utente ad un ruolo 5. Eliminazione di un relazione gerarchica 6. Eliminazione dell’assegnazione di un permesso ad un ruolo Quando si elimina un utente si deve decidere se annullare o meno le sessioni attive di quest’ultimo. La scelta ovviamente deve essere fatta in base al contesto applicativo e alle implicazioni di sicurezza che essa comporta. Come linea generale l’alternativa migliore da questo punto di vista è sicuramente la terminazione immediata di tutte le sessioni attive dell’utente cancellato. Un discorso analogo vale per le altre eliminazioni elencate. Nel caso dell’eliminazione di un ruolo o di una relazione di appartenenza di uno o più utenti ad un ruolo la scelta riguarda sempre la disattivazione di quest’ultimo in tutte le sessioni in cui esso sia attivo. Se invece ad essere cancellati sono un permesso o l’assegnazione di quest’ultimo ad uno o più ruoli, è necessario stabilire se questo va immediatamente eliminato anche dai ruoli attivi oppure no. Infine per quanto riguarda l’eliminazione di una relazione gerarchica è necessario decidere se disattivare o meno i ruoli attivati sfruttando l’ereditarietà. Come sempre la soluzione migliore dal punto di vista della sicurezza è la disattivazione immediata dei ruoli e dei permessi eliminati o dei quali si è revocata l’autorizzazione. Pagina 95 6.6 I vincoli Uno tra i problemi più articolati, che si devono affrontare nella progettazione di un sistema RBAC, è la definizione dei vincoli che si desidera supportare. I vincoli previsti dallo standard RBAC proposto dal NIST sono sostanzialmente di due tipi: vincoli di separazione dei compiti e vincoli gerarchici. I primi sono sia statici che dinamici, mentre i secondi solamente statici. In generale, anche se queste tipologie di vincoli sono indubbiamente essenziali per effettuare un buon controllo d’accesso, molte applicazioni richiedono di effettuare anche altre verifiche per garantire o meno l’accesso alle risorse del sistema. Ad esempio si possono introdurre dei controlli basati sull’istante temporale in cui un permesso viene richiesto, oppure si possono autorizzare solamente le transazioni “ben formate” secondo un modello definito a priori, che tipicamente stabilisce chi può fare che cosa su un oggetto di sistema e l’ordine secondo cui le diverse operazioni possono essere effettuate. A dimostrazione di quanto detto, si portano come esempio un modello di RBAC che espande quello originale aggiungendovi un serie di vincoli temporali, il GTRABC (Generalized Temporal RBAC), ed un diverso tipo di vincoli di separazioni dei compiti, non più statici o dinamici, ma storici. 6.6.1 GTRBAC (Generalized Temporal RBAC) Nel 2001 Bertino, Monatti e Ferrari [73] proposero un nuovo modello di controllo d’accesso basato su ruoli dotato di alcune interessanti caratteristiche aggiuntive relative a vincoli temporali: il TRBAC (Temporal RBAC). Questo modello venne poi ripreso e modificato nel 2002 da Bertino, Latif, e Ghafoor, che diedero vita al GTRBAC (Generalized Temporal RBAC)[87]. I vincoli temporali sono richiesti in applicazioni che richiedono il monitoraggio di operazioni “time-sensitive”, come ad esempio i sistemi di “workflow management” WFMSs (WorkFlow Mnagement Systems). Questo però non è l’unico ambito in cui essi possono risultare utili. Infatti ad esempio in alcune applicazioni bancarie può essere necessario vietare ad un certo utente di assumere i privilegi appartenenti un determinato ruolo al di fuori dell’orario lavorativo. Pagina 96 Una descrizione dettagliata del modello esula dagli scopi della presente tesi, tuttavia è utile dare un’idea di quanti e quali vincoli siano stati introdotti rispetto allo standard RBAC originale. A questo scopo è importante ricordare la distinzione tra i concetti di abilitazione ed attivazione di un ruolo: a) Secondo il modello GTRBAC un utente è abilitato ad un ruolo, se ha la possibilità di attivarlo: non è dunque sufficiente aver assegnato un ruolo per attivarlo, ma bisogna anche esserne abilitati. b) Un ruolo è invece attivo se è stato utilizzato da almeno un utente all’interno di una sua sessione. I vincoli che è possibile specificare in un sistema di controllo d’accesso GTRBAC sono i seguenti: 1. vincoli temporali sull’abilitazione e la disabilitazione dei ruoli: specificano l’inizio e la fine dell’intervallo temporale all’interno del quale un ruolo è abilitato per un utente, oppure la durata dello stesso. 2. vincoli temporali sugli assegnamenti utente-ruolo e permesso-ruolo: specificano gli estremi dell’intervallo durante il quale un utente o un permesso sono assegnati ad un ruolo, oppure la durata dello stesso. 3. vincoli di attivazione: specificano la durata dell’attivazione di un ruolo da parte di un utente, ma anche gli intervalli temporali in cui essa è consentita. Sono infine presenti le seguenti caratteristiche aggiuntive: 4. eventi run-time: è possibile definire degli eventi di sistema GTRBAC, che rendono operativi i vincoli di durata e di attivazione 5. espressioni di attivazione dei vincoli: si possono utilizzare delle espressioni, che permettono di attivare i vincoli precedentemente definiti 6. triggers: permettono di esprimere relazioni di dipendenza tra eventi GTRBAC 6.6.2 La separazione dei compiti storica Un altro esempio di vincoli che non sono inclusi nello standard RBAC del NIST sono quelli relativi alla separazione dei compiti storica. Quest’ultima si Pagina 97 differenzia dalla separazione dei compiti statica e dinamica poiché tiene traccia degli eventi passati del sistema. Un esempio renderà più chiaro il concetto: • Separazione dei compiti statica: “nessun utente può avere la possibilità di accedere sia al file1 che al file2”. • Separazione dei compiti dinamica: “nessun utente può avere accesso contemporaneamente al file1 e al file2”. • Separazione dei compiti storica: “nessun utente può avere avuto l’accesso sia al file1 che al file2”. Secondo la separazione dei compiti storica un utente può dunque accedere al file1 se e solo se non ha mai avuto accesso al file2 e viceversa. Si comprende dunque come la separazione dei compiti storica sia un vincolo più restrittivo di quella dinamica, in quanto tiene anche traccia degli accesi passati dell’utente, ma meno restrittivo di quella statica, poiché un utente può comunque scegliere al primo accesso quale file utilizzare. 6.6.3 Tassonomia dei vincoli Essendo impossibile presentare tutte le varianti dei modelli RBAC oggi presenti, si è cercato di definire una tassonomia di tutti i vincoli, o quantomeno della maggior parte dei vincoli, che un sistema di controllo d’accesso basato su ruoli può supportare. I vincoli vengono classificati nelle seguenti categorie: 1. vincoli di separazione dei compiti 2. vincoli di cardinalità 3. vincoli temporali 4. vincoli transazionali/operazionali 5. vincoli di prerequisito Le prima categoria, ovvero la separazione dei compiti, non necessita di particolari spiegazioni, in quanto è già stata ampiamente discussa nei capitoli precedenti. I vincoli di cardinalità invece pongono dei limiti sul numero massimo e minimo di certe entità e relazioni del modello. Ad esempio si può imporre che il numero Pagina 98 massimo di ruoli assegnati ad un utente sia maggiore di uno e minore di otto, oppure si può voler impedire ad un utente di creare più di nove sessioni, e cos’ via. I vincoli temporali intervengono sulle entità e le relazioni del modello ponendo dei limiti temporali di durata o di intervallo. Sono i vincoli di cui si è diffusamente parlato nel paragrafo precedente. I vincoli transazionali (o operazionali) permettono di autorizzare certe operazioni su un oggetto del sistema solamente se esse rispettano una certa sequenza definita a priori. Una transazione viene intesa come una sequenza di operazioni compiute su di un oggetto e, se questa sequenza rispetta certi vincoli, allora viene definita “transazione ben formata”. Ad esempio si può imporre che su un oggetto di tipo transazione bancaria la richiesta di pagamento sia eseguita da un utente dotato del ruolo di impiegato e che essa sia successivamente autorizzata da un diverso utente con il ruolo di direttore. I vincoli di prerequisito sono infine dei vincoli che impongono di possedere già una determinata caratteristica per potersene vedere assegnata un’altra. Ad esempio si può vietare di assegnare ad un utente il ruolo di manager se non possiede già quello di semplice impiegato. Allo stesso modo si può imporre che un utente non possa attivare il ruolo di direttore se non ha già attivato quello di cassiere. Esempi simili possono essere fatti sull’assegnazione dei permessi ai ruoli. Ognuna delle categorie di vincoli appena descritte può essere ulteriormente classificata secondo due dimensioni: 1. dimensione temporale del vincolo 2. target del vincolo La dimensione temporale del vincolo sta ad indicare quanto la validità di un vincolo perdura nel tempo e ciò si riflette sul momento in cui quest’ultimo deve essere verificato. Vi sono tre tipologie possibili: 1. vincoli statici 2. vincoli dinamici 3. vincoli storici Pagina 99 I vincoli statici devono essere sempre verificati, anche quando il sistema non è in funzione. I vincoli dinamici devono essere verificati dal sistema durante il suo funzionamento. I vincoli storici vengono verificati anch’essi durante il funzionamento del sistema, ma tengono conto anche delle operazioni eseguite nel passato. Ne sono un perfetto esempio i vincoli di separazioni dei compiti statici, dinamici e storici, dei quali si è discusso in precedenza. Va sottolineato il fatto che non tutte le categorie di vincoli precedentemente illustrate possono essere sia statiche, che dinamiche e storiche. I vincoli temporali possono essere solo dinamici o storici, mentre i vincoli transazionali sono per loro natura solamente storici. La tabella seguente riporta le dimensioni temporali di ogni singola categoria di vincoli. Dimensione temporale Statico Dinamico Storico 3 3 3 Cardinalità 3 3 3 Temporali X 3 3 X X 3 3 3 3 Separazione dei Categoria compiti Transazionali / Operazionali Prerequisito Tabella 6-1. Categorie di vincoli e dimensione temporale Il target del vincolo rappresenta invece l’oggetto, il bersaglio, delle limitazioni che esso impone. In particolare per un sistema RBAC si possono individuare i seguenti possibili target: 1) relazioni del modello, ovvero: a. UA b. PA c. RH d. User_session Pagina 100 e. Session_roles 2) entità del modello, ovvero: a. utenti b. ruoli c. oggetti d. operazioni e. permessi f. sessioni 3) altri vincoli Va sottolineato il fatto che i vincoli sulle relazioni e sulle entità del modello possono inserirsi sia nella fase di attivazione o creazione, che in quella di disattivazione o eliminazione delle stesse. Inoltre Per quanto riguarda le entità del modello, va ricordato che è possibile specificare vincoli che abbracciano ad esempio tutti gli utenti oppure solo uno specifico utente. Varia dunque quella che viene definita la granularità del target. Infine un’ultima considerazione va fatta in merito ai vincoli che hanno come target altri vincoli. Ci si trova ad esempio nel caso in cui si vuole attivare un vincolo di separazione dei compiti dinamica su due ruoli solamente in un certo intervallo temporale. Si tratta dunque di un vincolo temporale che ha come target un vincolo di separazione dei compiti. Ovviamente queste tipologie di vincoli sono piuttosto complesse da supportare e le applicazioni in cui esse sono realmente indispensabili non sono numerose. 6.6.4 I vincoli in un sistema ad oggetti Nella classificazione appena fornita sono stati indicati come possibili target di un vincolo gli oggetti del sistema. Va dunque sottolineato il fatto che, così come per i permessi, il target di un vincolo può essere sia un’intera classe di oggetti, che una singola istanza. Le alternative tra cui scegliere sono le medesime di quelle presentate in relazione ai permessi, ovvero si possono avere: 1. vincoli solo a livello di classe 2. vincoli solo a livello di istanza 3. vincoli ibridi Pagina 101 Si rimanda al paragrafo 6.4 per la spiegazione dettagliata delle tre varianti. È invece utile sottolineare a questo punto il fatto che, poiché ogni oggetto del sistema deve avere un nome univoco, è necessario effettuare lo stesso tipo di scelta sia per i permessi che per i vincoli. Questi infatti faranno riferimento allo stesso insieme di etichette, che rappresenteranno le istanze o le classi degli oggetti a seconda dell’alternativa messa in atto. 6.7 Il formato dei vincoli Dopo aver determinato l’insieme dei vincoli che si vogliono supportare è necessario stabilire anche come essi possono essere specificati dall’amministratore di sistema. Lo standard RBAC del NIST non si preoccupa di definire il formato dei vincoli, probabilmente perché viene considerato un aspetto maggiormente legato all’implementazione del modello e non al modello stesso. Per quanto questa logica di pensiero possa essere condivisibile, risulta utile a questo punto fornire un breve resoconto circa lo stato dell’arte della standardizzazione dei formati dei vincoli in un sistema di controllo d’accesso basato su ruoli. Va subito detto che ad oggi non esiste ancora uno standard universalmente riconosciuto, che definisca il formato di tutti i possibili vincoli di un sistema RBAC. Tuttavia alcuni tentativi più o meno autorevoli sono stati fatti in questa direzione negli ultimi anni ed hanno prodotto risultati interessanti. La maggior parte di essi utilizza il formato XML per la specifica dei vincoli. La motivazione principale di questa scelta va ricercata nel fatto che gli ambienti di tipo enterprise altamente distribuiti sono composti da entità eterogenee, che devono collaborare tra loro e scambiarsi dati in un formato universalmente comprensibile. Il formato XML, essendo indipendente dal fornitore, fornisce una rappresentazione uniforme dei dati e semplifica dunque la loro condivisione tra sistemi eterogenei. Una scelta di questo tipo è stata fatta ad esempio per la definizione dell’XGTRBAC (XML-based GTRBAC) [88], uno standard proposto nel 2003 da Bhatti, Bertino e Ghafoor per la rappresentazione dei vincoli temporali del controllo d’accesso di tipo GTRBAC, del quale si è parlato in precedenza. Pagina 102 Un altro importante standard, che definisce il formato dei vincoli di un sistema di controllo d’accesso è l’XACML (eXtensible Access Control Markup Language), al quale è dedicato il prossimo paragrafo. 6.7.1 XACML 2.0 (eXtensible Access Control Markup Language) L’XACML [90] è un linguaggio basato sullo standard XML, che è stato a sua volta standardizzato dall’OASIS (Organization for the Advancement of Structured Information Standards). La sua breve storia inizia nel 2003, anno in cui viene definita la sua prima versione dalla 1.0 alla 1.2. Lo standard ha un buon successo ed è implementato da diverse software-house, tra le quale ricordiamo le seguenti: • Parthenon Computing (ex. Jiffy Software): Parthenon XACML Evaluation Engine • Sun Microsystems: Sun's XACML Open Source Implementation • Lagash Systems: XACML.NET • University of Murcia (UMU), Spain: Java-based XACML editor Lo standard evolve e nel febbraio 2005 viene definita la versione 2.0, del la quale non si conosce al momento alcuna implementazione di una certa rilevanza. L’XACML descrive i formati sia del linguaggio per definire le politiche di sicurezza (“policy language”), che del linguaggio per scrivere le interrogazioni da porre al sistema di controllo d’accesso ed ottenerne le risposte (“request/response language”). In un tipico scenario d’uso un soggetto vuole effettuare una certa operazione su una risorsa del sistema ed invia a quest’ultimo la una query opportunamente strutturata (tramite il request language). Il sistema, a seconda di come è stato configurato (tramite il policy language), prende le decisioni in merito alla richiesta dell’utente ed elabora la risposta (tramite il response language) che passa a quest’ultimo. I formati dei vincoli esprimibili mediante l’XACML sono piuttosto articolati, perciò si rimanda al documento ufficiale se si desidera averne una descrizione precisa e completa. Si vuole semplicemente sottolineare il fatto che lo standard è ancora lontano dall’assumere una connotazione stabile, tanto che si sta già lavorando alla terza versione, di conseguenza può non essere così vantaggioso Pagina 103 adottarlo, anche perché la sua complessità comporta tempi di sviluppo ed implementazione elevati. 6.7.2 La mutua esclusione Una nota particolare va fatta a proposito del formato dei vincoli di mutua esclusione, che permettono di supportare il principio della separazione dei compiti. Anche se fino ad ora è stato illustrato e portato ad esempio il solo modello RBAC proposto dal NIST, vi sono diversi modi per esprimere i vincoli di mutua esclusione. Infatti, a seconda di come viene interpretato il principio del minimo privilegio, in modo più o meno stringente e rigoroso, possono esistere diverse varianti nelle modalità di specifica dei relativi vincoli. Se il sistema vuole fornire la possibilità di esprimere la mutua esclusione tra un ruolo ed uno o più altri ruoli, possono essere individuati due differenti formati: 1. mutua esclusione specificata tramite insieme di ruoli: permette di elencare in un’unica istruzione un insieme di ruoli, dei quali uno soltanto può essere assegnato ad un singolo utente (o attivato dallo stesso se si tratta di separazione dei compiti dinamica). 2. mutua esclusione specificata tramite coppie di ruoli: permette di specificare una coppia di ruoli mutuamente esclusivi, ovvero che non possono essere assegnati o attivati contemporaneamente da uno stesso utente. Ad una prima e superficiale analisi si potrebbe pensare che i due diversi formati abbiano anche una differente espressività, ovvero che la specifica tramite coppie di ruoli non possa essere utilizzata per rappresentare tutti i vincoli, che possono essere definiti utilizzando l’altro formato. In realtà è possibile emulare i vincoli espressi tramite insiemi di ruoli, rendendo mutuamente esclusive tutte le possibili coppie di ruoli dell’insieme stesso. Per chiarire meglio il concetto vengono riportate nella seguente figura tutte le relazioni di mutua esclusione che devono essere definite su un insieme di cinque ruoli. Pagina 104 Figura 6-3. Esempio di mutua esclusione tra cinque diversi ruoli In generale, per definire la mutua esclusione su un insieme di n ruoli è necessario definire (n*(n – 1))/2 coppie di mutua esclusione. La scelta di una soluzione sull’altra è sicuramente influenzata dal numero di ruoli che si prevede possano essere definiti come mutuamente esclusivi. Se questo numero è limitato, allora avrà senso utilizzare la soluzione meno articolata delle coppie di ruoli, che semplifica la verifica del vincolo da parte del sistema. Al crescere di questo valore, sarà al contrario indicato l’utilizzo degli insiemi di ruoli mutuamente esclusivi, che pur complicando il lavoro di verifica effettuato dal sistema, semplificano notevolmente il processo di configurazione, che è invece a carico dell’amministratore. 6.7.3 La Blacklist di Crampton Un’ultima nota riguardo ai formati va spesa per i vincoli storici di separazione dei compiti. Come tutti i vincoli storici non è sicuramente agevole verificarne il rispetto, in quanto bisogna memorizzare in modo permanente gli eventi del sistema che interessano ed in seguito andarli ad utilizzare in modo efficiente ogni volta che è necessario. Pagina 105 Nel 2003 J. Crampton [89] ha proposto di utilizzare delle blacklist come supporto per i vincoli di separazione dei compiti storici. L’aspetto innovativo di questo approccio è il fatto che non vengono memorizzati tutti gli stati passati del sistema, ma in base agli eventi che si susseguono durante il suo funzionamento vengono computate e salvate direttamente le informazioni circa gli eventi futuri che non possono accadere. Questo sistema inoltre è applicabile anche ai vincoli di separazione dei compiti statica e dinamica. A seconda della relazione su cui si vuole imporre il vincolo si dovranno creare differenti black list: • I vincoli sulle relazioni di assegnazione tra utenti e ruoli generano delle liste di assegnazioni utente-ruolo proibite. • I vincoli sulle relazioni di assegnazione tra permessi e ruoli generano delle liste di assegnazioni permesso-ruolo proibite. • I vincoli che fanno riferimento ad un utente o un ruolo specifico e alle sue relazione di assegnazione con i permessi generano liste di permessi proibiti. Ogni volta che un utente cerca di attivare un ruolo o un permesso, il sistema, prima di dare l’autorizzazione a procedere, verifica che questi ultimi non siano presenti nelle opportune blacklist e al contempo aggiorna queste ultime qualora fosse necessario. Il procedimento appare più chiaro osservando l’esempio riportato nella figura seguente, che è stato tratto da alcune slide rese disponibili dallo stesso Crampton: Pagina 106 Figura 6-4. Esempio di utilizzo di blacklist I vincoli sono espressi mediante la tripla <scope, set, temporal context>. Lo “scope” indica se il vincolo si applica ad un utente o ad un ruolo in particolare, oppure a tutti gli utenti o i ruoli. Il “set” è l’insieme dei ruoli o dei permessi mutuamente esclusivi. Infine il “temporal context” sta ad indicare se il vincolo è statico (“static”), dinamico (“dynamic”) o storico (“historical”). All’inizio non vi è alcuna relazione UA (assegnazione utente-ruolo) e la lista delle assegnazioni utente-ruolo proibite (LUA) contiene la coppia <jason, r1> poiché lo impone il secondo vincolo statico. Quando viene assegnato all’utente mick il ruolo r1, viene aggiornata la lista delle assegnazioni utente-ruolo proibite inserendovi anche la coppia <mick, r2> a causa della presenza del primo vincolo statico. Nel momento in cui mick usa il permesso p1, il vincolo storico impone la creazione di una nuova blacklist relativa al solo mick (Lmick), contenente il permesso p2. Infine, qualora mick venisse privato del ruolo r1, la lista delle assegnazioni utente-ruolo proibite verrebbe aggiornata eliminando la coppia <mick, r2>, mentre la blacklist di mick rimarrebbe inalterata, poiché ad essa è applicato un vincolo storico. Pagina 107 CAPITOLO 7 ESTENSIONE DEL MODELLO: UNA PROPOSTA In questo capitolo viene descritto il modello RBAC proposto, che verrà successivamente implementato. L’architettura base da cui si è partiti è ovviamente lo standard di controllo d’accesso basato su ruoli definito dal NIST, che è stato rivisto, anche se non stravolto, apportandovi alcune modifiche laddove si riteneva necessario. Lo scopo infatti non è quello di creare un’alternativa allo standard originale, ma di perfezionarlo sempre più, in modo da creare un modello veramente universale, che possa adattarsi alle esigenze più disparate. Pagina 108 7.1 Premessa Come si è dimostrato nel capitoli precedenti, sono stati sviluppati in questi ultimi anni diversi modelli di RBAC per risolvere i più svariati problemi relativi al controllo d’accesso. Fino ad oggi sono stati ampiamente studiati ed implementati differenti sistemi, ognuno con caratteristiche specifiche per il contesto applicativo di interesse e sono stati riconosciuti i loro vantaggi per la gestione e l’amministrazione di sistemi specialmente su larga scala. Quello che in passato è mancato è stata la caratterizzazione di un modello general purpose universalmente riconosciuto per la gestione del controllo d’accesso basato su ruoli. La mancanza di una definizione unica ed autorevole ha portato come risultato una certa confusione circa il significato e l’utilità dell’RBAC. Sicuramente gli sforzi compiuti dal NIST (National Institute of Standards and Technology) in questi ultimi anni hanno dato una forte spinta in questa direzione, ma la presenza di numerose varianti del modello originale dimostra che il processo di standardizzazione non è affatto terminato. In questo capitolo si vuole dunque fornire un’accurata descrizione di uno standard RBAC general purpose, che prenda spunto dai modelli base più diffusi, sia per quanto riguarda quelli già in uso in diversi prodotti commerciali, sia quelli più stimati nell’ambito della ricerca, anche se ancora in fase prototipale. Lo standard presentato nei paragrafi successivi prende vita dai documenti sul controllo d’accesso basato su ruoli prodotti dal NIST, apportandovi, laddove si ritengono necessarie, alcune modifiche, senza però stravolgerne l’essenza, in modo da non produrre un’ulteriore meteora nella molteplicità dei modelli RBAC già studiati ed implementati. Lo scopo infatti non è quello di creare un’alternativa allo standard originale, ma di perfezionarlo sempre più, in modo da creare un modello veramente universale, che possa adattarsi alle esigenze più disparate. 7.2 L’architettura Per prima cosa è necessario definire l’architettura del modello, ovvero occorre elencare e descrivere le entità che lo compongono e le relazioni che intercorrono tra di esse. Pagina 109 Come anticipato la base di partenza è il modello RBAC proposto dal NIST. Per comodità di consultazione quest’ultimo viene riportato nella figura seguente. Figura 7-1. Modello RBAC del NIST Dopo un’attenta analisi appare evidente che il modello del NIST, apparentemente semplice, chiaro e conciso, contenga in realtà una complessità intrinseca, derivante dal voler catturare in un’unica architettura sia la sua parte statica, che quella dinamica. Le relazioni UA (assegnazione di un utente ad un ruolo), PA (assegnazione di un permesso ad un ruolo) ed RH (relazioni gerarchiche fra ruoli) sono senza dubbio statiche, ovvero non cambiano durante la vita del sistema. Viceversa le relazioni user_sessions (relazioni tra un utente e le relative sessioni) e session_roles (relazioni tra una sessione ed i ruoli da essa attivati) vanno a costituire la parte dinamica dell’architettura. Questa distinzione è applicabile non solo alle relazioni, ma anche alle entità del modello. Infatti le sessioni (in figura: SESSIONS) non hanno alcun senso di esistere nella parte statica e trovano la loro corretta collocazione soltanto in quella dinamica. Tutte le altre entità invece possono essere inserite in entrambi gli ambiti, ma ovviamente sono legate fra loro da relazioni differenti. Pagina 110 È dunque necessario dividere l’architettura del modello in due parti, una statica ed una dinamica, ognuna delle quali dotata di entità e relazioni specifiche. Il principio da seguire in questo caso è il famoso “divide et impera”, infatti ogni sotto-modello risulta più semplice di quello globale e quindi più facilmente comprensibile e gestibile. Inoltre si potrà notare leggendo i prossimi paragrafi come questa suddivisione metta in luce una lacuna dell’architettura originale, che verrà dunque ristrutturata. 7.2.1 Parte statica La figura seguente riporta l’architettura statica del modello, dove U rappresenta l’insieme degli utenti, R quello dei ruoli e P quello dei permessi, che unifica oggetti ed operazioni, mentre UA, PA ed RH sono rispettivamente le relazioni di assegnazione di un utente ad un ruolo, di un permesso ad un ruolo e di gerarchia fra ruoli. RH U UA R PA P Figura 7-2. Architettura statica dello standard NIST Come si sarà certamente notato la parte statica del modello è molto semplice ed è ottenuta selezionando correttamente le opportune entità e relazioni dallo standard RBAC del NIST. Per la descrizione dettagliata delle entità e delle relazioni in gioco si rimanda dunque al relativo capitolo. Il modello proposto non modifica dunque la parte statica dell’architettura originale. Tuttavia è possibile apportare a quest’ultimo una piccola miglioria esplicitando la relazione esistente tra utente e ruoli di default, che viene definita staticamente, ma che viene poi utilizzata a livello dinamico ogni volta che un utente crea una nuova sessione. Pagina 111 La figura seguente introduce rispetto alla precedente la relazione “default_roles”, che lega un utente ai suoi ruoli di default e dunque illustra l’architettura statica del modello RBAC proposto. RH UA U R PA P Default_roles Figura 7-3. Architettura statica del modello proposto 7.2.2 Parte dinamica Per quanto riguarda l’architettura dinamica del modello è utile osservare per prima cosa come essa era strutturata nello standard proposto dal NIST, anche se come detto in precedenza non viene espressa in modo esplicito. La figura seguente mostra appunto l’architettura della parte statica del modello RBAC originale, in cui U rappresenta l’insieme degli utenti, S quello delle sessioni ed R quello dei ruoli, mentre user_sessions e session_roles sono rispettivamente le relazioni tra un utente e le sue sessioni e quelle tra una sessione ed i ruoli in essa attivi. U User_sessions S Session_roles R Figura 7-4. Architettura dinamica dello standard NIST Osservando la figura e confrontandola con la precedente, ovvero quella relativa alla parte statica del modello, si possono notare due principali differenze: 1. l’aggiunta dell’entità S (Sessioni) 2. la mancanza dell’entità P (Permessi) Pagina 112 Per quanto riguarda le sessioni è ovvio il fatto che esse possano esistere soltanto a livello dinamico, in quanto vengono create e distrutte dall’utente durante il funzionamento del sistema. In realtà la loro presenza non sarebbe strettamente necessaria, in quanto una sessione non è altro che una sorta di contenitore di ruoli attivi, ma i vincoli di attivazione dei ruoli vanno verificati contemporaneamente su tutte le sessioni create dallo stesso utente, quindi queste ultime si potrebbero considerare di fatto come un’unica entità che rappresenta l’utente dal punto di vista dinamico. Il concetto di sessione diventa invece utile quando il sistema di controllo d’accesso basato su ruoli deve essere integrato in un altro sistema che ne prevede l’uso. In questo caso risulta vantaggioso avere una corrispondenza uno a uno tra le sessioni RBAC e quelle dell’ambiente in cui esso è inserito. La mancanza dei permessi a livello dinamico è invece la lacuna del modello RBAC originale di cui si parlava in precedenza. Il fatto di non inserire i permessi nella parte dinamica dell’architettura pone un limite alle tipologie di vincoli che il modello può supportare, alcune delle quali sono di notevole interesse per diverse applicazioni. Il modello dinamico proposto introduce dunque l’entità P (Permessi) e la relazione “role_permission”, che lega un ruolo ai permessi da esso attivati durante il funzionamento del sistema. Questo processo viene definito appunto “attivazione dei permessi” per simmetria rispetto a quello di attivazione dei ruoli e di esso si parlerà più approfonditamente nel prossimo paragrafo. La figura seguente mostra il risultato della modifica architetturale appena illustrata. U User_sessions S Session_roles R Role_permissions P Figura 7-5. Architettura dinamica del modello proposto Infine la figura che segue mostra la variante del modello proposto descritta in precedenza, secondo la quale le sessioni utente vengono riunite in un’unica entità, Pagina 113 che raccoglie tutti i ruoli attivati dall’utente stesso durante il funzionamento del sistema. U/S Session_roles R Role_permissions P Figura 7-6. Variante della parte dinamica del modello Come si può vedere l’entità U/S, ovvero user/sessions, viene collegata direttamente a quella dei ruoli (R) tramite la solita relazione session_roles, la cui semantica rimane invariata. Questa variante del modello mette in evidenza la corrispondenza diretta che c’è tra le relazioni e le entità dell’architettura statica e di quella dinamica, come è mostrato nella seguente tabella. Architettura Statica Architettura Dinamica UA Session_roles PA Role_permissions U U/S R R P P Tabella 7-1. Corrispondenze tra architettura statica e dinamica Le relazioni statiche di assegnazione di un utente e di un permesso ad un ruolo trovano dunque i corrispettivi in ambito dinamico nei processi di attivazione dei ruoli e dei permessi. 7.3 L’attivazione dei permessi Come sottolineato nel paragrafo precedente, quello che manca allo standard proposto dal NIST è l’attivazione dei permessi. Di tutte le entità che compongono il modello (utenti, ruoli, permessi e sessioni) l’unica che può essere attivata è il Pagina 114 ruolo, ma questa è una semplificazione eccessiva, che non permette di supportare alcuni tipi di vincoli. È dunque necessario introdurre un meccanismo che dia la possibilità di attivare singolarmente ogni permesso. Lo standard del NIST permette di definire solamente vincoli statici sulla relazione PA (assegnazione dei permessi), che possono impedire di assegnare un permesso ad un ruolo. Quando però questo accade, ogni volta che un ruolo viene attivato, lo sono di conseguenza anche i relativi permessi, in quanto non è possibile introdurre vincoli aggiuntivi su questi ultimi. Si può inoltre affermare che a livello dinamico i permessi vengono utilizzati come dei semplici indici per ricercare il relativo permesso da attivare. Infatti quando un utente chiede al sistema RBAC di compiere una certa operazione su un oggetto, quello che accade può essere riassunto nei seguenti passi: 1. L’utente passa al sistema il suo nome, l’identificativo della sessione, il nome dell’oggetto e quello dell’operazione. 2. Per prima cosa il sistema verifica che la sessione appartenga all’utente. 3. Dal nome dell’oggetto e dell’operazione viene ricavato il relativo permesso. 4. Si ricercano tra i ruoli assegnati all’utente, quelli dotati del permesso richiesto. 5. Se almeno uno dei ruoli individuati è già attivo l’operazione viene autorizzata. 6. In caso contrario si procede all’attivazione dei ruoli individuati, controllando i relativi vincoli e fermandosi non appena se ne riesce ad attivare uno. 7. La procedura di autorizzazione può terminare con esito positivo solo dopo aver superato con successo tutte le fasi appena elencate, in caso contrario fallisce e l’utente non può compiere l’operazione desiderata sull’oggetto indicato. Appare ora evidente come i permessi vengano utilizzati solamente al passo quattro per ricercare il ruolo da attivare e non vengano più coinvolti nel processo di autorizzazione. Pagina 115 I vincoli che possono essere definiti hanno dunque una limitata espressività, poiché nel processo di attivazione vengono persi, assieme al riferimento al permesso, anche quelli relativi all’oggetto e all’operazione richiesta. Facendo riferimento alla tassonomia dei vincoli presentata nel capitolo precedente, si può quindi affermare che non è possibile definire alcun vincolo dinamico o storico, che non riguardi i ruoli, gli utenti o le sessioni del sistema di controllo d’accesso. Si prenda ad esempio un vincolo temporale: con l’architettura dello standard RBAC proposto dal NIST sarebbe possibile, anche se non è espressamente previsto, definire un vincolo che impedisce ad un ruolo di essere attivato fuori dall’orario d’ufficio e verificarlo al momento della sua attivazione. Non accade però lo stesso se si vuole applicare il vincolo ad un singolo permesso legato ad un ruolo. Il problema diventa ancor più evidente se ad ogni permesso associato allo stesso ruolo devono essere associati vincoli temporali differenti. A questo punto si potrebbe obiettare che è sufficiente assegnare ad un ruolo un singolo permesso ed utilizzare i vincoli sul primo come se fossero sul secondo. Questo è sicuramente vero, ma avere una corrispondenza uno a uno tra ruoli e permessi sarebbe altamente controproducente per l’amministrazione del sistema e annullerebbe tutti i vantaggi, che hanno reso l’RBAC uno dei modelli di controllo d’accesso più apprezzati di questi ultimi anni. Per porre rimedio a questa situazione è dunque necessario affiancare all’attivazione dei ruoli, anche quella dei permessi. Il processo di attivazione dei permessi dovrà sempre seguire quello di attivazione dei ruoli e, con riferimento all’elenco di passi esecutivi precedentemente illustrato, si inserisce sia dopo il punto cinque, che dopo il punto sei. Ovviamente l’attivazione di un permesso andrà a buon fine se tutti i relativi vincoli saranno rispettati, altrimenti il sistema, pur avendo attivato il ruolo, non consentirà all’utente di usufruire del permesso richiesto. Rimane infine da fare un’ultima considerazione riguardo all’attivazione dei permessi, ovvero è necessario scegliere tra le seguenti due opzioni: 1. un permesso, una volta attivato, rimane tale 2. il processo di attivazione di un permesso viene ripetuto ogni volta che quest’ultimo è richiesto dall’utente Pagina 116 Senza dubbio la seconda alternativa è la migliore, principalmente perché si adatta in modo più stringente al principio del minimo privilegio, in quanto un utente si vede assegnati i privilegi necessari per compiere il suo lavoro solo nel preciso istante in cui ne deve usufruire. Inoltre non bisogna dimenticare che, se i permessi dovessero rimanere attivi per un tempo indefinito, non sarebbe possibile supportare correttamente alcune tipologie di vincoli temporali. 7.4 Le scelte di definizione del modello Nel capitolo sei è stata effettuata un’analisi critica dello standard RBAC proposto dal NIST e si sono messi in luce numerosi punti dello stesso, cha lasciavano spazio a diverse interpretazioni. Nel modello proposto son state fatte dunque delle scelte in relazione ad ognuno di questi aspetti, che vengono ora elencate nella seguente lista, mantenendo l’ordine di presentazione del capitolo precedente. 1) Attivazione e disattivazione dei ruoli SCELTA: attivazione di un ruolo di default alla volta e disattivazione di un ruolo solamente all’occorrenza. 2) Le gerarchie a. Gerarchia ed attivazione dei ruoli SCELTA: attivazione esplicita dei ruoli padri. b. Gerarchia e disattivazione dei ruoli SCELTA: disattivazione esplicita dei ruoli padri. c. Gerarchia e separazione dei compiti SCELTA: nessun problema perché si usa l’attivazione esplicita dei ruoli padri. d. Gerarchia e permessi SCELTA: permessi standard (è sempre possibile, se lo si desidera, introdurre come vincoli di attivazione dei permessi quantomeno le classi P+ e P0). 3) Separazione dei compiti e permessi SCELTA: shared/shared, il rispetto della condizione di sicurezza viene lasciato come competenza dell’amministratore di sistema (è comunque possibile introdurre se lo si desidera vincoli statici sull’assegnazione dei Pagina 117 permessi che verifichino che un permesso assegnato ad un ruolo coinvolto in un vincolo di mutua esclusione non sia assegnato a nessun altro ruolo, riportandosi così alla situazione disjoint/disjoint). 4) I permessi in un sistema ad oggetti SCELTA: 3.a (soluzione ibrida), il sistema agisce in base al nome dell’oggetto che gli viene passato dall’utente, senza preoccuparsi che sia riferito ad una classe o ad un’istanza 5) Eliminazione degli elementi del modello a. Eliminazione di un utente b. Eliminazione di un ruolo c. Eliminazione di un permesso d. Eliminazione dell’appartenenza di un utente ad un ruolo e. Eliminazione di un relazione gerarchica f. Eliminazione dell’assegnazione di un permesso ad un ruolo SCELTA: le sessioni in corrispondenza di tutte le eliminazioni sopra elencate non vengono distrutte, in quanto ogni volta che un utente richiede un permesso al sistema viene controllata l’esistenza di tutte le entità e le relazioni che possono essere state cancellate, di conseguenza l’accesso verrà correttamente negato qualora fosse necessario. 6) I vincoli a. Vincoli supportati SCELTA: è obbligatorio supportare i vincoli di cardinalità sulle relazioni gerarchiche (o vincoli gerarchici) e quelli di separazione dei compiti sia statici che dinamici; i vincoli di cardinalità, temporali, transazionale e di prerequisito sono invece opzionali. b. Il formato dei vincoli SCELTA: non essendoci ancora uno standard universalmente riconosciuto, il formato dei vincoli non viene imposto dal modello, ma può variare da implementazione ad implementazione. Pagina 118 7.5 Il framework Come è stato fatto per lo standard RBAC proposto dal NIST, subito dopo aver definito il modello concettuale, si vuole fornire un’indicazione su come organizzare le diverse funzionalità dello stesso, in modo da garantirne una corretta implementazione. I paragrafi seguenti descrivono le funzioni e i packages che si consiglia di implementare. 7.5.1 Le funzioni Le funzioni che devono essere supportate sono suddivise nelle seguenti tre categorie: 1. funzioni di sistema 2. funzioni amministrative 3. funzioni di reportistica La semantica di questa classificazione è la medesima rispetto a quella definita nel capitolo dello standard RBAC proposto dal NIST, al quale si rimanda. Le funzioni di sistema permettono di verificare i vincoli dinamici e statici del modello. Esse sono: • Create session: crea una nuova sessione utente ed prova ad attivare i ruoli di default • Delete session: disattiva i ruoli della sessione e la elimina • Add active role: attiva un ruolo per una sessione utente se sono verificati i relativi vincoli • Drop active role: disattiva un ruolo di una sessione utente • Check access: controlla la disponibilità di un permesso per un certo utente e cerca di attivare un ruolo a cui il permesso è associato • Activate permission: attiva un permesso per un ruolo se sono verificati i relativi vincoli • Check integrity: controlla gli eventuali vincoli statici del modello Pagina 119 Da notare è il fatto che mentre per il processo di attivazione dei ruoli sono previsti due metodi, uno per l’attivazione (add active role) ed uno per la disattivazione (drop active role), per i permessi è invece definito un solo metodo (activate permission). Ciò è giustificato dal fatto che i ruoli rimangono attivi per un tempo indefinito, quindi è necessario disattivarlo esplicitamente, mentre per i permessi è stata fatta una scelta progettuale differente, secondo la quale questi ultimi non rimangono attivi dopo che l’utente ne ha potuto usufruire. Le funzioni amministrative consentono invece di creare, eliminare e modificare le entità e le relazioni del modello di controllo d’accesso. Esse sono: • Add user: aggiunta di un nuovo utente • Delete user: eliminazione di un utente • Add role: aggiunta di un nuovo ruolo • Delete role: eliminazione di un ruolo • Assign user: assegnazione di un utente ad un ruolo • Deassign user: revoca di un ruolo ad un utente • Grant permission: assegnazione di un permesso ad un ruolo • Revoke permission: revoca di un permesso ad un ruolo • Add inheritance: aggiunta di un ruolo figlio ad un ruolo padre • Delete inheritance: eliminazione di un ruolo figlio da un ruolo padre • Create SSD set: creazione di un vincolo SSD • Delete SSD set: eliminazione di un vincolo SSD • Create DSD set: creazione di un vincolo DSD • Delete DSD set: eliminazione di un vincolo DSD Infine le funzioni di reportistica forniscono tutti i servizi necessari per leggere i dati relativi alle entità ed alle relazioni del modello e vengono utilizzate sia dalle funzioni di sistema, che da quelle amministrative. Non si fornisce in questo caso un elenco delle funzioni di reportistica, in quanto la scelta non è critica, ma si delega questa scelta alla fase di implementazione del modello. Pagina 120 7.5.2 I packages La suddivisione in packages proposta dal NIST è sicuramente applicabile anche in questo contesto. I packages proposti sono dunque i seguenti: 1. Core RBAC 2. Hierarchical RBAC 3. SSD (Static Separation of Duty) RBAC 4. DSD (Dynamic Separation of Duty) RBAC Al primo fanno capo le funzionalità di base del modello, alle quali il secondo aggiunge quelle relative alle gerarchie fra ruoli, mentre il terzo ed il quarto quelle della separazione dei compiti rispettivamente statica e dinamica. A questi quattro packages principali è possibile affiancare una serie di altri packages per supportare le tipologie di vincoli illustrate e classificate nel capitolo precedente. In particolare possono essere previsti i seguenti: 5. temporal RBAC 6. cardinality RBAC 7. transactional RBAC 8. prerequisite RBAC Il primo offre supporto ai vincoli temporali, il secondo a quelli di cardinalità, il terzo a quelli transazionali (o operazionali) ed il quarto ai vincoli di prerequisito. Pagina 121 CAPITOLO 8 LA TECNOLOGIA J2EE Prima di descrivere l’implementazione del modello si vuole fornire una presentazione della tecnologia J2EE, che si andrà poi ad utilizzare per lo sviluppo del sistema RBAC. Verranno illusrtate sia l’architettura della piattaforma J2EE, che quella delle applicazioni enterpise che essa è in grado di eseguire. Infine verranno presentate le classi utilizzate nel corso del lavoro di sviluppo del sistema RBAC. Pagina 122 8.1 La piattaforma J2EE J2EE è la piattaforma più diffusa del settore delle applicazioni enterprise assieme alla piattaforma “.NET” del colosso Microsoft. La piattaforma J2EE usa un modello distribuito a più livelli (multi-tier) per lo sviluppo di applicazioni enterprise. Il termine “Enterprise Computing” (EC) è sinonimo di “Distributed Computing” ovvero calcolo eseguito da un gruppo di programmi interagenti attraverso una rete. La disomogeneità tra le componenti e di conseguenza la complessità strutturale sono le caratteristiche principali di questi sistemi. La piattaforma J2EE tende a semplificare tali aspetti fornendo un ambiente di sviluppo completo di API e metodologie di approccio alla risoluzione dei problemi di programmazione relativi alle applicazioni enterprise. La soluzione proposta da Sun si compone di quattro elementi principali: • Specifiche • Reference Implementation • Test di compatibilità • Application Programming Model (APM) Le specifiche elencano gli elementi necessari alla piattaforma e le procedure da seguire per una corretta implementazione di applicazioni basate su J2EE. La Reference Implementation contiene prototipi che rappresentano istanze semanticamente corrette di J2EE al fine di fornire all’industria del software modelli completi per i test di compatibilità. Include tool per il deployment e l’amministrazione di sistema, diversi EJB e JSP, Java Messaging Service e altri prodotti di terzi. Queste tecnologie verranno tutte illustrate nei paragrafi seguenti. L’Application Programming Model è un modello per la progettazione e la programmazione di applicazioni basato sulla metodologia “best-practice” per favorire un approccio ottimale alla piattaforma. Fornisce dunque una guida per il programmatore, analizzando le operaioni da svolgere con J2EE, e stabilendo le basi della metodologia legata allo sviluppo di sistemi multi-tier. Pagina 123 8.2 L’architettura J2EE Viene presentata sin da ora la figura di riferimento per l’architettura J2EE nella sua ultima versione, la 1.4. La Sun sta preparando una nuova versione, la 5.0, che però ad oggi è ancora in fase di sviluppo. Figura 8-1. L’architettura J2EE Procedendo con ordine, si comincia dalla descrizione ad alto livello dell’architettura proposta dalla piattaforma J2EE, che divide le applicazioni enterprise in tre strati applicativi fondamentali componenti (Component), contenitori (Container) e connettori (Adapter). Pagina 124 Figura 8-2. Componenti, contenitori e connettori Le applicazioni J2EE sono costituite da componenti. Un Component è un’unità software funzionale assemblata in un’applicazione J2EE con le sue classi, files e interconnessioni con altri componenti. Questi ultimi sono scritti nel linguaggio di programmazione Java e sono compilati nello stesso modo con cui si compila qualsiasi applicazione Java. La differenza tra i componenti J2EE e le classi standard Java risiede nel fatto che i componenti sono assemblati in un’applicazione J2EE, che deve essere verificata per essere conforme alle specifiche J2EE, ne viene fatto il deployment, ovvero vengono memorizzati in opportune directory accompagnati dai relativi file di configurazione, e vengono eseguiti e gestiti dagli application server J2EE, dei quali si parlerà in seguito. Il modello di programmazione prevede dunque lo sviluppo di soluzioni utilizzando componenti, a supporto dei quali fornisce le seguenti tecnologie fondamentali: • Applicazioni client e Applet: sono componenti che vengono eseguiti sulla macchina client. • Java Servlet, JavaServer Pages (JSP), Filters e web-event-Listener: sono componenti web che vengono eseguiti sul server. • Enterprise JavaBeans (EJB): sono componenti business che vengono eseguiti sul server. Pagina 125 Le Applicazioni client e le Applet sono componenti che vengono eseguiti sulla macchina client. Tipicamente sono delle GUI (Graphic User Interface), che permettono all’utente di interagire con il sistema. Le servlet consentono la costruzione di servizi web altamente performanti ed in grado di funzionare sulla maggior parte degli application server ad oggi sul mercato. Le JSP permettono invece di costruire pagine web dai contenuti dinamici. I filtri (Filters) intercettano le richieste degli utenti e consentono di definire controlli di qualsiasi tipo su di esse. Infine i web-event-Listener funzionano come un qualsiasi eventListener Java, ovvero si mettono in ascolto su un particolare tipo di evento web, segnalando la sua attivazione. Gli EJB forniscono supporto per la creazione di componenti server-side che possono essere generati indipendentemente da uno specifico database, transaction server o piattaforma su cui verranno installati. In realtà esiste un’ulteriore alternativa alle quattro riportate per la quale però non si può parlare di tecnologia dedicate, ed è rappresentata dalle componenti serverside sviluppate utilizzando java. Il fatto che J2EE sia indipendente dalla piattaforma, e che l’applicazione sia basata su un modello a più livelli, rende lo sviluppo di un’applicazione J2EE ancora più facile, grazie anche ai servizi sottostanti messi a disposizione per ciascun tipo di componente dal suo Container. Il secondo strato dell’architettura logica è rappresentato appunto dai contenitori, ovvero supporti tecnologici ai Component appartenenti al primo strato. I container sono interfacce tra un componente e le funzionalità a basso livello specifiche della piattaforma che supportano il componente. Infine i connettori (Adapter) consentono alle soluzioni basate sulla tecnologia J2EE di preservare e proteggere investimenti in tecnologie già esistenti fornendo uno strato di connessione verso applicazioni-server o middleware di varia natura, dai database relazionali, tramite adapter JDBC, fino ai server LDAP, tramite adapter JNDI. Pagina 126 Gli Application Server (AS) non sono altro che dei prodotti basati sullo standard J2EE, ovvero sono dei software che utilizzano e coordinano nel migliore dei modi tutte le tecnologie J2EE, rendendo più semplice il lavoro degli sviluppatori. Gli application-server compatibili con questa tecnologia riuniscono tutti e tre gli strati in un una unica piattaforma standard e quindi indipendente dal codice proprietario, consentendo lo sviluppo di componenti in grado di girare in qualunque container compatibile con J2EE indipendentemente dal fornitore di software, e di interagire con una vasta gamma di servizi pre-esistenti tramite i connettori. 8.3 L’Application Programming Model Il modello di programmazione APM prevede che un’applicazione J2EE sia strutturata secondo i seguenti livelli (o tier): 1. livello Client: componenti eseguiti sulla macchina client. 2. livello Web: componenti eseguiti sul server J2EE. 3. livello Business: componenti eseguiti sul server J2EE. 4. livello Enterprise Information System (EIS): software presente sui Database Server. Va sottolineato il fatto che, sebbene un’applicazione J2EE possa essere suddivisa nei quattro livelli sopra elencati, solitamente viene considerata una struttura di tre livelli, in quanto i componenti sono distribuiti su tre locazioni differenti: macchine client, macchina con il server J2EE, macchine con database. Le figure seguenti esemplificano la struttura di due applicazioni enterprise multitier, strutturate secondo lo standard J2EE. Pagina 127 Application Figura 8-3. Esempio di applicazione enterprise multi-tier Figura 8-4. Esempio di applicazione enterprise multi-tier Pagina 128 8.3.1 Livello Client Appartengono allo strato client le applicazioni che forniscono all’utente una interfaccia verso il sistema enterprise e rappresentano quindi la percezione che l’utente ha dell’applicazione J2EE. Tali applicazioni si suddividono in due classi di appartenenza: • applicazioni web-based • applicazioni non-webbased Le prime sono quelle applicazioni che utilizzano il browser come strato di supporto alla interfaccia verso l’utente ed i cui contenuti vengono generati dinamicamente da Servlet o Java Server Pages o staticamente in HTML. Le seconde (non-web-based) sono invece basate su applicazioni stand-alone che sfruttano lo strato di rete disponibile sul client per interfacciarsi direttamente con il business-tier dell’applicazione J2EE senza passare per il Web-Tier. 8.3.2 Livello Web Le componenti web-tier di J2EE sono rappresentate da pagine JSP, server-side applet e Servlet. Le pagine HTML che invocano Servlet o JSP secondo lo standard J2EE non sono considerate web-components, ed il motivo è il seguente: come illustrato nei paragrafi precedenti si considerano componenti, oggetti caricabili e gestibili all’interno di un contenitore. In questo caso, Servlet e JSP hanno il loro ambiente runtime all’interno del Servlet Container che provvede al loro ciclo di vita, nonché alla fornitura di servizi quali client-request e clientresponse, al contrario le pagine HTML, destinate ad essere visualizzate nel browser dell’utente, non utilizzano questa struttura di supporto. La piattaforma J2EE prevede quattro tipi di applicazioni web: 1. Basic HTML 2. HTML con JSP e Servlet 3. JSP con componenti JavaBeans 4. High Structured Application. Di queste, le prime tre sono dette “applicazioni web-centric”, quelle appartenenti al quarto tipo sono dette “applicazioni EJB Centric”. La scelta di un tipo di applicazione piuttosto che di un altro dipende ovviamente da vari fattori tra cui la Pagina 129 complessità del problema, le risorse del Team di sviluppo, la longevità della applicazione e il dinamismo dei contenuti da gestire e proporre. 8.3.3 Livello Business Nell’ambito di un’applicazione enterprise il livello business è lo strato che fornisce i seguenti servizi specifici: • gestione delle transazioni • controllo della concorrenza • gestione della sicurezza • gestione di logiche specifiche per la manipolazione dei dati Mediante un approccio di tipo Object Oriented è possibile decomporre tali logiche o logiche di business in un insieme di componenti ed elementi chiamati “business object”. La tecnologia fornita da Sun per implementare i “business object” è quella che in precedenza è stata definita come EJBs (Enterprise Java Beans). Tali componenti si occupano di: • Ricevere dati da un client • Processare tali dati • Inviare i dati allo strato EIS per la loro memorizzazione su base dati E viceversa: • Acquisire dati da un database appartenente allo strato EIS • Processare tali dati • Inviare tali dati al programma client che ne abbia fatto richiesta. La figura seguente esemplifica quanto appena illustrato. Pagina 130 Figura 8-5. Funzionamento del business-tier Esistono tre tipi principali di EJBs : 1. Entity Beans 2. Session Beans 3. MessagedrivenBeans Un Session Bean rappresenta una comunicazione temporanea con un client. Quando il client termina la sua esecuzione, il Session Bean e i suoi dati sono persi. L’Entity Bean, a differenza del Session Bean, rappresenta dei dati persistenti, memorizzati in una riga di una tabella del database. Se il client termina o il server viene chiuso, i servizi sottostanti assicurano che i dati dell’Entity Bean vengano salvati. Un Message-Driven Bean combina le caratteristiche di un Session Bean e di un Java Message Service (JMS) Message Listener, permettendo così a un componente business di ricevere messaggi JMS in modo asincrono. Un Enterprise Bean vive all’interno del container che provvede al ciclo vitale della componente e ad una varietà di latri servizi, quali la gestione della concorrenza e la scalabilità. L’EJB Container è a sua volta parte di un EJB server che fornisce tutti i servizi di naming e di directory, dei quali si parlerà in seguito. 8.3.4 Livello EIS Le applicazioni enterprise implicano per definizione l’accesso ad altre applicazioni, dati o servizi sparsi all’interno delle infrastrutture informatiche del fornitore di servizi. Le informazioni gestite ed i dati contenuti all’interno di tali Pagina 131 infrastrutture rappresentano la “ricchezza” del fornitore, e come tale vanno trattati con estrema cura garantendone la integrità. Il livello EIS si preoccupa proprio di gestire i questi dati e renderli disponibili al business-tier. Gli scenari di riferimento sono svariati e comprendono vari modelli di configurazione che le architetture enterprise possono assumere per soddisfare le necessità più disparate. Un modello classico è quello dei sistemi di commercio elettronico, rappresentato in figura. Figura 8-6. Modello del commercio elettronico 8.4 Le API J2EE Le API (Application Programming Interface) fornite dallo standard J2EE offrono supporto al programmatore per lavorare con le più comuni tecnologie utilizzate nell’ambito della programmazione distribuita e dei servizi di interconnessione via rete. Segue nei prossimi paragrafi una panoramica delle API più significative. 8.4.1 JDBC (Java DataBase Connectivity) La tecnologia JDBC è un adapter che permette di lavorare con database relazionali. Le API JDBC consentono al programmatore di inviare query ad un Pagina 132 database relazionale, di effettuare modifiche dei dati all’interno di tabelle, di lanciare stored-procedure e di ottenere meta-informazioni relativamente al database o alle entità che lo compongono. Architetturalmente le API JDBC sono suddivise in due strati principali: 1. il primo fornisce una interfaccia verso il programmatore 2. il secondo di livello più basso fornisce invece una serie di API per i produttori di driver verso database relazionali e nasconde all’utente i dettagli del driver in uso. Questa caratteristica rende la tecnologia indipendente rispetto al motore relazionale che il programmatore deve interfacciare. I driver JDBC possono essere suddivisi in 4 tipi fondamentali come illusrtato nella seguente tabella: Tipo 4 Tipo 3 Tipo 2 Tipo Direct-to-Database Pure Java Driver Pure Java Driver for Database Middleware; JDBC-ODBC Bridge plus ODBC Driver; 1 A native-API partly Java technology-enabled driver. Tabella 8-1. Classificazione API JDBC I driver di tipo 4 e 3 appartengono a quella gamma di driver che convertono le chiamate JDBC nel protocollo di rete utilizzato direttamente da un server relazionale o un “middleware” che fornisca connettività attraverso la rete verso uno o più database e sono scritti completamente in Java. La figura seguente mostra la loro architettura. Pagina 133 Figura 8-7. Driver JDBC di tipo 3 e 4 I driver di tipo 2 sono driver scritti parzialmente in Java e funzionano da interfaccia verso API native di specifici prodotti. I driver di tipo 1, anch’essi scritti parzialmente in Java, hanno funzioni di bridge verso il protocollo ODBC rilasciato da Microsoft. Questi driver sono anche detti JDBC/ODBC Bridge e rappresentano una buona alternativa in situazioni in cui non siano disponibili driver di tipo 3 o 4. La figura seguente mostra l’architettura di drivers di tipo 1 e 2. Pagina 134 Figura 8-8. Driver JDBC di tipo 1 e 2 8.4.2 RMI (Remote Method Invocation) RMI (Remote Method Invocation) fornisce il supporto per sviluppare applicazioni in grado di invocare metodi di oggetti distribuiti su virtual-machine differenti sparse per la rete. Grazie a questa tecnologia è possibile realizzare architetture distribuite in cui un client invoca metodi di oggetti residenti su un server, che a sua volta può essere client nei confronti di un altro server. Oltre a garantire tutte i vantaggi tipici di una architettura distribuita, essendo fortemente incentrato su Java RMI, consente di trasportare in ambiente distribuito tutte le caratteristiche di portabilità e semplicità legate allo sviluppo di componenti Object Oriented: 1) RMI è in grado di passare oggetti e ritornare valori durante una chiamata a metodo oltre che a tipi di dati predefiniti. Questo significa che dati Pagina 135 strutturati e complessi come le Hashtable possono essere passati come un singolo argomento senza dover decomporre l’oggetto in tipi di dati primitivi. 2) RMI consente di delegare l’implementazione di una classe dal client al server o viceversa. Questo fornisce una enorme flessibilità al programmatore che scriverà solo una volta il codice per implementare un oggetto che sarà immediatamente visibile sia a client che al server. 3) RMI estende le architetture distribuite consentendo l’uso di thread da parte di un server RMI per garantire la gestione ottimale della concorrenza tra oggetti distribuiti. 4) RMI abbraccia la filosofia “Write Once Run Anywhere” di Java: ogni sistema RMI è portabile su ogni Java Virtual Machine. 8.4.3 Java IDL (Interface Definition Language) RMI rappresenta una soluzione per la creazione di sistemi ad oggetti distribuiti con la limitazione che tali oggetti debbano essere scritti in Java. Tale soluzione non si adatta invece alle architetture in cui gli oggetti distribuiti siano scritti con linguaggi arbitrari. Per far fronte a tali situazioni, la Sun offre anche la soluzione basata su CORBA (Common Object Request Broker Architecture) [93] per la chiamata ad oggetti remoti. CORBA è uno standard largamente utilizzato introdotto dall’OMG (Object Management Group) e prevede la definizione delle interfacce verso oggetti remoti mediante un IDL (Interface Definition Language) indipendente dalla piattaforma e dal linguaggio di riferimento con cui l’oggetto è stato implementato. L’implementazione di questa tecnologia rilasciata da Sun comprende un ORB (Object Request Broker) in grado di interagire con altri ORB presenti sul mercato, nonché di un pre-compilatore IDL che traduce una descrizione IDL di una interfaccia remota in una classe Java che ne rappresenti il dato. Pagina 136 8.4.4 JNDI (Java Naming and Directory Interface) JNDI è quell’insieme di API che forniscono l’accesso a servizi generici di Naming o Directory attraverso la rete. Consentono all’applicazione che ne abbia bisogno, di ottenere oggetti o dati tramite il loro nome o di ricercare oggetti o dati mediante l’uso di attributi a loro associati. Ad esempio tramite JNDI è possibile accedere ad informazioni relative ad utenti di rete, server o workstation, sottoreti o servizi generici. Come per JDBC le API JNDI non nascono per fornire accesso in modo specifico ad un particolare servizio, ma costituiscono un set generico di strumenti in grado di interfacciarsi a servizi mediante “driver” rilasciati dal produttore del servizio e che mappano le API JNDI nel protocollo proprietario di ogni specifico servizio. Tali driver vengono detti “Service Providers” e forniscono accesso a protocolli come LDAP, NIS, Novell NDS oltre che ad una gran quantità di servizi come DNS, RMI o CORBA Registry. 8.4.5 JMS (Java Message Service) Le API JMS forniscono supporto alle applicazioni enterprise nella gestione asincrona della comunicazione verso servizi di “messaging” o nella creazione di nuovi MOM (Message Oriented Middleware). Grazie a JMS è possibile scrivere applicazioni di business “message-based” altamente portabili fornendo un’alternativa a RMI, che risulta necessaria in determinati ambiti applicativi. Nel modello proposto da J2EE l’accesso alle informazioni contenute all’interno di questo strato è possibile tramite oggetti chiamati connettori che rappresentano un’architettura standard per integrare applicazioni e componenti enterprise eterogenee con sistemi informativi enterprise anche loro eterogenei. 8.5 Servlet API: il package javax.servlet Il package javax.servlet è il package di base delle Servlet API, e contiene le classi per definire Servlet standard indipendenti dal protocollo. Tecnicamente una Pagina 137 Servlet generica è una classe definita a partire dall’interfaccia Servlet contenuta all’interno del package javax.servlet. Questa interfaccia contiene i prototipi di tutti i metodi necessari alla esecuzione delle logiche di business, nonché alla gestione del ciclo di vita dell’oggetto dal momento della sua istanziazione, sino al momento della sua terminazione. I metodi definiti in questa interfaccia devono essere supportati da tutte le servlet o possono essere ereditati attraverso la classe astratta GenericServlet che rappresenta una implementazione base di una servlet generica. Il package include inoltre una serie di classi utili alla comunicazione tra client e server, nonché alcune interfacce che definiscono i prototipi di oggetti utilizzati per tipizzare le classi che saranno necessarie alla specializzazione della servlet generica in servlet dipendenti da un particolare protocollo. La figura seguente mostra l’architettura del package javax.servlet. Figura 8-9. Il package javax.servlet La particolare specializzazione della servlet generica che interessa in questo ambito è quella fornita dal package javax.servlet.http. Quest’ultimo supporta lo sviluppo di Servlet che, specializzando la classe base astratta GenericServlet Pagina 138 definita nel package javax.servlet, utilizzano il protocollo HTTP. Le classi di questo package estendono le funzionalità di base di una servlet supportando tutte le caratteristiche della trasmissione di dati con protocollo HTTP compresi cookies, richieste e risposte HTTP nonché metodi HTTP (get, post, head, put). Formalmente quindi, una servlet specializzata per generare contenuti specifici per il mondo web sarà ottenibile estendendo la classe base astratta javax.servlet.http.HttpServlet. La figura seguente mostra la gerarchia del package. Figura 8-10. Il package javax.servlet.http Non si vuole descrivere ovviamente l’intero package, si desidera semplicemente presentare quelle classi rilevanti per l’implementazione del modello RBAC. I prossimi paragrafi presentano dunque le classi di maggiore interesse. Pagina 139 8.5.1 HttpServletResponse Questa classe definisce il canale di comunicazione tra la servlet ed il client che ha inviato la richiesta e mette a disposizione della servlet i metodi necessari per inviare al client i risultati prodotti dalla manipolazione dei dati di input. Una istanza dell’oggetto ServletResponse viene definita per implementazione della interfaccia HttpServletResponse definita all’interno del package javax.servlet.http che definisce una specializzazione della interfaccia derivata rispetto al protocollo http. 8.5.2 HttpServletRequest La classe di oggetti di tipo HttpServletRequest rappresenta una richiesta http. Mediante i metodi messi a disposizione da questa interfaccia, è possibile accedere ai contenuti della richiesta http inviata dal client compreso eventuali parametri o entità trasportate all’interno del pacchetto HTTP. I metodi ServletInputStream getInputStream e BufferedReader getReader permettono di accedere ai dati trasportati dal protocollo. Il metodo getParameter consente di ricavare i valori dei parametri contenuti all’interno della query string della richiesta referenziandoli tramite il loro nome. Esistono inoltre altri metodi che consentono di ottenere meta informazioni relative alla richiesta 8.5.3 Sessioni utente Le Servlet mettono a disposizione del programmatore la possibilità di racchiudere l’attività di un client per tutta la sua durata all’interno di sessioni utente. Una servlet può utilizzare una sessione per memorizzare dati persistenti, dati specifici relativi all’applicazione e recuperarli in qualsiasi istante sia necessario. Quando si crea una sessione utente, l’oggetto generato viene messo in uno stato di “new” che sta ad indicare che la sessione è stata creata ma non è attiva. Dal punto di vista puramente formale è ovvio che per essere attiva la sessione deve essere accettata dal client ovvero una sessione viene accettata dal client solo nel momento in cui invia al server per la prima volta l’identificativo della sessione. Pagina 140 Ogni volta che un client effettua una richiesta http, se in precedenza è stata definita una sessione utente legata al particolare client, il servlet container identifica il client e determina quale sessione è stata associata ad esso. Ogni sessione creata dal container è associata in modo univoco ad un identificativo o ID. Due sessioni non possono essere associate ad uno stesso ID. 8.5.3.1 HttpSession La classe httpSession viene definita dall’interfaccia javax.servlet.http.HttpSession, che comprende tra gli altri i seguenti metodi: • String getId() • long getCreationTime() • long getLastAccessedTime() • int getMaxInactiveInterval() • boolean isNew() E’ importante notare che i metodi che ritornano un valore che rappresenta un “tempo” rappresentano il dato in secondi. Sarà quindi necessario operare le necessarie conversioni per determinare informazioni tipo date ed ore. Il significato dei metodi descritti risulta chiaro leggendo il nome del metodo. Il primo ritorna l’identificativo della sessione, il secondo il tempo in secondi trascorso dalla creazione della sessione, il terzo il tempo in secondi trascorso dall’ultimo accesso alla sezione, mentre il quarto l’intervallo massimo di tempo di inattività della sessione. Il metodo isNew restituisce un valore booleano che indica lo stato della sessione, ovvero se è o meno attiva. Altri metodi che possono risultare utili sono i seguenti: • void putValue(String name, Object value) • void removeValue(String name) • String[] getValueNames(String name) • Object getValue(String name) Consentono di memorizzare o rimuovere oggetti nella forma di coppie <nome = oggetto> all’interno della sessione consentendo ad una servlet di memorizzare dati (in forma di oggetti) all’interno della sessione per poi utilizzarli ad ogni richiesta HTTP da parte dell’utente associato alla sessione. Pagina 141 Questi oggetti saranno inoltre accessibili ad ogni servlet che utilizzi la stessa sessione utente potendoli recuperare conoscendo il nome associato. 8.5.3.2 Durata di una sessione utente Una sessione utente rappresenta un oggetto transiente la cui durata deve essere limitata al periodi di attività dell’utente sul server. Utilizzando i metodi: • void invalidate() • int setMaxInactiveInterval(int interval) è possibile invalidare una sessione o disporre che una volta superato l’intervallo massimo di inattività la servlet venga automaticamente resa inattiva dal container. 8.5.4 Filter Tramite l'implementazione della interfaccia javax.servlet.Filter si è in grado di creare oggetti che filtrino le invocazioni da parte del client HTTP, verso una risorsa dinamica (Servlet o JSP), ma anche statica (pagine HTML o altro ancora). Un filtro inoltre può modificare la risposta inviata al client prima che questa sia effettivamente inviata. Formalmente un filtro si definisce come un preprocessore di una request http (prima che questa raggiunga la servlet) e post processore della risposta (prima che questa venga inviata al client). Più precisamente un filtro può effettuare le seguenti operazioni • Intercettare una chiamata ad una servlet prima che questo sia effettivamente eseguito • Esminare una richiesta prima del suo inoltro alla servlet • Modificare la sezione degli header dei vari pacchetti HTTP, prima del loro inoltro alla servlet • Modificare la sezione degli header dei vari pacchetti HTTP, prima della spedizione al client • Intercettare una chiamata di una servlet dopo che tale servlet sia stata invocato Un filtro fa dunque parte di una catena (pipeline) di componenti: è possibile specificare vari filtri in cascata, l’ultimo dei quali è la risorsa target richiesta dal Pagina 142 client. La pipeline di filtro è definita a livello di configurazione dell’applicazione Web e questo permette di gestirne il deployment in modo disaccoppiato dallo sviluppo. Come posizionamento nella gerarchia delle classi Java, un filtro implementa l’interfaccia javax.servlet.Filter: si tratta essenzialmente di fornire tre metodi, i soliti init/destroy di primo caricamento/scaricamento del filtro nel container e il doFilter, dove definire il comportamento applicativo del filtro. Il metodo doFilter ha tre argomenti, la coppia richiesta/risposta tipica di una servlet ordinaria (è quindi possibile impiegare un filtro come una servlet, basta fargli tornare direttamente una risposta al client) e un terzo argomento di tipo FilterChain, che permette al filtro di appartenere alla pipeline definita a livello di descrittore di deployment. A questo punto basterà che il filtro richiami il metodo doFilter (richiesta/risposta) dell’oggetto FilterChain per innescare il successivo stadio dell’elaborazione e il container richiamerà il prossimo filtro. 8.5.5 Eventi di tipo HTTP session Gli eventi di tipo HTTP session, implementati tramite istanze della classe javax.servlet.http.HttpSessionEvent o di sue sottoclassi, scattano in funzione delle fasi del ciclo di vita dell'oggetto HttpSession corrente, il quale permette di identificare e tracciare gli utenti di un'applicazione web. Vi sono due interfacce: 1. javax.servlet.http.HttpSessionListener, il cui fine consiste nel notificare il listener degli eventi globali nell'ambito del ciclo di vita di una sessione http. Comprende i seguenti metodi: o public void sessionCreated(javax.servlet.http.HttpSessionEvent hse): informa che una nuova sessione HTTP, accessibile tramite il parametro di tipo HttpSessionEvent, è stata creata; o public void sessionDestroyed(javax.servlet.http.HttpSessionEvent hse): informa che una sessione HTTP è stata invalidata; 2. public void javax.servlet.http.HttpSessionAttributeListener, il quale notifica al listener ogni modifica della tabella degli attributi di una sessione HTTP (anche in questo gli eventi vengono fatti scattare a modifica avvenuta) . Comprende i seguenti metodi: Pagina 143 o public void attributeAdded (javax.servlet.http.HttpSessionBindingEvent hsbe): un nuovo attributo, i cui dati sono accessibili tramite il parametro di evento, è stato aggiunto alla sessione HTTP. o public void attributeRemoved (javax.servlet.http.HttpSessionBindingEvent hsbe): un attributo, i cui dati sono ancora accessibili tramite il parametro evento, è stato eliminato dalla sessione HTTP. o public void attributeReplaced (javax.servlet.http.HttpSessionBindingEvent hsbe): un attributo di sessione HTTP è stato modificato ed i suoi precedenti dati possono venire recuperati tramite l'oggetto HttpSessionBindingEvent. 8.6 JSP (Java Server Pages) Una pagina JSP è un semplice file di testo che fonde codice html a codice Java per formare una pagina dai contenuti dinamici. Questa tecnologia dà la possibilità di unire codice HTML con codice Java senza che uno interferisca con l’altro e consente di isolare la rappresentazione dei contenuti dinamici dalle logiche di presentazione. Il disegnatore potrà concentrarsi solo sulla impaginazione dei contenuti che saranno inseriti dal programmatore, il quale non dovrà preoccuparsi dell’aspetto puramente grafico. Le JavaServer Pages consentono dunque di realizzare applicazioni web dinamiche accedendo a componenti Java contenenti logiche di business o alla base dati del sistema. 8.6.1 Compilazione di una pagina JSP Se dal punto di vista del programmatore una pagina JSP è un documento di testo contenente tag html e codice Java, dal punto di vista del server una pagina JSP è utilizzata allo stesso modo di una servlet. Di fatto, nel momento del primo accesso da parte dell’utente, la pagina JSP richiesta viene trasformata in un file Java e compilata dal compilatore interno della virtual machine. Come prodotto della compilazione si otterrà una classe Java che rappresenta una servlet di tipo HttpServlet che crea una pagina html e la invia al client. Pagina 144 Tipicamente l’application server memorizza su disco tutte le definizioni di classe ottenute dal processo di compilazione appena descritto per poter riutilizzare il codice già compilato. L’unica volta che una pagina JSP viene compilata è al momento del suo primo accesso da parte di un client o dopo modifiche apportate dal programmatore affinché il client acceda sempre alla ultima versione prodotta. 8.7 Autorizzazione in J2EE I paragrafi che seguono illustrano il modello base di autorizzazione della tecnologia J2EE ed un modello più evoluto, JAAS (Java Authentication and Authorization Service), che è stato inizialmente sviluppato parallelamente alle versioni J2EE rilasciate dalla Sun e che è stato infine incluso nella sua ultima versione, la 1.4. 8.7.1 Modello di autorizzazione di base Il modello di autorizzazione di base per lo standard J2EE è basato sul concetto di “security role”. Non bisogna farsi trarre in inganno però dall’utilizzo della parola “ruolo”, perché in realtà siamo di fronte all’usuale concetto di gruppo. Infatti un security role non è altro che un raggruppamento logico di utenti. Tramite un descrittore di deployment opportunamente strutturato è possibile associare un utente ad un security role e definire quali metodi (ad esempio di una Servlet o di un EJB) sono accessibili a quest’ultimo. Durante il funzionamento del sistema è possibile verificare che l’invocazione di un metodo da parte di un utente sia autorizzata, utilizzando i seguenti metodi: • Per le Servlet: “isUserInRole” della classe HttpServletRequest. • Per gli EJB: “isCallerInRole” della classe EJBContext. Entrambi i metodi restituiscono un valore booleano che indica se l’utente è o meno associato al ruolo che sta cercando di ricoprire. Pagina 145 8.7.2 JAAS (Java Authentication and Authorization Service) JAAS fornisce un servizio di autenticazione ed autorizzazione in modalità “pluggable”, ovvero si aggiunge ai meccanismi già esistenti, rimanendo però indipendente. Quello che interessa analizzare in questo ambito non è ovviamente il servizio di autenticazione, bensì quello di autorizzazione. Bisogna subito sottolineare il fatto che c’è molta confusione sul fatto che JAAS supporti o meno il controllo d’accesso basato su ruoli. La risposta è negativa, ma è vero che alcuni aspetti possono trarre in inganno e portare a conclusioni errate. La tecnologia JAAS offre indubbiamente delle funzionalità che possono essere ricondotte all’RBAC, ma manca completamente di altri servizi, che invece sono fortemente caratterizzanti per il controllo d’accesso basato su ruoli. Ecco dunque quello che JAAS permette di fare in ottica RBAC: • Associazione ruoli-permessi: è possibile definire in un “Java policy file” opportunamente strutturato l’associazione tra un “named principal” (l’equivalente di un ruolo) ed una serie di “grant entry” (l’equivalente dei permessi). • Associazione utenti-ruoli: in un altro file di configurazione è possibile associare gli username ai diversi “principal” (= ruoli). • Attivazione dei ruoli in una sessione utente: l’attivazione di un ruolo in una sessione è possibile tramite l’utilizzo del metodo java.security.auth.subject.doAs, che registra per l’utente che lo invoca un nuovo “principal” presso la classe che regola gli accessi alle risorse protette (AccessControlContext), la quale attribuisce all’utente i permessi assegnati al “principal”. Ecco però quello che non è possibile fare: • Manca il meccanismo di disattivazione dei ruoli • Non vi sono i ruoli di default • Non si possono definire gerarchie tra ruoli • Manca la possibilità di aggiungere dei vincoli all’attivazione dei ruoli • Non è prevista l’attivazione dei permessi Pagina 146 I punti appena elencati sono in ordine di importanza, infatti la disattivazione dei ruoli fa parte del Core RBAC, ovvero delle sue funzionalità di base e quindi imprescindibili. Lo stesso vale per i ruoli di default. Seguono poi il Hierarchical RBAC ed il Constrained RBAC, anch’essi non supportati, e si finisce con l’estensione del modello proposta, che ovviamente non poteva essere prevista. Risulta quindi evidente come non si possa ancora affermare che J2EE supporti i servizi di un sistema RBAC. D’altro canto la presenza di queste nuove funzionalità, sebbene ancora insuffcienti, è sicuramente un sintomo del crescente interesse verso il controllo d’accesso basato su ruoli. Pagina 147 CAPITOLO 9 L’IMPLEMENTAZIONE DEL MODELLO ESTESO In questo capitolo viene presentata l’implementazione del modello RBAC esteso. Verrà descritta in primo luogo l’architettura generale dell’applicazione, dopodiché verranno passate in rassegna le singole componenti: il motore statico e quello dinamico, il plug-in per l’integrazione con l’application server J2EE ed i tool amministrativi, nonché i file configurazione. Pagina 148 di 9.1 Motivazioni Come evidenziato negli ultimi paragrafi del capitolo precedente, è presente l’esigenza di un’implementazione del controllo d’accesso basato su ruoli in J2EE, che non è disponibile, se non in forma molto parziale al momento attuale. Rimane ora da stabilire come fornire tali funzionalità aggiuntive alle applicazioni enterprise che girano su un application server J2EE. L’approccio scelto è quello a plug-in, similmente a quello che era stato adottato per JAAS prima che venisse integrato con le altre tecnologie J2EE. Questa soluzione permette inoltre di realizzare un sistema RBAC indipendente dal contesto applicativo di interesse, in modo da poter essere utilizzato non solo in ambito web, ma anche in altre applicazioni Java. La scelta di realizzare un’applicazione indipendente dall’application server è dettata principalmente dalle seguenti motivazioni: a) Integrare il sistema RBAC direttamente nel server coincide di fatto con l’apportare una modifica allo standard J2EE, ma questo non è auspicabile, in quanto comporterebbe non pochi problemi di compatibilità con applicazioni J2EE già esistenti. b) Modificare un application server vuol dire realizzarne una patch, quindi per ogni un nuova versione di quest’ultimo, potrebbe essere necessario adattare nuovamente la patch, innescando così un processo di aggiornamento difficoltoso. c) Scegliere un particolareapplication server su cui realizzare la patch vuol dire escludere a priori tutti gli altri e quindi limitare la diffusione del sistema di controllo d’accesso. d) Realizzare un’applicazione indipendente dallo specifico ambito di utilizzo comporta l’indiscutibile vantaggio di poterla integrare con poco lavoro aggiuntivo in qualsiasi sistema. Per tutte queste ragioni in prima istanza è stato sviluppato un sistema RBAC indipendente dall’ambito applicativo di interesse e si è realizzato separatamente un plug-in, che permette a qualsiasi application server J2EE di integrare le funzionalità di controllo d’accesso basato su ruoli. Pagina 149 Il lavoro di implementazione del modello RBAC esteso si è dunque articolato nelle seguenti fasi: 1. definizione dell’insieme di interfacce di programmazione da implementare per supportare correttamente il modello. 2. implementazione delle interfacce definite al punto precedente, in modo da realizzare un sistema RBAC funzionante. 3. implementazione del plug-in per integrare le funzionalità del controllo d’accesso basato su ruoli in un application server J2EE. I prossimi paragrafi illustreranno l’architettura dell’intero sistema ed ogni sua singola componente. 9.2 Architettura del sistema Ad alto livello il sistema è suddiviso nelle seguenti componenti fondamentali: • Un motore RBAC, in realtà diviso in: o Un motore statico o Un motore dinamico • Due tool amministrativi, ovvero: o RBACAdmin o RBACSessionsMonitor • Un Database contenente le entità e le relazioni del modello • Un gestore delle sessioni utente • Un plugin per l’application server J2EE Il motore RBAC è l’applicativo fondamentale, che permette di verificare i vincoli del modello. All’avvio il motore statico effettua un controllo d’integrità del database, verificando il rispetto dei vincoli statici del modello. Se il test ha esito positivo si avvia anche il motore dinamico, che ha invece il compito di verificare il rispetto dei vincoli dinamici durante l’arco di tutto il funzionamento del sistema, rispondendo positivamente o negativamente alle richieste degli utenti di compiere una certa operazione su un oggetto del sistema. A questo punto va ricordato che il sistema può essere configurato anche diversamente, in modo tale da verificare i vincoli statici non solo all’avvio del Pagina 150 sistema, ma anche ad ogni richiesta di accesso degli utenti. La scelta deve essere effettuata in base a considerazioni circa il trade-off tra prestazioni e sicurezza: se si vogliono privilegiare le prestazioni si accetterà di verificare i vincoli statici solo una volta all’avvio dell’applicazione; se invece si vuole essere certi che il database non venga corrotto durante il funzionamento del sistema, allora si opterà per la seconda alternativa. Nei prossimi paragrafi verrà descritta l’architettura interna di ogni motore RBAC. I tool amministrativi implementati sono due: il primo (RBACAdmin) consente di amministrare il database contenente i dati necessari per effettuare il controllo d’accesso e di verificare la correttezza delle modifiche apportate, mentre il secondo (RBACSessionsMonitor) consente di visualizzare le sessioni utente ed i ruoli in esse attivi. Per una descrizione dettagliata dei due tool si rimanda ai paragrafi seguenti. Il database contiene le entità e le relazioni del modello RBAC, ovvero tutti i dati necessari per effettuare correttamente il controllo d’accesso ed autorizzare o meno un utente a compiere una certa operazione su un oggetto del sistema. La scelta di utilizzare un database piuttosto che semplici file di configurazione è dettata dalle seguenti motivazioni: a) L’utilizzo di un DBMS permette di gestire senza sforzi aggiuntivi gli accessi concorrenti del motore RBAC e del tool amministrativo RBACAdmin. b) Si può sfruttare la potenza espressiva del linguaggio SQL per effettuare interrogazioni anche complesse. c) È possibile definire direttamente sul DBMS alcuni vincoli statici di integrità e delegare quindi a quest’ultimo il compito di verificarli. Di questo si parlerà più approfonditamente nel paragrafo dedicato ai vincoli. In realtà non tutte le informazioni relative al controllo d’accesso sono memorizzate nel database. Infatti è necessario distinguere tra i dati persistenti e quelli temporanei: i primi vengono collocati nel database, mentre i secondi sono Pagina 151 oggetti direttamente gestiti dal motore dinamico, che li crea e li distrugge durante il funzionamento del sistema. In riferimento al capitolo sette, dove veniva descritto il modello RBAC esteso, il contenuto del database dunque comprende: • elenco degli utenti • elenco dei ruoli • elenco dei ruoli di default degli utenti • elenco dei permessi (oggetti + operazioni ) • elenco delle relazioni UA • elenco delle relazioni PA • elenco delle relazioni RH • elenco dei vincoli I dati temporanei sono invece i seguenti: • elenco sessioni • elenco relazioni user_session • elenco relazioni session_roles Va notato il fatto che non è necessario creare tre oggetti diversi per rappresentare i dati temporanei, ma è sufficiente utilizzare un unico oggetto “Session”, del quale ovviamente ci saranno più istanze, che contiene, oltre all’identificativo della sessione, anche il nome dell’utente che l’ha creata e l’elenco dei ruoli in essa attivi. Il gestore delle sessioni RBAC si preoccupa proprio della gestione di questo tipo di oggetti. Infine il plug-in per l’application server J2EE fa da tramite tra quest’ultimo ed il sistema RBAC, permettendo di effettuare i dovuti controlli d’accesso a fronte di una richiesta da parte dell’utente. Per una descrizione dettagliata di questo meccanismo si rimanda ai paragrafi successivi. La figura seguente mostra l’architettura del sistema nel suo complesso. Pagina 152 • • • • • • • • DATI PERSISTENTI elenco utenti elenco ruoli elenco ruoli di default elenco permessi (oggetti + operazioni ) elenco relazioni UA elenco relazioni PA elenco relazioni RH elenco vincoli • • • DATI TEMPORANEI elenco sessioni elenco relazioni user_session elenco relazioni session_roles Oggetti SESSION, che inglobano il nome dell’utente e l’elenco dei ruoli attivi DB Tools di amministrazione Sistema RBAC Plug-in amministratore App. Server utente Figura 9-1. Architettura del sistema 9.3 I package Prima di analizzare i dettagli implementativi del modello viene presentata una panoramica dei package, in cui è stata suddivisa l’applicazione. Come si vedrà le diverse interfacce sono state inserite principalmente nel package it.unibs.ing.carlotti.rbac.core, che contiene tutte le funzionalità di base, ma le relative implementazioni sono ovviamente distribuite su tutti gli altri package, secondo i dettami forniti nel capitolo precedente dalla definizione del framework del modello concettuale. Ecco dunque l’elenco completo dei package e del loro contenuto: Pagina 153 • it.unibs.ing.carlotti.rbac: package principale che contiene il motore statico e quello dinamico, rispettivamente: o RBACIntegrity o RBACEngine • it.unibs.ing.carlotti.rbac.web: package dedicato al plug-in per l’integrazione con J2EE; contiene le classi: o WebFilter o WebPlugin • it.unibs.ing.carlotti.rbac.core: package che contiene le funzionalità di base del controllo d’accesso basato su ruoli; contiene le seguenti classi ed interfacce (evidenziate in corsivo): o EngineComponent o DynamicConstraint o IntegrityComponent o StaticConstraint o Session o SessionsManager o SessionsObserver o RBACCoreStatic o RBACCoreDynamic o RBACSession o RBACSessionsManager o RBACIntegrityException • it.unibs.ing.carlotti.rbac.hierarchy: package che contiene l’implementazione del’RBAC gerarchico, includendo le classi relative ai vincoli sulla gerarchia di ruoli: o RBACHierarchyStatic o RBACHierarchyDynamic o RBACLimitedHerarchy • it.unibs.ing.carlotti.rbac.ssd: package che contie l’implementazione dei vincoli di separazione statica dei compiti: o RBACSSD Pagina 154 • it.unibs.ing.carlotti.rbac.dsd: package che contie l’implementazione dei vincoli di separazione dinamica dei compiti: o RBACDSD • it.unibs.ing.carlotti.rbac.time: package che contie l’implementazione dei vincoli temporali: o RBACTime • it.unibs.ing.carlotti.rbac.db: package che riunisce l’implementazione delle funzioni amministrative e di reportistica, che permettono di accedere al contenuto del database: o AdministrativeFunctions o ReviewFunctions o RBACAdmin o RBACReview o DBUtil • it.unibs.ing.carlotti.rbac.admintool: package che contiene le classi grafiche, che compongono il tool amministrativo RBACAdmin, delle quali non si fornisce l’elenco. • it.unibs.ing.carlotti.rbac.sessionsmonitor: package che contiene le classi grafiche, che compongono il tool amministrativo RBACSessionsMonitor, delle quali non si fornisce l’elenco. • it.unibs.ing.carlotti.rbac.conf: package che contiene i files di configurazione del sistema RBAC. Le classi e le interfacce appena elencate verranno descritte in modo più dettagliato nei paragrafi seguenti. Si fornisce infine nella tabella seguente un elenco delle diverse interfacce e delle classi che le implementano (in corsivo sono state indicate le interfacce). Pagina 155 Interfacce IntegrityComponent StaticConstraint EngineComponent DynamicConstraint Implementazioni RBACIntegrity, RBACCoreStatic, StaticContraint RBACHierarchyStatic, RBACLimitedHerarchy, RBACSSD RBACEngine, RBACCoreDynamic, DynamicContraint RBACHierarchyDynamic, RBACDSD, RBACTime Session RBACSession SessionsManager RBACSessionsManager SessionsObserver RBACSessionsMonitor AdministrativeFunctions RBACAdmin ReviewFunctions RBACReview Tabella 9-1. Implementazione delle interfacce 9.4 Descrizione dell’implementazione Si vuole ora fornire una descrizione del sistema RBAC approfondendo maggiormente gli aspetti prettamente implementativi. La figura seguente mostra in modo maggiormente dettagliato l’architettura del sistema RBAC. Sono state evidenziate le classi che permettono di accedere al database tramite le funzioni di reportistica e quelle amministrative. Il sistema RBAC è stato suddiviso nei suoi due motori e nel monitor delle sessioni. Il motore statico è utilizzato da quello dinamico e dal tool amministrativo (RBACAdmin) per effettuare il controllo d’integrità del database. Il motore dinamico utilizza inoltre i servizi del gestore delle sessioni, che viene monitorato anche dall’RBACSessionsMonitor. Il plugin infine accede direttamente ai metodi del motore dinamico per verificare i relativi vincoli durante il funzionamento del sistema. Pagina 156 DB Funzioni DB Amministrative Tool amministrativi Di Reportistica Sistema RBAC RBACAdmin Motore Statico RBACSessionMonitor Motore Dinamico WEB Plug-in Gestore sessioni Figura 9-2. Dettaglio architettura Nei paragrafi seguenti verranno descritti nell’ordine il plug-in per l’application server J2EE, il motore statico, quello dinamico ed infine il gestore ed il monitor delle sessioni. 9.4.1 Il web plug-in Si è realizzato un plug-in che permette di intercettare le richieste degli utenti nel web-tier (secondo l’architettura delle applicazioni enterprise definita nel capitolo precedente) ed effettuare a questo livello il controllo d’accesso richiamando le opportune funzioni del sistema RBAC, che verrà descritto nei prossimi paragrafi. Non vengono dunque coperte quelle applicazioni che permettono all’utente di agire direttamente sul business-tier: in questo caso sarà necessario realizzare un nuovo plug-in, del tutto simile a quello che viene ora descritto. Pagina 157 In primo luogo è stata realizzata una classe (WebPlugin), che implementa l’interfaccia javax.servlet.http.HttpSessionListener, in modo da intercettare gli eventi (javax.servlet.http.HttpSessionEvent) di creazione e distruzione di una sessione utente http (javax.servlet.http.HttpSession), come illustrato nel capitolo precedente. Lo scopo è dunque quello di creare una corrispondenza uno a uno tra le sessioni HTTP del server e quelle del sistema RBAC. Dall’HttpSessionEvent è infatti possibile ricavare l’identificatore della sessione HTTP ed utilizzarlo come identificatore della corrispondente sessione RBAC. In secondo luogo è stata realizzata una classe (WebFilter), che implementa l’interfaccia javax.servlet.Filter, in modo da intercettare le richieste di accesso degli utenti (vedi captiolo precedente) alle risorse del sever ed invocare un opportuno metodo del sistema RBAC per decidere se accettarle o meno. Ciò è possibile poiché si hanno a disposizione gli oggetti ServletRequest, dal quale si può ricavare la sessione HTTP, il suo identificativo, il nome dell’utente, quello dell’oggetto e dell’operazione richiesta, e ServletResponse, che si può utilizzare per indirizzare la risposta del server verso la pagina richiesta dall’utente, oppure verso una pagina di errore. A questo punto è necessario strutturare correttamente il file di configurazione “web.xml”, in modo da impostare l’applicazione affinché riconosca il filtro ed il listener definiti in precedenza (vedi figura seguente). Affinché il deployment dell’applicazione vada a buon fine, questo file deve essere collocato in un’apposita directory dell’applicazione web. Ad esempio per Tomcat deve essere collocato nella sotto-directory “WEB-INF” della directory principale di deployment dell’applicazione stessa, che a sua volta si trova nella sottodirectory “webapps” della directory di installazione del server. <filter> <filter-name> WebFilter </filter-name> <filter-class> it.unibs.carlotti.web.WebFilter </filter-class> </filter> <listener> <listener-class> it.unibs.carlotti.web.WebPlugin </listener-class> Pagina 158 </listener> <filter-mapping> <filter-name> WebFilter </filter-name> <url-pattern> /* </url-pattern> </filter-mapping> Figura 9-3. Estratto del file "web.xml" Affinchè un utente possa essere autenticato dal server web, è necessario inserire il suo nome e la sua password in un opportuno file di configurazione in formato XML. Ad esempio per Tomcat il file è denominato “tomcat-users.xml” e si trova nella sottodirectory “conf” della directory di installazione del server stesso. Infine va sottolineato il fatto che a livello del WebPlugin le sessioni possono non essere autenticate, perciò non è possibile conoscere il nome dell’utente loggato al sistema. Per risolvere questo problema viene creato un utente di default, il cui username è impostato ad “unknown”. Se si desidera che l’utente unknown abbia dei privilegi di accesso, è dunque necessario inserirlo nel database RBAC ed assegnargli i relativi ruoli. A livello di WebFilter invece gli utenti possono essere stati autenticati, di conseguenza è necessario aggiornare il nome dell’utente di una sessione nel caso in cui sia unknown. 9.4.2 Il motore statico Il motore statico è stato realizzato utilizzando il “pattern Decorator”, che permette di attribuire ad un oggetto responsabilità aggiuntive, mantenendo però la medesima interfaccia. IntegrityComponent, che In questo viene caso l’interfaccia direttamente comune implementata dalla è la classe RBACCoreStatic. Le funzionalità di quest’ultima possono essere aggiornate tramite la realizzazione di una classe che implementa l’interfaccia StaticConstraint. Avendo quest’ultima una reference ad un altro oggetto di tipo IntegrityComponent, è possibile creare una catena di chiamate agli altri StaticConstraint fino alla classe base RBACCoreStatic. Pagina 159 La figura seguente mostra la catena di chiamate del metodo checkIntegrity: ogni oggetto svolge i compiti che gli competono ed invoca lo stesso metodo sull’oggetto successivo della catena. RBACSSD chiamata CheckIntegrity() RBACLimitedHierarchy CheckIntegrity() RBACHierarchyStatic CheckIntegrity() RBACCoreStatic CheckIntegrity() Figura 9-4. Catena di chiamate La figura seguente mostra invece il diagramma delle classi del motore statico, che evidenzia l’utilizzo del pattern decorator. Pagina 160 Figura 9-5. Diagramma UML delle classi del motore statico Questo pattern è la soluzione migliore per rendere l’implementazione del modello RBAC modulare, facilmente aggiornabile ed espandibile con nuovi vincoli. Infatti chiunque volesse aggiungere una nuova tipologia di vincolo statico non deve fare altro che creare una classe che implementa l’interfaccia “StaticConstraint” ed aggiungerla nel costruttore del motore statico: new RBACSSD(new RBACLimitedHierarchy(new RBACHierarchyStatic(new RBACCoreStatic()))); L’unico metodo da implementare è il “checkIntegrity”, che non fa altro che verificare gli opportuni vincoli statici e lanciare un’eccezione (“IntegrityException”) nel caso in cui essi non siano rispettati. 9.4.3 Il motore dinamico La stessa scelta circa l’utilizzo del pattern Decorator è stata fatta anche per il motore dinamico, come evidenzia la figura che segue. Pagina 161 Figura 9-6. Diagramma UML delle classi del motore dinamico In questo caso chiunque volesse implementare un nuovo vincolo dinamico (o storico) dovrebbe creare una nuova classe, che implementi l’interfaccia “DynamicConstraint” ed aggiungerla nel costruttore del motore dinamico, così come si faceva per quello statico. Come si può vedere in figura, i metodi da implementare sono maggiori in numero rispetto al caso precedente, ma non è detto che si debbano inserire controlli aggiuntivi in ognuno di essi. Ad esempio se si desidera implementare un vincolo sull’attivazione dei permessi è sufficiente agire sul metodo “activatePermission”, se invece si vuole intervenire sull’attivazione dei ruoli sarà necessario intervenire il sui metodi “addActiveRole” ed eventualmente “dropActiveRole”. Pagina 162 La tabella seguente mostra su quali metodi interviene ogni implementazione dell’interfaccia EngineComponent. Il simbolo “/” indica che non vengono fatti controlli o operazioni aggiuntive, ma ovviamente deve essere comunque presente l’invocazione del metodo opportuno nella catena delle chiamate, così come è stato mostrato per il motore statico. Vincoli Metodi RBACCore RBACHierarchy Dynamic Dynamic RBACDSD RBACTime / / / / / / / Vincoli DSD / Eistenza utente, CreateSession attivazione ruoli di default DeleteSession AddActiveRole DropActiveRole ActivatePermission Esistenza sessione Esistenza ruolo Esistenza ruolo Esistenza permesso / Operazioni di disattivazione / / / Vincoli temporali Esistenza CheckAccess utente, Aggiunge ai sessione, controlli Core la permesso, possibilità di ruolo, trovare un ruolo attivazione fra quelli ruolo e ereditati / / permesso Tabella 9-2. Controlli vincoli dinamici Pagina 163 Da notare è infine il fatto che al metodo activatePermission viene passata, oltre al nome, anche la reference all’oggetto coinvolto nel vincolo, in modo da supportare anche eventuali controlli, che hanno la necessità di fare riferimento ad attributi memorizzati nell’istanza dell’oggetto stesso. 9.4.4 Il gestore e il monitor delle sessioni Il gestore ed il monitor delle sessioni sono legati dal punto di vista dell’architettura del sistema dal “pattern Observer”, che permette di definire una dipendenza one-way tra un oggetto ed i suoi osservatori, in modo tale che il primo possa informare i secondi qualora cambi stato e questi possano quindi aggiornarsi correttamente. In pratica, con riferimento alla figura seguente, quando una sessione viene creata, distrutta o ne vengono aggiornati i ruoli attivi, viene invocato il metodo notifyObservers, che a sua volta invoca il metodo update di tutti i SessionObserver che si erano precedentemente registrati tramite il metodo attach. A questo punto ogni osservatore può aggiornare il suo contenuto informativo andandolo a prelevare direttamente dal gestore delle sessioni. La figura seguente mostra il diagramma delle classi del gestore e del monitor delle sessioni, evidenziando l’utilizzo del pattern Observer. Figura 9-7. Diagramma UML delle classi di gestore e monitor delle sessioni Pagina 164 Ogni volta che viene aggiunta o rimossa una sessione il gestore delle sessioni informa dunque il monitor che è avvenuto un cambiamento e quest’ultimo aggiorna immediatamente il suo contenuto informativo. 9.4.5 Note implementative Rimangono da fare due note implementative. La prima riguarda l’utilizzo del “pattern Singleton”, che assicura la creazione di un sola istanza delle seguenti componenti architetturali: • Motore statico (RBACIntegrity) • Motore dinamico (RBACEngine) • Gestore delle sessioni (RBACSessionsManager) • Funzioni amministrative del database (RBACAdmin) • Funzioni di reportistica del database (RBACReview) La seconda nota invece riguarda in generale l’implementazione del codice, che è stata realizzata utilizzando le ultime novità apportate al JDK 1.5 (detto anche Tiger), tra le quali la principale è l’introduzione dei cosiddetti “Generics”, che permettono di costruire tipi parametrizzati, che vengono controllati già in fase di compilazione. 9.5 Il database L’accesso al database è regolato da due classi, RBACAdmin ed RBACReview, che implementano rispettivamente le funzioni amministrative, definite dal modello, e quelle di reportistica, che invece non erano definite. Per avere un elenco completo dei metodi di questa classe (ed anche di tutte le altre) si rimanda alla documentazione del codice in appendice. Il database contiene una tabella per ogni entità, relazione e vincolo del modello: • RbacUser {ID, name} • Role {ID, name} • UserDefaultRole {IDuser, IDrole} • Permission {ID, name object, operation} Pagina 165 • UA {IDuser, IDrole} • PA { IDpermission ,IDRole } • RH { IDparent, IDchild} • SSD { ID, Role1, Role2} • DSD {ID, Role1, Role2} • Time {IDpermission ,IDRole, FromTime, ToTime} 9.5.1 I vincoli supportati ed il loro formato Un ultimo aspetto progettuale non completamente definito a livello di modello concettuale è la scelta dei vincoli da supportare (oltre ovviamente a quelli base) ed il loro formato. I vincoli supportati sono i seguenti: • Gerarchia limitata: numero massimo di figli e di padri di un ruolo • Separazione statica dei compiti • Separazione dinamica dei compiti • Vincoli temporali di intervallo sull’attivazione dei permessi Il formato scelto per i vincoli di separazione dei compiti statica e dinamica è quello della mutua esclusione espressa per coppie di ruoli, così com’è stata descritta in precedenza nel capitolo sei. I vincoli temporali invece richiedono di specificare il ruolo ed il permesso che si desidera attivare, nonché gli istanti temporali (iniziale e finale) che delimitano l’intervallo all’interno del quale il permesso può essere attivato. Per quanto riguarda invece i vincoli gerarchici (ovvero quelli sul numero massimo di padri e figli che può aver un ruolo), essendo molto semplici da esprimere, non sono stati inseriti nel database, ma in un apposito file di configurazione ("hierarchy.properties"), il cui contenuto viene riportato in figura. hierarchy.maxParent = 1 hierarchy.maxChild = inf Figura 9-8. File di configurazione "hierarchy.properties" Pagina 166 La property “MaxParent” indica il numero massimo di padri di un ruolo, mentre in modo analogo “MaxChild” indica in numero massimo di figli. La stringa “inf” sta per “infinito” e serve ad indicare che non c’è un limite massimo per i figli (o i padri) che può aver un ruolo. Nel caso opposto in cui viene indicato il valore zero per uno qualsiasi dei due parametri (maxParent e maxChild), un ruolo non può avere né figli, né padri, appiattendo dunque la gerarchia. 9.6 I tool amministrativi In questa sezione si vogliono illustrare le funzionalità messe a disposizione dai tool di amministrazione, l’AdminTool ed il SessionsMonitor. 9.6.1 AdminTool Il tool di amministrazione AdminTool permette di agire sul database RBAC e modificarne il contenuto. Per prima cosa è necessario autenticarsi, utilizzando lo username e la password che sono a protezione del database. L’autenticazione viene fatta dal DBMS stesso, al quale vengono passate direttamente le credenziali inserite dall’utente. Questa scelta è dettata dal fatto che chi modifica i dati memorizzati all’interno del database deve avere i privilegi per accedervi. Il tool presenta una serie di schede all’interno delle quali viene visualizzato il contenuto del database e vengono presentate le funzionalità di base per creare nuovi elementi ed eliminare quelli esistenti. Le schede messe a disposizione sono le seguenti: • Users: gestione degli utenti • Roles: gestione dei ruoli • Permissions: gestione dei permessi • User assignment: assegnazione dei ruoli agli utenti • Default roles: assegnazione dei ruoli attivati di default agli utenti • Permission assignment: assegnazione dei permessi ai ruoli • Role Hierarchy: gestione delle relazioni gerarchiche • SSD: gestione dei vincoli di separazione dei compiti statica • DSD: gestione dei vincoli di separazione dei compiti dinamica Pagina 167 • Time: gestione dei vincoli temporali La figura seguente mostra un esempio di utilizzo del tool per l’assegnazione di un ruolo ad un utente. Figura 9-9. RBACAdmin tool: assegnazione di un ruolo ad un utente Il tool permette di controllare l’integrità del database, ovvero il rispetto dei vincoli statici, che esso stesso contiene. Ogni volta che un vincolo è violato compare un avviso simile a quello mostrato nella figura che segue. Pagina 168 Figura 9-10. RBACAdmin tool: violazione di un vincolo SSD 9.6.2 SessionMonitor Il monitor delle sessioni si avvia assieme all’applicativo e mostra in ogni istante tutte le sessioni attive, indicandone l’identificativo ed il nome dell’utente. Facendo doppio clic su una sessione, vengono mostrati in una nuova finestra i ruoli attivi della sessione selezionata. La figura seguente mostra in secondo piano il browser attraverso il quale l’utente “giacomo” è acceduto ad una pagina del web server. In primo piano si può vedere il SessionMonitor che mostra la sessione dell’utente ed i ruoli che essa ha attivato. Pagina 169 Figura 9-11. RBACSessionsMonitor 9.7 I file di configurazione I file di configurazione sono contenuti nel package “it.unibs.ing.carlotti.rbac.conf” ed il loro formato è lo standard “.properties”, che è così definito: ogni riga del file deve essere composta dal nome di una proprietà, un ‘=’ e un valore da attribuire alla proprietà indicata. Utilizzando questo formato è possibile utilizzare delle apposite classi Java che ne rendono la lettura particolarmente semplice ed immediata. I diversi file di configurazione sono strutturati in modo gerarchico, ovvero vi è un file di configurazione principale dal quale dipendono tutti gli altri. Questo file si deve chiamare necessariamente “rbac.properties” ed il suo contenuto è mostrato nella figura seguente. rbac.config.db = postgre.properties rbac.config.checkalways = false; rbac.create.db = postgre.sql Figura 9-12. File di configurazione “rbac.properties” Pagina 170 Le proprietà contenute in questo file sono le seguenti: • rbac.config.db: indica il nome del file che contiene i dati necessari per accedere al database. • rbac.config.checkalways: indica se il controllo di integrità del database deve essere fatto per ogni accesso di un utente (vedi paragrafi precedenti). • rbac.create.db: indica il nome del file SQL che contiene le istruzioni per creare il database. Il file indicato dalla proprietà “rbac.config.db” è a sua volta un file properties ed è strutturato come mostrato in figura. db.username = giacomo db.password = rbac05Carlotti db.url = jdbc:postgresql://localhost/rbac db.driver = org.postgresql.Driver Figura 9-13. File di configurazione “postgre.properties” Il file contiene le seguenti informazioni: • db.username: username per accedere al database (non viene utilizzato dall’AdminTool) • db.password: password per accedere al database (non viene utilizzato dall’AdminTool) • db.url: indirizzo del database • db.driver: driver JDBC (vedi capitolo precedente) da utilizzare per interfacciarsi correttamente al DBMS. Infine fa parte di questo package anche il file “hierarchy.properties”, che è stato mostrato in precedenza e che contiene le informazioni circa i vincoli che limitano la gerarchia fra ruoli. Pagina 171 CAPITOLO 10 TEST E CONCLUSIONI Questo è il capitolo finale della presente trattazione, in cui viengono presentati la fase di test dell’applicazione ed i suoi risultati. Si traggono dunque le conclusioni sul lavoro svolto e si propongono tre possibili filoni per proseguire lo studio sul controllo d’accesso basato su ruoli. Pagina 172 10.1 Testing Il sistema sviluppato è stato testato sia in ambiente Linux, che in ambiente Windows utilizzando due DMBS differenti, PostgreSQL e MySQL. La tabella seguente riassume le diverse configurazioni di testing. LINUX WINDOWS Versione Mandrake 10.0 Windows XP Professional SP2 DBMS MySQL 4.1.12 PostgreSQL 8.0 JVM 1.5.0 update 04 1.5.0 update 04 Jakarta Tomcat 5.5.9 Jakarta Tomcat 5.5.9 Application Server Tabella 10-1. Configurazioni di Testing Il lavoro si è articolato nelle seguenti fasi: • installazione DBMS • creazione database e popolazione delle tabelle • installazione Application Server • realizzazione di una semplice applicazione di test tramite JSP • deployment dell’applicazione di test • configurazione del sistema RBAC • deployment del sistema RBAC • testing dell’applicazione Per l’installazione dei DBMS si rimanda alla chiara e completa documentazione ufficiale di MySQL [95]e PostgreSQL [96]. La creazione e la popolazione del database sono state effettuate utilizzando i file di configurazione con estensione “.sql”, di cui si è parlato nel capitolo precedente, ed il tool amministrativo RBACAdmin, anch’esso descritto nel capitolo precedente. Sono stati inseriti utenti, permessi e ruoli in numero sufficiente per Pagina 173 realizzare gerarchie tra questi ultimi ed imporre tutti i possibili vincoli supportati dal modello RBAC esteso. Anche per quanto concerne l’installazione di Tomcat si rimanda alla documentazione del sito ufficiale [94]. L’applicazione di test è stata realizzata scrivendo alcune semplici pagine JSP (vedi capitolo 8), che mostravano solamente il nome dell’utente che le aveva accedute tramite un’operazione di “get” o di “post”. Queste pagine sono state distribuite in fase di deployment in diverse locazioni, alcune pubbliche, altre accessibili solo da certi utenti autenticati (file “tomcat-users.xml” - vedi paragrafo 9.4.1). In questo modo è stato possibile definire i permessi nel seguente modo: • oggetto = url della pagina jsp • operazione = get o post Si rimanda al capitolo precedente per la descrizione dettagliata della configurazione del sistema RBAC. Infine per quanto riguarda il deployment di quest’ultimo è sufficiente copiare i files “.class” nella sottodirectory “classes” della directory “WEB-INF” dell’applicazione di test e configurare correttamente il file “web.xml”, anch’esso contentuo in questa directory, come illustrato nel capitolo precedente. Completate tutte queste operazioni preliminari, è stato effettuato, a seguito di un’attenta ispezione del codice, un testing funzionale basato sui casi d’uso dell’applicazione, verificando per ognuno di questi ultimi il corretto funzionamento del sistema di controllo d’accesso. Poiché i vincoli di cui testare il funzionamento sono divisi in statici e dinamici, si è scelta la stessa classificazione anche per i casi d’uso. Una suddivisione ulteriore è stata fatta per package, in modo da testare incrementalmente il sistema, aggiungendo di volta in volta nuove funzionalità. I prossimi paragrafi riportano un elenco dei casi d’uso testati. 10.1.1 Motore statico: Casi d’uso 1. Core RBAC a. Creazione sessione: il sistema crea la sessione ed attiva gli eventuali ruoli di default. Pagina 174 b. Richiesta di un permesso regolare: il sistema autorizza l’utente. c. Richiesta di un permesso non regolare: il sistema non autorizza l’utente. d. Distruzione sessione: vengono disattivati i ruoli attivi e viene distrutta la sessione. 2. Hierarchical RBAC a. Richiesta di un permesso appartenente ad un ruolo ereditato: il sistema autorizza l’utente. b. Richiesta di un permesso non assegnato o ereditato dall’utente: il sistema non autorizza l’utente. 3. DSD RBAC a. Creazione di una sessione in cui i ruoli di default violano i vincoli DSD: la sessione viene creata senza attivare tutti i ruoli di default. b. Creazione di una sessione in cui i ruoli di default non violano i vincoli DSD: la sessione viene creata attivando tutti i ruoli di default. c. Attivazione di un ruolo che viola i vincoli DSD: il sistema non autorizza l’utente. d. Attivazione di un ruolo che non viola i vincoli DSD: il sistema autorizza l’utente. 4. Time RBAC a. Richiesta di un permesso attivabile: il sistema autorizza l’utente. b. Richiesta di un permesso non attivabile il sistema non autorizza l’utente. 5. Cancellazioni a. Eliminazione di un utente i. L’utente prova ad usare un permesso di un ruolo già attivo: il sistema non autorizza l’utente. ii. L’utente prova ad attivare un ruolo: il sistema non autorizza l’utente. iii. L’utente prova a creare una sessione: il sistema non autorizza l’utente. Pagina 175 iv. L’utente prova a terminare una sessione: la sessione viene terminata b. Eliminazione di un ruolo i. L’utente prova ad usare un permesso del ruolo eliminato, che però aveva già attivato: il sistema non autorizza l’utente. ii. L’utente prova ad attivare il ruolo eliminato: il sistema non autorizza l’utente. iii. L’utente prova ad disattivare il ruolo eliminato: il ruolo viene disattivato. iv. L’utente prova a creare una sessione in cui il ruolo eliminato è di default: la sessione viene creata, ma il ruolo non viene attivato. c. Eliminazione di un permesso i. L’utente prova ad utilizzare il permesso: il sistema non autorizza l’utente. d. Eliminazione dell’assegnamento di un utente ad un ruolo i. L’utente prova ad usare un permesso del ruolo non più assegnatogli, che però aveva già attivato: il sistema non autorizza l’utente. ii. L’utente prova ad attivare il ruolo che gli è stato tolto: il sistema non autorizza l’utente. iii. L’utente prova ad disattivare il ruolo che gli è stato tolto, ma che aveva attivo: il ruolo viene disattivato iv. L’utente prova a creare una sessione in cui il ruolo non più assegnatogli è di default: la sessione viene creata, ma il ruolo non viene attivato. e. Eliminazione dell’assegnazione di un permesso ad un ruolo i. L’utente prova ad utilizzare il permesso che gli è stato tolto: il sistema non autorizza l’utente. Pagina 176 10.1.2 Motore Statico: Casi d’uso 1. Core RBAC a. Aggiunta di un ruolo di default non assegnato all’utente: il sistema segnala l’errore all’amministratore. b. Aggiunta di un ruolo di default precedentemente assegnato all’utente: il sistema autorizza l’operazione. 2. Hierarchical RBAC a. Aggiunta di un ruolo di default ereditato dall’utente: il sistema autorizza l’operazione. b. Aggiunta di un ruolo di default non ereditato dall’utente: il sistema segnala l’errore all’amministratore. 3. Limited RBAC a. Aggiunta di una relazione di ereditarietà consentita: il sistema autorizza l’operazione. b. Aggiunta di una relazione di ereditarietà non consentita: il sistema segnala l’errore all’amministratore. 4. SSD RBAC a. Assegnazione ad un utente di un ruolo che è in conflitto con uno già assegnatogli: il sistema segnala l’errore all’amministratore. b. Assegnazione ad un utente di un ruolo che non è in conflitto con i ruoli già assegnatigli: il sistema segnala l’errore all’amministratore. 10.1.3 Risultati Il testing si è rivelato molto utile nel rivelare alcuni bug nell’implementazione, che difficilmente sarebbero stati scoperti con la sola ispezione del codice. Al termine della fase di revisione l’applicazione si è dimostrata affidabile e funzionante in tutte le sue componenti, descritte nei paragrafi precedenti. Pagina 177 10.2 Considerazioni finali In conclusione è possibile affermare che gli obiettivi stabiliti all’inizio della tesi sono stati pienamente raggiunti. In particolare sono stati conseguiti i seguenti risultati: • L’analisi dei modelli di controllo d’accesso basato su ruoli elaborati nel corso di questo ultimo decennio ha portato all’elaborazione di un modello RBAC esteso con la caratteristica originale dell’attivazione dei permessi (vedi capitolo 7), che permette di supportare un numero maggiore di vincoli, la cui necessità è stata segnalata in letteratura. • Si può ritenere un utile contributo anche la tassonomia proposta nel capitolo 6, in quanto mette ordine e classifica chiaramente i controlli che si possono effettuare, ponendo l’attenzione sia sul target del vincolo, che sull’istante temporale in cui esso deve essere verificato. • Per quanto riguarda invece l’implementazione, si è in primo luogo raggiunto l’obiettivo primario di aggiungere una nuova funzionalità di controllo d’acceso alle tecnologie J2EE, della quale si sentiva la mancanza. Ne sono la testimonianza numerosi articoli e forum di discussione nei siti specializzati, dei quali si può trovare un esempio al link: http://forum.java.sun.com/thread.jspa?threadID=568069&tstart=240. Il risultato è però ancor più generale, in quanto si è realizzato un sistema di controllo d’accesso basato su ruoli utilizzabile in qualsiasi contesto applicativo tramite l’implementazione di semplici plug-in, simili a quello illustrato nel capitolo 9. • Infine si è realizzata un’applicazione: o Modulare: è possibile scegliere se utilizzare solo il CoreRBAC, oppure anche le funzionalità degli altri modelli (Hierarchical, SSD, DSD, Time). o Facilmente espandibile: è possibile implementare nuovi vincoli ed integrarli nel sistema. Pagina 178 o Adattabile a più contesti applicativi: è possibile sfruttare il sistema RBAC per effettuare il controllo d’accesso non solo in ambito J2EE. o Semplice da configurare: il formato dei vincoli è immediatamente comprensibile e perfettamente aderente al modello concettuale; inoltre i tool amministrativi visuali facilitano notevolmente il lavoro dell’amministratore. Prima di discutere circa i possibili sviluppi futuri dell’applicativo realizzato, si vuole dare un’ulteriore riscontro dell’attualità del tema oggetto della presente trattazione e di come esso sia al centro di grandi interessi non solo a livello accademico, ma anche applicativo. 10.3 L’attualità del tema Il crescente interesse per il controllo d’accesso basato su ruoli è principalmente dovuto al fatto che le aziende si trovano ad avere sempre maggiori responsabilità legali, in concomitanza alla crescita delle minacce informatiche ed alla diffusione delle tecniche per la gestione delle identità. Nel novembre del 2004 la Unisys (società che fornisce servizi e soluzioni di IT in tutto il mondo) ha reso noti i risultati di uno studio che delinea le principali tendenze in ambito security (sicurezza informatica) nel 2005. Le previsioni indicano che le aziende dovranno affrontare importanti sfide e rilevanti investimenti in soluzioni di sicurezza per gestire le problematiche derivanti dalla crescente fiducia nelle reti integrate che le collegano con clienti e partner commerciali, dalla diffusione di tecnologie mobili e connettività wireless, dalle nuove minacce e tentativi di attacco da parte di cyberterroristi e cybercriminali verso le realtà aziendali ed i governi. Lo studio Unisys mette in risalto il fatto che la sicurezza oggi è soprattutto una questione di business. Infatti investire in soluzioni e servizi di security significa ottimizzare i processi associati all'impiego del patrimonio informativo aziendale per poterne pianificare la crescita e al contempo gestire i rischi che potrebbero minare l’immagine dell'azienda. Pagina 179 Nei prossimi anni si potrà assistere a importanti sfide che avranno un impatto rilevante in termini legali, economici e tecnologici. Le aziende saranno chiamate come mai prima d'ora a investire in sicurezza in maniera focalizzata, strategica e pervasiva. Questo onere sarà necessario per qualunque organizzazione che voglia diventare ciò che si definisce una “trusted enterprise”, ovvero una realtà nella quale il “risk management” è parte della strategia business, al fine di creare un ambiente sicuro che consenta la collaborazione ottimale con partner e clienti. La tecnica RBAC (Role-Based Access Control) consente l’accesso agli utenti a determinate applicazioni sulla base della loro funzione professionale anziché dell’identità personale. Questo sistema può eliminare le complesse modifiche necessarie quando i diritti di accesso vengono collegati direttamente agli utenti individuali. L'adozione della tecnica RBAC si è diffusa lentamente a causa della difficoltà e dei costi legati alla definizione dei ruoli a livello aziendale. In un'organizzazione con 40.000 dipendenti e svariati sistemi, per esempio, potrebbero servire anche 12 mesi per definire questi ruoli; tuttavia, associare 40.000 persone a 2.500 ruoli ridurrebbe enormemente il lavoro richiesto per fornire e gestire gli accessi. Nuove tecnologie permetteranno di ottenere più rapidamente i vantaggi del sistema RBAC, in particolare una superiore efficienza operativa e costi inferiori. Uno studio Unisys dedicato alla gestione dell’identità e degli accessi (IAM - Identity and Access Management) indica un'accelerazione dell'adozione dei meccanismi RBAC: il 32% degli interpellati ha dichiarato di essere intenzionato a implementare la tecnica RBAC nel 2005. Condotto all’inizio del mese di ottobre 2004, lo studio, effettuato da KRC Research, ha coinvolto 150 responsabili IT di grandi aziende degli Stati Uniti (con un fatturato annuo di oltre 500 milioni di dollari). Per una copia dei risultati della ricerca, è possibile visitare il sito Web di Unisys all'indirizzo “http://www.app1.unisys.com/common/iam/registration.asp”. Pagina 180 10.4 Sviluppi futuri Sicuramente il lavoro svolto nell’ambito della tesi rappresenta un punto di partenza e non un punto di arrivo per lo sviluppo di tecniche RBAC sempre più sicure ed efficienti. Gli ambiti di ricerca sono dunque numerosi. Per quanto riguarda gli sviluppi futuri in relazione al modello RBAC si possono individuare tre filoni principali: 1. il primo è volto alla classificazione e alla standardizzazione del formato dei vincoli che un sistema RBAC deve supportare; 2. il secondo ha come scopo l’individuazione di un modello amministrativo distribuito, applicabile alle grandi realtà organizzative, nelle quali non è concepibile che un’unica figura professionale possa gestire l’intero sistema informativo aziendale; 3. il terzo ed ultimo filone si preoccupa dell’integrazione del modello RBAC con altri modelli di controllo d’accesso per creare un sistema ancora più completo e sicuro. Per quanto concerne l’applicativo sviluppato, è sicuramente possibile apportare numerose migliorie a diversi livelli: 1. in primo luogo è possibile implementare tutti i diversi vincoli definiti nella tassonomia proposta; 2. in secondo luogo è senz’altro utile implementare funzioni grafiche evolute per i tool amministrativi, come ad esempio funzionalità “drag & drop” e visualizzazione schematica dei ruoli e della loro gerarchia; 3. infine è possibile realizzare numerosi altri plug-in per integrare l’applicativo in numerosi altri sistemi e dotarli delle funzionalità del controllo d’accesso basato su ruoli. Infine un’ultima verifica delle potenzialità del software implementato sarebbe la “prova sul campo”, ovvero l’installazione dello stesso in un sistema realmente utilizzato per la gestione del controllo d’accesso in un’organizzazione di medie o grandi dimensioni. Pagina 181 Indice delle figure Figura 2-1. Il reference monitor ............................................................................ 29 Figura 2-2. Il security kernel................................................................................. 30 Figura 2-3. Utente VS Soggetto............................................................................ 32 Figura 2-4. Tripla di controllo d’accesso secondo Clark e Wilson...................... 35 Figura 3-1. Relazioni tra utenti, ruoli, transazioni ed oggetti di sistema .............. 41 Figura 3-2. Gerarchia di ruoli ............................................................................... 42 Figura 3-3. Esempio di gerarchia tra ruoli ............................................................ 43 Figura 4-1. RBAC96 Framework.......................................................................... 51 Figura 4-2. Esempi di gerarchia di ruoli ............................................................... 53 Figura 4-3. Gerarchie di complessità crescente .................................................... 54 Figura 4-4. RBAC 3: unione dei modelli RBAC 0, 1, 2 ....................................... 56 Figura 5-1. Gerarchia ad albero ............................................................................ 63 Figura 5-2. Gerarchia ad albero invertito.............................................................. 63 Figura 5-3. Gerarchia a reticolo ............................................................................ 63 Figura 5-4. Core RBAC ........................................................................................ 68 Figura 5-5. Hierarchical RBAC ............................................................................ 70 Figura 5-6. Constrained RBAC: SSD ................................................................... 71 Figura 5-7. Constrained RBAC: DSD................................................................... 72 Figura 5-8. Packages dello standard RBAC.......................................................... 80 Figura 6-1. Interpretazione standard dei permessi RBAC ................................... 91 Figura 6-2. Modello dei permessi RBAC modificato ........................................... 91 Figura 6-3. Esempio di mutua esclusione tra cinque diversi ruoli...................... 105 Figura 6-4. Esempio di utilizzo di blacklist ........................................................ 107 Figura 7-1. Modello RBAC del NIST................................................................. 110 Figura 7-2. Architettura statica dello standard NIST .......................................... 111 Figura 7-3. Architettura statica del modello proposto ........................................ 112 Figura 7-4. Architettura dinamica dello standard NIST...................................... 112 Figura 7-5. Architettura dinamica del modello proposto .................................... 113 Figura 7-6. Variante della parte dinamica del modello....................................... 114 Pagina 182 Figura 8-1. L’architettura J2EE .......................................................................... 124 Figura 8-2. Componenti, contenitori e connettori............................................... 125 Figura 8-3. Esempio di applicazione enterprise multi-tier.................................. 128 Figura 8-4. Esempio di applicazione enterprise multi-tier.................................. 128 Figura 8-5. Funzionamento del business-tier ...................................................... 131 Figura 8-6. Modello del commercio elettronico ................................................. 132 Figura 8-7. Driver JDBC di tipo 3 e 4................................................................. 134 Figura 8-8. Driver JDBC di tipo 1 e 2................................................................. 135 Figura 8-9. Il package javax.servlet .................................................................... 138 Figura 8-10. Il package javax.servlet.http........................................................... 139 Figura 9-1. Architettura del sistema.................................................................... 153 Figura 9-2. Dettaglio architettura........................................................................ 157 Figura 9-3. Estratto del file "web.xml" ............................................................... 159 Figura 9-4. Catena di chiamate ........................................................................... 160 Figura 9-5. Diagramma UML delle classi del motore statico............................. 161 Figura 9-6. Diagramma UML delle classi del motore dinamico ........................ 162 Figura 9-7. Diagramma UML delle classi di gestore e monitor delle sessioni ... 164 Figura 9-8. File di configurazione "hierarchy.properties" .................................. 166 Figura 9-9. RBACAdmin tool: assegnazione di un ruolo ad un utente .............. 168 Figura 9-10. RBACAdmin tool: violazione di un vincolo SSD ......................... 169 Figura 9-11. RBACSessionsMonitor .................................................................. 170 Figura 9-12. File di configurazione “rbac.properties” ........................................ 170 Figura 9-13. File di configurazione “postgre.properties” ................................... 171 Pagina 183 Indice delle tabelle Tabella 1-1. Piano di lavoro .................................................................................. 22 Tabella 2-1. Esempio di matrice di controllo d'accesso di Lampson.................... 28 Tabella 5-1. Funzioni e packages dello standard RBAC ...................................... 82 Tabella 6-1. Categorie di vincoli e dimensione temporale ................................. 100 Tabella 7-1. Corrispondenze tra architettura statica e dinamica ......................... 114 Tabella 8-1. Classificazione API JDBC.............................................................. 133 Tabella 9-1. Implementazione delle interfacce ................................................... 156 Tabella 9-2. Controlli vincoli dinamici............................................................... 163 Tabella 10-1. Configurazioni di Testing ............................................................. 173 Pagina 184 Bibliografia e Riferimenti L’indice bibliografico seguente non è stato interamente utilizzato nell’ambito della tesi, in quanto lo studio di tutti i documenti elencati avrebbe richiesto di per sé un tempo maggiore di quello che si aveva a disposizione per portare a termine l’intero lavoro. È stato redatto tenendo traccia di tutti i principali riferimenti, che si sono incontrati durante l’attività di ricerca, allo scopo di creare una sorta di biblioteca virtuale sul controllo d’accesso in generale e più in particolare su quello basato su ruoli. L’intento è dunque quello di fornire una valida indicazione per chi volesse approfondire i diversi temi trattati in modo più o meno approfondito nella presente relazione. [1] DoD National Computer Security Center, Department of Defense Trusted Computer Systems Evaluation Criteria (Orange Book), December 1985, DoD 5200.28-STD. [2] Lampson, B. W., "Dynamic Protection Structures," AFIPS Conference Proceedings, 35, 1969, pp. 27–38. [3] Ware, W. H., Security Controls for Computer Systems (U): Report of Defense Science Board Task Force on Computer Security, Santa Monica, CA: The RAND Corporation, February 1970. [4] Anderson, J. P., Computer Security Technology Planning Study Volume II,ESD-TR-73-51, Electronic Systems Division, Air Force Systems Command, Hanscom Field, Bedford, MA, 01730, October 1972. [5] Bell, D. E., and L. J. LaPadula, Secure Computer Systems: Mathematical Foundations and Model, Bedford, MA: The Mitre Corporation, 1973. See also D. E. Bell and L. J. LaPadula, Secure Computer System: Unified Exposition and MULTICS Interpretation, MTR-2997 Rev. 1, Bedford, MA: The MITRE Corporation, March 1976, and ESD-TR-75-306, rev. 1, Electronic Systems Division, Air Force Systems Command, Hanscom Field, Bedford, MA 01731. Pagina 185 [6] Harrison, M., W. Ruzzo, and J. Ullman, Protection in Operating Systems, CACM 19, No. 8, August 1976, pp. 461–471. [7] Clark, D. D., and D. R. Wilson, "A Comparison of Commercial and Military Computer Security Policies," IEEE Symposium of Security and Privacy, 1987, pp. 184–194. [8] Dobson, J. E., and J. A. McDermid, "Security Models and Enterprise Models," in Database Security II: Status & Prospects, C. E. Landwehr (ed.), North Holland, 1989, pp. 1–39. [9] Baldwin, R. W., "Naming and Grouping Privileges To Simplify Security Management in Large Database," in Proceedings IEEE Computer Society Symposium on Research in Security and Privacy, April 1990, pp. 184– 194. [10] Thomsen, D. J., "Role-Based Application Design and Enforcement," in Database Security, IV: Status and Prospects, S. Jajodia and C. E. Landwehr (eds.), North Holland, 1991, pp. 151–168. [11] Brewer, D. F. C., and M. J. Nash, "The Chinese Wall Security Policy," Proceedings IEEE Computer Society Symposium on Research in Security and Privacy,April 1989, pp. 215–228. [12] Nash, M., and K. Poland, "Some Conundrums Concerning Separation of Duty," presented at the IEEE Symposium on Security and Privacy, Oakland, CA, 1990. [13] Ferraiolo, D., D. Gilbert, and N. Lynch, "An Examination of Federal and Commercial Access Control Policy Needs," in Proceedings of the NIST-NSA National (USA) Computer Security Conference, 1993, pp. 107–116. [14] Ferraiolo, D., and D. R. Kuhn, "Role-Based Access Control," in Proceedings of the NIST-NSA National (USA) Computer Security Conference, 1992, pp. 554–563. [15] Ferraiolo, D. F., J. Cugini, and D. R. Kuhn, "Role-Based Access Control (RBAC): Features and Motivations," in Proceedings of the 11th Annual Computer Security Application Conference, New Orleans, LA, December 11–15 1995, pp. 241–248. Pagina 186 [16] Sandhu, R. S., et al., "Role-Based Access Control: A Multidimensional View," Proceedings of the 10th Annual Computer Security Applications Conference, December 1994, pp. 54–62. [17] Nyanchama, M., and S. L. Osborn, "Access Rights Administration in Role-Based Security Systems," Proceedings of the IFIP WG11.3 Working Conference on Database Security, 1994. See also M. Nyanchama and S. L. Osborn, "The Role Graph Model and Conflict of Interest," ACM Transactions on Information and System Security (TISSEC), Vol. 2, No. 1, February 1999, pp. 3–33. [18] Deinhart, K., et al., "Method and System for Advanced Role-Based Access Control in Distributed and Centralized Computer Systems," U.S. Patent 5,911,143, June 8, 1999. [19] Sandhu, R., et. al., "Role-Based Access Control Models," IEEE COmputer, Vol. 29, No. 2, February 1996. [20] Barkley, J. F., "Application Engineering in Health Care," Second Annual CHIN Summit, June 9, 1995. [21] Barkley, J. F., and A. V. Cincotta. "Implementation of Role/Group Permission Association Using Object Access Type," U.S. Patent 6,202,066, 2002. [22] Bertino, E., E. Ferrari, and V. Atluri, "A Flexible Model for the Specification and Enforcement of Authorizations in Workflow Management Systems," 2nd ACM Workshop on Role-Based Access Control, November 1997. [23] Sandhu, R., D. Ferraiolo, and R. Kuhn, "The NIST Model for Role- Based Access Control: Towards a Unified Standard," Proc. 5th ACM Workshop on Role-Based Access Control, July 26–27, 2000. [24] U.S. Health Insurance Portability and Accountability Act of 1996 (HIPAA) [25] Federal Aviation Administration, National Airspace System (NAS) Protection Profile Template Supplement, Version 1.0. [26] Joshi, J., et al., "Digital Government Security Infrastructure Design Challenges," IEEE Computer, 33(2), February 2001, pp. 66–72. Pagina 187 [27] Joshi, J. B. D., et al., "Security Models for Web-Based Applications," Communications of the ACM, 44(2), February 2001, pp. 38–44. [28] Ferraiolo, D. F., J. F. Barkley, and D. R. Kuhn, "A Role-Based Access Control Model and Reference Implementation Within a Corporate Intranet," ACM Transactions on Information and System Security (TISSEC), Vol. 2, No. 1, February 1999, pp. 34–64. [29] Park, J. S., and R. Sandhu, "RBAC on the Web by Smart Certificates," Proc. ACM Workshop on Role-Based Access Control 1999: 1–9, New York: ACM Press. [30] Daniels, J., "This is Not a Game: The Weakest Link," SANS Institute, August 9, 2001. [31] Messmer, E., "Role-Based Access Control on a Roll," Network World, July 30, 2001 [32] Anderson, J. P., Computer Security Technology Planning Study, Volume II, ESD-TR-73-51, Electronic Systems Division, Air Force Systems Command, Hanscom Field, Bedford, MA, 01730 (October 1972). [33] DoD National Computer Security Center, Department of Defense Trusted Computer Systems Evaluation Criteria, December 1985, DoD 5200.28-STD. [34] Lampson, B., "Protection," ACM Operating Sys. Reviews, 8(1), 1974, pp. 18–24. [35] Bell, D. E., and L. J. LaPadula, Secure Computer Systems: Mathematical Foundations and Model, Bedford, MA: The Mitre Corporation, 1973. See also D. E. Bell and L. J. LaPadula, Secure Computer System: Unified Exposition and MULTICS Interpretation, MTR-2997 Rev. 1, Bedford, MA: The MITRE Corporation, March 1976; also ESD-TR-75-306, rev. 1, Electronic Systems Division, Air Force Systems Command, Hanscom Field, Bedford, MA, 01731. [36] Biba, K. J., Integrity Considerations for Secure Computer Systems, Bedford, MA: The MITRE Corporation, 1977. Pagina 188 [37] Clark, D. D., and D. R. Wilson "A Comparison of Commercial and Military Computer Security Policies," IEEE Symposium of Security and Privacy, 1987, pp. 184–194. [38] Brewer, D., and M. Nash, "The Chinese Wall Security Policy," Proc. IEEE Computer Society Symposium on Research in Security and Privacy, April 1989, pp. 215–228. [39] Badger, L., et al., "A Domain and Type Enforcement Prototype," Usenix Computing Systems, Volume 9, Cambridge, MA, 1996. [40] Boebert, W., and R. Kain, "A Practical Alternative to Hierarchical Integrity Policies," Proceedings of the 8th National Computer Security Conference, October 1985. [41] Ostendorp, K. A., et al., "Domain and Type Enforcement Firewalls," DARPA Information Survivability Conference and Exposition, 2000, DISCEX ‘00, Vol. 1, 1999, pp. 351–361. [42] Tidswell, J., and J. Potter, An Approach to Dynamic Domain and Type Enforcement, Microsoft Research Institute, Department of Computing, Macquarie University, NSW, Australia, 2000. [43] Hoffman, J., "Implementing RBAC on a Type-Enforced system," Proceedings of the 13th Annual Computer Security Applications Conference, December 1997. [44] Ferraiolo, D., and R. Kuhn, "Role-Based Access Control," Proc. of the NIST-NSA Nat. (USA) Comp. Security Conf., 1992, pp. 554–563. [45] Ferraiolo, D., J. Cugini, and R. Kuhn. "Role-Based Access Control: Features and Motivations," Proc. of the Annual Computer Security Applications Conf., New Orleans: IEEE Press, 1995. [46] Sandhu, R., et al., "Role-Based Access Control Models," IEEE Computer, 29(2), February 1996. [47] Baldwin, R. W., "Naming and Grouping Privileges To Simplify Security Management in Large Databases," Proceedings of the IEEE Computer Society Symposium on Research in Security and Privacy, April 1990, pp. 184–194. Pagina 189 [48] Nyanchama, M., and S. L. Osborn, "Access Rights Administration in Role-Based Security Systems," Proceedings of the IFIP WG11.3 Working Conference on Database Security, 1994. See also Nyanchama, M., and S. L. Osborn, "The Role Graph Model and Conflict of Interest," ACM Transactions on Information and System Security (TISSEC), Vol. 2, No. 1, February 1999, pp. 3–33. [49] Moffett, J. D., and E. C. Lupu, "The Uses of Role Hierarchies in Access Control," "Proc. of the 4th ACM Workshop on Role-Based Access Control", 1999, pp. 153–160. [50] McRae, R., The Stanford Model for Access Control Administration, Stanford University, 2000 (unpublished). [51] Proctor, K., "Why All Banks Should Practice Risk Management," Hoosier Banker, April 2001. [52] Griffin, R. J., Statement of the Honorable Richard J. Griffin, Inspector General, Department of Veterans Affairs, Before the United States House of Representatives Committee on Veterans Affairs, Subcommittee on Oversight and Investigations Hearing on Fraud and Mismanagement in VA, September 23, 1999. [53] Simon, R. T., and M. E. Zurko, "Separation of Duty in Role Based Environments," Proc. Computer Security Foundations Workshop X, Rockport, MA, June 1997. [54] Moffett, J., and M. Sloman, "Policy Conflict Analysis in Distributed Systems Management," Journal of Organizational Computing, Vol. 4, No. 1, (1994), pp. 1–22. [55] Kuhn, D. R., "Mutual Exclusion of Roles as a Means of Implementing Separation of Duty in Role-Based Access Control Systems," Proceedings 2nd ACM Workshop on Role-Based Access Control, Fairfax, VA, 1997. pp. 23–30. [56] Giuri, L., and P. Iglio, "A Formal Model for Role-Based Access Control with Constraints," Proc. of the Computer Security Foundations Workshop, Piscataway, NJ: IEEE Press, 1996, pp. 136–145. Pagina 190 [57] Gligor, V., S. I. Gavrilla, and D. F. Ferraiolo, "On the Formal Definition of Separation of Duty Policies and Their Composition," Proceedings IEEE Symposium on Security and Privacy, May 1998, pp. 172–183. [58] Ahn, G. J., and R. Sandhu, "The RSL99 Language for Role-Based Separation of Duty Constraints," Proceedings of the Fourth ACM Workshop on Role-Based Access Control, October 28–29, 1999, Fairfax, Virginia, pp. 43–54. [59] Ahn, G. J., and R. Sandhu, "Role-Based Authorization Constraints Specification," ACM Transactions on Information and System Security (TISSEC), Vol. 3, No. 4, November 2000. [60] Tidswell, J. E., and T. Jaeger, "Integrated Constraints and Inheritance in DTAC," Proceedings of the Fifth ACM Workshop on RoleBased Access Control, July 26–28, 2000, Berlin, Germany, pp. 93–102. [61] Schaad, A., and J. D. Moffett, "The Incorporation of Control Policies into Access Control Policies," Policy 2001: Workshop on Policies for Distributed Systems and Networks, Bristol, United Kingdom. [62] Botha, R. A., and J. H. P. Eloff, "Separation of Duties for Access Control Enforcement in Workflow Environments," IBM Systems Journal, Vol. 40, No. 3, 2001. [63] Hunton, J. E., and T. L. Jones, "Recreation, Inc., An Information Technology Risk Assessment Case Study of Enterprise Resource Planning (ERP) Systems," AICPA Case Development Program, Case No. 2000-02, American Institute of Certified Public Accountants, 2000. [64] Ferraiolo, D., J. Cugini, and R. Kuhn, "Role-Based Access Control: Features and Motivations," Proc. of the Annual Computer Security Applications Conf., Piscataway, NJ: IEEE Press, 1995. [65] Sandhu, R., "Transaction Control Expressions For Separation Of Duties," Proc. 4th Aerospace Computer Security Applications Conference, Orlando, FL, December 1988, pp. 282–286. Pagina 191 [66] Nash, M. J., and K. R. Poland, "Some Conundrums Concerning Separation of Duty," Proceedings 1990 IEEE Symposium on Security and Privacy, May 1990, pp. 201–207. [67] Cholewka, D. G., R. H. Botha, and J. H. P. Eloff, "A Context- Sensitive Access Control Model and Prototype Implementation," Proceedings of the IFIP TC11 15th International Conference on Information Security, Beijing, China (2000), pp. 341–350, 2000. [68] Georgiadis, C. K., et al., Flexible "Team-Based Access Control Using Contexts," Proceedings of ACM RBAC97, 1997. [69] Kumar, A., N. Karnik, and G. Chafle, "Context Sensitivity in Role- Based Access," ACM SIGOPS Operating Systems Review, Vol. 36, Issue 3 (July 2002), pp. 53–66 [70] Papenfus, C., and R. Botha, "An XML-Based Approach to Enforcing History Based Separation of Duty Policies in Heterogeneous Workflow Environments," SACJ/SART, No. 26, 2000, pp. 60–68. [71] Chandramouli, R., and R. Sandhu, "Role-Based Access Control Features in Commercial Database Management Systems," 21st National Information Systems Security Conference, October 6–9, 1998, Crystal City, Virginia. [72] Crampton, J., and G. Loizou, "Authorization and Antichains," Operating Systems Review, 35(3), 6–15, 2001. [73] Bertino, E., A. Bonatti, and E. Ferrari, "TRBAC: A Temporal Role- Based Access Control Model," ACM Transactions on Information and System Security, 4(4), pp. 65–104, September 2001. [74] Joshi, J. B., D. Bertino, and A. Ghafoor, "Temporal Hierarchies and Inheritance Semantics for GTRBAC," Seventh ACM Symposium on Access Control Models and Technologies, Monterey, CA, 2002. [75] Nyanchama, M., and S. L. Osborn, "Information Flow Analysis in Role-Based Systems," Journal of Computing and Information, 1(1), May 1994, Special Issue: Proc. of the 6th International Conference on Computing and Information (ICCI), Peterborough, Ontario, Canada. Pagina 192 [76] Sandhu, R., "Role Hierarchies and Constraints for Lattice-Based Access Controls," Proc. of the Fourth European Symposium on Research in Computer Security, Rome, Italy, September 25–27, 1996. [77] Osborn, S., R. Sandhu, and Q. Munawer, "Configuring Role-Based Access Control To Enforce Mandatory and Discretionary Access Control Policies," ACM Transactions on Information and System Security, Vol. 3, No. 2, May 2002, pp. 85–106. [78] Ferraiolo, D. F., and V. Hu, The Policy Machine: A Policy Engine and Language for Generalized Attribute-Based Access Control, (unpublished) 2002. [79] Sandhu, R., and Q. Munawer, "How To Do Discretionary Access Control Using Roles," Proc. of the 3rd ACM Workshop on Role-Based Access Control (RBAC-98), Fairfax, VA, October 1998, ACM Press. [80] Kuhn, D. R., "Role-Based Access Control on MLS Systems Without Kernel Changes," Proceedings ACM Workshop on Role-Based Access Control, 1998, pp. 25–32. [81] Osborn, S. L., "Mandatory Access Control and Role-Based Access Control Revisited," Proceedings of the Second ACM Workshop on RoleBased Access Control, November 1997. [82] Meyers, W. J., "RBAC Emulation on Trusted DG/UX," Proceedings Second ACM Workshop on Role-Based Access Control, 1997. [83] Phillips, Jr., C. E., S. A. Demurjian, and T. C. Ting, "Towards Information Assurance for Dynamic Coalitions," Proceedings 2002 IEEE Workshop in Information Assurance, United States Military Academy, West Point, New York, June 2002. [84] Khair M., I. Mavridis, and G. Pangalos, "Design of Secure Distributed Medical Database System," in Database and Expert Systems Applications (DEXA ‘98), August 1998. [85] Phillips, Jr., C. E., T. C. Ting, and S. A. Demurjian, "Mobile and Cooperative Systems: Information Sharing and Security in Dynamic Coalitions," Seventh ACM Symposium on Access Control Models and Pagina 193 Technologies, June 2002. Also "Information Sharing and Security in Dynamic Coalitions," University of Connecticut, Technical Report CSETR-02-1, 2002. National Institute of Standards and Technology, Proposed Standard for Role-Based Access Control [86] Jason Crampton “On Permissions, Inheritance and Role Hierarchies” Information Security Group Royal Holloway, University of London – CCS 2003 [87] J. B. D. Joshi, E. Bertino, U. Latif, and A. Ghafoor, "Generalized Temporal Role-Based Access Control Model," IEEE transaction on Knowledge and Data Engineering, Vol.17, No. 1, January 2002 [88] R. Bhatti, J. B. D. Bertino, A. Ghafoor, “X-GTRBAC: An XML- based Policy Specification Framework and Architecture for EnterpriseWide Access Control”, submitted to ACM Transactions on Information and System Security, 2003 [89] Jason Crampton “Constraints in Role-Based Access Control” 8th ACM Symposium on Access Control Models and Technologies, 2-3 June 2003 [90] eXstensible Access Control Markup language (XACML) version 2.0” OASIS Standard, 1 Feb 2005 [91] CTC93 The Canadian Trusted Computer Product Evaluation Criteria (CTCPEC) Version 3.0e. Canadian System Security Centre, Communications Security Establishment, Government of Canada, January 1993. [92] ISO (International Organization for Standardization), sito internet: http://www.iso.org/iso/en/ISOOnline.frontpage [93] CORBA (Common Object Request Broker Architecture), sito internet: http://www.omg.org/corba [94] Jakarta-Tomcat, sito internet: http://jakarta.apache.org/tomcat/ [95] MySQL, sito internet: http://www.mysql.com/ [96] PostgreSQL, sito internet: http://www.postgresql.org/ Pagina 194 APPENDICE A JavaDoc DynamicConstraint Overview Package Class Use Tree Deprecated Index Help PREV CLASS NEXT CLASS FRAMES SUMMARY: NESTED | FIELD | CONSTR | METHOD DETAIL: FIELD | CONSTR | METHOD NO FRAMES All Classes it.unibs.carlotti.rbac.core Interface DynamicConstraint All Superinterfaces: EngineComponent All Known Implementing Classes: RBACDSD, RBACHierarchyDynamic, RBACTime public interface DynamicConstraint extends EngineComponent Questa interfaccia definisce i metodi che devono essere implementati dai vincoli dinamici del modello Author: Giacomo Carlotti Method Summary Methods inherited from interface it.unibs.carlotti.rbac.core.EngineComponent activatePermission, addActiveRole, checkAccess, createSession, deleteSession, dropActiveRole Overview Package Class Use Tree Deprecated Index Help PREV CLASS NEXT CLASS FRAMES SUMMARY: NESTED | FIELD | CONSTR | METHOD DETAIL: FIELD | CONSTR | METHOD NO FRAMES All Classes EngineComponent Overview Package Class Use Tree Deprecated Index Help PREV CLASS NEXT CLASS FRAMES SUMMARY: NESTED | FIELD | CONSTR | METHOD DETAIL: FIELD | CONSTR | METHOD NO FRAMES All Classes it.unibs.carlotti.rbac.core Interface EngineComponent All Known Subinterfaces: DynamicConstraint All Known Implementing Classes: RBACCoreDynamic, RBACDSD, RBACEngine, RBACHierarchyDynamic, RBACTime public interface EngineComponent Questa interfaccia definisce i metodi che devono essere implementati dai componenti del motore che controlla i vincoli dinamici Author: Giacomo Carlotti Method Summary boolean activatePermission(java.lang.String roleName, java.lang. String permissionName, java.lang.Object obj) Attiva un permesso verificando eventuali vincoli boolean addActiveRole(java.lang.String roleName, java.lang. String idSession) attiva un ruolo per una sessione utente, verificando gli eventuali vincoli boolean checkAccess(java.lang.String userName, java.lang. String objectName, java.lang.String operation, java.lang. String idSession, java.lang.Object obj) controlla la disponibilità di un permesso per un certo utente e cerca di attivare un ruolo a cui il permesso è associato EngineComponent void createSession(java.lang.String id, java.lang. String userName) crea una nuova sessione utente ed prova ad attivare i ruoli di default void deleteSession(java.lang.String id) disattiva i ruoli della sessione e la elimina boolean dropActiveRole(java.lang.String roleName, java.lang. String idSession) disattiva un ruolo di una sessione utente Method Detail createSession void createSession(java.lang.String id, java.lang.String userName) crea una nuova sessione utente ed prova ad attivare i ruoli di default Parameters: id - id della sessione userName - nome dell'utente deleteSession void deleteSession(java.lang.String id) disattiva i ruoli della sessione e la elimina Parameters: id - id della sessione addActiveRole boolean addActiveRole(java.lang.String roleName, java.lang.String idSession) EngineComponent attiva un ruolo per una sessione utente, verificando gli eventuali vincoli Parameters: roleName - nome del ruolo idSession - id della sessione Returns: true se riesce ad attivare il ruolo, false altrimenti dropActiveRole boolean dropActiveRole(java.lang.String roleName, java.lang.String idSession) disattiva un ruolo di una sessione utente Parameters: roleName - nome del ruolo idSession - id della sessione Returns: true se riesce a disattivare il ruolo, false altrimenti checkAccess boolean checkAccess(java.lang.String java.lang.String java.lang.String java.lang.String java.lang.Object userName, objectName, operation, idSession, obj) controlla la disponibilità di un permesso per un certo utente e cerca di attivare un ruolo a cui il permesso è associato Parameters: userName - nome del ruolo objectName - nome dell'oggetto operation - nome dell'operazione idSession - id della sessione obj - reference dell'oggetto Returns: true il processo di attivazione va a buon fine, false altrimenti EngineComponent activatePermission boolean activatePermission(java.lang.String roleName, java.lang.String permissionName, java.lang.Object obj) Attiva un permesso verificando eventuali vincoli Parameters: roleName - ruolo coinvolto nel vincolo permissionName - permesso coinvolto nel vincolo obj - reference all'ogggetto Returns: true il processo di attivazione va a buon fine, false altrimenti Overview Package Class Use Tree Deprecated Index Help PREV CLASS NEXT CLASS FRAMES SUMMARY: NESTED | FIELD | CONSTR | METHOD DETAIL: FIELD | CONSTR | METHOD NO FRAMES All Classes IntegrityComponent Overview Package Class Use Tree Deprecated Index Help PREV CLASS NEXT CLASS FRAMES SUMMARY: NESTED | FIELD | CONSTR | METHOD DETAIL: FIELD | CONSTR | METHOD NO FRAMES All Classes it.unibs.carlotti.rbac.core Interface IntegrityComponent All Known Subinterfaces: StaticConstraint All Known Implementing Classes: RBACCoreStatic, RBACHierarchyStatic, RBACIntegrity, RBACLimitedHierarchy, RBACSSD public interface IntegrityComponent Questa interfaccia definisce i metodi che devono esssere implementati dai componenti del motore che controlla i vincoli statici Author: Giacomo Carlotti Method Summary void checkIntegrity() Controlla i vincoli statici di integrità del sistema Method Detail checkIntegrity void checkIntegrity() throws java.lang.Throwable Controlla i vincoli statici di integrità del sistema IntegrityComponent Throws: java.lang.Throwable Overview Package Class Use Tree Deprecated Index Help PREV CLASS NEXT CLASS FRAMES SUMMARY: NESTED | FIELD | CONSTR | METHOD DETAIL: FIELD | CONSTR | METHOD NO FRAMES All Classes IntegrityException Overview Package Class Use Tree Deprecated Index Help PREV CLASS NEXT CLASS FRAMES SUMMARY: NESTED | FIELD | CONSTR | METHOD DETAIL: FIELD | CONSTR | METHOD NO FRAMES All Classes it.unibs.carlotti.rbac.core Class IntegrityException java.lang.Object java.lang.Throwable java.lang.Exception it.unibs.carlotti.rbac.core.IntegrityException All Implemented Interfaces: java.io.Serializable public class IntegrityException extends java.lang.Exception Questa classe rappresenta le eccezioni che possono essere lanciate durante il controllo dei vincoli statici Author: Giacomo Carlotti See Also: Serialized Form Constructor Summary IntegrityException(java.lang.String arg0) Costruttore Method Summary Methods inherited from class java.lang.Throwable IntegrityException fillInStackTrace, getCause, getLocalizedMessage, getMessage, getStackTrace, initCause, printStackTrace, printStackTrace, printStackTrace, setStackTrace, toString Methods inherited from class java.lang.Object clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait Constructor Detail IntegrityException public IntegrityException(java.lang.String arg0) Costruttore Parameters: arg0 - messaggio d'errore Overview Package Class Use Tree Deprecated Index Help PREV CLASS NEXT CLASS FRAMES SUMMARY: NESTED | FIELD | CONSTR | METHOD DETAIL: FIELD | CONSTR | METHOD NO FRAMES All Classes RBACCoreDynamic Overview Package Class Use Tree Deprecated Index Help PREV CLASS NEXT CLASS FRAMES SUMMARY: NESTED | FIELD | CONSTR | METHOD DETAIL: FIELD | CONSTR | METHOD NO FRAMES All Classes it.unibs.carlotti.rbac.core Class RBACCoreDynamic java.lang.Object it.unibs.carlotti.rbac.core.RBACCoreDynamic All Implemented Interfaces: EngineComponent public class RBACCoreDynamic extends java.lang.Object implements EngineComponent Componente Core del motore dinamico Author: Giacomo Carlotti Constructor Summary RBACCoreDynamic() Method Summary boolean activatePermission(java.lang.String roleName, java.lang. String permissionName, java.lang.Object obj) Attiva un permesso verificando eventuali vincoli boolean addActiveRole(java.lang.String roleName, java.lang. String idSession) attiva un ruolo per una sessione utente, verificando gli eventuali vincoli RBACCoreDynamic boolean checkAccess(java.lang.String userName, java.lang. String objectName, java.lang.String operation, java.lang. String idSession, java.lang.Object obj) controlla la disponibilità di un permesso per un certo utente e cerca di attivare un ruolo a cui il permesso è associato void createSession(java.lang.String idSession, java.lang. String userName) crea una nuova sessione utente ed prova ad attivare i ruoli di default void deleteSession(java.lang.String id) disattiva i ruoli della sessione e la elimina boolean dropActiveRole(java.lang.String roleName, java.lang. String idSession) disattiva un ruolo di una sessione utente Methods inherited from class java.lang.Object clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait Constructor Detail RBACCoreDynamic public RBACCoreDynamic() Method Detail activatePermission public boolean activatePermission(java.lang.String roleName, java.lang.String permissionName, java.lang.Object obj) Description copied from interface: EngineComponent Attiva un permesso verificando eventuali vincoli Specified by: activatePermission in interface EngineComponent Parameters: RBACCoreDynamic roleName - ruolo coinvolto nel vincolo permissionName - permesso coinvolto nel vincolo obj - reference all'ogggetto Returns: true il processo di attivazione va a buon fine, false altrimenti addActiveRole public boolean addActiveRole(java.lang.String roleName, java.lang.String idSession) Description copied from interface: EngineComponent attiva un ruolo per una sessione utente, verificando gli eventuali vincoli Specified by: addActiveRole in interface EngineComponent Parameters: roleName - nome del ruolo idSession - id della sessione Returns: true se riesce ad attivare il ruolo, false altrimenti checkAccess public boolean checkAccess(java.lang.String java.lang.String java.lang.String java.lang.String java.lang.Object userName, objectName, operation, idSession, obj) Description copied from interface: EngineComponent controlla la disponibilità di un permesso per un certo utente e cerca di attivare un ruolo a cui il permesso è associato Specified by: checkAccess in interface EngineComponent Parameters: userName - nome del ruolo objectName - nome dell'oggetto operation - nome dell'operazione RBACCoreDynamic idSession - id della sessione obj - reference dell'oggetto Returns: true il processo di attivazione va a buon fine, false altrimenti createSession public void createSession(java.lang.String idSession, java.lang.String userName) Description copied from interface: EngineComponent crea una nuova sessione utente ed prova ad attivare i ruoli di default Specified by: createSession in interface EngineComponent Parameters: idSession - id della sessione userName - nome dell'utente deleteSession public void deleteSession(java.lang.String id) Description copied from interface: EngineComponent disattiva i ruoli della sessione e la elimina Specified by: deleteSession in interface EngineComponent Parameters: id - id della sessione dropActiveRole public boolean dropActiveRole(java.lang.String roleName, java.lang.String idSession) Description copied from interface: EngineComponent RBACCoreDynamic disattiva un ruolo di una sessione utente Specified by: dropActiveRole in interface EngineComponent Parameters: roleName - nome del ruolo idSession - id della sessione Returns: true se riesce a disattivare il ruolo, false altrimenti Overview Package Class Use Tree Deprecated Index Help PREV CLASS NEXT CLASS FRAMES SUMMARY: NESTED | FIELD | CONSTR | METHOD DETAIL: FIELD | CONSTR | METHOD NO FRAMES All Classes RBACCoreStatic Overview Package Class Use Tree Deprecated Index Help PREV CLASS NEXT CLASS FRAMES SUMMARY: NESTED | FIELD | CONSTR | METHOD DETAIL: FIELD | CONSTR | METHOD NO FRAMES All Classes it.unibs.carlotti.rbac.core Class RBACCoreStatic java.lang.Object it.unibs.carlotti.rbac.core.RBACCoreStatic All Implemented Interfaces: IntegrityComponent public class RBACCoreStatic extends java.lang.Object implements IntegrityComponent Componente Core del motore statico Author: Giacomo Carlotti Constructor Summary RBACCoreStatic() Method Summary void checkIntegrity() Controlla i vincoli statici di integrità del sistema Methods inherited from class java.lang.Object clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait RBACCoreStatic Constructor Detail RBACCoreStatic public RBACCoreStatic() Method Detail checkIntegrity public void checkIntegrity() throws java.lang.Throwable Description copied from interface: IntegrityComponent Controlla i vincoli statici di integrità del sistema Specified by: checkIntegrity in interface IntegrityComponent Throws: java.lang.Throwable Overview Package Class Use Tree Deprecated Index Help PREV CLASS NEXT CLASS FRAMES SUMMARY: NESTED | FIELD | CONSTR | METHOD DETAIL: FIELD | CONSTR | METHOD NO FRAMES All Classes RBACSession Overview Package Class Use Tree Deprecated Index Help PREV CLASS NEXT CLASS FRAMES SUMMARY: NESTED | FIELD | CONSTR | METHOD DETAIL: FIELD | CONSTR | METHOD NO FRAMES All Classes it.unibs.carlotti.rbac.core Class RBACSession java.lang.Object it.unibs.carlotti.rbac.core.RBACSession All Implemented Interfaces: Session public class RBACSession extends java.lang.Object implements Session Sessione RBAC Author: Giacomo Carlotti Constructor Summary RBACSession(java.lang.String id, java.lang.String userName) Method Summary java.util. getActiveRoles() Vector<java. Restituisce l'elenco dei ruoli attivi della sessione lang.String> java.lang. getId() String Restituisce l'id della sessione RBACSession java.lang. getUserName() String Restituisce il nome dell'utente che ha creato la sessione void setUserName(java.lang.String userName) Methods inherited from class java.lang.Object clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait Constructor Detail RBACSession public RBACSession(java.lang.String id, java.lang.String userName) Method Detail getActiveRoles public java.util.Vector<java.lang.String> getActiveRoles() Description copied from interface: Session Restituisce l'elenco dei ruoli attivi della sessione Specified by: getActiveRoles in interface Session Returns: l'elenco dei ruoli attivi getUserName public java.lang.String getUserName() Description copied from interface: Session Restituisce il nome dell'utente che ha creato la sessione RBACSession Specified by: getUserName in interface Session Returns: il nome dell'utente getId public java.lang.String getId() Description copied from interface: Session Restituisce l'id della sessione Specified by: getId in interface Session Returns: l'id della sessione setUserName public void setUserName(java.lang.String userName) Overview Package Class Use Tree Deprecated Index Help PREV CLASS NEXT CLASS FRAMES SUMMARY: NESTED | FIELD | CONSTR | METHOD DETAIL: FIELD | CONSTR | METHOD NO FRAMES All Classes RBACSessionsManager Overview Package Class Use Tree Deprecated Index Help PREV CLASS NEXT CLASS FRAMES SUMMARY: NESTED | FIELD | CONSTR | METHOD DETAIL: FIELD | CONSTR | METHOD NO FRAMES All Classes it.unibs.carlotti.rbac.core Class RBACSessionsManager java.lang.Object it.unibs.carlotti.rbac.core.RBACSessionsManager All Implemented Interfaces: SessionsManager public final class RBACSessionsManager extends java.lang.Object implements SessionsManager Manager delle Sessioni RBAC Author: Giacomo Carlotti Method Summary boolean addActiveRole(java.lang.String roleName, java.lang. String idSession) Aggiunge un ruolo attivo ad una sessione void attach(SessionObserver o) Aggiunge un oesservatore void createSession(java.lang.String idSession, java.lang. String userName) Crea una nuova sessione void deleteSession(java.lang.String id) Elimina una sessione void detach(SessionObserver o) elimina un osservatore boolean dropActiveRole(java.lang.String roleName, java.lang. String idSession) Elimina un ruolo attivo da una sessione static SessionsManager getInstance() RBACSession getSession(java.lang.String id) Restituisce la sessione desiderata RBACSessionsManager java.util. getSessions() Collection<RBACSession> Restituisce l'elenco delle sessioni java.lang.String getSessionUserName(java.lang.String idSession) restituisce il nome dell'utente di una sessione void notifyObservers() Avvisa gli osservatori di un cambiamento di stato java.util. sessionActiveRoles(java.lang.String idSession) Collection<java.lang. restituisce i ruoli attivi di una sessione String> java.util. userActiveRoles(java.lang.String userName) Collection<java.lang. Restituisce l'elenco dei ruoli attivi di un utente String> Methods inherited from class java.lang.Object clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait Method Detail getInstance public static SessionsManager getInstance() attach public void attach(SessionObserver o) Description copied from interface: SessionsManager Aggiunge un oesservatore Specified by: attach in interface SessionsManager Parameters: o - osservatore detach public void detach(SessionObserver o) Description copied from interface: SessionsManager elimina un osservatore Specified by: detach in interface SessionsManager RBACSessionsManager Parameters: o - osservatore notifyObservers public void notifyObservers() Description copied from interface: SessionsManager Avvisa gli osservatori di un cambiamento di stato Specified by: notifyObservers in interface SessionsManager getSessions public java.util.Collection<RBACSession> getSessions() Description copied from interface: SessionsManager Restituisce l'elenco delle sessioni Specified by: getSessions in interface SessionsManager Returns: elenco delle sessioni getSession public RBACSession getSession(java.lang.String id) throws java.lang.Throwable Description copied from interface: SessionsManager Restituisce la sessione desiderata Specified by: getSession in interface SessionsManager Parameters: id - identificativo della sessione Returns: la sessione indicata Throws: java.lang.Throwable addActiveRole public boolean addActiveRole(java.lang.String roleName, RBACSessionsManager java.lang.String idSession) Description copied from interface: SessionsManager Aggiunge un ruolo attivo ad una sessione Specified by: addActiveRole in interface SessionsManager Parameters: roleName - nome del ruolo idSession - id della sessione Returns: true se l'operazione va abuon fine, false altrimenti dropActiveRole public boolean dropActiveRole(java.lang.String roleName, java.lang.String idSession) Description copied from interface: SessionsManager Elimina un ruolo attivo da una sessione Specified by: dropActiveRole in interface SessionsManager Parameters: roleName - nome del ruolo idSession - id della sessione Returns: true se l'operazione va abuon fine, false altrimenti userActiveRoles public java.util.Collection<java.lang.String> userActiveRoles(java.lang. String userName) Description copied from interface: SessionsManager Restituisce l'elenco dei ruoli attivi di un utente Specified by: userActiveRoles in interface SessionsManager Parameters: userName - nome dell'utente Returns: elenco dei ruoli attivi sessionActiveRoles public java.util.Collection<java.lang.String> sessionActiveRoles(java.lang. String idSession) RBACSessionsManager throws java.lang.Throwable Description copied from interface: SessionsManager restituisce i ruoli attivi di una sessione Specified by: sessionActiveRoles in interface SessionsManager Parameters: idSession - id della sessione Returns: elenco dei ruoli attivi Throws: java.lang.Throwable getSessionUserName public java.lang.String getSessionUserName(java.lang.String idSession) throws java.lang.Throwable Description copied from interface: SessionsManager restituisce il nome dell'utente di una sessione Specified by: getSessionUserName in interface SessionsManager Parameters: idSession - id della sessione Returns: nome dell'utente Throws: java.lang.Throwable createSession public void createSession(java.lang.String idSession, java.lang.String userName) Description copied from interface: SessionsManager Crea una nuova sessione Specified by: createSession in interface SessionsManager Parameters: idSession - id della sessione userName - nome dell'utente deleteSession public void deleteSession(java.lang.String id) RBACSessionsManager Description copied from interface: SessionsManager Elimina una sessione Specified by: deleteSession in interface SessionsManager Parameters: id - id della sessione Overview Package Class Use Tree Deprecated Index Help PREV CLASS NEXT CLASS FRAMES SUMMARY: NESTED | FIELD | CONSTR | METHOD DETAIL: FIELD | CONSTR | METHOD NO FRAMES All Classes Session Overview Package Class Use Tree Deprecated Index Help PREV CLASS NEXT CLASS FRAMES SUMMARY: NESTED | FIELD | CONSTR | METHOD DETAIL: FIELD | CONSTR | METHOD NO FRAMES it.unibs.carlotti.rbac.core Interface Session All Known Implementing Classes: RBACSession public interface Session Questa interfaccia definisce i metodi per la gestione di una sessione utente Author: Giacomo Carlotti Method Summary java.util. getActiveRoles() Vector<java. Restituisce l'elenco dei ruoli attivi della sessione lang.String> java.lang. getId() String Restituisce l'id della sessione java.lang. getUserName() String Restituisce il nome dell'utente che ha creato la sessione Method Detail getActiveRoles java.util.Vector<java.lang.String> getActiveRoles() Restituisce l'elenco dei ruoli attivi della sessione All Classes Session Returns: l'elenco dei ruoli attivi getUserName java.lang.String getUserName() Restituisce il nome dell'utente che ha creato la sessione Returns: il nome dell'utente getId java.lang.String getId() Restituisce l'id della sessione Returns: l'id della sessione Overview Package Class Use Tree Deprecated Index Help PREV CLASS NEXT CLASS FRAMES SUMMARY: NESTED | FIELD | CONSTR | METHOD DETAIL: FIELD | CONSTR | METHOD NO FRAMES All Classes SessionObserver Overview Package Class Use Tree Deprecated Index Help PREV CLASS NEXT CLASS FRAMES SUMMARY: NESTED | FIELD | CONSTR | METHOD DETAIL: FIELD | CONSTR | METHOD NO FRAMES All Classes it.unibs.carlotti.rbac.core Interface SessionObserver All Known Implementing Classes: RBACSessionsMonitor public interface SessionObserver Questa interfaccia definisce i metodi da un monitor di sessione Author: Giacomo Carlotti Method Summary void update() Aggiorna i dati del monitor di sessione Method Detail update void update() Aggiorna i dati del monitor di sessione Overview Package Class Use Tree Deprecated Index Help PREV CLASS NEXT CLASS FRAMES SUMMARY: NESTED | FIELD | CONSTR | METHOD DETAIL: FIELD | CONSTR | METHOD NO FRAMES All Classes SessionsManager Overview Package Class Use Tree Deprecated Index Help PREV CLASS NEXT CLASS FRAMES SUMMARY: NESTED | FIELD | CONSTR | METHOD DETAIL: FIELD | CONSTR | METHOD NO FRAMES All Classes it.unibs.carlotti.rbac.core Interface SessionsManager All Known Implementing Classes: RBACSessionsManager public interface SessionsManager Questa interfaccia definisce i metodi che devono essere implementati per gestire le sessione di un sistema RBAC Author: Giacomo Carlotti Method Summary boolean addActiveRole(java.lang.String roleName, java.lang. String idSession) Aggiunge un ruolo attivo ad una sessione void attach(SessionObserver o) Aggiunge un oesservatore void createSession(java.lang.String idSession, java.lang. String userName) Crea una nuova sessione void deleteSession(java.lang.String idSession) Elimina una sessione void detach(SessionObserver o) elimina un osservatore boolean dropActiveRole(java.lang.String roleName, java.lang. String idSession) Elimina un ruolo attivo da una sessione RBACSession getSession(java.lang.String id) Restituisce la sessione desiderata java.util. getSessions() Collection<RBACSession> Restituisce l'elenco delle sessioni java.lang.String getSessionUserName(java.lang.String idSession) restituisce il nome dell'utente di una sessione void notifyObservers() Avvisa gli osservatori di un cambiamento di stato SessionsManager java.util. sessionActiveRoles(java.lang.String idSession) Collection<java.lang. restituisce i ruoli attivi di una sessione String> java.util. userActiveRoles(java.lang.String userName) Collection<java.lang. Restituisce l'elenco dei ruoli attivi di un utente String> Method Detail getSessions java.util.Collection<RBACSession> getSessions() Restituisce l'elenco delle sessioni Returns: elenco delle sessioni getSession RBACSession getSession(java.lang.String id) throws java.lang.Throwable Restituisce la sessione desiderata Parameters: id - identificativo della sessione Returns: la sessione indicata Throws: java.lang.Throwable addActiveRole boolean addActiveRole(java.lang.String roleName, java.lang.String idSession) Aggiunge un ruolo attivo ad una sessione Parameters: roleName - nome del ruolo idSession - id della sessione Returns: true se l'operazione va abuon fine, false altrimenti dropActiveRole SessionsManager boolean dropActiveRole(java.lang.String roleName, java.lang.String idSession) Elimina un ruolo attivo da una sessione Parameters: roleName - nome del ruolo idSession - id della sessione Returns: true se l'operazione va abuon fine, false altrimenti userActiveRoles java.util.Collection<java.lang.String> userActiveRoles(java.lang.String userName) Restituisce l'elenco dei ruoli attivi di un utente Parameters: userName - nome dell'utente Returns: elenco dei ruoli attivi sessionActiveRoles java.util.Collection<java.lang.String> sessionActiveRoles(java.lang.String idSession) throws java.lang.Throwable restituisce i ruoli attivi di una sessione Parameters: idSession - id della sessione Returns: elenco dei ruoli attivi Throws: java.lang.Throwable getSessionUserName java.lang.String getSessionUserName(java.lang.String idSession) throws java.lang.Throwable restituisce il nome dell'utente di una sessione Parameters: idSession - id della sessione Returns: nome dell'utente Throws: SessionsManager java.lang.Throwable createSession void createSession(java.lang.String idSession, java.lang.String userName) Crea una nuova sessione Parameters: idSession - id della sessione userName - nome dell'utente deleteSession void deleteSession(java.lang.String idSession) Elimina una sessione Parameters: idSession - id della sessione attach void attach(SessionObserver o) Aggiunge un oesservatore Parameters: o - osservatore detach void detach(SessionObserver o) elimina un osservatore Parameters: o - osservatore notifyObservers void notifyObservers() SessionsManager Avvisa gli osservatori di un cambiamento di stato Overview Package Class Use Tree Deprecated Index Help PREV CLASS NEXT CLASS FRAMES SUMMARY: NESTED | FIELD | CONSTR | METHOD DETAIL: FIELD | CONSTR | METHOD NO FRAMES All Classes StaticConstraint Overview Package Class Use Tree Deprecated Index Help PREV CLASS NEXT CLASS FRAMES SUMMARY: NESTED | FIELD | CONSTR | METHOD DETAIL: FIELD | CONSTR | METHOD NO FRAMES All Classes it.unibs.carlotti.rbac.core Interface StaticConstraint All Superinterfaces: IntegrityComponent All Known Implementing Classes: RBACHierarchyStatic, RBACLimitedHierarchy, RBACSSD public interface StaticConstraint extends IntegrityComponent Questa interfaccia definisce i metodi che devono essere implementati dai vincoli statici del modello Author: Giacomo Carlotti Method Summary Methods inherited from interface it.unibs.carlotti.rbac.core.IntegrityComponent checkIntegrity Overview Package Class Use Tree Deprecated Index Help PREV CLASS NEXT CLASS FRAMES SUMMARY: NESTED | FIELD | CONSTR | METHOD DETAIL: FIELD | CONSTR | METHOD NO FRAMES All Classes AdministrativeFunctions Overview Package Class Use Tree Deprecated Index Help PREV CLASS NEXT CLASS FRAMES SUMMARY: NESTED | FIELD | CONSTR | METHOD DETAIL: FIELD | CONSTR | METHOD NO FRAMES All Classes it.unibs.carlotti.rbac.db Interface AdministrativeFunctions All Known Implementing Classes: RBACAdmin public interface AdministrativeFunctions Questa interfaccia definisce le funzioni amministrative del sistema RBAC Author: Giacomo Carlotti Method Summary void addDSDSet(java.lang.String role1, java.lang.String role2) Aggiunge un vincolo di separazione dinamica dei compiti void addInheritance(java.lang.String roleParent, java.lang. String roleChild) Aggiunge una relazione gerarchica void addPermission(java.lang.String name, java.lang. String objectName, java.lang.String operationName) Aggiunge un permesso void addRole(java.lang.String name) Aggiunge un nuovo ruolo void addSSDSet(java.lang.String role1, java.lang.String role2) Aggiunge un vincolo di separazione statica dei compiti void addTimeConstraint(java.lang.String role, java.lang. String permission, java.lang.String from, java.lang. String to) Agginge un vincolo temporale AdministrativeFunctions void addUser(java.lang.String name) Aggiunge un nuovo utente void assignDefaultRole(java.lang.String userName, java.lang. String roleName) Assegna un ruolo di default ad un utente void assignUser(java.lang.String userName, java.lang. String roleName) Assegna un utente ad un ruolo void deassignDefaultRole(java.lang.String userName, java.lang. String roleName) Elimina l'associazione tra un utente e un ruolo di default void deassignUser(java.lang.String userName, java.lang. String roleName) Elimina l'associazione tra un utente da un ruolo void deleteDSDSet(java.lang.String role1, java.lang.String role2) Elimina un vincolo di separazione dinamica dei compiti void deleteInheritance(java.lang.String roleParent, java.lang. String roleChild) Elimina una relazione gerarchica void deletePermission(java.lang.String name) elimina un permesso void deleteRole(java.lang.String name) Elimina un ruolo void deleteSSDSet(java.lang.String role1, java.lang.String role2) Elimina un vincolo di separazione statica dei compiti void deleteTimeConstraint(java.lang.String role, java.lang. String permission) Elimina un vincolo temporale void deleteUser(java.lang.String name) Elimina un utente void grantPermission(java.lang.String permissionName, java.lang. String roleName) Assegna un permesso a un ruolo void revokePermission(java.lang.String permissionName, java.lang. String roleName) Revoca un permesso ad un ruolo AdministrativeFunctions Method Detail addRole void addRole(java.lang.String name) throws java.lang.Throwable Aggiunge un nuovo ruolo Parameters: name - nome del ruolo Throws: java.lang.Throwable deleteRole void deleteRole(java.lang.String name) throws java.lang.Throwable Elimina un ruolo Parameters: name - nome del ruolo Throws: java.lang.Throwable addUser void addUser(java.lang.String name) throws java.lang.Throwable Aggiunge un nuovo utente Parameters: name - nome dell'utente Throws: java.lang.Throwable AdministrativeFunctions deleteUser void deleteUser(java.lang.String name) throws java.lang.Throwable Elimina un utente Parameters: name - nome dell'utente Throws: java.lang.Throwable addPermission void addPermission(java.lang.String name, java.lang.String objectName, java.lang.String operationName) throws java.lang.Throwable Aggiunge un permesso Parameters: name - nome del permesso objectName - nome dell'oggetto operationName - nome dell'operazione Throws: java.lang.Throwable deletePermission void deletePermission(java.lang.String name) throws java.lang.Throwable elimina un permesso Parameters: name - nome del permesso Throws: java.lang.Throwable AdministrativeFunctions assignUser void assignUser(java.lang.String userName, java.lang.String roleName) throws java.lang.Throwable Assegna un utente ad un ruolo Parameters: userName - nome dell'utente roleName - nome del ruolo Throws: java.lang.Throwable deassignUser void deassignUser(java.lang.String userName, java.lang.String roleName) throws java.lang.Throwable Elimina l'associazione tra un utente da un ruolo Parameters: userName - nome dell'utente roleName - nome del ruolo Throws: java.lang.Throwable assignDefaultRole void assignDefaultRole(java.lang.String userName, java.lang.String roleName) throws java.lang.Throwable Assegna un ruolo di default ad un utente Parameters: AdministrativeFunctions userName - nome dell'utente roleName - nome del ruolo Throws: java.lang.Throwable deassignDefaultRole void deassignDefaultRole(java.lang.String userName, java.lang.String roleName) throws java.lang.Throwable Elimina l'associazione tra un utente e un ruolo di default Parameters: userName - nome dell'utente roleName - nome del ruolo Throws: java.lang.Throwable grantPermission void grantPermission(java.lang.String permissionName, java.lang.String roleName) throws java.lang.Throwable Assegna un permesso a un ruolo Parameters: permissionName - nome del permesso roleName - nome del ruolo Throws: java.lang.Throwable revokePermission void revokePermission(java.lang.String permissionName, java.lang.String roleName) throws java.lang.Throwable AdministrativeFunctions Revoca un permesso ad un ruolo Parameters: permissionName - nome del permesso roleName - nome del ruolo Throws: java.lang.Throwable addInheritance void addInheritance(java.lang.String roleParent, java.lang.String roleChild) throws java.lang.Throwable Aggiunge una relazione gerarchica Parameters: roleParent - ruolo padre roleChild - ruolo figlio Throws: java.lang.Throwable deleteInheritance void deleteInheritance(java.lang.String roleParent, java.lang.String roleChild) throws java.lang.Throwable Elimina una relazione gerarchica Parameters: roleParent - ruolo padre roleChild - ruolo figlio Throws: java.lang.Throwable addSSDSet AdministrativeFunctions void addSSDSet(java.lang.String role1, java.lang.String role2) throws java.lang.Throwable Aggiunge un vincolo di separazione statica dei compiti Parameters: role1 - ruolo mutuamente esclusivo role2 - ruolo mutuamente esclusivo Throws: java.lang.Throwable deleteSSDSet void deleteSSDSet(java.lang.String role1, java.lang.String role2) throws java.lang.Throwable Elimina un vincolo di separazione statica dei compiti Parameters: role1 - ruolo mutuamente esclusivo role2 - ruolo mutuamente esclusivo Throws: java.lang.Throwable addDSDSet void addDSDSet(java.lang.String role1, java.lang.String role2) throws java.lang.Throwable Aggiunge un vincolo di separazione dinamica dei compiti Parameters: role1 - ruolo mutuamente esclusivo role2 - ruolo mutuamente esclusivo Throws: java.lang.Throwable AdministrativeFunctions deleteDSDSet void deleteDSDSet(java.lang.String role1, java.lang.String role2) throws java.lang.Throwable Elimina un vincolo di separazione dinamica dei compiti Parameters: role1 - ruolo mutuamente esclusivo role2 - ruolo mutuamente esclusivo Throws: java.lang.Throwable addTimeConstraint void addTimeConstraint(java.lang.String role, java.lang.String permission, java.lang.String from, java.lang.String to) throws java.lang.Throwable Agginge un vincolo temporale Parameters: role - nome del ruolo permission - nome del permesso from - istante iniziale dell'intervallo di validità del permesso to - istante finale dell'intervallo di validità del permesso Throws: java.lang.Throwable deleteTimeConstraint void deleteTimeConstraint(java.lang.String role, java.lang.String permission) throws java.lang.Throwable AdministrativeFunctions Elimina un vincolo temporale Parameters: role - nome del ruolo permission - nome del permesso Throws: java.lang.Throwable Overview Package Class Use Tree Deprecated Index Help PREV CLASS NEXT CLASS FRAMES SUMMARY: NESTED | FIELD | CONSTR | METHOD DETAIL: FIELD | CONSTR | METHOD NO FRAMES All Classes DBUtil Overview Package Class Use Tree Deprecated Index Help PREV CLASS NEXT CLASS FRAMES SUMMARY: NESTED | FIELD | CONSTR | METHOD DETAIL: FIELD | CONSTR | METHOD NO FRAMES All Classes it.unibs.carlotti.rbac.db Class DBUtil java.lang.Object it.unibs.carlotti.rbac.db.DBUtil public class DBUtil extends java.lang.Object Questa classe implementa i metodi base per l'accesso ad un database Author: Giacomo Carlotti Constructor Summary DBUtil(java.lang.String username, java.lang.String password, java. lang.String url, java.lang.String driver) Costruttore Method Summary java. executeQuery(java.lang.String query) sql. Esegue una query generica sul database ResultSet void executeUpdate(java.lang.String query) Esegue una query di aggiornamento del database Methods inherited from class java.lang.Object clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait DBUtil Constructor Detail DBUtil public DBUtil(java.lang.String username, java.lang.String password, java.lang.String url, java.lang.String driver) throws java.sql.SQLException, java.lang.ClassNotFoundException Costruttore Parameters: username - nome dell'utente del db password - password dell'utente del db url - indirizzo del db driver - jdbc drivers Throws: java.sql.SQLException java.lang.ClassNotFoundException Method Detail executeQuery public java.sql.ResultSet executeQuery(java.lang.String query) throws java.lang.Throwable Esegue una query generica sul database Parameters: query - query da eseguire Returns: risultato della query Throws: java.lang.Throwable DBUtil executeUpdate public void executeUpdate(java.lang.String query) throws java.lang.Throwable Esegue una query di aggiornamento del database Parameters: query - query da eseguire Throws: java.lang.Throwable Overview Package Class Use Tree Deprecated Index Help PREV CLASS NEXT CLASS FRAMES SUMMARY: NESTED | FIELD | CONSTR | METHOD DETAIL: FIELD | CONSTR | METHOD NO FRAMES All Classes RBACAdmin Overview Package Class Use Tree Deprecated Index Help PREV CLASS NEXT CLASS FRAMES SUMMARY: NESTED | FIELD | CONSTR | METHOD DETAIL: FIELD | CONSTR | METHOD NO FRAMES All Classes it.unibs.carlotti.rbac.db Class RBACAdmin java.lang.Object it.unibs.carlotti.rbac.db.RBACAdmin All Implemented Interfaces: AdministrativeFunctions public final class RBACAdmin extends java.lang.Object implements AdministrativeFunctions La classe contiene i metodi che servono a modificare il contenuto del database RBAC a scopo amministrativo Author: Giacomo Carlotti Field Summary (package db private) DBUtil Method Summary void addDSDSet(java.lang.String role1, java.lang. String role2) Aggiunge un vincolo di separazione dinamica dei compiti RBACAdmin void addInheritance(java.lang.String roleParent, java. lang.String roleChild) Aggiunge una relazione gerarchica void addPermission(java.lang.String name, java.lang. String objectName, java.lang.String operationName) Aggiunge un permesso void addRole(java.lang.String name) Aggiunge un nuovo ruolo void addSSDSet(java.lang.String role1, java.lang. String role2) Aggiunge un vincolo di separazione statica dei compiti void addTimeConstraint(java.lang.String role, java.lang. String permission, java.lang.String from, java. lang.String to) Agginge un vincolo temporale void addUser(java.lang.String name) Aggiunge un nuovo utente void assignDefaultRole(java.lang.String userName, java. lang.String roleName) Assegna un ruolo di default ad un utente void assignUser(java.lang.String userName, java.lang. String roleName) Assegna un utente ad un ruolo void createDB() void deassignDefaultRole(java.lang.String userName, java.lang.String roleName) Elimina l'associazione tra un utente e un ruolo di default void deassignUser(java.lang.String userName, java.lang. String roleName) Elimina l'associazione tra un utente da un ruolo void deleteDSDSet(java.lang.String role1, java.lang. String role2) Elimina un vincolo di separazione dinamica dei compiti void deleteInheritance(java.lang.String roleParent, java.lang.String roleChild) Elimina una relazione gerarchica RBACAdmin void deletePermission(java.lang.String name) elimina un permesso void deleteRole(java.lang.String name) Elimina un ruolo void deleteSSDSet(java.lang.String role1, java.lang. String role2) Elimina un vincolo di separazione statica dei compiti void deleteTimeConstraint(java.lang.String role, java. lang.String permission) Elimina un vincolo temporale void deleteUser(java.lang.String name) Elimina un utente static RBACAdmin getInstance(java.lang.String username, java.lang. String password) void grantPermission(java.lang.String permissionName, java.lang.String roleName) Assegna un permesso a un ruolo void revokePermission(java.lang.String permissionName, java.lang.String roleName) Revoca un permesso ad un ruolo Methods inherited from class java.lang.Object clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait Field Detail db final DBUtil db Method Detail getInstance RBACAdmin public static RBACAdmin getInstance(java.lang.String username, java.lang.String password) throws java.lang.Throwable Throws: java.lang.Throwable createDB public void createDB() throws java.lang.Throwable Throws: java.lang.Throwable addRole public void addRole(java.lang.String name) throws java.lang.Throwable Description copied from interface: AdministrativeFunctions Aggiunge un nuovo ruolo Specified by: addRole in interface AdministrativeFunctions Parameters: name - nome del ruolo Throws: java.lang.Throwable deleteRole public void deleteRole(java.lang.String name) throws java.lang.Throwable Description copied from interface: AdministrativeFunctions Elimina un ruolo RBACAdmin Specified by: deleteRole in interface AdministrativeFunctions Parameters: name - nome del ruolo Throws: java.lang.Throwable addUser public void addUser(java.lang.String name) throws java.lang.Throwable Description copied from interface: AdministrativeFunctions Aggiunge un nuovo utente Specified by: addUser in interface AdministrativeFunctions Parameters: name - nome dell'utente Throws: java.lang.Throwable deleteUser public void deleteUser(java.lang.String name) throws java.lang.Throwable Description copied from interface: AdministrativeFunctions Elimina un utente Specified by: deleteUser in interface AdministrativeFunctions Parameters: name - nome dell'utente Throws: java.lang.Throwable RBACAdmin addPermission public void addPermission(java.lang.String name, java.lang.String objectName, java.lang.String operationName) throws java.lang.Throwable Description copied from interface: AdministrativeFunctions Aggiunge un permesso Specified by: addPermission in interface AdministrativeFunctions Parameters: name - nome del permesso objectName - nome dell'oggetto operationName - nome dell'operazione Throws: java.lang.Throwable deletePermission public void deletePermission(java.lang.String name) throws java.lang.Throwable Description copied from interface: AdministrativeFunctions elimina un permesso Specified by: deletePermission in interface AdministrativeFunctions Parameters: name - nome del permesso Throws: java.lang.Throwable assignUser public void assignUser(java.lang.String userName, java.lang.String roleName) throws java.lang.Throwable RBACAdmin Description copied from interface: AdministrativeFunctions Assegna un utente ad un ruolo Specified by: assignUser in interface AdministrativeFunctions Parameters: userName - nome dell'utente roleName - nome del ruolo Throws: java.lang.Throwable deassignUser public void deassignUser(java.lang.String userName, java.lang.String roleName) throws java.lang.Throwable Description copied from interface: AdministrativeFunctions Elimina l'associazione tra un utente da un ruolo Specified by: deassignUser in interface AdministrativeFunctions Parameters: userName - nome dell'utente roleName - nome del ruolo Throws: java.lang.Throwable assignDefaultRole public void assignDefaultRole(java.lang.String userName, java.lang.String roleName) throws java.lang.Throwable Description copied from interface: AdministrativeFunctions Assegna un ruolo di default ad un utente Specified by: assignDefaultRole in interface AdministrativeFunctions Parameters: RBACAdmin userName - nome dell'utente roleName - nome del ruolo Throws: java.lang.Throwable deassignDefaultRole public void deassignDefaultRole(java.lang.String userName, java.lang.String roleName) throws java.lang.Throwable Description copied from interface: AdministrativeFunctions Elimina l'associazione tra un utente e un ruolo di default Specified by: deassignDefaultRole in interface AdministrativeFunctions Parameters: userName - nome dell'utente roleName - nome del ruolo Throws: java.lang.Throwable grantPermission public void grantPermission(java.lang.String permissionName, java.lang.String roleName) throws java.lang.Throwable Description copied from interface: AdministrativeFunctions Assegna un permesso a un ruolo Specified by: grantPermission in interface AdministrativeFunctions Parameters: permissionName - nome del permesso roleName - nome del ruolo Throws: java.lang.Throwable RBACAdmin revokePermission public void revokePermission(java.lang.String permissionName, java.lang.String roleName) throws java.lang.Throwable Description copied from interface: AdministrativeFunctions Revoca un permesso ad un ruolo Specified by: revokePermission in interface AdministrativeFunctions Parameters: permissionName - nome del permesso roleName - nome del ruolo Throws: java.lang.Throwable addInheritance public void addInheritance(java.lang.String roleParent, java.lang.String roleChild) throws java.lang.Throwable Description copied from interface: AdministrativeFunctions Aggiunge una relazione gerarchica Specified by: addInheritance in interface AdministrativeFunctions Parameters: roleParent - ruolo padre roleChild - ruolo figlio Throws: java.lang.Throwable deleteInheritance public void deleteInheritance(java.lang.String roleParent, java.lang.String roleChild) throws java.lang.Throwable RBACAdmin Description copied from interface: AdministrativeFunctions Elimina una relazione gerarchica Specified by: deleteInheritance in interface AdministrativeFunctions Parameters: roleParent - ruolo padre roleChild - ruolo figlio Throws: java.lang.Throwable addSSDSet public void addSSDSet(java.lang.String role1, java.lang.String role2) throws java.lang.Throwable Description copied from interface: AdministrativeFunctions Aggiunge un vincolo di separazione statica dei compiti Specified by: addSSDSet in interface AdministrativeFunctions Parameters: role1 - ruolo mutuamente esclusivo role2 - ruolo mutuamente esclusivo Throws: java.lang.Throwable deleteSSDSet public void deleteSSDSet(java.lang.String role1, java.lang.String role2) throws java.lang.Throwable Description copied from interface: AdministrativeFunctions Elimina un vincolo di separazione statica dei compiti Specified by: deleteSSDSet in interface AdministrativeFunctions RBACAdmin Parameters: role1 - ruolo mutuamente esclusivo role2 - ruolo mutuamente esclusivo Throws: java.lang.Throwable addDSDSet public void addDSDSet(java.lang.String role1, java.lang.String role2) throws java.lang.Throwable Description copied from interface: AdministrativeFunctions Aggiunge un vincolo di separazione dinamica dei compiti Specified by: addDSDSet in interface AdministrativeFunctions Parameters: role1 - ruolo mutuamente esclusivo role2 - ruolo mutuamente esclusivo Throws: java.lang.Throwable deleteDSDSet public void deleteDSDSet(java.lang.String role1, java.lang.String role2) throws java.lang.Throwable Description copied from interface: AdministrativeFunctions Elimina un vincolo di separazione dinamica dei compiti Specified by: deleteDSDSet in interface AdministrativeFunctions Parameters: role1 - ruolo mutuamente esclusivo role2 - ruolo mutuamente esclusivo Throws: java.lang.Throwable RBACAdmin addTimeConstraint public void addTimeConstraint(java.lang.String role, java.lang.String permission, java.lang.String from, java.lang.String to) throws java.lang.Throwable Description copied from interface: AdministrativeFunctions Agginge un vincolo temporale Specified by: addTimeConstraint in interface AdministrativeFunctions Parameters: role - nome del ruolo permission - nome del permesso from - istante iniziale dell'intervallo di validità del permesso to - istante finale dell'intervallo di validità del permesso Throws: java.lang.Throwable deleteTimeConstraint public void deleteTimeConstraint(java.lang.String role, java.lang.String permission) throws java.lang.Throwable Description copied from interface: AdministrativeFunctions Elimina un vincolo temporale Specified by: deleteTimeConstraint in interface AdministrativeFunctions Parameters: role - nome del ruolo permission - nome del permesso Throws: java.lang.Throwable Overview Package Class Use Tree Deprecated Index Help RBACAdmin PREV CLASS NEXT CLASS FRAMES SUMMARY: NESTED | FIELD | CONSTR | METHOD DETAIL: FIELD | CONSTR | METHOD NO FRAMES All Classes RBACReview Overview Package Class Use Tree Deprecated Index Help PREV CLASS NEXT CLASS FRAMES SUMMARY: NESTED | FIELD | CONSTR | METHOD DETAIL: FIELD | CONSTR | METHOD NO FRAMES All Classes it.unibs.carlotti.rbac.db Class RBACReview java.lang.Object it.unibs.carlotti.rbac.db.RBACReview All Implemented Interfaces: ReviewFunctions public final class RBACReview extends java.lang.Object implements ReviewFunctions La classe contiene metodi di reportistica, che non modificano il contenuto del database RBAC Author: Giacomo Carlotti Field Summary static java. SEPARATORE lang.String Method Summary java.util. assignedPermissionRoles(java.lang.String userName, java. Collection<java.lang. lang.String permissionName) String> Restituisce i nomi dei ruoli assegnati ad un utente, ai quali è assegnato il permesso indicato java.util. assignedRoles(java.lang.String userName) Collection<java.lang. Restituisce i nomi dei ruoli assegnati direttamente ad un utente String> java.util. authorizedPermissionRoles(java.lang.String userName, java. Collection<java.lang. lang.String permissionName) String> Restituisce i nomi dei ruoli ereditati da un utente, ai quali è assegnato il permesso indicato java.util. authorizedRoles(java.lang.String userName) Collection<java.lang. Restituisce l'elenco dei ruoli autorizzati per un utente String> RBACReview java.util. defaultUserRoles(java.lang.String userName) Collection<java.lang. Restituisce i nomi dei ruoli di default assegnati ad un utente String> java.util. getConflictingDSDRoles(java.lang.String role) Collection<java.lang. Restituisce i nomi dei ruoli mutuamente esclusivi ad un ruolo secondo i vincoli String> DSD java.util. getConflictingSSDRoles(java.lang.String role) Collection<java.lang. Restituisce i nomi dei ruoli mutuamente esclusivi ad un ruolo secondo i vincoli String> SSD java.util. getDefaultRoles() Collection<java.lang. Restituisce l'elenco delle relazioni utente-ruolo_di_default String> java.util. getDSDs() Collection<java.lang. Restituisce l'elenco dei vincoli di DSD String> java.lang.String getFromTime(java.lang.String role, java.lang. String permission) Restituisce il limite inferiore del vincolo temporale static ReviewFunctions getInstance() int getMaxChildren() Calcola il numero massimo di ruoli figli presenti all'interno della gerarchia int getMaxParents() Calcola il numero massimo di ruoli padri presenti all'interno della gerarchia java.util. getPAs() Collection<java.lang. Restituisce l'elenco delle relazioni ruolo-permesso String> java.lang.String getPermissionId(java.lang.String name) Restituisce l'id di un permesso dato il nome java.lang.String getPermissionName(java.lang.String operation, java.lang. String object) Restituisce il nome di un permesso dati i nomi dell'oggetto e dell'operazione java.util. getPermissions() Collection<java.lang. Restituisce l'elenco dei permessi String> java.util. getRHs() Collection<java.lang. Restituisce l'elenco delle relazioni gerarchiche String> java.lang.String getRoleId(java.lang.String name) Restituisce l'id di un ruolo dato il nome java.util. getRoles() Collection<java.lang. Restituisce l'elenco dei ruoli String> java.util. getSSDs() Collection<java.lang. Restituisce l'elenco dei vincoli di SSD String> RBACReview java.util. getTimes() Collection<java.lang. Restituisce l'elenco dei vincoli temporali String> java.lang.String getToTime(java.lang.String role, java.lang. String permission) Restituisce il limite superiore del vincolo temporale java.util. getUAs() Collection<java.lang. Restituisce l'elenco delle relazioni utente-ruolo String> java.lang.String getUserId(java.lang.String name) Restituisce l'id di un utente dato il nome java.util. getUsers() Collection<java.lang. String> Methods inherited from class java.lang.Object clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait Field Detail SEPARATORE public static final java.lang.String SEPARATORE See Also: Constant Field Values Method Detail getInstance public static ReviewFunctions getInstance() throws java.lang.Throwable Throws: java.lang.Throwable getPermissionName public java.lang.String getPermissionName(java.lang.String operation, java.lang.String object) throws java.lang.Throwable Description copied from interface: ReviewFunctions RBACReview Restituisce il nome di un permesso dati i nomi dell'oggetto e dell'operazione Specified by: getPermissionName in interface ReviewFunctions Parameters: operation - nome dell'operazione object - nome dell'oggetto Returns: il nome del permesso Throws: java.lang.Throwable assignedRoles public java.util.Collection<java.lang.String> assignedRoles(java.lang. String userName) throws java.lang.Throwable Description copied from interface: ReviewFunctions Restituisce i nomi dei ruoli assegnati direttamente ad un utente Specified by: assignedRoles in interface ReviewFunctions Parameters: userName - nome dell'utente Returns: elenco dei ruoli Throws: java.lang.Throwable defaultUserRoles public java.util.Collection<java.lang.String> defaultUserRoles(java.lang. String userName) throws java.lang.Throwable Description copied from interface: ReviewFunctions Restituisce i nomi dei ruoli di default assegnati ad un utente Specified by: defaultUserRoles in interface ReviewFunctions Parameters: userName - nome dell'utente Returns: elenco dei ruoli di default Throws: java.lang.Throwable RBACReview assignedPermissionRoles public java.util.Collection<java.lang.String> assignedPermissionRoles(java.lang. String userName, java.lang. String permissionName) throws java.lang. Throwable Description copied from interface: ReviewFunctions Restituisce i nomi dei ruoli assegnati ad un utente, ai quali è assegnato il permesso indicato Specified by: assignedPermissionRoles in interface ReviewFunctions Parameters: userName - nome dell'utente permissionName - nome del permesso Returns: elenco dei nomi dei ruoli assegnati ad un utente Throws: java.lang.Throwable authorizedRoles public java.util.Collection<java.lang.String> authorizedRoles(java.lang. String userName) throws java.lang.Throwable Description copied from interface: ReviewFunctions Restituisce l'elenco dei ruoli autorizzati per un utente Specified by: authorizedRoles in interface ReviewFunctions Parameters: userName - nome dell'utente Returns: l'elenco dei ruoli autorizzati per un utente Throws: java.lang.Throwable authorizedPermissionRoles public java.util.Collection<java.lang.String> authorizedPermissionRoles(java.lang. String userName, java.lang. String permissionName) throws java.lang. Throwable RBACReview Description copied from interface: ReviewFunctions Restituisce i nomi dei ruoli ereditati da un utente, ai quali è assegnato il permesso indicato Specified by: authorizedPermissionRoles in interface ReviewFunctions Parameters: userName - nome dell'utente permissionName - nome del permesso Returns: elenco dei ruoli ereditati da un utente Throws: java.lang.Throwable getMaxChildren public int getMaxChildren() throws java.lang.Throwable Description copied from interface: ReviewFunctions Calcola il numero massimo di ruoli figli presenti all'interno della gerarchia Specified by: getMaxChildren in interface ReviewFunctions Returns: numero massimo di ruoli figli Throws: java.lang.Throwable getMaxParents public int getMaxParents() throws java.lang.Throwable Description copied from interface: ReviewFunctions Calcola il numero massimo di ruoli padri presenti all'interno della gerarchia Specified by: getMaxParents in interface ReviewFunctions Returns: numero massimo di ruoli padri Throws: java.lang.Throwable getConflictingSSDRoles public java.util.Collection<java.lang.String> getConflictingSSDRoles(java.lang. RBACReview String role) throws java.lang. Throwable Description copied from interface: ReviewFunctions Restituisce i nomi dei ruoli mutuamente esclusivi ad un ruolo secondo i vincoli SSD Specified by: getConflictingSSDRoles in interface ReviewFunctions Parameters: role - il nome del ruolo Returns: l'elenco dei ruoli mutuamenti esclusivi Throws: java.lang.Throwable getConflictingDSDRoles public java.util.Collection<java.lang.String> getConflictingDSDRoles(java.lang. String role) throws java.lang. Throwable Description copied from interface: ReviewFunctions Restituisce i nomi dei ruoli mutuamente esclusivi ad un ruolo secondo i vincoli DSD Specified by: getConflictingDSDRoles in interface ReviewFunctions Parameters: role - il nome del ruolo Returns: l'elenco dei ruoli mutuamente esclusivi Throws: java.lang.Throwable getFromTime public java.lang.String getFromTime(java.lang.String role, java.lang.String permission) throws java.lang.Throwable Description copied from interface: ReviewFunctions Restituisce il limite inferiore del vincolo temporale Specified by: getFromTime in interface ReviewFunctions Parameters: role - ruolo del vincolo temporale permission - permesso del vincolo temporale RBACReview Returns: limite inferiore del vincolo temporale Throws: java.lang.Throwable getToTime public java.lang.String getToTime(java.lang.String role, java.lang.String permission) throws java.lang.Throwable Description copied from interface: ReviewFunctions Restituisce il limite superiore del vincolo temporale Specified by: getToTime in interface ReviewFunctions Parameters: role - ruolo del vincolo temporale permission - permesso del vincolo temporale Returns: limite superiore del vincolo temporale Throws: java.lang.Throwable getUsers public java.util.Collection<java.lang.String> getUsers() throws java.lang.Throwable Specified by: getUsers in interface ReviewFunctions Throws: java.lang.Throwable getRoles public java.util.Collection<java.lang.String> getRoles() throws java.lang.Throwable Description copied from interface: ReviewFunctions Restituisce l'elenco dei ruoli Specified by: getRoles in interface ReviewFunctions Returns: l'elenco dei ruoli Throws: RBACReview java.lang.Throwable getPermissions public java.util.Collection<java.lang.String> getPermissions() throws java.lang.Throwable Description copied from interface: ReviewFunctions Restituisce l'elenco dei permessi Specified by: getPermissions in interface ReviewFunctions Returns: l'elenco dei permessi Throws: java.lang.Throwable getDefaultRoles public java.util.Collection<java.lang.String> getDefaultRoles() throws java.lang.Throwable Description copied from interface: ReviewFunctions Restituisce l'elenco delle relazioni utente-ruolo_di_default Specified by: getDefaultRoles in interface ReviewFunctions Returns: l'elenco delle relazioni utente-ruolo_di_default Throws: java.lang.Throwable getUAs public java.util.Collection<java.lang.String> getUAs() throws java.lang.Throwable Description copied from interface: ReviewFunctions Restituisce l'elenco delle relazioni utente-ruolo Specified by: getUAs in interface ReviewFunctions Returns: l'elenco delle relazioni utente-ruolo Throws: java.lang.Throwable RBACReview getPAs public java.util.Collection<java.lang.String> getPAs() throws java.lang.Throwable Description copied from interface: ReviewFunctions Restituisce l'elenco delle relazioni ruolo-permesso Specified by: getPAs in interface ReviewFunctions Returns: l'elenco delle relazioni ruolo-permesso Throws: java.lang.Throwable getRHs public java.util.Collection<java.lang.String> getRHs() throws java.lang.Throwable Description copied from interface: ReviewFunctions Restituisce l'elenco delle relazioni gerarchiche Specified by: getRHs in interface ReviewFunctions Returns: l'elenco delle relazioni gerarchiche Throws: java.lang.Throwable getSSDs public java.util.Collection<java.lang.String> getSSDs() throws java.lang.Throwable Description copied from interface: ReviewFunctions Restituisce l'elenco dei vincoli di SSD Specified by: getSSDs in interface ReviewFunctions Returns: l'elenco dei vincoli di SSD Throws: java.lang.Throwable RBACReview getDSDs public java.util.Collection<java.lang.String> getDSDs() throws java.lang.Throwable Description copied from interface: ReviewFunctions Restituisce l'elenco dei vincoli di DSD Specified by: getDSDs in interface ReviewFunctions Returns: l'elenco dei vincoli di DSD Throws: java.lang.Throwable getTimes public java.util.Collection<java.lang.String> getTimes() throws java.lang.Throwable Description copied from interface: ReviewFunctions Restituisce l'elenco dei vincoli temporali Specified by: getTimes in interface ReviewFunctions Returns: l'elenco dei vincoli temporali Throws: java.lang.Throwable getPermissionId public java.lang.String getPermissionId(java.lang.String name) throws java.lang.Throwable Description copied from interface: ReviewFunctions Restituisce l'id di un permesso dato il nome Specified by: getPermissionId in interface ReviewFunctions Parameters: name - il nome del permesso Returns: l'id del permesso Throws: java.lang.Throwable RBACReview getUserId public java.lang.String getUserId(java.lang.String name) throws java.lang.Throwable Description copied from interface: ReviewFunctions Restituisce l'id di un utente dato il nome Specified by: getUserId in interface ReviewFunctions Parameters: name - il nome dell'utente Returns: l'id dell'utente Throws: java.lang.Throwable getRoleId public java.lang.String getRoleId(java.lang.String name) throws java.lang.Throwable Description copied from interface: ReviewFunctions Restituisce l'id di un ruolo dato il nome Specified by: getRoleId in interface ReviewFunctions Parameters: name - il nome del ruolo Returns: l'id del ruolo Throws: java.lang.Throwable Overview Package Class Use Tree Deprecated Index Help PREV CLASS NEXT CLASS FRAMES SUMMARY: NESTED | FIELD | CONSTR | METHOD DETAIL: FIELD | CONSTR | METHOD NO FRAMES All Classes ReviewFunctions Overview Package Class Use Tree Deprecated Index Help PREV CLASS NEXT CLASS FRAMES SUMMARY: NESTED | FIELD | CONSTR | METHOD DETAIL: FIELD | CONSTR | METHOD NO FRAMES All Classes it.unibs.carlotti.rbac.db Interface ReviewFunctions All Known Implementing Classes: RBACReview public interface ReviewFunctions Questa interfaccia definisce le funzioni di reportistica del sistema RBAC Author: Giacomo Carlotti Method Summary java.util. assignedPermissionRoles(java.lang.String userName, java.lang. Collection<java. String permissionName) lang.String> Restituisce i nomi dei ruoli assegnati ad un utente, ai quali è assegnato il permesso indicato java.util. assignedRoles(java.lang.String userName) Collection<java. Restituisce i nomi dei ruoli assegnati direttamente ad un utente lang.String> java.util. authorizedPermissionRoles(java.lang.String userName, java.lang. Collection<java. String permissionName) lang.String> Restituisce i nomi dei ruoli ereditati da un utente, ai quali è assegnato il permesso indicato java.util. authorizedRoles(java.lang.String userName) Collection<java. Restituisce l'elenco dei ruoli autorizzati per un utente lang.String> java.util. defaultUserRoles(java.lang.String userName) Collection<java. Restituisce i nomi dei ruoli di default assegnati ad un utente lang.String> java.util. getConflictingDSDRoles(java.lang.String role) Collection<java. Restituisce i nomi dei ruoli mutuamente esclusivi ad un ruolo secondo i vincoli DSD lang.String> java.util. getConflictingSSDRoles(java.lang.String role) Collection<java. Restituisce i nomi dei ruoli mutuamente esclusivi ad un ruolo secondo i vincoli SSD lang.String> java.util. getDefaultRoles() Collection<java. Restituisce l'elenco delle relazioni utente-ruolo_di_default lang.String> java.util. getDSDs() Collection<java. Restituisce l'elenco dei vincoli di DSD lang.String> ReviewFunctions java.lang. getFromTime(java.lang.String role, java.lang.String permission) String Restituisce il limite inferiore del vincolo temporale int getMaxChildren() Calcola il numero massimo di ruoli figli presenti all'interno della gerarchia int getMaxParents() Calcola il numero massimo di ruoli padri presenti all'interno della gerarchia java.util. getPAs() Collection<java. Restituisce l'elenco delle relazioni ruolo-permesso lang.String> java.lang. getPermissionId(java.lang.String name) String Restituisce l'id di un permesso dato il nome java.lang. getPermissionName(java.lang.String operation, java.lang. String String object) Restituisce il nome di un permesso dati i nomi dell'oggetto e dell'operazione java.util. getPermissions() Collection<java. Restituisce l'elenco dei permessi lang.String> java.util. getRHs() Collection<java. Restituisce l'elenco delle relazioni gerarchiche lang.String> java.lang. getRoleId(java.lang.String name) String Restituisce l'id di un ruolo dato il nome java.util. getRoles() Collection<java. Restituisce l'elenco dei ruoli lang.String> java.util. getSSDs() Collection<java. Restituisce l'elenco dei vincoli di SSD lang.String> java.util. getTimes() Collection<java. Restituisce l'elenco dei vincoli temporali lang.String> java.lang. getToTime(java.lang.String role, java.lang.String permission) String Restituisce il limite superiore del vincolo temporale java.util. getUAs() Collection<java. Restituisce l'elenco delle relazioni utente-ruolo lang.String> java.lang. getUserId(java.lang.String name) String Restituisce l'id di un utente dato il nome java.util. getUsers() Collection<java. lang.String> Method Detail getPermissionName java.lang.String getPermissionName(java.lang.String operation, ReviewFunctions java.lang.String object) throws java.lang.Throwable Restituisce il nome di un permesso dati i nomi dell'oggetto e dell'operazione Parameters: operation - nome dell'operazione object - nome dell'oggetto Returns: il nome del permesso Throws: java.lang.Throwable assignedRoles java.util.Collection<java.lang.String> assignedRoles(java.lang.String userName) throws java.lang.Throwable Restituisce i nomi dei ruoli assegnati direttamente ad un utente Parameters: userName - nome dell'utente Returns: elenco dei ruoli Throws: java.lang.Throwable defaultUserRoles java.util.Collection<java.lang.String> defaultUserRoles(java.lang.String userName) throws java.lang.Throwable Restituisce i nomi dei ruoli di default assegnati ad un utente Parameters: userName - nome dell'utente Returns: elenco dei ruoli di default Throws: java.lang.Throwable assignedPermissionRoles java.util.Collection<java.lang.String> assignedPermissionRoles(java.lang. String userName, java.lang. String permissionName) throws java.lang. ReviewFunctions Throwable Restituisce i nomi dei ruoli assegnati ad un utente, ai quali è assegnato il permesso indicato Parameters: userName - nome dell'utente permissionName - nome del permesso Returns: elenco dei nomi dei ruoli assegnati ad un utente Throws: java.lang.Throwable authorizedRoles java.util.Collection<java.lang.String> authorizedRoles(java.lang.String userName) throws java.lang.Throwable Restituisce l'elenco dei ruoli autorizzati per un utente Parameters: userName - nome dell'utente Returns: l'elenco dei ruoli autorizzati per un utente Throws: java.lang.Throwable authorizedPermissionRoles java.util.Collection<java.lang.String> authorizedPermissionRoles(java.lang. String userName, java.lang. String permissionName) throws java.lang. Throwable Restituisce i nomi dei ruoli ereditati da un utente, ai quali è assegnato il permesso indicato Parameters: userName - nome dell'utente permissionName - nome del permesso Returns: elenco dei ruoli ereditati da un utente Throws: java.lang.Throwable getMaxChildren int getMaxChildren() ReviewFunctions throws java.lang.Throwable Calcola il numero massimo di ruoli figli presenti all'interno della gerarchia Returns: numero massimo di ruoli figli Throws: java.lang.Throwable getMaxParents int getMaxParents() throws java.lang.Throwable Calcola il numero massimo di ruoli padri presenti all'interno della gerarchia Returns: numero massimo di ruoli padri Throws: java.lang.Throwable getConflictingSSDRoles java.util.Collection<java.lang.String> getConflictingSSDRoles(java.lang.String role) throws java.lang. Throwable Restituisce i nomi dei ruoli mutuamente esclusivi ad un ruolo secondo i vincoli SSD Parameters: role - il nome del ruolo Returns: l'elenco dei ruoli mutuamenti esclusivi Throws: java.lang.Throwable getConflictingDSDRoles java.util.Collection<java.lang.String> getConflictingDSDRoles(java.lang.String role) throws java.lang. Throwable Restituisce i nomi dei ruoli mutuamente esclusivi ad un ruolo secondo i vincoli DSD Parameters: role - il nome del ruolo Returns: l'elenco dei ruoli mutuamente esclusivi ReviewFunctions Throws: java.lang.Throwable getFromTime java.lang.String getFromTime(java.lang.String role, java.lang.String permission) throws java.lang.Throwable Restituisce il limite inferiore del vincolo temporale Parameters: role - ruolo del vincolo temporale permission - permesso del vincolo temporale Returns: limite inferiore del vincolo temporale Throws: java.lang.Throwable getToTime java.lang.String getToTime(java.lang.String role, java.lang.String permission) throws java.lang.Throwable Restituisce il limite superiore del vincolo temporale Parameters: role - ruolo del vincolo temporale permission - permesso del vincolo temporale Returns: limite superiore del vincolo temporale Throws: java.lang.Throwable getTimes java.util.Collection<java.lang.String> getTimes() throws java.lang.Throwable Restituisce l'elenco dei vincoli temporali Returns: l'elenco dei vincoli temporali Throws: java.lang.Throwable ReviewFunctions getUsers java.util.Collection<java.lang.String> getUsers() throws java.lang.Throwable Throws: java.lang.Throwable getRoles java.util.Collection<java.lang.String> getRoles() throws java.lang.Throwable Restituisce l'elenco dei ruoli Returns: l'elenco dei ruoli Throws: java.lang.Throwable getPermissions java.util.Collection<java.lang.String> getPermissions() throws java.lang.Throwable Restituisce l'elenco dei permessi Returns: l'elenco dei permessi Throws: java.lang.Throwable getDefaultRoles java.util.Collection<java.lang.String> getDefaultRoles() throws java.lang.Throwable Restituisce l'elenco delle relazioni utente-ruolo_di_default Returns: l'elenco delle relazioni utente-ruolo_di_default Throws: java.lang.Throwable getUAs ReviewFunctions java.util.Collection<java.lang.String> getUAs() throws java.lang.Throwable Restituisce l'elenco delle relazioni utente-ruolo Returns: l'elenco delle relazioni utente-ruolo Throws: java.lang.Throwable getPAs java.util.Collection<java.lang.String> getPAs() throws java.lang.Throwable Restituisce l'elenco delle relazioni ruolo-permesso Returns: l'elenco delle relazioni ruolo-permesso Throws: java.lang.Throwable getRHs java.util.Collection<java.lang.String> getRHs() throws java.lang.Throwable Restituisce l'elenco delle relazioni gerarchiche Returns: l'elenco delle relazioni gerarchiche Throws: java.lang.Throwable getSSDs java.util.Collection<java.lang.String> getSSDs() throws java.lang.Throwable Restituisce l'elenco dei vincoli di SSD Returns: l'elenco dei vincoli di SSD Throws: java.lang.Throwable ReviewFunctions getDSDs java.util.Collection<java.lang.String> getDSDs() throws java.lang.Throwable Restituisce l'elenco dei vincoli di DSD Returns: l'elenco dei vincoli di DSD Throws: java.lang.Throwable getPermissionId java.lang.String getPermissionId(java.lang.String name) throws java.lang.Throwable Restituisce l'id di un permesso dato il nome Parameters: name - il nome del permesso Returns: l'id del permesso Throws: java.lang.Throwable getUserId java.lang.String getUserId(java.lang.String name) throws java.lang.Throwable Restituisce l'id di un utente dato il nome Parameters: name - il nome dell'utente Returns: l'id dell'utente Throws: java.lang.Throwable getRoleId java.lang.String getRoleId(java.lang.String name) throws java.lang.Throwable Restituisce l'id di un ruolo dato il nome ReviewFunctions Parameters: name - il nome del ruolo Returns: l'id del ruolo Throws: java.lang.Throwable Overview Package Class Use Tree Deprecated Index Help PREV CLASS NEXT CLASS FRAMES SUMMARY: NESTED | FIELD | CONSTR | METHOD DETAIL: FIELD | CONSTR | METHOD NO FRAMES All Classes RBACDSD Overview Package Class Use Tree Deprecated Index Help PREV CLASS NEXT CLASS SUMMARY: NESTED | FIELD | CONSTR | METHOD FRAMES NO FRAMES All Classes DETAIL: FIELD | CONSTR | METHOD it.unibs.carlotti.rbac.dsd Class RBACDSD java.lang.Object it.unibs.carlotti.rbac.dsd.RBACDSD All Implemented Interfaces: DynamicConstraint, EngineComponent public class RBACDSD extends java.lang.Object implements DynamicConstraint Componente DSD del motore dinamico Author: Giacomo Carlotti Constructor Summary RBACDSD(EngineComponent ec) Method Summary boolean activatePermission(java.lang.String roleName, java.lang. String permissionName, java.lang.Object obj) Attiva un permesso verificando eventuali vincoli boolean addActiveRole(java.lang.String roleName, java.lang. String idSession) attiva un ruolo per una sessione utente, verificando gli eventuali vincoli RBACDSD boolean checkAccess(java.lang.String userName, java.lang. String objectName, java.lang.String operation, java.lang. String idSession, java.lang.Object obj) controlla la disponibilità di un permesso per un certo utente e cerca di attivare un ruolo a cui il permesso è associato void createSession(java.lang.String id, java.lang. String userName) crea una nuova sessione utente ed prova ad attivare i ruoli di default void deleteSession(java.lang.String id) disattiva i ruoli della sessione e la elimina boolean dropActiveRole(java.lang.String roleName, java.lang. String idSession) disattiva un ruolo di una sessione utente Methods inherited from class java.lang.Object clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait Constructor Detail RBACDSD public RBACDSD(EngineComponent ec) Method Detail activatePermission public boolean activatePermission(java.lang.String roleName, java.lang.String permissionName, java.lang.Object obj) Description copied from interface: EngineComponent Attiva un permesso verificando eventuali vincoli Specified by: activatePermission in interface EngineComponent Parameters: RBACDSD roleName - ruolo coinvolto nel vincolo permissionName - permesso coinvolto nel vincolo obj - reference all'ogggetto Returns: true il processo di attivazione va a buon fine, false altrimenti addActiveRole public boolean addActiveRole(java.lang.String roleName, java.lang.String idSession) Description copied from interface: EngineComponent attiva un ruolo per una sessione utente, verificando gli eventuali vincoli Specified by: addActiveRole in interface EngineComponent Parameters: roleName - nome del ruolo idSession - id della sessione Returns: true se riesce ad attivare il ruolo, false altrimenti checkAccess public boolean checkAccess(java.lang.String java.lang.String java.lang.String java.lang.String java.lang.Object userName, objectName, operation, idSession, obj) Description copied from interface: EngineComponent controlla la disponibilità di un permesso per un certo utente e cerca di attivare un ruolo a cui il permesso è associato Specified by: checkAccess in interface EngineComponent Parameters: userName - nome del ruolo objectName - nome dell'oggetto operation - nome dell'operazione RBACDSD idSession - id della sessione obj - reference dell'oggetto Returns: true il processo di attivazione va a buon fine, false altrimenti createSession public void createSession(java.lang.String id, java.lang.String userName) Description copied from interface: EngineComponent crea una nuova sessione utente ed prova ad attivare i ruoli di default Specified by: createSession in interface EngineComponent Parameters: id - id della sessione userName - nome dell'utente deleteSession public void deleteSession(java.lang.String id) Description copied from interface: EngineComponent disattiva i ruoli della sessione e la elimina Specified by: deleteSession in interface EngineComponent Parameters: id - id della sessione dropActiveRole public boolean dropActiveRole(java.lang.String roleName, java.lang.String idSession) Description copied from interface: EngineComponent RBACDSD disattiva un ruolo di una sessione utente Specified by: dropActiveRole in interface EngineComponent Parameters: roleName - nome del ruolo idSession - id della sessione Returns: true se riesce a disattivare il ruolo, false altrimenti Overview Package Class Use Tree Deprecated Index Help PREV CLASS NEXT CLASS SUMMARY: NESTED | FIELD | CONSTR | METHOD FRAMES NO FRAMES All Classes DETAIL: FIELD | CONSTR | METHOD RBACHierarchyDynamic Overview Package Class Use Tree Deprecated Index Help PREV CLASS NEXT CLASS FRAMES SUMMARY: NESTED | FIELD | CONSTR | METHOD DETAIL: FIELD | CONSTR | METHOD NO FRAMES All Classes it.unibs.carlotti.rbac.hierarchy Class RBACHierarchyDynamic java.lang.Object it.unibs.carlotti.rbac.hierarchy.RBACHierarchyDynamic All Implemented Interfaces: DynamicConstraint, EngineComponent public class RBACHierarchyDynamic extends java.lang.Object implements DynamicConstraint Componente Hierarchy del motore dinamico Author: Giacomo Carlotti Constructor Summary RBACHierarchyDynamic(EngineComponent _ec) Method Summary boolean activatePermission(java.lang.String roleName, java.lang. String permissionName, java.lang.Object obj) Attiva un permesso verificando eventuali vincoli boolean addActiveRole(java.lang.String roleName, java.lang. String idSession) attiva un ruolo per una sessione utente, verificando gli eventuali vincoli RBACHierarchyDynamic boolean checkAccess(java.lang.String userName, java.lang. String objectName, java.lang.String operation, java.lang. String idSession, java.lang.Object obj) controlla la disponibilità di un permesso per un certo utente e cerca di attivare un ruolo a cui il permesso è associato void createSession(java.lang.String id, java.lang. String userName) crea una nuova sessione utente ed prova ad attivare i ruoli di default void deleteSession(java.lang.String id) disattiva i ruoli della sessione e la elimina boolean dropActiveRole(java.lang.String roleName, java.lang. String idSession) disattiva un ruolo di una sessione utente Methods inherited from class java.lang.Object clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait Constructor Detail RBACHierarchyDynamic public RBACHierarchyDynamic(EngineComponent _ec) Method Detail activatePermission public boolean activatePermission(java.lang.String roleName, java.lang.String permissionName, java.lang.Object obj) Description copied from interface: EngineComponent Attiva un permesso verificando eventuali vincoli Specified by: activatePermission in interface EngineComponent Parameters: RBACHierarchyDynamic roleName - ruolo coinvolto nel vincolo permissionName - permesso coinvolto nel vincolo obj - reference all'ogggetto Returns: true il processo di attivazione va a buon fine, false altrimenti addActiveRole public boolean addActiveRole(java.lang.String roleName, java.lang.String idSession) Description copied from interface: EngineComponent attiva un ruolo per una sessione utente, verificando gli eventuali vincoli Specified by: addActiveRole in interface EngineComponent Parameters: roleName - nome del ruolo idSession - id della sessione Returns: true se riesce ad attivare il ruolo, false altrimenti checkAccess public boolean checkAccess(java.lang.String java.lang.String java.lang.String java.lang.String java.lang.Object userName, objectName, operation, idSession, obj) Description copied from interface: EngineComponent controlla la disponibilità di un permesso per un certo utente e cerca di attivare un ruolo a cui il permesso è associato Specified by: checkAccess in interface EngineComponent Parameters: userName - nome del ruolo objectName - nome dell'oggetto operation - nome dell'operazione RBACHierarchyDynamic idSession - id della sessione obj - reference dell'oggetto Returns: true il processo di attivazione va a buon fine, false altrimenti createSession public void createSession(java.lang.String id, java.lang.String userName) Description copied from interface: EngineComponent crea una nuova sessione utente ed prova ad attivare i ruoli di default Specified by: createSession in interface EngineComponent Parameters: id - id della sessione userName - nome dell'utente deleteSession public void deleteSession(java.lang.String id) Description copied from interface: EngineComponent disattiva i ruoli della sessione e la elimina Specified by: deleteSession in interface EngineComponent Parameters: id - id della sessione dropActiveRole public boolean dropActiveRole(java.lang.String roleName, java.lang.String idSession) Description copied from interface: EngineComponent RBACHierarchyDynamic disattiva un ruolo di una sessione utente Specified by: dropActiveRole in interface EngineComponent Parameters: roleName - nome del ruolo idSession - id della sessione Returns: true se riesce a disattivare il ruolo, false altrimenti Overview Package Class Use Tree Deprecated Index Help PREV CLASS NEXT CLASS FRAMES SUMMARY: NESTED | FIELD | CONSTR | METHOD DETAIL: FIELD | CONSTR | METHOD NO FRAMES All Classes RBACHierarchyStatic Overview Package Class Use Tree Deprecated Index Help PREV CLASS NEXT CLASS FRAMES SUMMARY: NESTED | FIELD | CONSTR | METHOD DETAIL: FIELD | CONSTR | METHOD NO FRAMES All Classes it.unibs.carlotti.rbac.hierarchy Class RBACHierarchyStatic java.lang.Object it.unibs.carlotti.rbac.hierarchy.RBACHierarchyStatic All Implemented Interfaces: IntegrityComponent, StaticConstraint public class RBACHierarchyStatic extends java.lang.Object implements StaticConstraint Componente Hierarchy del motore statico Author: Giacomo Carlotti Constructor Summary RBACHierarchyStatic(IntegrityComponent _ic) Method Summary void checkIntegrity() - controlla che i ruoli di default di un utente siano tra quelli ereditati Methods inherited from class java.lang.Object clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait RBACHierarchyStatic Constructor Detail RBACHierarchyStatic public RBACHierarchyStatic(IntegrityComponent _ic) Method Detail checkIntegrity public void checkIntegrity() throws java.lang.Throwable - controlla che i ruoli di default di un utente siano tra quelli ereditati Specified by: checkIntegrity in interface IntegrityComponent Throws: java.lang.Throwable Overview Package Class Use Tree Deprecated Index Help PREV CLASS NEXT CLASS FRAMES SUMMARY: NESTED | FIELD | CONSTR | METHOD DETAIL: FIELD | CONSTR | METHOD NO FRAMES All Classes RBACLimitedHierarchy Overview Package Class Use Tree Deprecated Index Help PREV CLASS NEXT CLASS FRAMES SUMMARY: NESTED | FIELD | CONSTR | METHOD DETAIL: FIELD | CONSTR | METHOD NO FRAMES All Classes it.unibs.carlotti.rbac.hierarchy Class RBACLimitedHierarchy java.lang.Object it.unibs.carlotti.rbac.hierarchy.RBACLimitedHierarchy All Implemented Interfaces: IntegrityComponent, StaticConstraint public class RBACLimitedHierarchy extends java.lang.Object implements StaticConstraint Componente LimitedHierarchy del motore statico Author: Giacomo Carlotti Constructor Summary RBACLimitedHierarchy(IntegrityComponent _ic) Method Summary void checkIntegrity() Controlla i vincoli statici di integrità del sistema Methods inherited from class java.lang.Object clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait RBACLimitedHierarchy Constructor Detail RBACLimitedHierarchy public RBACLimitedHierarchy(IntegrityComponent _ic) throws java.lang.Throwable Throws: java.lang.Throwable Method Detail checkIntegrity public void checkIntegrity() throws java.lang.Throwable Description copied from interface: IntegrityComponent Controlla i vincoli statici di integrità del sistema Specified by: checkIntegrity in interface IntegrityComponent Throws: java.lang.Throwable Overview Package Class Use Tree Deprecated Index Help PREV CLASS NEXT CLASS FRAMES SUMMARY: NESTED | FIELD | CONSTR | METHOD DETAIL: FIELD | CONSTR | METHOD NO FRAMES All Classes RBACSSD Overview Package Class Use Tree Deprecated Index Help PREV CLASS NEXT CLASS SUMMARY: NESTED | FIELD | CONSTR | METHOD FRAMES NO FRAMES All Classes DETAIL: FIELD | CONSTR | METHOD it.unibs.carlotti.rbac.ssd Class RBACSSD java.lang.Object it.unibs.carlotti.rbac.ssd.RBACSSD All Implemented Interfaces: IntegrityComponent, StaticConstraint public class RBACSSD extends java.lang.Object implements StaticConstraint Componente SSD del motore statico Author: Giacomo Carlotti Constructor Summary RBACSSD(IntegrityComponent ic, boolean hierarchical) Method Summary void checkIntegrity() Controlla i vincoli statici di integrità del sistema Methods inherited from class java.lang.Object clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait RBACSSD Constructor Detail RBACSSD public RBACSSD(IntegrityComponent ic, boolean hierarchical) Method Detail checkIntegrity public void checkIntegrity() throws java.lang.Throwable Description copied from interface: IntegrityComponent Controlla i vincoli statici di integrità del sistema Specified by: checkIntegrity in interface IntegrityComponent Throws: java.lang.Throwable Overview Package Class Use Tree Deprecated Index Help PREV CLASS NEXT CLASS SUMMARY: NESTED | FIELD | CONSTR | METHOD FRAMES NO FRAMES All Classes DETAIL: FIELD | CONSTR | METHOD RBACTime Overview Package Class Use Tree Deprecated Index Help PREV CLASS NEXT CLASS SUMMARY: NESTED | FIELD | CONSTR | METHOD FRAMES NO FRAMES All Classes DETAIL: FIELD | CONSTR | METHOD it.unibs.carlotti.rbac.time Class RBACTime java.lang.Object it.unibs.carlotti.rbac.time.RBACTime All Implemented Interfaces: DynamicConstraint, EngineComponent public class RBACTime extends java.lang.Object implements DynamicConstraint Componente Time del motore dinamico Author: Giacomo Carlotti Constructor Summary RBACTime(EngineComponent ec) Method Summary boolean activatePermission(java.lang.String roleName, java.lang. String permissionName, java.lang.Object obj) Attiva un permesso verificando eventuali vincoli boolean addActiveRole(java.lang.String roleName, java.lang. String idSession) attiva un ruolo per una sessione utente, verificando gli eventuali vincoli RBACTime boolean checkAccess(java.lang.String userName, java.lang. String objectName, java.lang.String operation, java.lang. String idSession, java.lang.Object obj) controlla la disponibilità di un permesso per un certo utente e cerca di attivare un ruolo a cui il permesso è associato void createSession(java.lang.String id, java.lang. String userName) crea una nuova sessione utente ed prova ad attivare i ruoli di default void deleteSession(java.lang.String id) disattiva i ruoli della sessione e la elimina boolean dropActiveRole(java.lang.String roleName, java.lang. String idSession) disattiva un ruolo di una sessione utente Methods inherited from class java.lang.Object clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait Constructor Detail RBACTime public RBACTime(EngineComponent ec) Method Detail createSession public void createSession(java.lang.String id, java.lang.String userName) Description copied from interface: EngineComponent crea una nuova sessione utente ed prova ad attivare i ruoli di default Specified by: createSession in interface EngineComponent Parameters: id - id della sessione RBACTime userName - nome dell'utente deleteSession public void deleteSession(java.lang.String id) Description copied from interface: EngineComponent disattiva i ruoli della sessione e la elimina Specified by: deleteSession in interface EngineComponent Parameters: id - id della sessione addActiveRole public boolean addActiveRole(java.lang.String roleName, java.lang.String idSession) Description copied from interface: EngineComponent attiva un ruolo per una sessione utente, verificando gli eventuali vincoli Specified by: addActiveRole in interface EngineComponent Parameters: roleName - nome del ruolo idSession - id della sessione Returns: true se riesce ad attivare il ruolo, false altrimenti dropActiveRole public boolean dropActiveRole(java.lang.String roleName, java.lang.String idSession) Description copied from interface: EngineComponent disattiva un ruolo di una sessione utente RBACTime Specified by: dropActiveRole in interface EngineComponent Parameters: roleName - nome del ruolo idSession - id della sessione Returns: true se riesce a disattivare il ruolo, false altrimenti checkAccess public boolean checkAccess(java.lang.String java.lang.String java.lang.String java.lang.String java.lang.Object userName, objectName, operation, idSession, obj) Description copied from interface: EngineComponent controlla la disponibilità di un permesso per un certo utente e cerca di attivare un ruolo a cui il permesso è associato Specified by: checkAccess in interface EngineComponent Parameters: userName - nome del ruolo objectName - nome dell'oggetto operation - nome dell'operazione idSession - id della sessione obj - reference dell'oggetto Returns: true il processo di attivazione va a buon fine, false altrimenti activatePermission public boolean activatePermission(java.lang.String roleName, java.lang.String permissionName, java.lang.Object obj) Description copied from interface: EngineComponent Attiva un permesso verificando eventuali vincoli RBACTime Specified by: activatePermission in interface EngineComponent Parameters: roleName - ruolo coinvolto nel vincolo permissionName - permesso coinvolto nel vincolo obj - reference all'ogggetto Returns: true il processo di attivazione va a buon fine, false altrimenti Overview Package Class Use Tree Deprecated Index Help PREV CLASS NEXT CLASS SUMMARY: NESTED | FIELD | CONSTR | METHOD FRAMES NO FRAMES All Classes DETAIL: FIELD | CONSTR | METHOD WebFilter Overview Package Class Use Tree Deprecated Index Help PREV CLASS NEXT CLASS FRAMES SUMMARY: NESTED | FIELD | CONSTR | METHOD DETAIL: FIELD | CONSTR | METHOD NO FRAMES All Classes it.unibs.carlotti.rbac.web Class WebFilter java.lang.Object it.unibs.carlotti.rbac.web.WebFilter All Implemented Interfaces: javax.servlet.Filter public class WebFilter extends java.lang.Object implements javax.servlet.Filter Questa classe permette di intercettare le chiamate alle risorse del web server ed eseguire i controlli dei vincoli dinamici del sistema RBAC Author: Giacomo Carlotti Constructor Summary WebFilter() Method Summary void destroy() void doFilter(javax.servlet.ServletRequest arg0, javax.servlet. ServletResponse arg1, javax.servlet.FilterChain arg2) WebFilter void init(javax.servlet.FilterConfig arg0) Methods inherited from class java.lang.Object clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait Constructor Detail WebFilter public WebFilter() Method Detail init public void init(javax.servlet.FilterConfig arg0) throws javax.servlet.ServletException Specified by: init in interface javax.servlet.Filter Throws: javax.servlet.ServletException doFilter public void doFilter(javax.servlet.ServletRequest arg0, javax.servlet.ServletResponse arg1, javax.servlet.FilterChain arg2) throws java.io.IOException, javax.servlet.ServletException Specified by: doFilter in interface javax.servlet.Filter Throws: java.io.IOException javax.servlet.ServletException WebFilter destroy public void destroy() Specified by: destroy in interface javax.servlet.Filter Overview Package Class Use Tree Deprecated Index Help PREV CLASS NEXT CLASS FRAMES SUMMARY: NESTED | FIELD | CONSTR | METHOD DETAIL: FIELD | CONSTR | METHOD NO FRAMES All Classes WebPlugin Overview Package Class Use Tree Deprecated Index Help PREV CLASS NEXT CLASS FRAMES SUMMARY: NESTED | FIELD | CONSTR | METHOD DETAIL: FIELD | CONSTR | METHOD NO FRAMES All Classes it.unibs.carlotti.rbac.web Class WebPlugin java.lang.Object it.unibs.carlotti.rbac.web.WebPlugin All Implemented Interfaces: java.util.EventListener, javax.servlet.http.HttpSessionListener public class WebPlugin extends java.lang.Object implements javax.servlet.http.HttpSessionListener Questa classe intercetta gli eventi di creazione e distruzione delle sessioni http degli utenti e permette di istanziare e distruggere le corrispondenti sessioni del sistema RBAC Author: Giacomo Carlotti Constructor Summary WebPlugin() Method Summary void sessionCreated(javax.servlet.http.HttpSessionEvent arg0) void sessionDestroyed(javax.servlet.http.HttpSessionEvent arg0) Methods inherited from class java.lang.Object WebPlugin clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait Constructor Detail WebPlugin public WebPlugin() Method Detail sessionCreated public void sessionCreated(javax.servlet.http.HttpSessionEvent arg0) Specified by: sessionCreated in interface javax.servlet.http.HttpSessionListener sessionDestroyed public void sessionDestroyed(javax.servlet.http.HttpSessionEvent arg0) Specified by: sessionDestroyed in interface javax.servlet.http. HttpSessionListener Overview Package Class Use Tree Deprecated Index Help PREV CLASS NEXT CLASS FRAMES SUMMARY: NESTED | FIELD | CONSTR | METHOD DETAIL: FIELD | CONSTR | METHOD NO FRAMES All Classes APPENDICE B.1 Diagrammi UML dei packages APPENDICE B.2 Diagrammi UML delle classi