Security Manager

De ChuWiki

Security Manager en rmi[editar]

Cuando se serializan objetos en java vimos que hay un problema de seguridad. Para evitarlo, hay que instalar un SecurityManager y un fichero java.policy adecuado.

Cuando desde un servidor RMI ofrecemos un objeto remoto a los clientes, es posible que este método en sus parámetros reciba objetos serializables que nos pase el cliente. También el cliente puede recibir un objeto como resultado de la llamada al método, o incluso una excepción, que también es serializable, puesto que se lanza en el servidor y llega al cliente.

Es en la serialización de estos objetos (tanto de ida como de vuelta) cuando se presenta el problema de seguridad, ya que un cliente o un servidor malicioso puede hacer una clase Serializable cuyo código de serialización sea malicioso. Ese código de serialización se ejecuta en el otro lado (por ejemplo, si el cliente envía la clase Serializable, es en el servidor donde se ejecuta el código de serialización), abriendo la posibilidad de que un cliente envíe código a ejecutar en el servidor. Por ello, debemos instalar un SecurityManager y un fichero java.policy adecuados. De esta forma, ese código tendrá los permisos restringidos y no podrá hacer cualquier cosa.

Para instalar un SecurityManager, debemos ejecutar este código

System.setProperty ("java.security.policy", "/un_path/java.policy");
if (System.getSecurityManager()==null) 
    System.setSecurityManager(new RMISecurityManager());

La primera línea podemos no ponerla. Entonces se buscará el fichero java.policy en el HOME del usuario.

El fichero java.policy puede dar todos los permisos a todo el mundo poniendo algo como esto

grant { 
        permission java.security.AllPermission; 
};

pero no es aconsejable, puesto que entonces es como si no estuvieramos poniendo el SecurityManager.

En el tutorial de permisos en java de sun tienes todos los tipos de permisos que se pueden conceder o denegar y aquí tienes la sintaxis del fichero java.policy

De hecho, veo en http://java.sun.com/docs/books/tutorial/rmi/running.html que el fichero java.policy puede ser bastante complejo. Este es el ejemplo que pone

grant {
    permission java.net.SocketPermission "*:1024-65535",
        "connect,accept";
    permission java.io.FilePermission
        "c:\\home\\ann\\public_html\\classes\\-", "read";
    permission java.io.FilePermission
        "c:\\home\\jones\\public_html\\classes\\-", "read";
};

en el que se intuye que se da permiso para conectar y aceptar sockets en determinados puertos, y sólo se da permiso de lectura en determinados directorios.

Da la impresión además por lo que he visto en algún sitio, que en el fichero de java.policy se pueden poner cosas como permisos para clases firmadas y demás.

Enlaces[editar]