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

时间:2016-08-23 14:08:51

标签: elasticsearch

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

Page<Address> page = addressSearchRepository.search(simpleQueryStringQuery(query), pageable);

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

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

Page<Address> page = addressSearchRepository.search(wrapperQuery(jsonQuery), pageable);

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

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

当页面大小非常大时,可能会限制页面大小或使用扫描和滚动API来缓解这种情况。

我知道应该不惜一切代价避免使用脚本字段,但默认情况下会禁用它们(自v1.4.3起)。

1 个答案:

答案 0 :(得分:6)

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

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

节点可能不会耗尽内存,但节点几乎没有响应。

Elastic的团队正在尝试implement other circuit breakersadd default limits to certain types of queries and aggregations(一项艰巨的任务)。但是,如果您的目标是让您的用户不要崩溃ES,而他们可以完全访问所有查询,我认为有办法让它崩溃。我个人不会暴露ES,让我的用户随心所欲地做任何他们想做的事情。

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