Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/372.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用groovy脚本的Elasticsearch 2.0.0安全管理器_Java_Groovy_<img Src="//i.stack.imgur.com/RUiNP.png" Height="16" Width="18" Alt="" Class="sponsor Tag Img">elasticsearch - Fatal编程技术网 elasticsearch,Java,Groovy,elasticsearch" /> elasticsearch,Java,Groovy,elasticsearch" />

Java 使用groovy脚本的Elasticsearch 2.0.0安全管理器

Java 使用groovy脚本的Elasticsearch 2.0.0安全管理器,java,groovy,elasticsearch,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

我正在使用来自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
}
根据stacktrace,调用
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
我还需要配置什么,以便在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的人报告了这个问题,他们已经解决了。实际上,但它要到2.1版才可用


是否有任何解决方法或配置选项使其立即工作?

您必须使用系统属性读取权限更新

将:
permission java.util.PropertyPermission“groovy.json.faststringutils.write.to.final.fields”、“read”
添加到
grant

默认策略文件(
java.policy
)位于
$java\u HOME/lib/security
下,除非使用
java.security.policy
系统属性另行指定


或者,使用
-Dsecurity.manager.enabled=false在没有安全管理器的情况下运行JVM,更好的实现方法是在/config/scripts下定义脚本。由于脚本是静态的,因此您可以从中获得以下优势:

  • 无需内联脚本即可确保应用程序的安全
  • 脚本被编译一次并再次使用。这将提高性能
  • 无需更改任何java安全策略

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

    security.manager.enabled: false
    

    请注意,从2.2.0开始,它就被弃用,很可能很快就会被删除。这不是最佳实践,在允许使用动态脚本时应避免

    谢谢你的意见。不过,我在云环境中工作。我不想通过处理脚本使应用程序的部署复杂化,脚本需要单独部署到elasticsearch集群,如果我采用这种方法,就会出现这种情况。抱歉,这不起作用,既不修改
    java.policy
    文件,也不通过
    -Dsecurity.manager.enabled=false
    选项禁用安全管理器。奇怪的是,我使用的是2.0.0,我也有JsonOutput问题,但报告的方式不同(只是ClsDefNotFound错误)。在我的案例中,根本原因不是读取的属性,而是FastStringUtils类中sun.misc.Unsafe的错误。在我的例子中,使用
    -Dsecurity.manager.enabled=false禁用用于elasticsearch的安全管理器修复了此问题
    
    export ES_JAVA_OPTS=-Dgroovy.json.faststringutils.write.to.final.fields\=true
    
    security.manager.enabled: false