Taste of Tech Topics

Acroquest Technology株式会社のエンジニアが書く技術ブログ

Kibanaのマルチテナント運用について考えてみた(前編)

こんにちは。
@です😊

最近Elasticsearch + Kibanaをマルチテナントで利用する方を多く見かけます。
そういったときに問題になってくるのが、セキュリティですね。

たとえば

  • 「一部のダッシュボードだけを見せたい」
  • 「編集できないようにしたい」
  • ダッシュボードの存在を知られたくない」

など、色々とセキュリティ要件が発生するはずです。

この記事では、実際に上記のような設定ができるのか、どうやって設定するのかといったところを
改めて整理してみます。
※多少回りくどい検証過程を書いているので、「結局どうしたらいいの?」という部分のみ知りたい方は、後編にご期待ください。

バージョン情報など

macOS High Sierra version 10.13.2
Elasticsearch 6.1.1
Kibana 6.1.1
Logstash 6.1.1
x-packはElasticsearchとKibanaにインストールしています(試す場合はトライアル版で構いません)

目次

  1. 下準備(サンプルデータの内容など)
  2. indexごとに制御
  3. ダッシュボードの閲覧専用ユーザー(後編)
  4. ダッシュボードの存在を隠す(後編)

下準備

まずは、今回の記事で使うサンプルデータについてです。

想定として、自分がkibanaによるログ可視化サービスを提供しており、クライアントとしてA社およびB社がいると仮定します。
さらにクライアントの中にも、管理者と一般ユーザーがいると仮定しましょう。
整理すると下のような4種類になります(厳密にはサービス自体の管理者を含むと5種類)

A社 B社
admin A社のダッシュボードを編集できる B社のダッシュボードを編集できる
一般社員 A社のダッシュボードの閲覧のみ可能 B社のダッシュボードの閲覧のみ可能

作成してあるダッシュボード

f:id:acro-engineer:20180105155411p:plain:w800

ダッシュボード名 使用index 概要
[A社]売り上げ推移 company_a A社の売り上げ推移を可視化したダッシュボード
[B社]売り上げ推移 company_b B社の売り上げ推移を可視化したダッシュボード
[管理者]売り上げ推移ダッシュボード company_a, company_b A社B社のデータを横断して推移を可視化したダッシュボード

それぞれのダッシュボードは下の画像のようになっています。
(機能確認用のサンプルなので必要最低限の内容です)

  • [A社]売り上げ推移

f:id:acro-engineer:20180105161123p:plain:w500

  • [B社]売り上げ推移

f:id:acro-engineer:20180105161158p:plain:w500

f:id:acro-engineer:20180105161303p:plain:w500


各ユーザーごとの権限は下記の通りです。

[A社]売り上げ推移 [B社]売り上げ推移 [管理者]売り上げ推移ダッシュボード
admin 編集可能 編集可能 編集可能
userA_admin 編集可能 閲覧不可 閲覧のみ※
userA_general 閲覧のみ 閲覧不可 閲覧のみ※
userB_admin 閲覧不可 編集可能 閲覧のみ※
userB_general 閲覧不可 閲覧のみ 閲覧のみ※

※自社データのみ閲覧可能

index毎に制御

まず、もっともシンプルなアクセス制御方法として、index毎の権限を設定する方法があります。
例えば「userA_adminにはcompany_a indexへのall権限」、「userB_generalにはcompany_b indexへのread権限のみ」といった具合です。
この部分は非常にシンプルですが、実際にKibanaで設定してみます。

既に使ったことのある方はご存じかと思いますが、
Elasticsearchのアクセス制御の仕組みは、Roleとして権限グループを作成し、そこにUserを結びつけることで実現します。

ではまず、A社のadminである「userA_admin」について見ていきます。

最初に、Roleとして「roleA_admin」を作成します。
f:id:acro-engineer:20180106065722p:plain:w700

Create roleを選択し...
f:id:acro-engineer:20180106070305p:plain:w700

Role名および権限を設定します。
ここではcompany_aというindexにall権限を付与しています。
※Cluster Privilegesに関する説明は本記事では割愛します。要望があれば別途まとめる....かもしれません。
f:id:acro-engineer:20180106070828p:plain:w800

次にroleA_adminのロールに紐付くユーザーとしてuserA_adminを作成します。
f:id:acro-engineer:20180106071246p:plain:w700

Create userを選択します。
f:id:acro-engineer:20180106071452p:plain

userA_adminという名前のユーザーを作り、Roleとして、「roleA_admin」「kibana_user」を付与します。
(kibana_userについては後述します。kibanaを使うために必要な権限だと考えてください。)
f:id:acro-engineer:20180121211001p:plain:w700

userA_adminでログインして、ダッシュボードを確認してみます。
f:id:acro-engineer:20180121214558p:plain:w700

上がA社のダッシュボード、下がB社のダッシュボードです。
B社のダッシュボードは見えなくなっていますね。
※ただし、「B社のダッシュボードが存在すること」がわかってしまいます。この問題については後述します。
f:id:acro-engineer:20180121215244p:plain:w600
f:id:acro-engineer:20180121214935p:plain:w600


他のユーザーなども同様に作ります。
f:id:acro-engineer:20180121221821p:plain:w700

試しにuserA_generalも試してみます。
期待する挙動はA社ダッシュボードの閲覧のみができることです。

しかし....編集できてしまいました....
f:id:acro-engineer:20180121225436p:plain:w700

そうなんです。
Kibanaのダッシュボード自体の情報は、.kibanaというindexに保存されているので、
company_aのindexを制御しても、ダッシュボードの編集や削除ができてしまうのです。
B社のダッシュボードが一覧に表示されてしまったのもこのためです。
つまり、ダッシュボードの編集権限をカットするには、.kibana indexへの権限を制限する必要があります。
f:id:acro-engineer:20180121232810p:plain:w700


少し長くなってしまったので、その方法に関しては、後編で書くことにします。
ご期待ください☺️

Acroquest Technologyでは、キャリア採用を行っています。

  • ビッグデータHadoop/Spark、NoSQL)、データ分析(Elasticsearch、Python関連)、Web開発(SpringCloud/SpringBoot、AngularJS)といった最新のOSSを利用する開発プロジェクトに関わりたい。
  • マイクロサービスDevOpsなどの技術を使ったり、データ分析機械学習などのスキルを活かしたい。
  • 社会貢献性の高いプロジェクトや、顧客の価値を創造するようなプロジェクトで、提案からリリースまで携わりたい。
  • 書籍・雑誌等の執筆や、対外的な勉強会の開催・参加を通した技術の発信、社内勉強会での技術情報共有により、エンジニアとして成長したい。


少しでも上記に興味を持たれた方は、是非以下のページをご覧ください。
データ分析基盤Elasticsearchを使い倒したいエンジニア募集! - Acroquest Technology株式会社のエンジニア中途・インターンシップ・契約・委託の求人 - Wantedlywww.wantedly.com