Protéger son cluster Elasticsearch avec Jetty

2012-04-10
2 min read

Nativement, Elasticsearch expose l’ensemble de ses services sans aucune authentification et donc une commande du type curl -XDELETE http://localhost:9200/myindex peut faire de nombreux dégâts non désirés.

De plus, si vous développez une application JQuery avec un accès direct depuis le poste client à votre cluster Elasticsearch, le risque qu’un utilisateur joue un peu avec votre cluster est grand !

Alors, pas de panique… La société Sonian Inc. a open sourcé son plugin Jetty pour Elasticsearch pour notre plus grand bonheur 😉

Principe

Le principe consiste à rajouter une surcouche Jetty à Elasticsearch, sous forme de plugin.

Il ne reste plus qu’à restreindre certaines URL et certaines méthodes (DELETE par exemple) à certains utilisateurs.

Guide d’installation

Pour installer le plugin, connectez vous à votre serveur hébergeant Elasticsearch et allez dans le répertoire d’installation :

cd /usr/local/elasticsearch/elasticsearch-0.19.2/

Installez le plugin (vérifiez la compatibilité entre la version du plugin et celle de votre noeud) :

sudo bin/plugin -install sonian/elasticsearch-jetty/0.19.2
- Installing sonian/elasticsearch-jetty/0.19.2...
Trying https://github.com/downloads/sonian/elasticsearch-jetty/elasticsearch-jetty-0.19.2.zip...
Downloading .......................................................................................................................................................................DONE
Installed jetty

Récupérez le fichier de configuration de jetty proposé par Sonian en exemple :

sudo curl https://raw.github.com/sonian/elasticsearch-jetty/master/config/jetty.xml -o config/jetty.xml

Idem pour le fichier avec les logins / password :

sudo curl https://raw.github.com/sonian/elasticsearch-jetty/master/config/realm.properties -o config/realm.properties

Il faut ensuite modifier la configuration Elasticsearch et ajouter la ligne suivante dans config/elasticsearch.yml :

sudo vi config/elasticsearch.yml
# Jetty Plugin
http.type: com.sonian.elasticsearch.http.jetty.JettyHttpServerTransportModule

Les petits gars de Sonian ayant très bien fait leur boulot, les protections nécessaires sont déjà en place avec le fichier config/jetty.xml très complet.

Modifiez les valeurs par défaut de login/password dans config/realm.properties :

superuser: YOURSUPERUSERPASSWORD,admin,readwrite
user: USERPASSWORD,readwrite

Redémarrez Elasticsearch. Si vous l’avez installé en tant que service :

sudo service elasticsearch restart

Et voilà ! Impossible de faire des commandes du type :

curl http://localhost:9200/_refresh
# 401 Unauthorized

Mais avec authentification, ça passe :

curl -u user:USERPASSWORD http://localhost:9200/_refresh
# {"ok":true,"_shards":{"total":23,"successful":23,"failed":0}}
Share this article on
Avatar

David Pilato

20+ years of experience, mostly in Java. Living in Cergy, France.