Роли безопасности ElasticSearch X-Pack и безопасность полей

#elasticsearch #elasticsearch-x-pack

#elasticsearch #elasticsearch-x-pack

Вопрос:

Я использую ES 6.2.4 и использую X-Pack. Я регистрирую пользователя со следующими ролями:

 {
    "password" : "changeme",
    "roles" : [  "object_basic", "object_ext" ],
    "full_name" : "FullName",
    "email" : "sample@example.com",
    "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_*" ],
      "privileges": [ "read" ],
      "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) пользователю, возвращаются все поля (включая «имя», «описание»).
Это не то, чего я ожидал. Я ожидал бы, что «имя», «описание» НЕ возвращаются, поскольку только case_access_basic_viewer_group_ids НЕ включен в запрос object_ext.

Теперь, если я обновлю роли пользователя и оставлю только object_ext, он будет вести себя правильно и ничего не вернет.

Если я обновляю роли пользователя и оставляю только object_basic, то он не возвращает «имя», «описание».

Я, конечно, хочу, чтобы пользователю были назначены обе роли, и возвращать «имя», «описание» только тогда, когда соответствующие массивы содержат действительные данные в сочетании с массивом метаданных пользователя. Теперь похоже, что если запускается роль obj_basic, она также автоматически запускает obj_ext.

Что я делаю не так?

Ответ №1:

Похоже, что (по крайней мере) для версии 6.2.4 невозможно обеспечить безопасность на уровне документа и поля с тем же индексом, который задокументирован здесь .

Если вам нужно ограничить доступ как к документам, так и к полям, рассмотрите возможность разделения документов по индексу.

Это может быть реальной проблемой при определенных условиях, поскольку это может привести к принудительной нормализации модели.