安全与Java脚本(JRuby的,Jython的,Groovy中,BeanShell的,等等)
题
我期待运行一些未验证脚本(写在一个尚未将要确定的语言,但必须是基于Java的,所以的JRuby,Groovy的是,Jython,BeanShell的,等都是候选人)。我想这些脚本能够做一些事情和做其他事情的限制。
通常情况下,我只是去使用Java的安全管理器,并用它做。这是相当简单的,让我限制文件和网络访问的能力来关闭JVM,等等。这将很好地工作在高层次的东西,我想挡掉。
但是有一些东西我想允许的,但只能通过我的自定义API /库,我已经提供。举例来说,我不希望允许直接访问网络来开辟一个URLConnection到yahoo.com,但我确定,如果它与MyURLConnection完成。这就是 - 有一组方法/类的,我想允许,然后一切我想成为禁区
我不相信这种类型的安全可以使用标准的Java安全模型来完成,但也许可以。我没有在脚本语言本身的性能或灵活性的特定需求(脚本将是我的基本循环API简单过程调用/分支)。因此,即使“大”开销在每个反射调用检查安全检查是我的罚款。
建议?
解决方案
免责声明:我不是Java的安全API的专家,所以有可能是一个更好的方式来做到这一点。
我的露天的,基于Java的开源企业网站管理系统工作,我们实施了类似的东西你描述。我们希望允许脚本,但仅限于我们的Java API的一个子集到脚本引擎。
我们选择犀牛引擎JavaScript脚本。它允许你控制哪些API暴露给JavaScript,这使我们能够选择哪些类是可用的,哪些不是。开销,根据我们的工程师,为10%左右 - 不算太糟糕。
除此之外,这可能是与你有关的,以及,在Java方面,我们使用Acegi(现在的Spring Security),并使用AOP给基于角色的控制,其方法有一定的用户可以调用。这非常有效授权。因此,实际上,访问通过JavaScript我们的应用程序,用户首先必须在第一时间向他提供受限制的API,然后该API可以根据授权进行进一步限制。所以,你可以使用AOP技术,以进一步限制哪些方法可以调用,从而允许在其他脚本语言,比如Groovy,等我们在添加这些过程也暴露这一点,有信心,我们的基本的Java API的保护用户免受未经授权的访问。
其他提示
您可能能够使用自定义的类装载器,做兽医链接到类委托给其父前。
您可以创建自己的权限,检查这些在安全敏感的API,然后使用AccessController.doPrivileged
恢复相应的权限,同时调用底层API。
您需要确保脚本引擎本身是安全的。犀牛在Sun JDK版本应该没问题,但不能保证。显然,你需要确保一切可用的脚本是安全的。
在Groovy中,你可以做你提到什么。其实很简单。您可以轻松地限制在受信任的环境中运行不信任脚本的权限,让自己的API,这反过来又可以做的事情不可信的使用。