2013-01-02 15 views
16

E 'davvero facile da caricare solo un mucchio di dati JSON a un server elasticsearch per avere un'API di query di base, con un sacco di opzionifacile modo per fare un server elasticsearch sola lettura

Vorrei solo sapere se c'è e un modo semplice per pubblicarlo tutto impedendo alle persone di modificarlo

Dall'impostazione predefinita, il server è aperto per ricevere un messaggio http DELETE o PUT che modifica i dati.

Esiste un tipo di impostazione per configurarlo come di sola lettura? O devo configurare qualche tipo di proxy http per raggiungerlo?

(io sono un newbie elasticsearch)

risposta

3

Con entrambi elastico o Solr, non è una buona idea di dipendere dal motore di ricerca per la vostra sicurezza. Dovresti usare la sicurezza nel tuo contenitore, o anche mettere il container dietro qualcosa di veramente a prova di proiettile come Apache HTTPD, e quindi impostare la sicurezza per proibire le cose che vuoi proibire.

5

Elasticsearch è pensato per essere utilizzato in un ambiente fidato e di per sé non ha alcun meccanismo di controllo di accesso. Quindi, il modo migliore per implementare elasticsearch è con un server web di fronte ad esso che sarebbe responsabile del controllo dell'accesso e del tipo di query che possono raggiungere elasticsearch. Detto questo, è possibile limitare l'accesso a elasticsearch utilizzando il plug-in elasticsearch-jetty.

+2

Utilizzando nginx come proxy protetto da password è un'altra soluzione semplice . Anche il libro di cucina elasticsearch sostiene questo. –

20

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.

+0

Sembra che Kibana non funzioni solo con i metodi http "GET". Hai incontrato un work-around per questo? – Kevin

7

È possibile impostare un flag di sola lettura sul proprio indice, questo però limita alcune operazioni, quindi è necessario verificare se è accettabile.

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

Come menzionato in una delle altre risposte, in realtà si dovrebbe avere ES esecuzione in un ambiente di fiducia, in cui è possibile controllare l'accesso ad essa.

Maggiori informazioni sulle impostazioni di indice qui: http://www.elasticsearch.org/guide/reference/api/admin-indices-update-settings/

5

so che è un vecchio argomento. Ho riscontrato lo stesso problema, ho messo ES dietro Nginx per renderlo leggibile ma permetto a kibana di accedervi.

L'unica richiesta di ES di cui Kibana ha bisogno nel mio caso è "url_public/_all/_search".

Quindi l'ho permesso al mio conf Nginx.

Qui il mio file di configurazione:

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

in modo da ottenere unica richiesta è permesso a meno che la richiesta è _all/_search. È semplice aggiungere altre richieste se necessario.

5

Io uso questo plugin elasticsearch:

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

E 'molto semplice, facile da installare & configurare. La pagina del progetto GitHub ha un esempio di configurazione che mostra come limitare le richieste al solo metodo GET HTTP; che non cambierà alcun dato in elasticsearch. Se hai bisogno solo di IP # autorizzati (o di nessuno) per usare altri metodi (PUT/DELETE/etc) che possono cambiare i dati, allora avrai anche te coperto.

Qualcosa di simile va nel tuo elasticsearch file di configurazione (/etc/elasticsearch/elasticsearch.yml o equivalente), adattato dalla pagina 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 
Problemi correlati