JAAS.

Slides:



Advertisements
Presentazioni simili
Text Processing Google APi
Advertisements

1 Le s-espressioni. 2 Un nuovo esempio completo: le s-espressioni Sexpr 4 alberi binari (possibilmente vuoti) che hanno sulle foglie atomi (stringhe)
1 Progettazione gerarchica delle s- espressioni, utilizzando lereditarietà
Interfacce Java.
La sicurezza di ASP.NET e IIS
TechNet Security Workshop IV Milano, 8 Giugno. Internet Information Server 6.0.
ASP.NET – Web Forms Davide Vernole.NET MVP. Di cosa parleremo Introduzione ad ASP.NET ASP.NET, dietro le quinte Componenti principali di una applicazione.
WSDL (Web Services Description Language) Laurea Magistrale in Informatica Reti 2 (2006/07) dott. Federico Paoloni
UDDI (Universal Description, Discovery and Integration Protocol) Laurea Magistrale in Informatica Reti 2 (2006/07) dott. Federico Paoloni
JPA Overview della tecnologia. Java Persistence Architecture Definita nella JSR-220 EJB 3.0 ( Tentativo di unificare EJB2.1 con.
1 Processi e Thread Processi Thread Meccanismi di comunicazione fra processi (IPC) Problemi classici di IPC Scheduling Processi e thread in Unix Processi.
Un DataBase Management System (DBMS) relazionale client/server.
EJB Enterprise Java Beans B. Pernici. Approccio Java.
Pierluigi Plebani - Politecnico di Milano MAIS Registry URBE (Uddi Registry By Example) WP2 Roma - 25 Novembre 2005.
Model – View - Controller
Esempio: Tombola! Parte seconda.
Unified Modeling Language class C {…} class B extends C {…} Esiste una notazione grafica per mostrare le relazioni di ereditarietà. Object StringC B Tutte.
J0 1 Marco Ronchetti Java Threads & Sincronizzazione.
J0 1 Marco Ronchetti - Corso di Formazione Sodalia – Febbraio 2001 – Modulo Web Programming Tomcat configuration.
Modificatori: static Variabili e metodi associati ad una Classe anziche ad un Oggetto sono definiti static. Le variabili statiche servono come singola.
EJB Getting started Database: MySql Application Server: Pramati Server Ambiente di sviluppo: Pramati Studio 3 Applicazione esempio: Logon Trento, 30/10/2002.
Richiami di Java Multithreading. Threads (subclassing) public class A { public void a_method { C t = new C(); //C t = new C(String name); t.start(); …
Sezione: Costruttori Costruttori. Definizione dei costruttori Se per una classe A non scrivo nessun costruttore, il sistema automaticamente crea il costruttore.
prompt> java SumAverage
1 struct Pila { private: int size; int defaultGrowthSize; int marker; int * contenuto; void cresci(int increment); public: Pila(int initialSize) ; Pila();
Directory services Directory offline –Elenchi telefonici –Guide TV –Cataloghi acquisti Directory online –Application specific (lotus notes, MS Exchange.
Costruzione di Interfacce Lezione 10 Dal Java al C++ parte 1
1. Conoscere luso delle collezioni in Java Comprendere le principali caratteristiche nelle varie classi di Collection disponibili Saper individuare quali.
Fanno ormai parte della nostra vita di tutti i giorni….
Java Database Connection (dal corso dei Servizi Web)
Programming with JXTA Hello World Peer discovery Peer Group discovery Creating Peer group Joining a Peer Group.
Università La Sapienza Ingegneria del Software I 1 Ingegneria del software I Seminario 3:Enterprise Java Beans.
2000 Prentice Hall, Inc. All rights reserved. 1 Capitolo 6: Classi e astrazione dati 1.Introduzione 2.Definizione delle strutture 3.Accedere ai membri.
Packages. Package: insieme di classi e interfacce in relazione Per formare un package basta inserire la direttiva come prima istruzione nel file sorgente.
FONDAMENTI DI INFORMATICA III WfMC-1. FONDAMENTI DI INFORMATICA III WfMC-2 WFMC Cose WfMC Workflow Management Coalition (WfMC), Brussels, è unorganizzazione.
Gestione File System e I/O in Windows 2000 Implementazione del File System FAT-12, FAT-16, FAT-32 NTFS API relative al File System Gestione dei dispositivi.
Programmazione distribuita in Java
Java base VI: Gestione I/O. Argomenti Introdurre le API per linput e output in Java.
Sequence. CREARE UNA SEQUENCE CREATE SEQUENCE nome [INCREMENT BY n] [START WITH n] [MAXVALUE n | NOMAXVALUE] [MINVALUE n | NOMINVALUE] [CYCLE | NOCYCLE]
FUNZIONI DI GRUPPO Le funzioni di gruppo operano su un set di record restituendo un risultato per il gruppo. AVG ([DISTINCT|ALL] n) media, ignora i valori.
Componenti dell’architettura Oracle
realizzazione app per Google Android OS
Palermo, may 2010 F.Doumaz, S.Vinci (INGV-CNT- Gruppo di telerilevamento)
Un esempio: Registrazione e lettura di dati in un file
Muoversi tra le finestre
JavaScript Lezione 5 Tipizzazione ed operazioni tra tipi diversi Istruzioni di input.
Moduli o Form I Moduli permettono all'utente di immettere informazioni...
Attività Formativa Sviluppo di un WORKFLOW ENGINE di Dott. Riccardo Gasperoni Alessandro Caricato Gabriele Trabucco in collaborazione con Progesi S.p.A.
Project Review byNight byNight December 6th, 2011.
14° Workshop – DotNetMarche :: Castelfidardo, 16 Aprile 2010 Introduzione ai framework per IoC / DI e AOP.
Installazione di Drupal su Linux (sistemista) Installazione step-by-step e note.
Multiset. Progettare (specifica con identificazione delle eventuali astrazioni necessarie, incluse eccezioni, e implementazione) del tipo di dato Multiset,
Funzioni stringhe. chr Restituisce il carattere di un valore ascii dato. Per vedere lelenco dei codici ascii clicca QQQQ uuuu iiiiEsempio
Visual Studio Tools for Office: Developer Solutions Platform Fulvio Giaccari MCSD.NET / MCT Responsabile Usergroup ShareOffice Blog:
SQL Server 2005 Sicurezza Davide Mauri Factory Software
Test con JUnit. zJUnit è un ambiente di test per programmi Java ySviluppato da Kent Beck É possibile usare JUnit allinterno di Eclipse per eseguire i.
Project Review Novembrer 17th, Project Review Agenda: Project goals User stories – use cases – scenarios Project plan summary Status as of November.
Project Review byNight byNight December 21th, 2011.
Project Review byNight byNight December 6th, 2011.
Project Review Novembrer 17th, Project Review Agenda: Project goals User stories – use cases – scenarios Project plan summary Status as of November.
Project Review byNight byNight December 5th, 2011.
1 Simulated multiple inheritance Sandro Pedrazzini Approfondimento Simulated multiple inheritance in Java.
SUBQUERY Chi ha un salario maggiore di quello di Abel? Occorre scomporre la query in due sotto problemi: MAIN : quali impiegati hanno un salario maggiore.
Customer Support Research & Development Come registrarsi ed entrare in......ITRC.
Corso di Web Services A A Domenico Rosaci Patterns di E-Business D. RosaciPatterns per l'e-Business.
Introduzione al linguaggio C. Cos’e’ il C? Il C e’ un linguaggio ad alto livello Un compilatore C prende in input un file contenente codice sorgente C.
Collection & Generics in Java
Introduction to automatic ABMs documentation Keywords: Doxygen ODD protocol MASON documentation Simone Romano.
Sistemi di elaborazione dell’informazione Modulo 3 -Protocolli applicativi Unità didattica 4 - Protocolli del Web Ernesto Damiani Lezione 3 – Esempi HTTP.
JDBC Java DataBase Connectivity SISTEMI ITIS B. CASTELLI Anno Scolastico
Transcript della presentazione:

JAAS

JAVA Security I primi framework JAVA security mirano a lla protezione dell’utente l’utente dall’esecuzione di codice mobile basandosi su: L’origine del codice Chi ha creato il codice JAAS si preoccupa di proteggere il systema dagli utenti basandosi su: L’identità di chi esegue il codice I permessi concessi a chi esegue il codice

Motivazioni Meccanismi di autenticazione possono essere implementati in differenti modi: Usando un database Oracol Un’autenticazione NT Il protocollo LDAP (lightweight access directory protocol) Il punto è come utilizzare qualunque di questi meccanismi senza cambiare il codice dell’applicazione …

JAAS “JAVA Authentication and Authorization Service”. Tali API sono un’estensione di J2SE (Java 2 Platform, Standard Edition) 1.3. Fanno parte delle core API in J2SE 1.4 Sono parte di J2EE (Java 2 Platform, Enterprise Edition) 1.3 specification.

Nasce JAVA Security Java nasce per essere utilizzato come codice mobile (applets) Il modello di sicurezza utilizzato inizialmente mirava a considerare: La provenienza del codice Il creatore del codice Tutti i meccanismi (sandbox, firma digitale del codice, files di policy) erano concepiti per proteggere l’utente dal sistema

JAAS JAAS consente di effettuare sia autenticazione che autorizzazione JAAS semplifica la gestione della sicurezza inJAVA inserendo un livello di astrazione tra il livello applicativo e i meccanismi di autenticazione ed autorizzazione sottostanti Come la maggior parte delle security APIs di JAVA, anche JAAS riesce ad essere indipendente dalle implementazioni utilizzando un sistema di moduli SPIs (Serive Provider Interfaces)

JAVA providers

                                                                                                                                                                                                                                                                                                                        

Caratteristiche JAAS mette a disposizione moduli pre-sviluppati È possibile sviluppare nuovi moduli o importarne degli esterni È inoltre possibile utilizzare uno stack di moduli: ogni modulo può utilizzare i meccanismi di un modulo sottostante per interagire con diverse infrastrutture. L’utilizzo di uno stack di autenticazione riprende il Pluggable Authentication Module (PAM) di Unix

Caratteristiche JAAS utilizza un approccio simile ad un protocollo di commit a due fasi JAAS eredita dal security packages di J2SE 1.2 i principi per la configurazione come Policy files ed i Permessi JAAS infine eredita idee da altri affermati framework per la sicurezza, come i certificati X.509

Subject e Principals JAAS usa il termine subject per riferirsi a qualsiasi servizio o utente Per identificare i soggetti con cui interagire si basa su di nomi. Tuttavi i soggetti potrebbero avere nomi diversi per utilizzre servizi diversi Le interfacce utilizzate sono: public interface Principal { public String getName(); } public final class Subject { public Set getPrincipals() { } }

Utilizzo Se la versione di JAVA è anteriore alla J2SEv1.4 occorre procurarsi l’estensione Occorre salvare il file jaas.jar nel classpath o nella cartella <jre-home>/lib/ext/

Utilizzo Per utilizzare JAAS nelle proprie applicazioni occorre: Creare un LoginContext Passare un CallbackHandler al LoginContext, per prelevare o processare i dati utente Effettuare l’autenticazione chiamando il metodo login() del LoginContext Effettuare le operazioni privilegiate utilizzando il Subject restituito dal metodo login() (asssumendo che l’autenticazione sia andata a buon fine)

Un esempio LoginContext lc = new LoginContext("MyExample");     try {         lc.login();     } catch (LoginException) {         // Authentication failed.     }     // Authentication successful, we can now continue.     // We can use the returned Subject if we like.     Subject sub = lc.getSubject();     Subject.doAs(sub, new MyPrivilegedAction());

Cosa succede Ecco cosa avviene: Durante l’inizializzazione dell’oggetto LoginContext viene cercata la entry "MyExample" in un file di configurazione di JAAS (scritto dallo sviluppatore) per capire quale LoginModule caricare Durante il login, il LoginContext chiama il metodo login() di ogni modulo caricato Ogni chiamata effettua l’autenticazione o utilizza un CallbackHandler Il CallbackHandler usa uno o più Callbacks per interagire con gli utenti e prelevare l’input Viene creata una istanza Subject popolata con dettagli dell’autenticazione quali Principal e Credenziali

JAAS classi ed interfacce Common Subject, Principal, credential (credential is not any specific class, but can be any object) Authentication LoginContext, LoginModule, CallbackHandler, Callback Authorization Policy, AuthPermission, PrivateCredentialPermission

Common: Subjects, Principals, and Credentials La classe Subject rappresenta un entità autenticata. La classe contiene tre insieme di informazioni di sicurezza: Identities: uno o più Principal Public credentials: es: un nome o una chiave pubblica Private credentials: password o chiavi private I Principals rappresentano delle identità che un soggetto può assumere (un codicee fiscale, un indirizzo email, una login ID). Implementano l’interfaccia Principal e serializable Una credenziale è un qualsiasi Oggetto (una chiave, un ticket, una password). Tali credenziali vengono usati a livello sistema piuttosto che a quello applicativo.

Authentication: LoginContext È’ la classe direttamente usata dal livello applicativo usato per autenticare i Subjects. All’interno del del LoginContext vengono caricati i moduli pluggable indicati nel file di configurazione I tre metodi usati più comunemente sono: Table 2. LoginContext methods login() Invoca i meccanismi di autenticazione dei diversi LoginModules. In caso di successo viene creato un Subject autenticato, altrimenti viene generata una LoginException. getSubject() Ritorna il Subject autenticato logout() Effettua il logout del Subject e rimuove Principals e credenziali

Autenticazione: LoginModules JndiLoginModule Verifies against a directory service configured under JNDI (Java Naming and Directory Interface) Krb5LoginModule Autentica usando il Protocollo Kerberos NTLoginModule Usa le informazioni correnti dell’utente NT per autenticare UnixLoginModule Usa le informazione del utente Unix corrente

LoginModule: metodi Devono essere implementati dal programmatore initialize() Chiamato dopo la creazione dell’oggetto login() Effettua l’autenticazione commit() Chiamato dopo l’autenticazione dal LoginContext. Qui si assegnano Principals e Credenziali al Subject. abort() Chiamato quando fallisce l’autenticazione snche se nelle prime fasi. Non vengono assegnati Principals e Credenziali al Subject. logout() Rimuove Principals e Credenziali associate al Subject. Devono essere implementati dal programmatore Non vengono utilizzati dal livello applicativo, ma dal LoginContext

Authentication: CallbackHandlers and Callbacks CallbackHandlers and Callbacks fanno si che il LoginModule riesca a prelevare le credenziali dell’utente. Devono poter essere utilizzati indipendentemente da qual è l’ambito applicativo entro il quale le credenziali sono prelevate (es: e command line o JSP). JAAS dispone già di 7 built-in Callbacks nel javax.security.auth.callback package: ChoiceCallback, ConfirmationCallback, LocaleCallback, NameCallback, PasswordCallback, TextInputCallback, TextOutputCallback.

Configuration files Hanno la seguente struttura:      Application {           ModuleClass  Flag    ModuleOptions;           ModuleClass  Flag    ModuleOptions;           ...       };       Application {           ModuleClass  Flag    ModuleOptions;           ...       };       ... Un esempio: Sample {     com.sun.security.auth.module.NTLoginModule Required debug=true; };

Flags Login2 Authentication Status SampleLogin Module required pass fail NTLoginModule sufficient SmartCard requisite * Kerberos optional Overall Authentication

Un esempio di login da linea di comando Per utilizzare un database per l’autenticazione: Creare un database Creare un file di configurazione che dice al LoginContext come usare il modulo RdbmsLoginModule Creare un ConsoleCallbackHandler pre prelevare l’input utente Aggiunfre il codice applicativo per utilizzare il Modulo RdbmsLoginModule, il file di Configurazione, ed il ConsoleCallbackHandler Nel RdbmsLoginModule, occorre implementare i 5 metodi definiti nella LoginModule interface.

Inizializzazione Il primo di questi metodi è: initialize() : public void initialize(Subject subject, CallbackHandler callbackHandler,   Map sharedState, Map options) {    this.subject          = subject;    this.callbackHandler  = callbackHandler;    this.sharedState      = sharedState;    this.options          = options;    url         = (String)options.get("url");    driverClass = (String)options.get("driver");    debug       ="true“.equalsIgnoreCase((String)options.get("debug")); } The sharedState Map permette di condividere dati tra diversi LoginModules; un caratteristica non usata qui

Il file di inizializzazione   Example {    RdbmsLoginModule required    driver="org.gjt.mm.mysql.Driver"    url="jdbc:mysql://localhost/jaasdb?user=root"    debug="true";    };

L’applicazione ConsoleCallbackHandler cbh = new LoginContext lc = new LoginContext("Example", cbh); lc.login();

Our login() method then performs the following steps: Creates two Callbacks that will receive username/password information from the user. It uses two of the built-in JAAS callbacks from the javax.security.auth.callback package: NameCallback and PasswordCallback. Both of these classes implement the Callback interface, a marker interface with no methods. Invokes the Callbacks indirectly by passing them to the handle() method of the CallbackHandler parameter specified in the call to initialize(). Retrieves the username/password from the Callbacks. Uses the username/password in our own rdbmsValidate() method, which checks them against the database via a JDBC query.

public boolean login() throws LoginException {    if (callbackHandler == null)         throw new LoginException("no handler");    NameCallback nameCb = new NameCallback("user: ");    PasswordCallback passCb = new PasswordCallback("password: ", true);    callbacks = new Callback[] { nameCb, passCb };    callbackHandler.handle(callbacks);    String username = nameCb.getName();    String password = new String(passCb.getPassword());    success = rdbmsValidate(username, password);    return(true); }

public void handle(Callback[] callbacks) throws java. io public void handle(Callback[] callbacks)               throws java.io.IOException, UnsupportedCallbackException {     for (int i = 0; i < callbacks.length; i++) {         if (callbacks[i] instanceof NameCallback) {             NameCallback nameCb = (NameCallback)callbacks[i];             System.out.print(nameCb.getPrompt());             String user=(new BufferedReader(new InputStreamReader(System.in))).readLine();             nameCb.setName(user);         } else if (callbacks[i] instanceof PasswordCallback) {             PasswordCallback passCb = (PasswordCallback)callbacks[i];             System.out.print(passCb.getPrompt());             String pass=(new BufferedReader(new InputStreamReader(System.in))).readLine();             passCb.setPassword(pass.toCharArray());         } else {             throw(new UnsupportedCallbackException(callbacks[i],                     "Callback class not supported"));         }     } }

JSP Callback String user = request.getParameter("user"); String pass = request.getParameter("pass"); PassiveCallbackHandler cbh = new PassiveCallbackHandler(user, pass); LoginContext lc = new LoginContext("Example", cbh);

PassiveCallback public void handle(Callback[] callbacks)     throws java.io.IOException, UnsupportedCallbackException {         for (int i = 0; i < callbacks.length; i++) {             if (callbacks[i] instanceof NameCallback) {                 NameCallback nameCb = (NameCallback)callbacks[i]; nameCb.setName(user);             } else if(callbacks[i] instanceof PasswordCallback) {                 PasswordCallback passCb = (PasswordCallback)callbacks[i];                 passCb.setPassword(pass.toCharArray());             } else {                 throw(new UnsupportedCallbackException(callbacks[i],                     "Callback class not supported"));              }         }     } } No richiede interazione con l’utente

Autorizzazione Una volta che l’autenticazione è stata completata con successo JAAS permette il controllo degli accessi per i principals associati al Subject autenticato Il controllo dell’accesso JAAS principal-based (basato su chi esegue il codice) completa l’esistente sistema Java 2 codesource-based (basato sulla provenienza del codice e sulla firma)

Autorizzazioni Occorre definire un insieme di risorse protette Un insieme di condizioni secondo le quali i Principal menzionati possono accedere alle risorse JAAS estende la policy di default di Java 2 utilizzando insieme i due criteri (code base and user based)

Esempio // Java 2 codesource-based policy grant Codebase "http://foo.com", Signedby "foo" { permission java.io.FilePermission "/cdrom/-", "read"; } // JAAS principal-based policy grant Codebase "http://bar.com, Signedby "bar", Principal bar.Principal "duke" { permission java.io.FilePermission "/cdrom/duke/-", "read"; }

Esempio Questo esempio consente al codice: caricato da 'bar.com‘ firmato da 'bar', ed eseguito da ‘'duke‘ di leggere solo quei files che si trovano nella cartella '/cdrom/duke' directory. Per essere eseguito come ‘duke’ il subject autenticato dal LoginContext deve essere associato ad un Principal il cui metodo “getName” ritorna la stringa ‘duke’. Se il codice caricato da 'bar.com', firmato da 'bar', eseguissse stand-alone (non eseguito come 'duke'), allora non otterrebbe il permesso Se la policy non specificasse l’informazione Codbase o SygnedBy quel permesso sarebbe concsso a qualunque codice eseguto come ‘duke’

Ruoli e Gruppi JAAS tratta ruoli e gruppi semplicemente come Principals. Il controllo dell’accesso può essere applicato a ruoli e gruppi così come ad altri tipi di Principal: // an administrator role can access user password grant Principal foo.Role "administrator" { permission java.io.FilePermission "/passwords/-", "read, write"; // a basketball team (group) can read its directory grant Principal foo.Team "SlamDunk" { permission java.io.FilePermission "/teams/SlamDunk/-", "read"; }

Eseguire un’operazione con particolari Privilegi In JAVA 2 la runtime richiama il Seccurity Manager quando occorre accedere a delle operazioni sensibili Per determinare se il codice ha sufficienti permessi Il SecurityManager delega la responsabilità al “java.security.AccessController” che ottiene un immagine del contesto corrente (AccessControlContext) e si assicura che questi contenga sufficienti privilegi per portare a termine l’operazione.

Eseguire azioni privilegiate con JAAS JAAS completa questa architettura mettendo a disposizione il metodo: Subject.doAs, per associare dinamicamente un soggetto autenticato al corrente AccessControlContext. Utilizzando JAAS, il server può essere sicuro di ciò definendo l’operazione qualle java.security.PrivilegedAction, e poi invocando il metodo doAs Fornendo sia il subject autenticato che il PrivilegedAction il metodo doAs associa il subject all’AccessControlContext corrente ed esegue l’azione

Esempio public final class Subject { ... // associate the subject with the current // AccessControlContext and execute the action public static Object doAs(Subject s, java.security.PrivilegedAction action) { }