這真的很容易,只是上傳一堆的JSON數據到elasticsearch服務器有一個基本的查詢API,有很多的選擇簡單的方式讓一個elasticsearch服務器只讀
我只是想知道如果有簡單的方法發佈它,所有這些都可以防止人們修改它
從默認設置開始,服務器將不會收到將修改數據的DELETE或PUT http消息。
是否有某種設置將其配置爲只讀?或者我應該配置某種類型的http代理來實現它?
(我是一個新手elasticsearch)
這真的很容易,只是上傳一堆的JSON數據到elasticsearch服務器有一個基本的查詢API,有很多的選擇簡單的方式讓一個elasticsearch服務器只讀
我只是想知道如果有簡單的方法發佈它,所有這些都可以防止人們修改它
從默認設置開始,服務器將不會收到將修改數據的DELETE或PUT http消息。
是否有某種設置將其配置爲只讀?或者我應該配置某種類型的http代理來實現它?
(我是一個新手elasticsearch)
無論使用哪種彈性或Solr的,它不依賴於你的安全搜索引擎是一個好主意。你應該在你的容器中使用安全性,或者甚至把容器放在真的像Apache HTTPD這樣的防彈設備上,然後設置安全性來禁止你想禁止的東西。
Elasticsearch旨在用於受信任的環境,並且本身沒有任何訪問控制機制。因此,部署彈性搜索的最佳方式是在其前面安裝一個Web服務器,負責控制可以實現彈性搜索的訪問和查詢類型。說,可以通過使用elasticsearch-jetty插件來限制對elasticsearch的訪問。
如果您想將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。
似乎Kibana不會只使用「GET」http方法操作。你有沒有遇到過這個問題? – Kevin
你可以在你的索引上設置一個只讀標誌,但是這會限制一些操作,所以你需要看看是否可以接受。
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/
我知道這是一個老話題。我遇到了同樣的問題,將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。如果需要添加其他請求很簡單。
我用這個插件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
nginx的使用作爲一個受密碼保護的代理是另一種簡單的解決方案。 elasticsearch廚師食譜也支持這一點。 –