Sécuriser ElasticSearch avec Apache mod_proxy

Un des enjeux (une des galères ?) quand on utilise ElasticSearch est de sécuriser les données qui sont dessus.

Il existe plusieurs méthodes pour le faire, qu’il s’agisse de Jetty ou encore l’utilisation d’iptables pour sécuriser le port 9200. Personnellement, je préfère la méthode Apache Proxy, qui est assez simple et permet de maîtriser les adresses IP qui peuvent accéder à ElasticSearch, ou d’appliquer un htaccess (la méthode IP reste plus sûre).

Voici les étapes pour appliquer ma méthode :

Configurer ElasticSearch en local uniquement

Rien de plus simple. Dans le fichier de configuration, trouvez les valeurs network.publish_host & network.host dans le fichier de configuration elasticsearch.yml (qui peut se trouver dans /etc/elasticsearch selon votre configuration), dé-commentez ces lignes et affectez l’adresse locale 127.0.0.1 :

network.publish_host: 17.0.0.1
network.host: 127.0.0.1

Au passage, profitez-en pour faire tourner ElasticSearch sur un disque qui a suffisemment d’espace, plutôt que dans le rootfs (par défaut) :

path.data: /home/elasticsearch/data
path.work: /home/elasticsearch/tmp
path.logs: /home/elasticsearch/logs

Redémarrez ElasticSearch

sudo service elasticsearch restart

Désormais, notre serveur ne répondra plus qu’aux requêtes provenant du localhost.

Sur Apache

Configurons maintenant la VHOST apache qui va accueillir ElasticSearch.  Mais avant, si vous n’avez jamais fait de reverse proxy sur votre serveur, il faut activer les modules :

sudo a2enmod proxy
sudo a2enmod proxy_http
sudo service apache2 restart

On va partir du principe que le serveur a été configuré avec les pieds et que tout le trafic tombe dans la vhost default pour faire simple.

Éditez le fichier qui se trouve normalement dans :

/etc/apache2/site-available/default

et ajoutez la configuration suivante sous l’instruction DocumentRoot :

ProxyRequests Off
ProxyPreserveHost On

<Proxy>
Order deny,allow
Allow from all
</Proxy>

ProxyPass /es http://localhost:9200
ProxyPassReverse /es http://localhost:9200

<Location /es>
Order deny,allow
Deny from all
Allow from 88.133.243. 78.198.222.13 // Ici se trouvent les IP autorisées a communiquer avec ElasticSearch
</Location>

Normalement, si tout se passe bien, si vous appelez http://monserveur.com/es depuis une des IP que vous avez autorisé, ce dernier répondra correctement, et donnera une 403 depuis une autre IP.

Un des problème de cette configuration est peut-être une légère augmentation du temps de réponse du serveur ElasticSearch, mais je ne l’ai pas encore testé.

P.S. : Si vous travaillez en local, continuez a utiliser l’adresse http://localhost:9200/ pour envoyer des requêtes a ElasticSeach !

N’hésitez pas si vous avez des questions !

Vous aimerez aussi...