Elasticsearch on AWS用户身份验证

时间:2018-07-12 19:29:30

标签: java rest api amazon-web-services elasticsearch

我正在AWS上使用ES服务。我在学习如何使用它方面取得了很大的进步,尤其是在ES HighLevelRestClient中。所以现在我想保护ES服务器的安全,增加用户身份验证的安全性。 Amazon提供类似于“用户/密码”凭证的“访问密钥”和“秘密密钥”值。不幸的是,他们还提供了自己的AWSCredentials和AWS4Signer类来创建凭证并签署请求!

他们的代码示例非常简单,并且可以与Elastic Co的Java“ Low Level” RestClient一起正常工作。以下是类似于https://docs.aws.amazon.com/elasticsearch-service/latest/developerguide/es-indexing-programmatic.html的亚马逊推荐内容的摘要:

    credentialsProvider = new AWSStaticCredentialsProvider (new BasicAWSCredentials ("access key", "secret key")); // while debugging
    HttpRequestInterceptor interceptor =
            new AWSRequestSigningApacheInterceptor (serviceName, signer, credentialsProvider);
    RestClient lowLevelClient = RestClient.builder (HttpHost.create (esURL))
            .setHttpClientConfigCallback (hacb -> hacb.addInterceptorLast (interceptor)).build ();

好消息是,这很好!不幸的是,对ES High Level Rest Client签名版本的明显扩展(如Add authentication in elasticsearch high level client for JAVA中的建议)不起作用!那就是:

        RestClientBuilder builder = RestClient.builder (HttpHost.create (esURL))
                .setHttpClientConfigCallback (hacb -> hacb.addInterceptorLast (interceptor));

        highLevelClient = new RestHighLevelClient (builder);

总是从AWS导致以下错误消息:

{"message":"The request signature we calculated does not match the signature you provided. Check your AWS Secret Access Key and signing method. Consult the service documentation for details."}

我推测ES高级休息客户端会构造JSON查询,而AWS拦截器在创建签名时不会看到这些查询。由于等效方法在Elastic Co云实例上很好用(请参见上面的SO线程),所以我猜这是AWS人员和ES人员之间不交谈的地方。

是否可以使用某种方式使用AWS CredentialsProvider和Signer,但可以使用Apache HttpAsyncClientBuilder :: setDefaultCredentialProvider方法?还是有ES Rest API的版本,其中Java High Level Rest客户端在AWS拦截器对其进行签名之前就完全构建了请求?

否则,我将被迫使用IP地址签名(ugh),开始使用低级Rest Client(双ugh)或结合使用ssh隧道和AWS VPC安全性(许多ughs)。

1 个答案:

答案 0 :(得分:0)

好吧,我找到了一个目前对我来说很好的答案。我在github上找到了aws-es-proxy 1,这使我可以在计算机上运行代理服务器。我通过127.0.0.1:9200(可配置)连接到它,它签署了我的请求并将其转发到我的AWS服务器。有效!

但是,它确实向我的应用程序添加了外部依赖关系,因此,总的来说,我认为这是一种解决方法,而不是解决方案。