Manageri de securitate

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.

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

Alegerea metodelor ce trebuie 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.

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)

Exemplu aplicatie cu manager de securitate

Aplicatia de mai jos implementeaza si testeaza un manager de securitate ce ofera drept de scriere a fiserelor dar permite citirea fisierelor doar dupa introducerea unei parole.

import java.io.*;
 
class MySecurityManager extends SecurityManager
{
	private String pas;
	MySecurityManager(String pas)
	{
		super();
		this.pas=pas;
	}
 
	public void checkWrite(String f)
	{
	}
 
	public void checkWrite(FileDescriptor f)
	{
	}
 
	public void checkRead(String f)
	{
		if(!chkPas()) throw new SecurityException("Citire blocata."); 
	}
 
	public void checkRead(FileDescriptor f)
	{
		if(!chkPas()) throw new SecurityException("Citire blocata.");
	}
 
	private boolean chkPas()
	{
		try
		{
			BufferedReader line = new BufferedReader(new InputStreamReader(System.in));
			if(!(line.readLine()).equals(pas)) return false;
		}catch(Exception e){}
		return true;
	}
}
 
 
public class WriteFile
{
 
 
	public static void main(String args[])
	{
		try
		{
 
			System.setSecurityManager(new MySecurityManager("sm custom"));
 
 
			FileWriter fw = new FileWriter("file.txt");
			fw.write("ABCD\n");
			fw.write("123\n");
			fw.close();	
 
			BufferedReader fr = new BufferedReader(new FileReader("file.txt"));
			System.out.println(fr.readLine());
			fr.close();
 
		}catch(SecurityException ex)
		{
			ex.printStackTrace();
		}
		catch(Exception e)
		{
			e.printStackTrace();
		}
 
	}
}