redashでのアクセス制御について

※redashの権限指定に誤りがあったので修正(2018/01/18)※ f:id:yassan0627:20171202153537p:plain Redash Advent Calendar 2017 の 22日目の記事です!

redashを使って可視化したら今度は、色々な人に公開したくなりますよね?

ただ、会社によっては、「あのデータを全員に見せるのは如何なものか?」勢が少なからずいるはず。
まぁ、なんでもかんでもデータを見せることで事業リスクなったり、インサイダーな重要事実を知っている扱いの人を不用意に増やすのもまた問題でもあります。

そういう訳で、必要な人に適度にデータを公開する為に、redashを使った取り組み事例のご紹介。

検証環境

  • ホスト:Ubuntu 16.04 LTS
  • redashは、Dockerイメージを使って構築(v3.0.0+b3134)

TLDR

  • グループにパーミッション設定をつければ良いが、GUIでは指定不可。 CLIでは出来るようだが、今回はテーブル直接変更した。
  • redashだけでは、クエリ単位のパーミッション設定は出来ない。 なので、ロール違いの同じデータベースなデータソースを複数用意して、ロールに応じて参照権限有/無でうまいこと切り分ける(かなり力技)。

はじめに

redash単体で可能なアクセス制御は以下の通り、ソース見るとパーミッション設定値がそのままなので、イメージが湧くと思います。

cf. redash/groups.py · getredash/redash

@option('--permissions', default=None,
        help="Comma separated list of permissions ('create_dashboard',"
        " 'create_query', 'edit_dashboard', 'edit_query', "
        "'view_query', 'view_source', 'execute_query', 'list_users',"
        " 'schedule_query', 'list_dashboards', 'list_alerts',"
        " 'list_data_sources') (leave blank for default).")

見難いので、整理するとこんな感じ

create_dashboard
create_query
edit_dashboard
edit_query
execute_query
list_alerts
list_dashboards
list_data_sources
list_users
schedule_query
view_query
view_source

また、コードにもあるとおり、パーミッションはグループに付与するようです。
ここでは、CLI経由でグループ作成時に指定するようです。GUIでは指定出来ないので、CLIを使う事になりますが、イマイチわからないので、テーブルを直接書き換えちゃいます

前提条件

ユーザ 所属グループ パーミッション
member1 member_group すべての操作可能
manager1 manager_group ダッシュボードの選択と閲覧しか出来ない

cf. ダッシュボードの用意には、id:kakku22 さんの kakakakakku/redash-hands-on: Redash study materials for beginners 📊 を活用させていただきました。
cf. testデータソース用のテーブルデータは、 Mockaroo を使ったダミーテーブルを作成しました

ユーザ及びグループの作成

まず、グループの作成、管理者ユーザでredashにログインし、グループを2つ作成し、ユーザを各々所属させます。

f:id:yassan0627:20171217184557p:plain
f:id:yassan0627:20171217184602p:plain

グループのパーミッションの変更

次に、redashのデータベースに入って、groupsテーブルを以下のようにいじります

f:id:yassan0627:20171217184220p:plain

グループ パーミッション
'member_group' '{"view_query","execute_query","list_dashboards"}'
'manager_group' '{"create_dashboard","create_query","edit_dashboard","edit_query","view_query","view_source","execute_query","list_users","schedule_query","list_dashboards","list_alerts","list_data_sources"}'

※更新すると即時反映されます

変更結果

manager1の表示

デフォルトと特に変わりません
f:id:yassan0627:20171217185352p:plain
f:id:yassan0627:20171217185355p:plainf:id:yassan0627:20171217185359p:plain f:id:yassan0627:20171217185406p:plain

member1の表示

一方、memberの方は、クエリやアラートなどの表示が消えて選択できなくなっています。
f:id:yassan0627:20171217185806p:plain

また、ダッシュボードの作成も出来ません。
f:id:yassan0627:20171217185809p:plain

ダッシュボードも右端にあるはずの編集ボタンが消え、各クエリへのリンクもなくなっていることがわかります。
f:id:yassan0627:20171217190313p:plain

データソースを分ける

データベース test を作成して、ロール ope_1、ope_2を作成して、以下のように権限設定します。

テーブル名 ope_1 ope_2
users 参照可能 参照不可
play_list 参照可能 参照可能

下記のようにデータソースを作成

ope_2が参照出来ない ope_2で参照
f:id:yassan0627:20171217202048p:plain f:id:yassan0627:20171217202059p:plain

各グループに作成したデータソースを割り当て

グループ 設定
manager f:id:yassan0627:20171217203255p:plain
member f:id:yassan0627:20171217202402p:plain

クエリを下記のように作成

f:id:yassan0627:20171217202609p:plainf:id:yassan0627:20171217202614p:plain

上記2つのクエリをならべたダッシュボードを作成して、ユーザによって表示を確認

グループ 表示
manager f:id:yassan0627:20171217203337p:plain
member f:id:yassan0627:20171217203343p:plain

まとめ

以上が現状までに考えた対策です。
ただ、これ非常にややこしい(特にデータソースで分ける辺り)。しかも、柔軟性に乏しいので、その場しのぎでしか無いです。

この方が楽だとか、あればぜひ教えてください!

明日は、 @katsuhisa__ さんです。お楽しみに。