Definir Permisos Usando AccessController

Necesidad

Definir permisos personalizados obligatorios usando AccessController en Java.

Contexto

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

  1. Se desarrolla una aplicación en Java.

Solución

La arquitectura de seguridad de Java permite el ajuste de los permisos que requiere la una aplicación usando un fichero de políticas en el que 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 del gestor de recursos invoca a un método especial de la clase AccessController 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, en caso contrario lanza una excepción de seguridad [1].

Los permisos constan de un objetivo y de una acción. Por ejemplo, para acceder a una propiedad del sistema el objetivo puede ser una propiedad específica y las acciones pueden ser leer o escribir el valor de la propiedad.

  1. Para crear un permiso personalizado se debe crear una clase que herede de java.security.BasicPermission, la cual representa la implementación de un permiso básico donde se especifique el nombre del objetivo [2].

    custompermission.java
    import java.security.BasicPermission;
    
    public class CustomPermission extends BasicPermission
    {
      ...
    }
  2. Para crear una instancia de la clase java.security.BasicPermission, se debe invocar al constructor de esta clase pasandole como parámetro el nombre del objetivo involucrado en el permiso.

    public CustomPermission(String perm)
    {
      super(perm);
    }
  3. La clase CustomPermission debe estar alojada en el directorio src/api.

  4. Luego se crea la clase API, la cual expone el método llamado metodoControlado, donde el código que invoque este servicio debe tener concedido los privilegios necesarios para poder ejecutarlo.

  5. Para este punto se invoca el método AccessController.checkPermission para determinar si el código tiene concedido el permiso para realizar una acción especifica. En el caso de no concederse el permiso, este método genera una excepción de tipo AccessControlException [3].

    api.java
    import java.security.AccessController;
    
    public class API
    {
      public static void metodoControlado ()
      {
        AccessController.checkPermission(new CustomPermission("permiso"));
        System.out.println("El metodo pudo ser ejecutado satisfactoriamente");
      }
    }
  6. La clase API debe estar alojada en el directorio src/api.

  7. Finalmente, se crea la clase que invoque el servicio metodoControlado de la clase API, la cual debe tener los permisos necesarios para poder realizar la invocación de manera satisfactoria.

    cli.java
    public class CLI
    {
      public static void main(String[] args)
      {
        API.metodoControlado();
      }
    }
  8. La clase CLI debe estar alojada en el directorio src/autorizado.

  9. Se debe crear el archivo de políticas java.policy, donde el campo codeBase indica la ubicación del código fuente otorgándole el permiso al código que se encuentre en esa ubicación. Para este caso, los códigos que se encuentran en las ubicaciones src/api y src/autorizado tienen habilitado el permiso.

    policy.java
    grant codebase "file:src/api"
    {
      permission CustomPermission "permiso";
    };
    grant codebase "file:src/autorizado"
    {
      permission CustomPermission "permiso";
    };
  10. Para ejecutar el programa utilizando el archivo de políticas java.policy, se debe ingresar el comando mostrado a continuación.

    ejecutar.shell
    $ java -classpath src/api:src/autorizado -Djava.security.manager -
    Djava.security.policy==java.policy CLI
    El metodo pudo ser ejecutado satisfactoriamente
  11. El comando anterior habilita la ejecución del gestor de seguridad, en este, se especifica el nombre del archivo de políticas y se establece la ubicación del código a ejecutar.

  12. Si no se concede el permiso CustomPermission para el código ubicado en la ruta /src/autorizado dentro del archivo de políticas, al ejecutarse el método AccessController.checkPermission, este lanza una excepción del tipo AccessControlException.

    ejecutar2.shell
    $ java -classpath src/api:src/autorizado -Djava.security.policy==java.policys CLI
    Exception in thread "main" java.security.AccessControlException: access denied
    (CustomPermission permiso)
    at java.security.AccessControlContext.checkPermission(AccessControlContext.java:393)
    at java.security.AccessController.checkPermission(AccessController.java:553)
    at API.metodoControlado(API.java:7)
    at CLI.main(CLI.java:8)

Copyright © 2020 Fluid Attacks, We hack your software. All rights reserved.

Service status - Terms of Use - Privacy Policy - Cookie Policy