20

多くのオプションを備えた基本的なクエリAPIを持つために、大量のjsonデータをelasticsearchサーバーにアップロードするのは本当に簡単です

人々がそれを変更できないように、すべてを公開する簡単な方法があるかどうかを知りたいだけです

デフォルト設定から、サーバーは開いていて、データを変更する DELETE または PUT http メッセージを受信しません。

読み取り専用に設定するための何らかの設定はありますか? または、それを実現するためにある種の http プロキシを構成する必要がありますか?

(私はelasticsearchの初心者です)

4

7 に答える 7

23

Elasticsearch API を読み取り専用として公開したい場合は、その前に 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

悪意のあるユーザーがサーバーを台無しにする可能性があることに注意してください。たとえば、不適切なスクリプト ペイロードを送信すると、Elasticsearch が動かなくなりますが、ほとんどの場合、この方法で問題ありません。

プロキシについてさらに制御が必要な場合は、より複雑な Nginx 構成を使用するか、専用のプロキシを作成することができます。Ruby または Node.js で。

より複雑な Ruby ベースのプロキシについては、この例を参照してください。

于 2013-01-02T10:23:37.987 に答える
8

インデックスに読み取り専用フラグを設定できますが、これにより一部の操作が制限されるため、それが許容できるかどうかを確認する必要があります。

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

他の回答の1つで述べたように、ESへのアクセスを制御できる信頼できる環境でESを実行する必要があります。

インデックス設定の詳細については、http ://www.elasticsearch.org/guide/reference/api/admin-indices-update-settings/ をご覧ください。

于 2013-09-12T15:05:24.813 に答える
6

私はこのelasticsearchプラグインを使用しています:

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

非常にシンプルで、インストールと構成が簡単です。GitHub プロジェクト ページには、リクエストを HTTP GET メソッドのみに制限する方法を示す構成例があります。これはelasticsearchのデータを変更しません。データを変更できる他の方法 (PUT/DELETE/etc) を使用するために、ホワイトリストに登録された IP 番号のみが必要な場合 (または何も必要ない場合) も同様にカバーされます。

次のような内容が、GitHub ページから適用された、elasticsearch 構成ファイル (/etc/elasticsearch/elasticsearch.yml または同等のもの) に入ります。

readonlyrest:
    enable: true
    response_if_req_forbidden: Sorry, your request is forbidden
    # Default policy is to forbid everything, let's 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
于 2015-03-05T12:41:36.323 に答える
6

私はそれが古いトピックであることを知っています。私は同じ問題に遭遇しました.ESをNginxの後ろに置いて読み取り専用にし、kibanaがアクセスできるようにしました。

私の場合、Kibana が必要とする ES からの唯一のリクエストは「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;
    }
}

したがって、リクエストが _all/_search でない限り、GET リクエストのみが許可されます。必要に応じて他のリクエストを追加するのは簡単です。

于 2014-10-22T19:12:03.143 に答える
5

Elasticsearch は信頼できる環境で使用することを意図しており、それ自体にはアクセス制御メカニズムはありません。したがって、elasticsearch を展開する最善の方法は、elasticsearch に到達できるクエリのアクセスとタイプの制御を担当する Web サーバーをその前に配置することです。そうは言っても、 elasticsearch-jettyプラグインを使用することで、elasticsearch へのアクセスを制限することができます。

于 2013-01-02T00:15:10.013 に答える
3

Elastic でも Solr でも、セキュリティを検索エンジンに依存するのは得策ではありません。コンテナでセキュリティを使用するか、コンテナをApache HTTPD のような本当に防弾の背後に置き、禁止したいものを禁止するようにセキュリティを設定する必要があります。

于 2013-01-02T00:12:55.787 に答える
0

nginx の背後に公開されている ES インスタンスがあり、内部で更新されている場合、これらのブロックは準備のみを行い、_search エンドポイントのみを許可する必要があります。

    limit_except GET POST OPTIONS {
        allow 127.0.0.1;
        deny  all;
    }
    if ($request_uri !~ .*search.*) {
        set $sc fail;
    }
    if ($remote_addr = 127.0.0.1) {
        set $sc pass;
    }
    if ($sc = fail) {
        return 404;
    }
于 2020-11-20T21:58:36.173 に答える