Права доступа к файлам Java для потоков - PullRequest
11 голосов
/ 10 ноября 2011

Я программирую сервер Java, который должен обрабатывать код Python, предоставленный пользователем с помощью Jython. Очевидно, я не могу просто выполнить это без некоторого риска взломщика, обращающегося к файлам и системным командам, которые он / она не должен. Я искал способ ограничить права доступа к файлам для определенных потоков в течение нескольких часов, и самым близким, что я получил, было ограничение доступа к файлам для всего приложения. Есть ли реализованный класс, который делает что-то подобное, или какой-то метод для этого?

Ответы [ 2 ]

4 голосов
/ 11 ноября 2011

Вы можете попробовать использовать java.lang.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 находится в каталоге HOME текущего пользователя). Это сделает что-то похожее на то, что вам нужно, разрешив доступ на чтение и запись к файлам под текущим пользователем и запретив доступ ко всем остальным частям файловой системы. Вот результат (первый open () ссылается на файл в каталоге HOME текущего пользователя, так как это текущий рабочий каталог):

>>> 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 голосов
/ 06 ноября 2013

В 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";

(Это должен быть комментарий к принятому ответу, за исключением того, что комментарий не будет форматироваться разборчиво.)

...