3.
Scrierea unui manager de securitate
4.
Alegere metodelor ce trebuiesc rescrise
Scopul lucrării
este de presenta mecanismul de securitate java folosit pentru controlul
drepturilor aplicaţiilor.
Securitatea este o problemă
importantă atunci când programele interacţionează în cadrul unei
reţele. Unul dintre mecanismele pe care java le pune la dispoziţie
pentru creşterea securităţii aplicaţiilor îl
reprezintă managerii de securitate. Un manager de securitate
implementează şi impune restricţii de securitate pentru
aplicaţia în cadrul căreia este instalat.
Un manager de
securitate este un obiect integrat în cadrul aplicaţiei, care poate bloca
anumite operaţii care nu sunt permise pentru respectiva aplicaţie.
Observaţie:
Pentru o aplicaţie, un manager de securitate poate fi instalat doar o singură
dată. Daca se încearcă instalarea pentru a doua oara a unui manager
de securitate va rezulta excepţia SecurityException.
Pentru a
obţine managerul de securitate pentru o aplicaţie se utilizează
metoda getSecurityManager() din cadrul clasei System.
SecurityManager sm = System.getSecurityManager();
Daca o
aplicaţie nu are instalat nici un manager de securitate atunci metoda
getSecurityManager() returnează null. In mod implicit o aplicaţie nu
are nici un manager de securitate instalat.
Clasa SecurityManager
conţine un set de instrucţiuni checkxxx() ( checkAccess(),
checkExit()m etc. ). Aceste metode sunt apelate automat de către diverse
metode din cadrul librăriilor java înainte de a efectua anumite
operaţii. Aceste metode de verificare a permisiunilor, în momentul când
sunt apelate, se termină normal daca operaţia este permisă, sau
aruncă o excepţie SecurityException, daca operaţia
respectivă nu este permisă.
Pentru a scrie un
manager de securitate trebuie extinsă clasa SecurityManager. Această
clasă va rescrie o parte din metode checkxxx() pentru a restricţiona
operaţiile pe care aplicaţia le poate efectua.
In această
secţiune este prezentat modul în care se poate construi un manager de
securitate.
Pentru a
construi un manager pentru securitate trebuie extinsă clasa
SecurityManager.
Class MySecurityManager extends SecurityManager
{
…
}
Implementarea
standard oferită de clasa SecurityManager pentru metodele checkxxx()
aruncă excepţia SecurityException. Aceasta înseamnă că daca
nici una dintre metode nu este rescrisă toate operaţiile, care sunt
verificate de către managerul de securitate, sunt interzise.
In continuare se
vor rescrie metodele din cadrul MySecurityManager care oferă permisiune
pentru scrierea în fişier.
public void checkWrite(String f){}
public void checkWrite(FileDescriptor f){}
In aceste
condiţii o aplicaţie care va instala managerul MySecurityManager va
avea numai drept de scriere în fişier, restul de operaţii verificate
de către managerul de securitate ne fiind permise întrucât restul
metodelor checkxxx() nu au fost rescrise.
Odată
construit un manager de securitate acesta trebuie instalat în cadrul
aplicaţiei. Pentru instalare se utilizează metoda setSecurityManager().
try {
System.setSecurityManager(new MySecurityManager());
} catch (SecurityException se) {
System.out.println("SecurityManager already set!");
}
In momentul când se
doreşte crearea unui manager de securitate partea cea mai dificilă
este alegerea metodelor checkxxx() care trebuie rescrise. In această
secţiune sunt prezentate metodele care trebuie rescrise pentru a bloca
operaţiile verificate de managerul de securitate.
Operatii asupra Aprobate de
sockets
checkAccept(String host, int port)
checkConnect(String host, int port)
checkConnect(String host, int port, Object executionContext)
checkListen(int port)
threads
checkAccess(Thread thread)
checkAccess(ThreadGroup threadgroup)
class loader
checkCreateClassLoader()
file system
checkDelete(String filename)
checkLink(String library)
checkRead(FileDescriptor filedescriptor)
checkRead(String filename)
checkRead(String filename, Object executionContext)
checkWrite(FileDescriptor filedescriptor)
checkWrite(String filename)
system commands
checkExec(String command)
interpreter
checkExit(int status)
package
checkPackageAccess(String packageName)
checkPackageDefinition(String packageName)
properties
checkPropertiesAccess()
checkPropertyAccess(String key)
checkPropertyAccess(String key, String def)
networking
checkSetFactory()
windows
checkTopLevelWindow(Object window)
Importaţi în mediul Eclipse proiectul ce exemplifică noţiunile prezentate în acest laborator (link proiect). Testaţi aplicaţia din cadrul acestui pachet.