Download Sin título de diapositiva
Document related concepts
no text concepts found
Transcript
TEMA 5. Seguridad en Java 1. Introducción a los Controladores de Seguridad 2. Decidir qué Métodos Sobreescribir del SecurityManager 3. Escribir un Controlador de Seguridad 4. Instalar un Controlador de Seguridad 5. Gestor de seguridad en RMI 1 Bibliografía Tutoriales Sun: http://java.sun.com/docs/books/tutoria l/security/index.html http://java.sun.com/javase/6/docs/tec hnotes/guides/security/index.html 2 1 . Introducción a los Controladores de Seguridad Seguridad en Java El controlador de seguridad actúa como un guardia de seguridad a tiempo completo. La clase SecurityManager del paquete java.lang es una clase abstracta que proporciona el interface de programación y una implementación parcial para todos los controladores de seguridad de Java. Una aplicación debe crear e instalar su propio controlador de seguridad. 3 1 . Introducción a los Controladores de Seguridad Seguridad en Java Los navegadores y los visualizadores de applets crean su propio controlador de seguridad cuando arrancan. Un applet está sujeto a las restricciones de acceso. 4 1 . Introducción a los Controladores de Seguridad Seguridad en Java Para obtener el controlador de seguridad actual: getSecurityManager() de la clase System getSecurityManager() devuelve null si no hay ningún controlador de seguridad actual en la aplicación. Una vez se tiene el controlador de seguridad, se pueden permitir o prohibir ciertas operaciones. Por ejemplo, el método System.exit(), que finaliza el interprete Java, utiliza el método checkExit() del controlador de seguridad para aprobar la operación de salida: SecurityManager security = System.getSecurityManager();if (security != null) { security.checkExit(status); 5 1 . Introducción a los Controladores de Seguridad Seguridad en Java Si el controlador de seguridad aprueba la operación de salida, el checkExit() retorna normalmente. Si el controlador de seguridad prohibe la operación, el checkExit() lanza una SecurityException. 6 1 . Introducción a los Controladores de Seguridad Seguridad en Java El conjunto de métodos checkXXX() representa el conjunto de operaciones de las clases de los paquetes Java y el sistema de ejecución de Java que ya están sujetos a la protección del controlador de seguridad. Si se escribe el propio controlador de seguridad, se puede tener que sobreescribir los métodos checkXXX() de SecurityManager para modificar la política de seguridad de las operaciones específicas. 7 2 . Decidir qué Métodos Sobreescribir del SecurityManager Métodos para sobreescribir Podrías tener que sobreescribir varios métodos checkXXX() del SecurityManager . La primera columna de la siguiente tabla son objetos sobre los que se pueden realizar varias operaciones. La segunda columna lista los métodos de SecurityManager que aprueban las operaciones de los objetos de la primera columna. 8 2 . Decidir qué Métodos Sobreescribir del SecurityManager Métodos para sobreescribir 9 3 . Escribir un Controlador de Seguridad Ejemplo Para escribir tu propio controlador de seguridad, debes crear una subclase de la clase SecurityManager. Esta subclase sobreescribe varios métodos de SecurityManager para personalizar las verificaciones y aprobaciones necesarias para una aplicación Java. El ejemplo restringe la lectura y escritura en el sistema de ficheros. Un método que abra un fichero para leer invoca uno de los métodos checkRead() de SecurityManager Un método que abre un fichero para escribir invoca a uno de los métodos checkWrite() se SecurityManager. 10 3 . Escribir un Controlador de Seguridad Ejemplo La política implementada por nuestro ejemplo le pide al usuario una password cuando la aplicación intenta abrir un fichero para leer o escribir. Si la password es correcta se permite el acceso. Todos los controladores de seguridad deben ser una subclase de SecurityManager. Así, nuestra PasswordSecurityManager desciende de SecurityManager. class PasswordSecurityManager extends SecurityManager { . . .} 11 3 . Escribir un Controlador de Seguridad Ejemplo Luego, PasswordSecurityManager declara un ejemplar de la variable privada password para contener el password que el usuario debe introducir para poder permitir el acceso al sistema de ficheros restringido. La password se selecciona durante la construcción. PasswordSecurityManager(String password) { super(); this.password = password;} 12 3 . Escribir un Controlador de Seguridad Ejemplo private boolean accessOK() { int c; DataInputStream dis = new DataInputStream(System.in); String response; System.out.println("What's the secret password?"); try { response = dis.readLine(); if (response.equals(password)) return true; else return false; } catch (IOException e) { return false; }} 13 3 . Escribir un Controlador de Seguridad Ejemplo public void checkRead(FileDescriptor filedescriptor) { if (!accessOK()) throw new SecurityException("Not a Chance!");} public void checkRead(String filename) { if (!accessOK()) throw new SecurityException("No Way!");} public void checkRead(String filename, Object executionContext) { if (!accessOK()) throw new SecurityException("Forget It!");} public void checkWrite(FileDescriptor filedescriptor) { if (!accessOK()) throw new SecurityException("Not!");} public void checkWrite(String filename) { if (!accessOK()) throw new SecurityException("Not Even!"); SecurityException es una excepción en tiempo de ejecución, y no necesita ser declarada en la clausula throws de estos métodos. 14 3 . Escribir un Controlador de Seguridad Ejemplo Por defecto, la clase SecurityManager prohíbe todas las operaciones que están sujetas a las restricciones de seguridad. Por lo que podrías encontrar que tienes que sobreescribir muchos métodos checkXXX() para obtener el comportamiento deseado. Todos los métodos checkXXX() de la clase SecurityManager operan de la misma forma. – Si el acceso está permitido, el método retorna. – Si el acceso no está permitido, el método lanza una SecurityException. Asegúrate de que implementas de esta forma tus métodos checkXXX() sobreescritos. 15 4 . Instalar un Controlador de Seguridad Para instalar el controlador de seguridad unicamente debes ejecutar el método: System.setSecurityManager() Ver el ejemplo que se adjunta. 16 5 . Gestor de seguridad en RMI SM RMI Por defecto el gestor de seguridad de RMI es muy restrictivo: no permite acceso a los ficheros y solo permite conexiones a la máquina de origen (similar a de las applets ver siguiente tema). No permite descarga de resguardo (Stub) ni permite a un objeto cliente de RMI contactar con el registro RMI. Por lo tanto deberemos extender la clase RMISecurityManager o modificar el fichero de políticas de seguridad java para RMI (java.policy). 17 5 . Gestor de seguridad en RMI Enlaces de interés Permisos en java: http://download.oracle.com/javase/1.4.2/do cs/guide/security/permissions.html Fichero java.policy: http://download.oracle.com/javase/1.5.0/do cs/guide/security/PolicyFiles.html Seguridad en java: http://www.uv.es/sto/cursos/seguridad.java /html/sjava.html#toc6 18