2013-01-02 22 views
16

Thật dễ dàng để tải lên một loạt dữ liệu json lên máy chủ elasticsearch để có api truy vấn cơ bản, với nhiều tùy chọnCách dễ dàng để tạo một máy chủ elasticsearch chỉ đọc

Tôi muốn biết nếu có và cách dễ dàng để xuất bản, tất cả ngăn mọi người sửa đổi nó

Từ cài đặt mặc định, máy chủ mở ot nhận được thông báo DELETE hoặc PUT http có thể sửa đổi dữ liệu.

Có một số loại cài đặt nào để định cấu hình để chỉ đọc không? Hoặc tôi sẽ cấu hình một số loại proxy http để đạt được nó?

(Tôi là người mới sử dụng elasticsearch)

Trả lời

3

Với Elastic hoặc Solr, bạn không nên phụ thuộc vào công cụ tìm kiếm để bảo mật. Bạn nên sử dụng bảo mật trong vùng chứa của mình hoặc thậm chí đặt vùng chứa đằng sau thứ gì đó thực sự chống đạn như Apache HTTPD và sau đó thiết lập bảo mật để cấm những thứ bạn muốn cấm.

5

Elasticsearch có nghĩa là được sử dụng trong một môi trường đáng tin cậy và bản thân nó không có bất kỳ cơ chế kiểm soát truy cập nào. Vì vậy, cách tốt nhất để triển khai elasticsearch là với một máy chủ web ở phía trước nó sẽ chịu trách nhiệm kiểm soát truy cập và loại truy vấn có thể tiếp cận elasticsearch. Nói rằng, có thể giới hạn quyền truy cập vào elasticsearch bằng cách sử dụng plugin elasticsearch-jetty.

+2

Sử dụng nginx như một proxy mật khẩu bảo vệ là một giải pháp đơn giản . Sách dạy nấu ăn đầu bếp elasticsearch cũng hỗ trợ điều này. –

20

Nếu bạn muốn hiển thị API Elasticsearch dưới dạng chỉ đọc, tôi nghĩ cách tốt nhất là đặt Nginx ở phía trước nó và từ chối tất cả các yêu cầu ngoại trừ GET. Một cấu hình ví dụ như sau:

# 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; 
    } 

    } 

} 

Sau đó:

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 

Note, mà một người sử dụng độc hại có thể vẫn còn lộn xộn lên máy chủ của bạn, ví dụ gửi trọng tải kịch bản không chính xác, mà sẽ làm cho Elasticsearch gặp khó khăn, nhưng đối với hầu hết các mục đích, cách tiếp cận này sẽ ổn.

Nếu bạn cần kiểm soát nhiều hơn về proxy, bạn có thể sử dụng cấu hình Nginx phức tạp hơn hoặc viết một proxy chuyên dụng ví dụ. trong Ruby hoặc Node.js.

Xem điều này example cho proxy phức tạp hơn dựa trên Ruby.

+0

Có vẻ như Kibana sẽ không hoạt động trên các phương thức http "GET" duy nhất. Bạn đã gặp phải một công việc xung quanh cho điều này? – Kevin

7

Bạn có thể đặt cờ chỉ đọc trên chỉ mục của mình, điều này sẽ giới hạn một số thao tác mặc dù vậy, vì vậy bạn sẽ cần phải xem liệu điều đó có chấp nhận được hay không.

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

Như đã đề cập trong một trong các câu trả lời khác, bạn nên chạy ES trong môi trường đáng tin cậy, nơi bạn có thể kiểm soát quyền truy cập vào nó.

Thông tin thêm về cài đặt chỉ mục tại đây: http://www.elasticsearch.org/guide/reference/api/admin-indices-update-settings/

5

Tôi biết đó là chủ đề cũ. Tôi gặp phải vấn đề tương tự, đặt ES đằng sau Nginx để làm cho nó chỉ đọc nhưng cho phép kibana truy cập nó.

Yêu cầu duy nhất từ ​​ES mà Kibana cần trong trường hợp của tôi là "url_public/_all/_search".

Vì vậy, tôi cho phép nó vào conf Nginx của tôi.

Đây file conf của tôi:

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; 
    } 
} 

Vì vậy, chỉ GET yêu cầu được phép trừ khi yêu cầu là _all/_search. Nó là đơn giản để thêm yêu cầu khác nếu cần thiết.

5

tôi sử dụng này Plugin elasticsearch:

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

Nó rất đơn giản, dễ cài đặt & cấu hình. Trang dự án GitHub có một ví dụ cấu hình cho thấy cách giới hạn các yêu cầu tới phương thức HTTP GET; sẽ không thay đổi bất kỳ dữ liệu nào trong elasticsearch. Nếu bạn chỉ cần IP của danh sách trắng (hoặc không có) để sử dụng các phương pháp khác (PUT/DELETE/etc) có thể thay đổi dữ liệu thì nó cũng đã được bạn bảo vệ.

Something như thế này đi vào elasticsearch tập tin cấu hình của bạn (/etc/elasticsearch/elasticsearch.yml hoặc tương đương), chuyển thể từ trang GitHub:

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 
Các vấn đề liên quan