Простой способ сделать сервер elasticsearch только для чтения - программирование
Подтвердить что ты не робот

Простой способ сделать сервер elasticsearch только для чтения

Очень просто загрузить кучу json-данных на сервер elasticsearch, чтобы иметь базовый запрос api с множеством опций

Я просто хотел бы знать, есть ли там простой способ опубликовать все это, чтобы люди не изменяли его.

Из значения по умолчанию сервер открыт или получает сообщение DELETE или PUT http, которое будет изменять данные.

Есть ли какой-то параметр, чтобы настроить его на чтение? Или я могу настроить какой-то прокси-сервер http для его достижения?

(Я новичок в elasticsearch)

4b9b3361

Ответ 1

Если вы хотите открыть API Elasticsearch как доступный только для чтения, я думаю, что лучший способ - поставить Nginx перед ним и отклонить все запросы, кроме GET. Пример конфигурации выглядит следующим образом:

# Run me with:
#
#     $ nginx -c path/to/this/file
#
# All requests except GET are denied.

worker_processes  1;
pid               nginx.pid;

events {
    worker_connections  1024;
}

http {

  server {

    listen       8080;
    server_name  search.example.com;

    error_log   elasticsearch-errors.log;
    access_log  elasticsearch.log;

    location / {
      if ($request_method !~ "GET") {
        return 403;
        break;
      }

      proxy_pass http://localhost:9200;
      proxy_redirect off;

      proxy_set_header  X-Real-IP  $remote_addr;
      proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header  Host $http_host;
    }

  }

}

Тогда:

curl -i -X GET http://localhost:8080/_search -d '{"query":{"match_all":{}}}'
HTTP/1.1 200 OK

curl -i -X POST http://localhost:8080/test/test/1 -d '{"foo":"bar"}'
HTTP/1.1 403 Forbidden

curl -i -X DELETE http://localhost:8080/test/
HTTP/1.1 403 Forbidden

Обратите внимание, что вредоносный пользователь все равно может испортить ваш сервер, например, отправив неверные полезные данные script, что заставило бы Elasticsearch застревать, но для большинства целей этот подход был бы прекрасен.

Если вам потребуется больше контроля проксирования, вы можете использовать более сложную конфигурацию Nginx или написать специальный прокси, например. в Ruby или Node.js.

Смотрите этот пример для более сложного прокси-сервера на основе Ruby.

Ответ 2

Вы можете установить флаг readonly в своем индексе, но это ограничивает некоторые операции, поэтому вам нужно будет убедиться, что это приемлемо.

curl -XPUT http://<ip-address>:9200/<index name>/_settings -d'
{
    "index":{
        "blocks":{
            "read_only":true
        }
    }
}'

Как уже упоминалось в одном из других ответов, на самом деле вы должны запустить ES в доверенной среде, где вы можете контролировать доступ к ней.

Подробнее об индексах здесь: http://www.elasticsearch.org/guide/reference/api/admin-indices-update-settings/

Ответ 3

Elasticsearch предназначен для использования в надежной среде и сам по себе не имеет никакого механизма контроля доступа. Таким образом, лучший способ развернуть elasticsearch - это веб-сервер перед ним, который будет отвечать за контроль доступа и тип запросов, которые могут достичь elasticsearch. Сказав это, можно ограничить доступ к elasticsearch, используя elasticsearch-jetty плагин.

Ответ 4

Я знаю, что это старая тема. Я столкнулся с той же проблемой, поставил ES за Nginx, чтобы сделать его доступным только для чтения, но позволить кибане получить к нему доступ.

Единственный запрос от ES, который нуждается в Kibana в моем случае, - "url_public/_all/_search".

Итак, я разрешил это в свой Nginx conf.

Здесь мой файл conf:

server {

    listen port_es;
    server_name ip_es;

    rewrite ^/(.*) /$1 break;
    proxy_ignore_client_abort on;
    proxy_redirect url_es url_public;
    proxy_set_header  X-Real-IP  $remote_addr;
    proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header  Host $http_host;

    location ~ ^/(_all/_search) {
        limit_except GET POST OPTIONS {
                deny  all;
        }
        proxy_pass url_es;
    }

    location / {

        limit_except GET {
                deny  all;
        }
        proxy_pass url_es;
    }
}

Таким образом, разрешен только запрос GET, если только запрос _all/_search. При необходимости просто добавить другой запрос.

Ответ 5

Я использую этот плагин elasticsearch:

https://github.com/sscarduzio/elasticsearch-readonlyrest-plugin

Это очень просто, легко установить и настроить. На странице проекта GitHub приведен пример конфигурации, который показывает, как ограничить запросы только HTTP GET; которые не изменят никаких данных в elasticsearch. Если вам нужен только белый IP-адрес (или none) для использования других методов (PUT/DELETE/etc), которые могут изменять данные, то он также вас охватывает.

Что-то вроде этого входит в ваш конфигурационный файл elasticsearch (/etc/elasticsearch/elasticsearch.yml или его эквивалент), адаптированный с страницы GitHub:

readonlyrest:
    enable: true
    response_if_req_forbidden: Sorry, your request is forbidden
    # Default policy is to forbid everything, let define a whitelist
    access_control_rules:

    # from these IP addresses, accept any method, any URI, any HTTP body
    #- name: full access to internal servers
    #  type: allow
    #  hosts: [127.0.0.1, 10.0.0.10]

    # From external hosts, accept only GET and OPTION methods only if the HTTP request body is empty
    - name: restricted access to all other hosts
      type: allow
      methods: [OPTIONS,GET]
      maxBodyLength: 0

Ответ 6

С помощью Elastic или Solr не следует зависеть от поисковой системы для вашей безопасности. Вы должны использовать безопасность в своем контейнере или даже помещать контейнер в нечто действительно пуленепробиваемое, например Apache HTTPD, а затем настраивать безопасность, чтобы запретить то, что вы хотите запретить.