【问题标题】:Server-side elasticsearch filters服务器端 elasticsearch 过滤器
【发布时间】:2015-10-24 23:47:20
【问题描述】:

我正在使用 javascript-elasticsearch API 来搜索数据。但是,我需要根据他们的工作室限制对某个组的访问。例如:

obj1
title = Titanic
studio = Fox

obj2
title = Lion King
studio = Disney

我可以查询:?q=&studio=disney,但这可以由恶意用户在 javascript 中进行调整以执行 q=&studio=。有没有办法在我正在使用的 API 密钥或 elasticsearch 本身中设置此限制(&studio=X)?如何做到这一点,如果不能做到,上述问题的最佳解决方案是什么?

【问题讨论】:

    标签: javascript elasticsearch elasticjs


    【解决方案1】:

    这可以通过filtered alias 来完成。这个想法是,不是通过索引名称搜索,而是通过该索引上的过滤别名进行搜索。这是一个例子。假设您有一个类型为movie 的索引movies。最基本的搜索方式是:

    curl -XPOST localhost:9200/movies/movie/_search?q=...
    

    以这种方式搜索时,您基本上可以访问整个电影索引。如果您想将对该索引的某些文档的访问限制为某些类型的用户,您可以创建一个别名,该别名将仅查询与某个过滤器匹配的文档,如下所示:

    curl -XPOST localhost:9200/_aliases -d '{
        "actions" : [
            {
                "add" : {
                     "index" : "movies",
                     "alias" : "disney_movies",
                     "filter" : { "term" : { "studio" : "disney" } }
                }
            }
        ]
    }'
    

    然后您可以强制搜索该别名而不是索引。这样做会透明地仅搜索带有 studio: disney 的电影,您无需再在查询本身中明确指定。

    curl -XPOST localhost:9200/disney_movies/movie/_search?q=...
    

    如果有人试图篡改 studio 变量,将没有匹配的别名,因此不会返回任何结果,这正是您想要的。

    【讨论】:

    • 谢谢。这正是我正在寻找的。因此,为了确保我清楚,在上述情况下,当创建用户时,我们将创建添加先决条件过滤器的别名(使用我们的管理 API 密钥),然后当我们稍后执行搜索我们通过别名端点搜索的那个用户。对上面的理解正确吗?
    • 另外,我想我们想使用类似 uuid 的东西作为 url 中的别名?所以很难猜出其他网址之一可能是什么?
    • 你的理解是正确的。当然,您可以使用任何您想要的别名作为别名。另外值得注意的是,如果您有数千名用户,此解决方案的扩展性不太好,但对于几十个用户来说,这完全没问题。
    • Shield 不完全符合我的要求吗?在介绍中它说“Shield 是 Elasticsearch 的一个插件,可让您轻松保护集群。使用 Shield,您可以使用密码保护您的数据以及实施更高级的安全措施,例如加密通信、基于角色的访问控制、 IP 过滤和审计。”。但我以前从未使用过:elastic.co/guide/en/shield/current/introduction.html.
    • 由于 Shield 是一种商业产品,我将建议在这种情况下,您需要为您的用例提供更细粒度的东西。但当然,有了 Shield,您可以做更多需要真正安全的高级操作,而不仅仅是“信息隐藏”。
    猜你喜欢
    • 2022-10-17
    • 1970-01-01
    • 2018-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-05
    • 2015-06-10
    相关资源
    最近更新 更多