Разрешения файлов Java для потоков
Я программирую Java-сервер, который должен обрабатывать код Python, заданный пользователем с помощью Jython. Очевидно, что я не могу просто выполнить его без некоторого риска взломщика доступа к файлам и системным командам, которые он / она не должен. я искал какой-то способ ограничить права доступа к файлам для конкретных потоков в течение нескольких часов, и ближе всего я получил ограничение прав доступа к файлам для всего приложения. Есть ли реализованный класс, который делает что-то подобное, или какой-то метод, чтобы сделать это?
2 ответа:
Можно попробовать использовать java.яз..SecurityManager . См. также этот вопрос об использовании менеджера безопасности для установки различных параметров безопасности для каждого потока.
Вы можете настроить менеджер безопасности и политику безопасности следующим образом:
jython -Djava.security.manager=securitymanager -Djava.security.policy=policyfile
Где securitymanager - используемый менеджер безопасности, а policyfile содержит спецификацию политики, как описано, например, здесь. Если в качестве источника политики безопасности используется файл политики, то здесь вот пример:
grant { permission java.security.AllPermission; }
Для запуска Jython потребуются некоторые разрешения, включая следующие:
grant { permission java.io.FilePermission "${user.home}${/}-", "read, write"; permission java.lang.RuntimePermission "createClassLoader"; permission java.lang.RuntimePermission "getProtectionDomain"; };
(предполагается, что ваш cachedir находится в домашнем каталоге текущего пользователя). Это позволит сделать что-то близкое к тому, что вам нужно, разрешив доступ на чтение и запись к файлам под домашним компьютером текущего пользователя и запретив доступ ко всем другим частям файловой системы. Вот результат (первый open () ссылается на файл в домашнем каталоге текущего пользователя, так как это текущий рабочий каталог):
>>> 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) >>>
С jython 2.5.2 я нашел эти разрешения необходимыми:
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";
(это должен быть комментарий к принятому ответу, за исключением того, что комментарий не будет форматироваться разборчиво.)