La security (Parte III)
Pagina 3 di 3
Che succede durante un controllo di sicurezza?
Anche se gli sviluppatori solitamente non si preoccupanotroppo delle routine usate durante un controllo diPermissions, capire come funziona il meccanismo puo'aiutare ad implementare un meccanismo migliore.
Gli oggetti importanti in questo controllo sono:SecurityManager, AccessController eAccessControllerContext.
Per prima cosa, SecurityManager entra in scena, quandoun metodo richiede una permission per essere eseguitocorrettamente, il metodo recupera un SecurityManager erichiama il suo checkPermission().
E' possibile aggiungere protezione e controllo allevostre applicazioni semplicemente aggiungendo una chiamataesplicita al SecurityManager nel vostro codice:
SecurityManager sm = System.getSecurityManager();If (sm != null) sm.checkPermission(perm);// if the permission isn't granted, an AccessControlException// will be thrown.
Se volete utilizzare dei controlli di esecuzione piu'stringenti di quelli standard usati da Java, dovete creare levostre sottoclassi e richiedere i security check in ognimetodo richiamato. Per esempio se volete verificare/evitarela creazione di stringhe troppo grandi, create la vostrasottoclasse di String e richiamate i controlli necessari neimetodi che volete proteggere. Teoricamente potete forzare uncheck prima di ogni metodo nella vostra applicazione.
SecurityManager tuttavia, non fa' altro che passare lePermission all'AccessController.
L'AccessController e' quello che fa'effettivamente il lavoro. E' un'arnese piuttostocomplesso, che si appoggia su un numero notevole di chiamatenative, ed e' difficile rendere appieno cosa fa in pocheparole.
Essenzialmente, quando controlla una Permission,l'AccessController prende un'istantanea dello Stackcorrente, lo incapsula in un AccessControllerContextche utilizza metodi nativi per recuperare un'array diclassi che rappresentano lo stack corrente con tutti i suoithread. Quindi verifica le Permissions (nella forma diProtectionDomains) associati con ogni classe dello stack.
Se qualche classe (anche una sola), manca della permission infase di test, un'eccezione viene eseguita. Altrimenti ilmetodo ritorna senza dire nulla.
Super poteri: doPrivileged()
In alcuni casi pero', si vuole "cambiare leregole" , anche solo per una classe e solo per un caso.Questo e' fatto usando doPrivileged.
Ipotizziamo che Admin.class abbia i permessi per leggere unastringa "segreta" , mentre User.class non ce liabbia (e non debba averceli).
Nonostante cio', in certe condizioni un'oggetto Userdeve eseguire dei metodi tipici di Admin che richiedono ilvalore di tale stringa. E' possibile fornire taliprivilegi senza fornire ad User l'accesso permanente allastringa usando doPrivileged().
Nota: doPrivileged ritorna sempre un'oggetto (se ritornaqualche cosa).
Stabilire quali Permission sono necessarie
A giudicare da vari post su svariate mailing list di Java,decidere quali privilegi aggiudicare al codice comportaparecchi problemi. Questo puo' essere vero se stateportando del codice da Jdk 1.1. a Jdk 1.2 o superiore, cheimprovvisamente richiede delle permission per eseguire deimetodi che prima non li richiedevano.
Non esiste nessun tool (AFAIK) per generare automaticamentele policy necessarie per del codice specifico, la cosamigliore e' quella di pianificare con le Permissiongia' in testa fin dall'inizio, e progettare il codicein accordo a questo.
Tenere bene a mente che, senza doPrivileged(), ogni singolaclasse in un thread richiede le Permission perche' Javasia contento. Se un metodo in A richiama un metodo in B cherichiama un metodo in C che richiede una certa permission,tutte e tre le classi devono avere tale Permissionperche' possano funzionare.
Conclusioni
L'unica applicazione veramente sicura e' quella chenon sta' funzionando, in ogni altro caso non esiste unacosa come "codice sicuro" , ma utilizzando almeglio i meccanismi di protezione ed autorizzazione delcodice forniti da Java, e' possibile ridurre di molto ipericoli insiti.
- Articolo precedente La security (Parte II)
- Articolo successivo Gestione dei Pool di Connessioni (Parte I)