gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 02:49:34 25 4
gpt4 key购买 nike

我正在使用 Java/Spring Boot API 开发 AngularJS 应用程序。它使用 Spring Data Elasticsearch 提供对 Elasticsearch 的搜索 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 索引的搜索 API。假设索引中的任何数据都可以安全地显示给用户,这是否存在安全风险?

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

也许限制页面大小或在页面非常大时使用扫描和滚动 API 可以缓解这种情况。

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

最佳答案

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

我并不是说无论您采用何种聚合并创建 10 个深层嵌套聚合都会削弱集群,但在正常情况下,集群是为特定 SLA 构建的并处理一定数量的数据,给定一些繁重的数据聚合(例如 analyzed 字符串字段上的 terms)对于节点来说计算量非常大。

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

Elastic 的团队正在努力 implement other circuit breakersadd default limits to certain types of queries and aggregations (一项艰巨的任务)。但是如果你的目标是让你的用户不让 ES 崩溃,而他们可以完全访问所有查询,我认为有办法让它崩溃。就我个人而言,我不会公开 ES 并让我的用户对他们创建的任何查询做任何他们想做的事。

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

关于elasticsearch - 通过应用程序的 API 直接公开 Elasticsearch Search API 是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39103547/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com