Java脚本安全性(JRuby,Jython,Groovy,BeanShell等)

时间:2009-02-09 21:13:03

标签: java security groovy jruby jython

我希望运行一些未经验证的脚本(用一种尚未确定的语言编写,但需要基于Java,因此JRuby,Groovy,Jython,BeanShell等都是候选者)。我希望这些脚本能够做一些事情并限制其他事情。

通常,我只是使用Java的SecurityManager并完成它。这非常简单,让我可以限制文件和网络访问,关闭JVM的能力等等。这对于我想要阻止的高级内容非常有效。

但是我想要允许一些东西,但只能通过我提供的自定义API /库。例如,我不想允许直接网络访问打开到yahoo.com的URLConnection,但如果使用MyURLConnection完成,我很好。那就是 - 我想要允许的一组方法/类,然后我想要的其他一切都不受限制。

我不相信这种类型的安全性可以使用标准的Java安全模型来完成,但也许它可以。我对脚本语言本身的性能或灵活性没有特定要求(脚本将通过基本循环/分支对我的API进行简单的过程调用)。所以即使是一个“大”的开销来检查每次反射调用的安全检查也没问题。

建议?

3 个答案:

答案 0 :(得分:4)

免责声明:我不是Java安全API的专家,所以可能有更好的方法来做到这一点。

我为Alfresco,基于Java的开源企业CMS工作,我们实现了与您描述的类似的东西。我们希望允许编写脚本,但仅将Java API的一部分公开给脚本引擎。

我们选择了Rhino Engine for JavaScript脚本。它允许您控制向JavaScript公开哪些API,这允许我们选择哪些类可用,哪些不可用。根据我们的工程师的说法,开销大约为10% - 不算太糟糕。

除此之外,这也可能与您相关,在Java方面,我们使用Acegi(现在是Spring Security),并使用AOP对某个用户可以调用的方法进行基于角色的控制。这对于授权非常有效。因此,实际上,首先通过JavaScript访问我们的应用程序的用户首先可以使用受限制的API,然后可以基于授权进一步限制该API。因此,您可以使用AOP技术进一步限制可以调用哪些方法,从而允许在其他脚本语言(如Groovy等)中公开它。我们正在添加这些,并且有信心我们的底层Java API保护用户免受未经授权的访问

答案 1 :(得分:3)

您可以使用自定义类加载器,在委托给父类之前,它会检查链接到类。

您可以创建自己的权限,检查安全敏感API中的权限,然后在调用底层API时使用AccessController.doPrivileged恢复适当的权限。

您需要确保脚本引擎本身是安全的。 Sun JDK中的Rhino版本应该没问题,但不能保证。显然,您需要确保脚本可用的所有内容都是安全的。

答案 2 :(得分:0)

在Groovy中,你可以完全按照你提到的那样做。其实很简单。您可以轻松限制在受信任环境中运行的不受信任脚本的权限,允许使用您自己的api,这反过来可以执行不受信任的事情。

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