通过应用程序的API直接公开Elasticsearch Search API是否安全?

ger*_*ies 5 elasticsearch

我正在使用Java/Spring Boot API开发AngularJS应用程序.它使用Spring Data Elasticsearch提供对Elasticsearch的Search API的访问以进行搜索.这是一个例子:

Page<Address> page = addressSearchRepository.search(simpleQueryStringQuery(query), pageable);
Run Code Online (Sandbox Code Playgroud)

变量query是用户的搜索字符串.pageable是一个指定页码,页面大小和排序的对象.我可以使用它QueryBuilders来构建其他Elasticsearch查询并将它们公开为不同的API端点.

另一种选择是QueryBuilders.wrapperQuery直接从JavaScript 使用和发送Elasticsearch查询.下面是一个jsonQuery包含完整Elasticsearch查询的字符串示例:

Page<Address> page = addressSearchRepository.search(wrapperQuery(jsonQuery), pageable);
Run Code Online (Sandbox Code Playgroud)

这将是一个安全端点,只有经过身份验证的用户才能访问.这似乎等同于直接暴露Elasticsearch索引的Search API.假设索引中的任何数据都可以安全地显示给用户,这是否存在安全风险?

到目前为止,在我的研究中,我发现使用查询可能会使Elasticsearch崩溃,但在新版本中它并不是一个大问题:https://www.elastic.co/blog/found-crash -elasticsearch#任意大尺寸参数

当页面大小非常大时,可能限制页面大小或使用扫描和滚动API会减轻这种情况.

我知道应该不惜一切代价避免使用脚本字段,但默认情况下它们是禁用的(从v1.4.3开始).

And*_*fan 6

如果您知道如何操作,仍然可以使Elasticsearch崩溃.例如,如果您开始构建10个深层嵌套聚合,那么您可能会好好休息一下.它要么花费大量时间,要么非常昂贵,使用大量内存,使JVM做很多垃圾收集(基本上冻结JVM中运行的所有其他线程),回收少量内存.它可以通过这种方式使群集无响应.

我不是说你采取的任何聚合和创建10个深度嵌套聚合都会使集群瘫痪,但在正常情况下,为某个SLA构建集群并处理一定数量的数据,给定一些重要的聚合(对于字符串字段terms上的示例analyzed),对节点的计算量非常高.

也许节点不会耗尽内存,但节点几乎没有响应.

Elastic的团队正在尝试实施其他断路器为某些类型的查询和聚合添加默认限制(这是一项艰巨的任务).但是,如果您的目标是让您的用户不要崩溃ES,而他们可以完全访问所有查询,我认为有办法让它崩溃.我个人不会暴露ES,让我的用户随心所欲地做任何他们想做的事情.

根据您wrapper的配置方式,我只允许我的用户使用某些类型的查询/聚合,对于那些我会施加一些限制(适用于那些接受限制的查询/ aggs ).