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
Respuesta
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)
>>>
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). –
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.)
- 1. Copiar permisos/autenticación a hilos hijo ...?
- 2. Permisos en archivos de solución para modificar
- 3. Hilos Java vs Hilos OS
- 4. Manipulación de permisos de archivos de Windows en Java
- 5. Hilos y escritura de archivos
- 6. ¿Cómo cambiar los permisos de archivos de Java 1.4.2?
- 7. ¿Cómo cambio programáticamente los permisos de archivos?
- 8. ¿Hilos dentro de hilos en Java?
- 9. sincronización de hilos java
- 10. reutilización de hilos java
- 11. Hilos y descriptores de archivos
- 12. Permisos de archivos de Linux para dispositivos USB en Android
- 13. excepciones de hilos de java
- 14. ¿Se puede hacer Mercurial para conservar los permisos de archivos?
- 15. Delphi 2009 clases/componentes para leer/escribir permisos de archivos
- 16. hilos de java en libGDX
- 17. Hilos en Java
- 18. Ver archivos adjuntos en hilos
- 19. Tomar posesión de archivos con permisos 'rotos'
- 20. Conservación de permisos de archivos con Git
- 21. implementar rsync y permisos de archivos/directorios
- 22. hilos Tomcat Java vs roscas
- 23. Java Swingworker y múltiples hilos
- 24. Métodos Java Ejecutando en hilos
- 25. agrupaciones de hilos individuales o múltiples para el servidor Java?
- 26. Pequeño proyecto para aprender los hilos de Java
- 27. Permisos predeterminados cuando Mercurial crea archivos
- 28. Java hilos y basura colector
- 29. Permisos de volcado del montón Java
- 30. Incrementando los permisos de semáforo, en Java
Relacionados (pero todavía abierto) pregunta: http://stackoverflow.com/questions/6744553/java -security-manager-per-thread – Thilo
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
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