Elasticsearch 5.0とともにsite pluginを動かす

Elasticsearch 0.17で、Elasticsearchは静的なWebページを公開する site pluginの機能を追加しました。 site pluginによってユーザはElasticsearchにグラフィカルユーザインターフェースを提供するJavascriptアプリを作成することができました。

これにより、ElasticsearchユーザはElasticsearchの統計値をモニタリングしたり、インデックスの管理、セグメントのマージの可視化、アナライザのデバッグやクラスタリングなどのためのプラグインを開発することができました。

最も人気のあるsite pluginは HeadKopfで、どちらもインデックス管理とモニタリングの機能を持っています。

ここまではいい話でしたが、ここからは悪いお知らせです。。。

site plugin はElasticsearch 5.0では使えなくなります。

なぜ、この人気のある機能を使えなくするのでしょうか?

ElasticsearchはWebサーバとしてデザインされていないためです。静的なファイルを扱うのは、Elasticsearchが提供しているHTTP RESTインタフェースに追加するのが簡単なハックでした。静的なファイルを扱う有害な点は何でしょう?

静的なファイルを扱うこと自体が有害であることがわかります。 これまで発見された7つのセキュリティ脆弱性のうちの2つがsite pluginに関係ありました。 特に必須機能ではないものなのにです。対照的に、他の2つのセキュリティ脆弱性はdynamic scriptingによるもので、問題解決のために私たちは 新しいスクリプト言語を作りました。

Elasticsearchは現在は、Java Security Managerの元で起動します。Elasticsearchのコアが必要とする特権を最小限にするようにしました。さらに特権のエスカレーションやファイルアクセスに必要なコードのかたまりをより制限するためにコアとモジュールに分けています。ゼロデイ脆弱性を見つけるようなハッカーに脆弱性を公開する範囲を最小限にする目的で様々なことを行っています。

必要でない機能であるWebサーバを実行するのはこの目的から外れてしまいます。

さらに、Elasticsearch上でWebアプリケーションをホスティングするということは、Elasticsearchをインターネットにさらすという悪い習慣を助長します。個別のよりセキュアなネットワークで実行すべきなのに。

Elasticsearch 5.0とsite pluginを一緒に動かす方法

最も人気のあるsite pluginである HeadKopf (もうすぐCerebroに置き換わる)や HQはすでに、Elasticsearchの外で実行する方法があります。よくご存知の方法です。site pluginはHTML、Javascript、CSS、画像ファイルから構成されており、Webサーバで扱うことができます。ローカルでの利用であれば、PythonのSimpleHTTPServerでもできます。

cd my_plugin/
python -m SimpleHTTPServer 8000

site pluginはユーザのブラウザからElasticsearchに直接リクエストしていたので、Elasticsearchに Cross Origin Resource Sharingを許可する設定を少し追加する必要があります。

例えば、次の設定を elasticsearch.yml設定ファイルに追加します。

http.cors.enabled: true
http.cors.allow-origin: /https?:\/\/localhost(:[0-9]+)?/

allow-originの設定はsite pluginをホストしているWebサーバのアドレスにマッチする正規表現になります。CORS設定については、 HTTP module ドキュメントをご覧ください。

Elasticsearchで X-PackのSecurity機能 (以前のShield)を利用している場合は、次の設定も追加する必要があります。

http.cors.allow-credentials: true
http.cors.allow-headers: X-Requested-With,X-Auth-Token,Content-Type, Content-Length, Authorization

site pluginより高機能なもの

もし、あなたがプラグインの作者で、静的なWebファイルのホスティング以上のものを提供したい場合は、 Kibana pluginの開発を検討しましょう。

KibanaはNode.js Webサーバを利用しており、プラグインはサーバサイドの機能を持つことができます。例えば、ユーザのブラウザからのリクエストの代わりに、Kibanaのバックエンドサーバから直接Elasticsearchの呼び出しを行えます。

Kibana plugin generator もあります。プラグインを開発する最初の一歩になりますし、またElastic{ON}16のビデオがこの方法を説明しています。もちろん、 IRCフォーラムでKibanaの開発者に質問することも可能です。