Manageri de securitate. 1

1. Obiectivul lucrării 1

2. Noţiuni teoretice. 1

3. Scrierea unui manager de securitate. 2

4. Alegere metodelor ce trebuiesc rescrise. 3

 

Manageri de securitate

1. Obiectivul lucrării

Scopul lucrării este de presenta mecanismul de securitate java folosit pentru controlul drepturilor aplicaţiilor.

2. Noţiuni teoretice

 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.

3. Scrierea unui manager de securitate

 

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!");
            }

 

4. Alegere metodelor ce trebuiesc rescrise

 

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)

 Exerciţii

Importaţi în mediul Eclipse proiectul ce exemplifică noţiunile prezentate în acest laborator (link proiect). Testaţi aplicaţia din cadrul acestui pachet.