Sicurezza in Java
z
Evoluzione dei modelli di sicurezza in Java
z
Architettura di autorizzazione nel JDK 1.2
1
Java Virtual Machine
caricamento in memoria del file .class
Loading
Linking
Verification
verifica byte-code
Preparation
allocazione spazio in memoria
Resolution
risoluzione di tutti i riferimenti
simbolici ad altre classi
inizializzazione di tutte le variabili
statiche allocate
Initializing
Esecuzione
di main()
Esempio:
int intero = 5
preparation: memoria per l’int
inizializing: il valore di int viene modificato in 5
2
Il Class Loader di Java (1.)
Caratteristiche:
• “lazy” loading; le classi sono caricate “on demand" e possibilmente
all’ultimo momento
Esempio:
Prova p = new Prova();
Attrib1 a1;
classe
Attrib2 a2=new Attrib2();
Prova
initAttrib1() { a1=new Attrib1(); }
• programmabilità
3
Il Class Loader di Java (2.)
Recupero dei dati
della classe
Definizione
della classe
Risoluzione
della classe
Restituzione
della istanza di
Class
Caricamento della classe
Caricamento delle superclassi
Esecuzione della fase di
Verification
N.B: la risoluzione può
essere ritardata, non tutte le
classi riferite devono essere
immediatamente caricate
4
Struttura della classe Class Loader
loadClass(…)
findLoadedClass(…)
Classe
ClassLoader
findSystemClass(..)
findClass(…)
resolveClass()
defineClass(….)
5
class MyClassLoader extends ClassLoader {
6
Tipi di Class Loader
• class loader interno; in JDK 1.2 usato solo per caricare le classi di Java;
•secure class loader; in JDK 1.2 permette di implementare politiche di
sicurezza più granulari;
• applet class loader; ogni browser implementa un proprio class loader;
• URL class loader; permette di caricare classi da un insieme di URL
distinte
I programmatori possono definire class loader propri purchè tutti
estendano i tipi predefiniti
Primordial CL
java.lang.CL
java.security.SecureCL
java.net.URLCL
AppletCL
7
• Il class loader che fa il bootstrap del processo di caricamento si chiama
primordial class loader (generalmente scritto in linguaggio nativo). Il class
loader che definisce una classe si chiama defining class loader
• concetto di delega. Un class loader puo’ direttamente caricare una classe
oppure delegare un altro class loader a tale compito (ad esempio il class
loader delle classi dell’applicazione si puo’ delegare al class loader interno
il caricamento delle classi di sistema; questo garantisce che tutte le classi di
sistema abbiano tipi considerati unici)
A tempo di compilazione il tipo di una classe corrisponde a un nome
A runtime il tipo effettivo della classe è determinato dalla coppia nome
della classe e defining class loader: <C, L>
Due tipi di classe nell’ambiente runtime Java sono considerati uguali se i
tipi delle classi e i loro defining class loader sono uguali
8
• Istanze di MyClassLoader possono delegare il caricamento della classe
java.lang.String al class loader di sistema
• Se C è il risultato di L.defineClass() allora L è il defining class loader
• Se C è il risultato di L.loadClass allora L è il class loader che ha
avviarto il processo di loading di C
Ogni classe è permanentemente associata al proprio defining class loader
ed è il defining class loader che avvia il processo di loading di
qualunque classe riferita da C
Questo permette di mantenere la consistenza temporale dei namespace e la
consistenza dei namespace in presenza di delega
9
Occorre garantire che le due
occorrenze della classe X siano
dello stesso tipo per garantire la
safety della chiamata di metodo f
10
11
Class Loader e Sicurezza
Il Class Loader gioca un ruolo fondamentale
• crea spazi di nomi separati;
• si coordina con il componente Security Manager che implementa le
politiche di sicurezza
www.sun.com
Car
Class
Classi nella Virtual Machine
Class Loader L1
Internet
Car(ora.com)
Class Loader L2
www.ora.com
Car
Car (sun.com)
L1
L2
Car
Car
Class
Class
Class
12
Modello di Sicurezza in JDKTM 1.0
13
Modello di Sicurezza in JDKTM 1.0
Vantaggi:
• la sandbox protegge l’accesso a tutte le risorse di sistema
• i programmatori di applicazioni (non di applet) possono scrivere un
proprio Security Manager per “aprire” la sandbox
Limitazioni:
• modello troppo restrittivo
• i programmatori di applicazioni (non di applet) devono scrivere un
proprio Security Manager per “aprire” la sandbox
• ad ogni politica diversa corrisponde una nuova versione del
SecurityManager
14
Modello di Sicurezza in JDKTM 1.1
15
Modello di Sicurezza in JDKTM 1.1
Vantaggi:
• la firma del codice assicura:
– autenticazione
– integrità
Limitazioni:
• applicazioni locali non sono sottoposte ad alcun controllo
• tutte le classi presenti nel CLASSPATH sono considerate fidate
16
Modello di Sicurezza in JDKTM 1.2
Obiettivi:
• estensione dei controlli di sicurezza sia alle applet sia alle
applicazioni (esterne e locali)
• configurabilità semplificata delle politiche di sicurezza
• controlli di accesso granulari
Elementi caratterizzanti la nuova architettura:
• politica di sicurezza
• definizione di permessi di accesso
• controllo d’accesso
17
Modello di Sicurezza in JDKTM 1.2
18
Politica di Sicurezza (1.)
• Politica di sicurezza: matrice di controllo dell’accesso
Codice
Permessi
Li Gong applet,
read, write /tmp and home/gong
applet firmate
Esempio di Politica di Sicurezza (rappresentazione ASCII di default ):
grant signedBy “*”, CodeBase “http://java.sun.com/people/gong/”
{
permission java.io.FilePermission “read, write”, “tmp/*”;
}
19
Politica di Sicurezza (2.)
• CodeSource (chi/dove): località di provenienza del codice e insieme di
certificati utilizzati per la firma del codice
• Permissions: permessi attribuiti al codice
• abstract class Policy:
– public static Policy getPolicy()
– public static void setPolicy(Policy policy)
– public abstract Permissions getPermissions(CodeSource codesource)
– public abstract void refresh()
20
Secure Class Loader e Protection Domain
Protected final Class
defineClass(String name, byte [] b, int off, int len, CodeSource cs)
21
Esempio di Secure Class Loader (1.)
public class AgentClassLoader extends SecureClassLoader
……..
public AgentClassLoader() {}
public AgentClassLoader( Environment env, String agentClass, AgentID agentID )
{ …...
codeSource = new CodeSource( AgentToURL( agentClass, agentID ),
new Certificate[0] );
}
public static URL AgentToURL( String AgentClass, AgentID agentID )
{return new URL( "http://" + agentID.place.domain +
"/" + agentID.place.place +
"/" + AgentClass +
}
22
Esempio di Secure Class Loader (2.)
protected Class findClass(final String className) throws ClassNotFoundException
{ …..
return myFindClass( className );
}
private Class myFindClass( String className) throws Exception
{if
la classe si trova in locale then
byte [] classData= ...loadClassFile();
verifico l’autenticità delle firme sul codice
defineClass( className, classData, 0, classData.length, codeSource );
else
la cerco in remoto
…….
}
23
Permission Class
• I permessi sono caratterizzati da:
– un type: che tipo di permessi (permessi relativi a file, a socket..);
– un nome: identifica l’oggetto a cui i permessi sono riferiti
– azioni
• 11 permessi standard Java, ognuno dei quali implementato come classe
Esempio: il FilePermission class
FilePermission p1 = new FilePermission (“-”, “execute”);
FilePermission p2 = new FilePermission (“/myclasses/*”, “read”);
24
Struttura della gerarchia
25
Controllo dell’Accesso
JDK 1.1
SecurityManager security=System.getSecurityManager();
if (security !=null) {
Security.checkRead(“path/file”);
JDK 1.2
FilePermission perm = new
FilePermission(“path/file”,“read”);
AccessController.checkPermission (perm);
26
Algoritmo di Controllo dell’Accesso (1.)
• L’AccessController controlla se tutti i domini nella catena delle
chiamate hanno il permesso richiesto
• strategie di implementazione: lazy evaluation
27
Algoritmo di Controllo dell’Accesso (2.)
• quando nello stack sono presenti più domini, tutti devono avere il
permesso richiesto
28
Caratteristiche del modello di sicurezza
di JDK 1.2
Vantaggi:
• separazione tra specifica delle politiche ed effettivo enforcement
• estensibilità e scalabilità dei controlli di sicurezza
(checkRead vs. checkPermission) => controllo dell’accesso
“tipizzato”
Limiti:
• aggiornamento delle politiche semi-statico
• difficoltà di controllo dell’uso delle risorse (CPU..)
29
Scarica

Architettura di Sicurezza in Java