# Politica de Seguridad

ES4X te permite que ejecutes tus aplicacoines en un sandbox totalmente seguro. Igual que deno (opens new window), ES4X puede aislar tu aplicacion. La tecnologia que permite esto es el security manager (opens new window) de JVM. Los managers de seguridad fueron los que aislaban el antiguo codigo Applet de la maquina anfitriona. Son mas precisos que lo que te permite deno a dia de hoy.

# Crea un security.policy

Para crear una politica de segurida, ejecuta la herramienta es4x:

$ es4x security-policy

Creating a new 'security.policy' with full network access and
read-only IO access to the working directory.

El archivo generado es una plantilla simple, si lo abres lo puedes leer:

// Grant the following permissions to code that shall be executed from
// the node_modules/.lib/* directory
grant codeBase "file:\${user.dir}\${/}node_modules\${/}.lib\${/}*" {
  // vert.x will need full access to the temp dir.
  permission java.io.FilePermission "\${java.io.tmpdir}\${/}-", "read,write,delete";

  // the code should be able to read the JVM/GraalVM runtime libs
  permission java.io.FilePermission "\${java.home}", "read";
  permission java.io.FilePermission "\${java.home}\${/}..\${/}release", "read";
  permission java.io.FilePermission "\${java.home}\${/}-", "read";

  // applications are allowed to read all files from the CWD
  permission java.io.FilePermission "\${user.dir}\${/}-", "read";
  // uncomment the following to allow full read access
  //permission java.io.FilePermission "<<ALL FILES>>", "read";

  // Netty performs some reflection we need to allow it
  permission java.lang.reflect.ReflectPermission "suppressAccessChecks";

  // By default we allow all runtime permissions
  // users may want to restrict this further say for example to
  // deny access to environment variables, etc...
  permission java.lang.RuntimePermission "*";

  // ES4X setup a nice looking logger
  permission java.util.logging.LoggingPermission "control";

  // Allow full access to JVM system properties
  permission java.util.PropertyPermission "*", "read,write";

  // currently we allow all access to the network
  permission java.net.SocketPermission "*", "accept,connect,listen,resolve";
};

Esta plantilla permite acceso total a la red y solo lectura a todos los archivos desde CWD donde se inicia la aplicacion.

TIP

Una vez que conozcas todos los permisos que necesita tu aplicacion puedes comenzar a restringirlos incluso mas!

WARNING

Aunque esta plantilla parece buena para comenzar, recuerda que el CWD es de solo lectura, asi que si por ejemplo estas ejecutando un servidor http que escribe uploads, a menos que estos uploads vayan al directorio $TEMP, van a fallar porque la aplicacion no tiene persmisos para escribir.