Elasticsearch专题精讲——API规范—— 基于 URL 的访问控制
API规范—— 基于 URL 的访问控制
https://www.elastic.co/guide/en/elasticsearch/reference/8.8/api-conventions.html#api-url-access-control
Elasticsearch 中的 multi-search(多搜索)、multi-get(多获取) 和 bulk(批量请求)是在一个请求中执行多个操作的方法。如果使用基于URL的访问控制代理来保护数据访问,那么 multi-search(多搜索)、multi-get(多获取) 和 bulk(批量请求)中,需要在URL和请求体中指定数据流或索引,才能保证请求被正确执行并访问到所需的数据。
例如,如果客户端想要一次请求获取多个索引的数据,那么就需要在URL中指定要获取数据的索引名称,同时还需要在每个请求的请求体中指明请求的具体操作及操作对应的索引名称。因此,对于数据非常庞大且涉及多个索引的情况,执行基于URL的访问控制就会变得非常困难。
我们举个例子:
假设客户端想要一次请求获取三个索引(index1、index2和index3)中所有文档的数据。根据基于URL的访问控制的实现方式,客户端需要向服务器发送三个请求,每个请求都需要指定索引名称,并在请求体中指定搜索操作:
GET /index1/_search { "query": { "match_all": {} } } GET /index2/_search { "query": { "match_all": {} } } GET /index3/_search { "query": { "match_all": {} } }
这种实现方式很容易导致重复的请求,因为每个请求都需要指定索引名称。此外,这样的做法还需要客户端发送多个请求,导致服务器负载较大。
为了减轻这种情况下的负担,建议通过使用单个索引名称,并使用多查询语句(multi-query)来执行基于URL的访问控制。这意味着客户端可以在单个请求中指定一个或多个查询,并指定与查询关联的索引名称。例如:
POST /_msearch {} {"index": "index1"} {"query": {"match_all": {}}} {} {"index": "index2"} {"query": {"match_all": {}}} {} {"index": "index3"} {"query": {"match_all": {}}}
为了克服这种困难,用户可以使用其他方法,例如快速启动和关闭数据流或每个请求使用单个索引名称来提高数据访问的效率并简化基于URL的访问控制。
此外,还可以考虑优化数据流。如果客户端只需要一部分结果,就可以使用分片(shard)和滚动(scrolling)来减小数据量,并且仅获取必要的数据。可以使用滚动作为一种优化策略,来提升基于URL的访问控制的效率。
要防止用户重写 URL 中指定的数据流或索引,请在 elasticsearch.yml 中将 rest.action.multi.allow_display_index 设置为 false:
rest.action.multi.allow_display_index: false
需要注意的是,该选项的默认值是 true,这意味着用户可以在 URL 中自定义显示的索引。如果你将其设置为 false,则 Elasticsearch 在 URL 中忽略显示的索引,并将只考虑实际请求中指定的索引,从而确保安全性。