2011-11-10 13 views
11

Estoy programando un servidor Java que tiene que manejar el código Python dado por el usuario usando Jython. Obviamente, no puedo simplemente ejecutarlo sin el riesgo de que un cracker acceda a los archivos y comandos del sistema que él/ella no debería. He estado buscando alguna forma de restringir los permisos de archivos para hilos específicos durante horas, y lo más cerca que he estado ha sido restringir los permisos de archivo para toda la aplicación. ¿Hay una clase implementada que haga algo así o algún método para hacerlo?Permisos de archivos Java para hilos

+2

Relacionados (pero todavía abierto) pregunta: http://stackoverflow.com/questions/6744553/java -security-manager-per-thread – Thilo

+1

También (con Rhino en lugar de Jython): http: // stackoverfl ow.com/questions/93911/how-can-you-run-javascript-using-rhino-for-java-in-a-sandbox – Thilo

+0

heredablethreadlocal es una opción interesante, pero debes tener cuidado, porque no se ganó t se propaga a cualquier hilo generado ya (por ejemplo, código enviado a un grupo de subprocesos). por lo tanto, es probablemente una especie de solución frágil. – jtahlborn

Respuesta

4

Puede intentar con java.lang.SecurityManager. Consulte también this question sobre el uso de un administrador de seguridad para establecer diferentes configuraciones de seguridad por subproceso.

Puede configurar un controlador de seguridad y la política de seguridad de la siguiente manera:

jython -Djava.security.manager=securitymanager -Djava.security.policy=policyfile 

donde SecurityManager es el gerente de seguridad de usar y policyFile contiene la especificación de políticas como se describe, por ejemplo, here. Si utiliza un archivo de política como la fuente para la política de seguridad, aquí hay un ejemplo:

grant { 
    permission java.security.AllPermission; 
} 

Jython necesitará algunos permisos para poner en marcha incluyendo las siguientes:

grant { 
    permission java.io.FilePermission "${user.home}${/}-", "read, write"; 
    permission java.lang.RuntimePermission "createClassLoader"; 
    permission java.lang.RuntimePermission "getProtectionDomain"; 
}; 

(esto supone que su cachedir está bajo el directorio HOME del usuario actual). Esto hará algo parecido a lo que necesita para permitir el acceso de lectura y escritura a los archivos en el INICIO del usuario actual y no permitir el acceso a todas las demás partes del sistema de archivos. Aquí está el resultado (la primera abierta() hace referencia a un archivo en el directorio inicial del usuario actual ya que este es el directorio actual de trabajo):

>>> f1=open('test.txt', 'r') 
>>> f2=open('/tmp/test.txt', 'r') 
Traceback (innermost last): 
    File "<console>", line 1, in ? 
java.security.AccessControlException: access denied (java.io.FilePermission /tmp/test.txt read) 
    at java.security.AccessControlContext.checkPermission(AccessControlContext.java:342) 
    at java.security.AccessController.checkPermission(AccessController.java:553) 
    at java.lang.SecurityManager.checkPermission(SecurityManager.java:549) 
    at java.lang.SecurityManager.checkRead(SecurityManager.java:888) 
    at java.io.File.exists(File.java:748) 
    at org.python.core.PyFile._setup(Unknown Source) 
    at org.python.core.PyFile.file_init(Unknown Source) 
    at org.python.core.PyFile$1.new_impl(Unknown Source) 
    at org.python.core.PyType.invoke_new_(Unknown Source) 
    at org.python.core.PyType.type___call__(Unknown Source) 
    at org.python.core.PyType.__call__(Unknown Source) 
    at org.python.core.PyObject.__call__(Unknown Source) 
    at org.python.pycode._pyx2.f$0(<console>:1) 
    at org.python.pycode._pyx2.call_function(<console>) 
    at org.python.core.PyTableCode.call(Unknown Source) 
    at org.python.core.PyCode.call(Unknown Source) 
    at org.python.core.Py.runCode(Unknown Source) 
    at org.python.core.Py.exec(Unknown Source) 
    at org.python.util.PythonInterpreter.exec(Unknown Source) 
    at org.python.util.InteractiveInterpreter.runcode(Unknown Source) 
    at org.python.util.InteractiveInterpreter.runsource(Unknown Source) 
    at org.python.util.InteractiveInterpreter.runsource(Unknown Source) 
    at org.python.util.InteractiveConsole.push(Unknown Source) 
    at org.python.util.InteractiveConsole.interact(Unknown Source) 
    at org.python.util.jython.main(Unknown Source) 

java.security.AccessControlException: java.security.AccessControlException: access denied (java.io.FilePermission /tmp/test.txt read) 
>>> 
+0

Gracias por publicar esta política; No creo que exista en ningún otro lado. Publiqué algunos otros permisos necesarios en una respuesta a continuación (con razón, un comentario si los comentarios permitían el formato del código). –

0

Con jython 2.5.2 He encontrado estos permisos necesarios:

permission java.io.FilePermission "${user.dir}${/}path${/}to${/}python${/}-", "read"; 
permission java.util.PropertyPermission "user.dir", "read"; 
permission java.lang.RuntimePermission "accessDeclaredMembers"; 
permission java.lang.RuntimePermission "createClassLoader"; 
permission java.lang.RuntimePermission "getProtectionDomain"; 

(Esto debería ser un comentario a la respuesta aceptada, excepto que un comentario no dará formato legible.)