Kibana 4.3 に Basic 認証機能をつけるプラグインをつくってみた。 | パークのソフトウエア開発者ブログ|ICT技術(Java・Android・iPhone・C・Ruby)なら株式会社パークにお任せください

パークのソフトウエア開発者ブログ|ICT技術(Java・Android・iPhone・C・Ruby)なら株式会社パークにお任せください

開発の解決方法や新しい手法の情報を、パークのエンジニアが提供します。パークのエンジニアが必要な場合は、ぜひお気軽にお問い合わせ下さい。 株式会社パーク:http://www.pa-rk.co.jp/

どうも、ちかです
最近めっちゃ忙しい。。

Kibana ってこんなの

Elasticsearch のデータを可視化するツールです。

こういうブログ記事では
まず導入として
Kibana ってこんなの」っていう話をするものですが
すでに知ってる人向けの記事ということで。

Kibana プラグイン

Kibana 4.2 からプラグインで機能を追加できるようになりました。

サーバー側は Node.js のフレームワーク hapi ベースで
クライアント側は AngularJS ベースで
とりあえずなんでもできます。

特に Elasticsearch へのアクセスは
サーバーから手軽にできるようになっています。
サーバー側でプロキシを作ればクライアントからも簡単にアクセスできます。

# Elasticsearch への GET メソッドのクチはデフォルトで開いてます。
# elasticsearch.js の API を
# サーバーでは server.plugins.elasticsearch.client として使えます。
# クライアントでは es という名前で依存性注入できます。

Kibana プラグインの作り方

Qiita に
Kibanaプラットフォームでアプリケーションをつくってみよう
という濃いぃ記事があるのでご参考に。

ミニマム構成では index.js と package.json があれば OK。

認証プラグイン


Kibana を使ってみて気になったのが
認証機能がないこと。

Shield という Elasticsearch プラグインがあるらしいのですが
有償らしいので (セキュリティ向けプラグインShieldのリリース(日本語訳))
とりあえずあきらめて

Authentication という Issue ページも立っているのですが
4.2 ⇒ 4.3 ⇒ 4.4 と先延ばし先延ばしにされているので
とりあえずあきらめて

作ってみました。

  • index.js
const Boom = require('boom');

var users = {
  chica: {
    password: 'secret'
  }
};

module.exports = kibana => new kibana.Plugin({
  init(server, options) {
    server.auth.scheme('basic', basic);
    server.auth.strategy('default', 'basic');
    server.auth.default('default');
  }
});

function basic(server, options) {
  return {
    authenticate(request, reply) {
      const authorization = request.raw.req.headers.authorization;
      if (!authorization) {
        return reply(Boom.unauthorized('Authentication required', 'Basic'));
      }

      const parts = authorization.split(/\s+/);
      if (parts.length !== 2 || parts[0].toLowerCase() !== 'basic') {
        return reply(Boom.unauthorized('Authentication failed.', 'Basic'));
      }

      const credentials = new Buffer(parts[1], 'base64').toString().split(':', 2);
      const user = users[credentials[0]];
      if (!user || user.password !== credentials[1]) {
        return reply(Boom.unauthorized('Authentication failed.', 'Basic'));
      }

      return reply.continue({ credentials: { user: user } });
    }
  };
}
  • package.json
{
  "name": "basic-authentication",
  "version": "0.0.1"
}

index.js と package.json を tar.gz に固めて

kibana/bin/kibana plugin -i basic-authentication -u file://path/to/plugin.tar.gz

こんなので
一応ちゃんと認証が求められるようになります。

まぁでも
これを洗練するより
4.4 が出るのを待つかな。(本末転倒)

今回はこんなところで。