2013-01-02 40 views
16

這真的很容易,只是上傳一堆的JSON數據到elasticsearch服務器有一個基本的查詢API,有很多的選擇簡單的方式讓一個elasticsearch服務器只讀

我只是想知道如果有簡單的方法發佈它,所有這些都可以防止人們修改它

從默認設置開始,服務器將不會收到將修改數據的DELETE或PUT http消息。

是否有某種設置將其配置爲只讀?或者我應該配置某種類型的http代理來實現它?

(我是一個新手elasticsearch)

回答

3

無論使用哪種彈性或Solr的,它不依賴於你的安全搜索引擎是一個好主意。你應該在你的容器中使用安全性,或者甚至把容器放在真的像Apache HTTPD這樣的防彈設備上,然後設置安全性來禁止你想禁止的東西。

5

Elasticsearch旨在用於受信任的環境,並且本身沒有任何訪問控制機制。因此,部署彈性搜索的最佳方式是在其前面安裝一個Web服務器,負責控制可以實現彈性搜索的訪問和查詢類型。說,可以通過使用elasticsearch-jetty插件來限制對elasticsearch的訪問。

+2

nginx的使用作爲一個受密碼保護的代理是另一種簡單的解決方案。 elasticsearch廚師食譜也支持這一點。 –

20

如果您想將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的代理,請參閱此example

+0

似乎Kibana不會只使用「GET」http方法操作。你有沒有遇到過這個問題? – Kevin

7

你可以在你的索引上設置一個只讀標誌,但是這會限制一些操作,所以你需要看看是否可以接受。

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/

5

我知道這是一個老話題。我遇到了同樣的問題,將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; 
    } 
} 

因此,只有GET請求被允許,除非請求是_all/_search。如果需要添加其他請求很簡單。

5

我用這個插件elasticsearch:

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

這是非常簡單,安裝方便&配置。 GitHub項目頁面有一個配置示例,顯示如何僅將請求限制爲HTTP GET方法;這不會改變elasticsearch中的任何數據。如果您只需要列入白名單的IP地址(或無)以使用其他可以更改數據的方法(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'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 
相關問題