Joven hacker sonriendo

Configurar Gestor de Seguridad

Nuestros ethical hackers explican cómo evitar vulnerabilidades de seguridad mediante la programación segura en Java al configurar el gestor de seguridad. La arquitectura de seguridad de Java permite el ajuste de los permisos de la aplicación usando un fichero de políticas (policy file).

Necesidad

Controlar el acceso de un programa Java a los recursos del sistema.

Contexto

A continuación se describen las circunstancias bajo las cuales la siguiente solución tiene sentido:

  1. Tener instalado el Java SE versión 1.4 en adelante.

Solución

La arquitectura de seguridad de Java permite el ajuste sencillo de los permisos que requiere la aplicación usando un fichero de políticas policy file en el cual se definen los permisos que tendrá la aplicación para acceder a los recursos del sistema.

Durante la ejecución de la aplicación, cuando esta solicita acceso a un recurso del sistema, el código de gestión de recursos invoca directa o indirectamente un método especial de la clase AccessControler el cual evalúa la petición y decide si debe concederse o no el acceso. Si se concede el permiso la ejecución continua y si no, se lanza una excepción de seguridad [1].

Para establecer una política de seguridad se deben considerar los siguientes aspectos:

  1. Cree un archivo con el nombre java.policy para la aplicación en cuestión. Este debe ser desplegado en el directorio $JAVA_HOME/jre/lib/security/nombreAplicacion/, donde $JAVA_HOME es el directorio raíz del Java y nombreAplicacion es el directorio que corresponde al nombre de la aplicación.

  2. Se debe modificar el archivo $JAVA_HOME/jre/lib/security/java.security con el propósito de ingresar una nueva entrada que especifique la ubicación del archivo de políticas para la aplicación.

  3. La localización de los ficheros de configuración se especifica como valores de propiedades cuyos nombres son de la forma policy.url.n donde n es un número. Por defecto el sistema tiene definidas las siguientes ubicaciones:

    java.security
    1
    2
    policy.url.1=file:${java.home}/lib/security/java.policy
    policy.url.2=file:${user.home}/.java.policy
    
  4. Para agregar la nueva entrada se debe incluir la siguiente instrucción.

    1
    policy.url.3=file:${java.home}/lib/security/nombreAplicacion/java.policy
    
  5. El sistema establece la política de seguridad primero leyendo policy.url.1, e incrementa el número hasta que no encuentra otra entrada. La evaluación es incremental; si se dispone de policy.url.1 y policy.url.3, pero no de policy.url.2, el fichero 3 no se leerá. Por norma los números de ficheros han de ser correlativos.

  6. Un permiso consta de un objetivo y una acción, por ejemplo, para acceder al sistema de archivos local, el objetivo puede ser un directorio o un archivo y las acciones pueden ser: leer, escribir, ejecutar y borrar.

  7. Para este caso el permiso que representa el acceso a un directorio del sistema de archivos es java.io.FilePermission.

    1
    2
    3
    4
    Grant codeBase "file:/home/sysadmin/-"
    {
      permission java.io.FilePermission "/home/FLUID/-", "read";
    };
    
  8. El campo codeBase indica la ubicación en la que se encuentra el código fuente de la aplicación al cual se le va aplicar la política.

  9. En la regla anterior, se establece que cualquier código bajo la estructura del directorio /home/sysadmin/ tiene permisos de solo lectura sobre todos los archivos y subdirectorios que contenga el directorio /home/FLUID/-.

  10. Para establecer permisos de conexión para acceder a un equipo en la red en un puerto determinado, se debe utilizar la clase SocketPermission mediante la siguiente política:

    1
    2
    3
    4
    Grant codeBase "file:/home/sysadmin/-"
    {
      permission java.net.SocketPermission "union.FLUID.com:3333" , "connect , accept";
    };
    
  11. Con este permiso se autoriza a la aplicación para que establezca una conexión al puerto 3333 con el equipo union.FLUID.com y además acepte conexiones en ese puerto.

  12. Estos son los permisos que se deben configurar inicialmente para la aplicación:

    • PropertyPermission: Permisos para manipular propiedades.

    • FilePermission: Permisos de acceso a archivos o directorios y consta de un nombre de ruta y un conjunto de acciones validas para esa ruta.

    • SocketPermission: Representa un acceso a la red a través de sockets y consta de una dirección de host y un conjunto de acciones especificando formas de conectar.

  13. PropertyPermission y SocketPermission se establecen de la siguiente manera.

    1
    2
    3
    4
    Grant codeBase "file:/home/sysadmin/-"
    {
      permission java.util.PropertyPermission "FLUID.version", "read";
    };
    
    1
    2
    host = (nombreHost | dirIP)[:rangoPuertos]
    rangoPuertos = numPuerto | -numPuerto | numPuerto-[numPuerto]
    
  14. Ejecutar el gestor de seguridad. Para instalar el gestor de seguridad de Java desde el código de la aplicación, se debe invocar el método setSecurityManager de la clase java.lang.System de la siguiente manera.

    1
    2
    3
    4
    5
    6
    //Se crea una instacia del gestor de seguridad
    
    SecurityManager securityManager = new SecurityManager();
    //Se instala el gestor de seguridad en la aplicación
    
    System.setSecurityManager(securityManager);
    
  15. Para instalar el gestor de seguridad invocándolo desde la maquina virtual de Java se debe ingresar la siguiente instrucción desde la consola de comandos del sistema operativo.

    1
    java -Djava.security.manager nombreAplicacion
    
  16. El argumento -Djava.security.manager habilita la ejecución del gestor de seguridad de Java con el propósito de ejecutar el código de forma segura.




Haz un comentario

Estado de los servicios - Términos de Uso