Protéger son cluster Elasticsearch avec Jetty
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}}