ElasticSearch X-Pack安全角色和现场安全

问题描述

我正在使用ES 6.2.4,并且正在使用X-Pack。 我注册具有以下角色的用户

{
    "password" : "changeme","roles" : [  "object_basic","object_ext" ],"full_name" : "FullName","email" : "[email protected]","Metadata" : {
        "access_group_ids": ["1","2","3"]
    }
}

我具有以下安全角色。

Object_basic

{
  "indices": [
    {
      "names": [ "*cases_*" ],"privileges": [ "read" ],"field_security" : {
        "grant" : [ "case_id","short_name","type","status","owner_department" ]
      },"query": "{\"template\":{\"source\":\"{\\\"bool\\\":{\\\"should\\\":[{\\\"terms\\\":{\\\"case_access_owner_group_ids\\\": {{#toJson}}_user.Metadata.access_group_ids{{/toJson}}}},{\\\"terms\\\":{\\\"case_access_contributor_group_ids\\\": {{#toJson}}_user.Metadata.access_group_ids{{/toJson}} }},{\\\"terms\\\":{\\\"case_access_viewer_group_ids\\\": {{#toJson}}_user.Metadata.access_group_ids{{/toJson}} }},{\\\"terms\\\":{\\\"case_access_basic_viewer_group_ids\\\": {{#toJson}}_user.Metadata.access_group_ids{{/toJson}}  }} ]}}\"}}"
    }
  ]
}

Object_ext

{
  "indices": [
    {
      "names": [ "*cases_*" ],"field_security" : {
        "grant" : [ "name","description" ]
      },"query": "{\"template\":{\"source\":\"{\\\"bool\\\":{\\\"should\\\":[{\\\"terms\\\":{\\\"case_access_owner_group_ids\\\":{{#toJson}}_user.Metadata.access_group_ids{{/toJson}}}},{\\\"terms\\\":{\\\"case_access_contributor_group_ids\\\":{{#toJson}}_user.Metadata.access_group_ids{{/toJson}}}},{\\\"terms\\\":{\\\"case_access_viewer_group_ids\\\": {{#toJson}}_user.Metadata.access_group_ids{{/toJson}}}}]}}\"}}"
    }
  ]
}

这两个安全角色查询间的唯一区别是,object_ext所包含的条件较少(例如case_access_basic_viewer_group_ids)。

我摄取了一些包含如下值的数据:

 "case_access_owner_group_ids": [],"case_access_contributor_group_ids": [],"case_access_viewer_group_ids": [],"case_access_basic_viewer_group_ids": ["2"],

当我将两个角色(object_basic和object_ext)分配给用户时,将返回所有字段(包括名称”,“描述”)。 这不是我所期望的。我希望不会返回“名称”,“描述”,因为object_ext查询中仅不包括 case_access_basic_viewer_group_ids

现在,如果我更新用户的角色,而只留下object_ext,则它的行为正确且不返回任何内容

如果我更新了用户角色,而只留下了object_basic,则它不会返回“名称”,“描述”。

我当然希望同时为用户分配两个角色,并且仅当足够的数组包含有效数据以及用户的元数据数组时,才返回“名称”,“描述”。现在看来,如果触发了obj_basic角色,它也会自动触发obj_ext。

我在做什么错了?

解决方法

对于6.2.4版本,看起来(至少)看起来没有文档和字段级安全性与here所记录的索引相同。

如果您需要限制对文档和字段的访问,请考虑 而是按索引分割文档。

在特定条件下,这可能是一个真正的问题,因为它可能会强制对模型进行规范化。