Distribuzione di informazioni critiche



 
 

 Struttura del Codice:

Le classi implementate sono :

  • DNS : istanzia la classe DNSCommon per creare gli oggetti comuni ai thread che gestiscono le connessioni con i 2 Admin.Si e' gestita la concorrenza tramite il metodo ruoloDisponibile() invocato dai thread AscoltoReg .Questi attendono la connessione degli Admin per la fase di registrazione. Quando si connetteranno si invia loro il ruolo disponibile (secondo una politica FCFS), insieme all'insieme degli indirizzi ip dei nodi da amministrare.
  • AdminApp : istanzia la classe Admin che in base agli argomenti passati da linea di comando(NameServer address, NameServer port) tenta una connessione al NameServer . Viene invocato il metodo registrazione() che gestisce il protocollo di comunicazione con il NS . 
  • Nodo: Si istanzia un oggetto comune Common ai thread successivamente creati .In questo oggetto si implementano dei metodi che permettono di sincronizzare tra loro i thread.
  • Si crea un ClassLoader personalizzato instanziando la classe CaricaClassi(). Questo è il cuore del progetto : infatti si è dovuto implementare un Caricatore di Classi con specifiche di sicurezza, per avere un ambiente sicuro in cui sia possibile implementare le proprie politiche di sicurezza.Solo l'Administrator possiede il diritto di editare le politiche e propagarle ai nodi.
  • Questi oggetti vengono passati ai 3 thread : 
    • ThreadCaricaClassi : suo compito è caricare delle classi tramite il classloader precedentemente creato.
    • ThreadRicevePolitica : rimane in ascolto di una possibile connessione con l'Admin, pronto a ricevere nuove politiche.Quando arrivano le aggiorna nel sistema e chiama il thread StoppaClassi.
    • ThreadStoppaClassi : suo compito è stoppare le classi in esecuzione e farle ripartire con le nuove politiche.

Problematiche del progetto:

     Il nodo cruciale del progetto è stato implementare un SecureClassLoader in grado  di caricare le classi on demand e su cui applicare una propria politica di sicurezza.

    Si è usato il modello di sicurezza del Java Development Kit 1.2 che costituisce una architettura per l'implementazione del principio del minimo privilegio.Questa prevede la specificazione da parte dello sviluppatore di una norma di sicurezza, in base alla quale concedere alle applicazioni diversi gradi di accesso alle risorse, a seconda della fonte dei programmi stessi e dell'identità di chi li ha firmati. Per specificare una norma di sicurezza è sufficiente modificare l'apposito file di configurazione java.policy(<java.home>\lib\security\java.policy) 

    Il contenuto del file della norma di sicurezza è costituito da una serie di istruzioni, definite voci di assegnazione, che identificano i permessi associati al codice, in base alla sua provenienza e all'identità dei suoi firmatari.Nel nostro caso, inizialmente si è lasciato il java.policy originale nei Nodi da amministare, poi si è simulato il fatto che l'Administrator abbia editato le politiche e quindi si sono propagate ai nodi (pol2.policy).In questo file di nuove politiche si sono cambiate le voci di assegnazione, in particolare si è fatto in modo che nessuna classe  potesse scrivere su un un file appartenente al path specificato(path="D:/code/Test5").

grant CodeBase "file:D:/code/Test5" {
permission java.io.FilePermission "D:\\Code\Test6","read, delete, execute"; };

    Così quando il Nodo riceve la nuova politica dal MasterAdministrator , stoppa tutte le classi caricate dal SecureClassLoader, aggiorna la politica(*) e le rimette in esecuzione dall'inizio. Si è constatato che al momento di ricaricare le classi, la classe che deve leggere un file in ingresso e copiarlo su un altro non ha piu' i permessi per farlo e la JVM effettivamente avverte negando il permesso di scrittura.

 

Problemi riscontrati:

     Non si è riusciti ad implementare un metodo che facesse il refresh della nuova politica a run-time. L'unica soluzione trovata è stata quella di terminare il processo in esecuzione sul nodo e farlo ripartire con il comando:

java -Djava.security.manager -Djava.security.policy="url newpolitica" NodoApp

 

 

Sorgenti zippati:


Riferimenti bibliografici :

per il meccanismo di class loading e protection domain si è fatto riferimento a :

Li Gong "JDK 1.2 Security Architecture" .

Li Gong "Java Security:present and near future"

Li Gong "Secure Java Class Loading".

Roland Schemers "Implementing protection domains in the JDK 1.2".

per la programmazione client/server e threads.
Bruce Eckel "Thinking in Java ".

Jamie Jaworski "Java 2:tutto e oltre" .

Jim Farley "Java distributed computing" .
 
 

Reti di Calcolatori            _____________  _                                                                                                                                    5