java - 带 Groovy 脚本的 Elasticsearch 2.0.0 安全管理器

标签 java groovy elasticsearch

我正在 Java 应用程序中使用全新的 Elasticsearch 2.0.0。

使用具有以下代码的内联 groovy 脚本调用 prepareUpdate() 方法时:

import org.elasticsearch.common.logging.*
import groovy.json.*

ESLogger logger = ESLoggerFactory.getLogger('events-sequence.groovy')

def TOKEN_SEPARATOR = "###"
def flow = [ ]

try {
    ctx._source.events.reverseEach { e ->
        def context = e.tuplenized_context ? JsonOutput.toJson(e.tuplenized_context) : "[]"
        flow << (e.name.toLowerCase() + TOKEN_SEPARATOR + context.toLowerCase())
    }
    ctx._source.flow = flow.join(TOKEN_SEPARATOR)

} catch (Throwable t) {
    logger.error("Error applying derivation", t)
    throw t
}

我收到以下异常:

    java.security.AccessControlException: access denied ("java.util.PropertyPermission" "groovy.json.faststringutils.write.to.final.fields" "read")

根据堆栈跟踪,调用 JsonOutput.toJson() 方法时会发生这种情况:

java.lang.ExceptionInInitializerError
        at groovy.json.internal.CharBuf.addJsonFieldName(CharBuf.java:516)
        at groovy.json.JsonOutput.writeMap(JsonOutput.java:423)
        at groovy.json.JsonOutput.writeObject(JsonOutput.java:267)
        at groovy.json.JsonOutput.writeIterator(JsonOutput.java:441)
        at groovy.json.JsonOutput.writeObject(JsonOutput.java:269)
        at groovy.json.JsonOutput.toJson(JsonOutput.java:187)
        at groovy.json.JsonOutput$toJson.call(Unknown Source)
        at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:48)
        at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:113)
        at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:125)
        at 3974cbb354b454f7c665982a3a8f854ede6125fb$_run_closure1.doCall(3974cbb354b454f7c665982a3a8f854ede6125fb:18)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:497)
        at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:93)
        at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:325)
        at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:294)
        at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1019)
        at groovy.lang.Closure.call(Closure.java:426)
        at groovy.lang.Closure.call(Closure.java:442)
        at org.codehaus.groovy.runtime.DefaultGroovyMethods.each(DefaultGroovyMethods.java:2030)
        at org.codehaus.groovy.runtime.DefaultGroovyMethods.reverseEach(DefaultGroovyMethods.java:2172)
        at org.codehaus.groovy.runtime.dgm$532.invoke(Unknown Source)
        at org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite$PojoMetaMethodSiteNoUnwrapNoCoerce.invoke(PojoMetaMethodSite.java:274)
        at org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite.call(PojoMetaMethodSite.java:56)
        at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:48)
        at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:113)
        at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:125)
        at 3974cbb354b454f7c665982a3a8f854ede6125fb.run(3974cbb354b454f7c665982a3a8f854ede6125fb:17)
        at org.elasticsearch.script.groovy.GroovyScriptEngineService$GroovyScript.run(GroovyScriptEngineService.java:248)
        at org.elasticsearch.action.update.UpdateHelper.executeScript(UpdateHelper.java:251)
        at org.elasticsearch.action.update.UpdateHelper.prepare(UpdateHelper.java:196)
        at org.elasticsearch.action.update.UpdateHelper.prepare(UpdateHelper.java:79)
        at org.elasticsearch.action.bulk.TransportShardBulkAction.shardUpdateOperation(TransportShardBulkAction.java:408)
        at org.elasticsearch.action.bulk.TransportShardBulkAction.shardOperationOnPrimary(TransportShardBulkAction.java:203)
        at org.elasticsearch.action.support.replication.TransportReplicationAction$PrimaryPhase.performOnPrimary(TransportReplicationAction.java:579)
        at org.elasticsearch.action.support.replication.TransportReplicationAction$PrimaryPhase$1.doRun(TransportReplicationAction.java:452)
        at org.elasticsearch.common.util.concurrent.AbstractRunnable.run(AbstractRunnable.java:37)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
        at java.lang.Thread.run(Thread.java:745)
    Caused by: java.security.AccessControlException: access denied ("java.util.PropertyPermission" "groovy.json.faststringutils.write.to.final.fields" "read")
        at java.security.AccessControlContext.checkPermission(AccessControlContext.java:472)
        at java.security.AccessController.checkPermission(AccessController.java:884)
        at java.lang.SecurityManager.checkPermission(SecurityManager.java:549)
        at java.lang.SecurityManager.checkPropertyAccess(SecurityManager.java:1294)
        at java.lang.System.getProperty(System.java:753)
        at groovy.json.internal.FastStringUtils.<clinit>(FastStringUtils.java:37)
        ... 42 more

在我的 elasticsearch.yml 配置文件中,我添加了以下两行:

script.inline: on 
script.indexed: on

我还需要配置什么才能在 groovy 脚本中将对象序列化为 JSON 吗?

编辑:我还尝试初始化 Elasticsearch 设置以下选项:

export ES_JAVA_OPTS=-Dgroovy.json.faststringutils.write.to.final.fields\=true

但运气不佳,因为问题似乎是没有权限访问 groovy.json.faststringutils.write.to.final.fields 系统属性,无论其值是什么。

<小时/>

编辑2:全部修改默认的java.policy文件,使用-Djava.security.manager指定新的策略文件和-Djava.security.policy=file:///my.policy 选项并通过 -Dsecurity.manager.enabled=false 选项禁用安全管理器不起作用。

我已将此问题报告给 Elasticsearch 人员,他们已经修复了该问题。实际上,here's the commit ,但要到 2.1 版本才可用。

是否有任何解决方法或配置选项可以使其现在正常工作?

最佳答案

这里的其他建议也不适合我,但我确实发现我可以通过将以下内容添加到我的 elasticsearch.yml 文件来禁用 ES 安全管理器...

security.manager.enabled: false

请注意,此功能自 2.2.0 起已弃用,并且可能很快就会被删除。这不是最佳实践,在允许动态脚本时应该避免。

关于java - 带 Groovy 脚本的 Elasticsearch 2.0.0 安全管理器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33503890/

相关文章:

java - 从jsp中的内联java代码中提取字符串

grails - 我应该把客户代码放在哪里?

elasticsearch - 我可以缩小Elastic Search _stats获得的结果吗?

elasticsearch - 如何使用ElasticSearch中的脚本将对象添加到数组?

java - 自定义独立 gradle 插件不像通常的 build.gradle 代码那么强大?

java - 我正在尝试从字符串中删除所有元音

GroovyClassLoader 和导入

unit-testing - @GrabConfig 有什么替代方案吗?

elasticsearch - 应用程序侧加入Elasticsearch

java - 如何使用 ImageView 调用电话?