2009-02-09 2 views
11

Я ищу для запуска некоторые не проверенные сценарии (написанные на языке, который еще не определен, но должен быть основан на Java, поэтому JRuby, Groovy, Jython, BeanShell и т. д. - все кандидаты). Я хочу, чтобы эти сценарии могли делать что-то и ограничивались другими делами.Безопасность с помощью Java-скриптов (JRuby, Jython, Groovy, BeanShell и т. Д.)

Обычно я просто использую SecurityManager для Java и делаю это с ним. Это довольно просто и позволяет мне ограничить доступ к файлам и сети, возможность отключения JVM и т. Д. И это будет хорошо работать для материалов высокого уровня, которые я хочу заблокировать.

Но есть некоторые вещи, которые я хочу разрешить, но только через свой пользовательский API/библиотеку, которую я предоставляю. Например, я не хочу разрешать прямой доступ к сети, чтобы открыть URLConnection на yahoo.com, но я в порядке, если это делается с MyURLConnection. То есть - есть набор методов/классов, которые я хочу разрешить, а затем все остальное, что я хочу быть вне пределов.

Я не считаю, что этот тип безопасности может быть выполнен со стандартной моделью безопасности Java, но, возможно, это возможно. У меня нет особых требований к производительности или гибкости самого языка сценариев (скрипты будут простыми процедурными вызовами для моего API с базовым циклом/ветвлением). Таким образом, даже «большие» накладные расходы, которые проверяют проверку безопасности на каждый вызов отражения, мне в порядке.

Предложения?

ответ

4

Отказ от ответственности: Я не являюсь экспертом по API-интерфейсам Java Security, поэтому может быть лучший способ сделать это.

Я работаю для Alfresco, основанного на Java Open Source Enterprise CMS, и мы реализовали нечто похожее на то, что вы описали. Мы хотели разрешить создание сценариев, но только для того, чтобы показать подмножество наших API Java для механизма сценариев.

Мы выбрали Rhino Engine для сценариев JavaScript. Это позволяет вам контролировать, какие API-интерфейсы подвержены JavaScript, что позволяет нам выбирать, какие классы доступны, а какие нет. Накладные расходы, по словам наших инженеров, составляют порядка 10% - не так уж плохо.

В дополнение к этому, и это может быть уместным и для вас, на стороне Java, мы используем Acegi (теперь Spring Security) и используем AOP для обеспечения ролевого контроля над методами, которые может вызвать определенный пользователь , Это очень хорошо подходит для авторизации. Таким образом, в действительности пользователь, обращающийся к нашему приложению через JavaScript, сначала имеет ограниченный API, доступный ему, в первую очередь, а затем этот API может быть ограничен еще более на основе авторизации. Таким образом, вы можете использовать методы АОП для дальнейшего ограничения того, какие методы могут быть вызваны, что позволяет выявить это на других языках сценариев, таких как Groovy и т. Д. Мы также добавляем их, имея уверенность в том, что наша базовая Java API-интерфейсы защищают пользователей от несанкционированного доступа.

+0

Спасибо, что очень полезно. Btw - прецедент для меня - позволить людям загружать скрипты для своих нагрузочных тестов для запуска на http://browsermob.com. Я не смотрел на Rhino, но похоже, что он может работать до тех пор, пока он не разрешает прямой доступ к API Java, например, Groovy. –

+0

Да, у вас там больше контроля, что хорошо с точки зрения безопасности. Возможно, вам придется создавать оболочки для определенных API, а затем выставлять эти объекты. Например, у нас есть механизм рабочего процесса и создан объект рабочего процесса, который мы затем подвергли JavaScript, который контролирует то, что вы можете сделать. –

+0

Быстрое наблюдение: как вы убедились, что переменная Packages недоступна? См. Http://codeutopia.net/blog/2009/01/02/sandboxing-rhino-in-java/ –

3

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

Вы можете создать свои собственные разрешения, проверить для своих защищенных API, а затем использовать AccessController.doPrivileged для восстановления соответствующих привилегий при вызове базового API.

Вам необходимо убедиться в том, что сам скриптовый механизм защищен. Версия Rhino в Sun JDK должна быть в порядке, но никаких гарантий. Очевидно, что вам нужно убедиться, что все, что доступно для скрипта, безопасно.

+0

Том - спасибо за советы. Похоже, мне также нужно исследовать модель безопасности Java немного больше - я не знал о doPriveleged –

0

В Groovy вы можете сделать то, что вы упомянули. На самом деле очень легко. Вы можете легко ограничить разрешения ненадежных скриптов, работающих в надежной среде, разрешить использование собственного api, что, в свою очередь, может сделать недоверенные вещи.

http://www.chrismoos.com/2010/03/24/groovy-scripts-and-jvm-security/