Se si desidera esporre l'API Elasticsearch come di sola lettura, penso che il modo migliore sia mettere Nginx di fronte ad esso e negare tutte le richieste tranne GET. Un esempio di configurazione si presenta così:
# 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;
}
}
}
Poi:
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
nota, che un utente malintenzionato potrebbe ancora rovinare il vostro server, ad esempio l'invio di carichi di script non corretti, il che renderebbe elasticsearch si blocca, ma per la maggior parte degli scopi, questo approccio andrebbe bene.
Se è necessario un maggiore controllo sul proxy, è possibile utilizzare una configurazione Nginx più complessa o scrivere un proxy dedicato ad es. in Ruby o Node.js.
Vedere questo example per un proxy più complesso basato su Ruby.
Utilizzando nginx come proxy protetto da password è un'altra soluzione semplice . Anche il libro di cucina elasticsearch sostiene questo. –