Создание ключей API на ElasticSearch с ограниченными возможностями поиска - PullRequest
0 голосов
/ 25 сентября 2019

Я хочу создать ключи API наasticsearch через API POST _security / api_key, я могу создать их, но я хочу ограничить возможности поиска для сгенерированного ключа, что я не могу сделать.

По существу,чего я хочу добиться, так это того, что все мои записи имеют поле типа "username":"username1" или другое, например "username":"username2", т. е. все записи будут иметь действительное значение для имя пользователя поле

Теперь я хочу создать ключ, в котором я указываю что-то вроде "username":"username2", которое затем добавляется к каждому поисковому запросу, выполненному с использованием этого ключа, в качестве примера AND, например, если этот ключ ищет (/ index_name / _search) для

{
    "query": {
        "match": {
            "key_zz":"value_aa"
        }
    }
}

этот запрос фактически будет И для обоих из нижеприведенных (т.е. если запись с этой комбинацией существует "key_zz":"value_aa", но значение для имя пользователя не равно имя пользователя2 API не возвращает этот объект)

{
    "query": {
        "match": {
            "key_zz":"value_aa"
        }
    }
}

AND

{
    "query": {
        "must": { 
          "match" : {
            "username":"username2"
          } 
        }
    }
} 

Я попытался создать ключ со всеми следующими комбинациями:

    "name": "key-name",
    "role_descriptors": {
        "role_name": {
            "indices": [
                {
                    "names": [
                        "index_name"
                    ],
                    "privileges": [
                        "read"
                    ],
                    "query": {
                        "match": {
                            "username": "value_custom"
                        }
                    }
                }
            ]
        }
    }
}

В поле запроса у меня естьперепробовал все следующие комбинации:

           "query": {
                        "and": {
                            "username": "value_custom"
                        }
                    }
          "query": {
                        "bool": {
                            "must": {
                                "match": {
                                    "username": "value_custom"
                                }
                            }
                        }
                    }
           "query": {
                        "bool": {
                            "must": {
                                "bool": {
                                    "must": {
                                        "match": {
                                            "username": "value_custom"
                                        }
                                    }
                                }
                            }
                        }
                    }

Но ничего из вышеперечисленного не сработало.Кроме того, ранее тип отображения поля username был text , но затем я обновил его до ключевое слово

В двух словах, что япопытка достичь - это своего рода защита на уровне документа.Я знаю, что в ElasticSearch есть какая-то защита на уровне документов (https://www.elastic.co/guide/en/elastic-stack-overview/current/document-level-security.html), но в нашей архитектуре мы хотим добиться этого с помощью ключей API с ограниченными возможностями поиска. В настоящее время мы используем Algolia, и мы достигли этого, используя точную реализацию.описано выше. В документации ElasticSearch есть ссылки на то, как ограничить роль, но не на то, как ограничивать ключи API. Нужна помощь для достижения этого.

Кроме того, я использую ElasticSearch v7

Некоторые справочные ссылки:

  1. https://www.elastic.co/guide/en/elasticsearch/reference/current/security-api-create-api-key.html
  2. https://www.elastic.co/guide/en/elasticsearch/reference/current/security-api-put-role.html
...