はじめに
redashはとても便利。
なくてはならないツールの一つになりつつある。
しかし、いざ運用を考えるとロールまわりでいろいろ課題が生まれた。
いかに工夫して課題を回避していったかまとめる。
redashを導入する上で運用上の要件
- 「クエリを書けるグループ」/「書けないが作られたクエリを全て見るグループ」/「その中の一部のクエリを見れるグループ」に分けたい。
- クエリを書けるグループの中で、誰が何のクエリを投げたか、後で確認できるようにしたい。
databaseの中には個人情報が入っているものもあるため、
誰がどのクエリを投げ、どのような結果を知ったのか、要はAuditに相当する機能を入れたい。
調査してわかったこと
redash単体では、我々の要件を満たす機能は"普通には"持っていなかった。
しかし、工夫すれば我々の要件を実現できるのではないか、
という仮説が生まれ、少々泥臭い作業だが運用で回避できるかも。という調査結果が出た。
見せる/見せないの制御のためにやったこと
データソースとグループを分ける
ざっくり3種類に分けた。
・SQLを書けるグループ
・SQLを見るグループ(の中で作成された全クエリ見えるグループ)
・SQLを見るグループ(の中で作成された中でごく限られたクエリ見えるグループ)
データソースについて
接続先のDatabaseは同じだが、
redashの管理上の名前を変えただけで同じような設定を作成した。
- MasterDB
- MasterDB-public
あくまでもredashで管理するデータソースの名前を変えただけなので、
接続するdatabaseのID/PWは同じにした。
グループについて
- Default
- Important
- Writer
上記3種類を作成し、それぞれ使用するデータソースと、権限を変えた
- Defaultグループ
After
MasterDB-publicに対する参照権限のみ与えた
クエリを作成する
上記の通り作成するとWriterユーザーのみ(厳密にいうとAdminは無条件で書き込み可能)
クエリを作成することができる。
Writerユーザーは、
誰にでも見せていいクエリをMasterDB-public
制限したいクエリをMasterDB
に書くようにする。
countryのみMasterDB-Publicにして、一般ユーザーにも見せる事ことにし、
MasterDBは限られたグループ(Important)のみとする
一般ユーザーからの見え方
MasterDB-Publicしか見えない
全参照権限保持ユーザーからの見え方
参照ユーザーでクエリを書く
クエリの作成ボタン自体は消えるわけではないので、Create Queryは押せるが
当然権限を持っていないため、エラーになる。
誰がどのクエリを投げたのか把握する
dockerで稼働している場合、
redash_server_1
コンテナに誰がログインしたのかがログに出力される
このログの中に、メールアドレスと、その前後にQuery Hashというのが表示される。
Adminユーザーでログインしている状態で
/admin/queryresult
へアクセス。
ログの中に記載のあったQuery Hashを元に検索すると、
どのクエリが実行されたのか確認することができる。
そのクエリの結果はどうだったのか。
左のペンボタンをクリックすると、その時の実行結果を確認する事ができる。
まとめ
MySQLのAuditで制限すればいいじゃないかという議論も出ると思うが、
もしMySQLのAuditで確認するとなると、ユーザー分データソースを作らなければならなくなる。
そのため、redash側で今回は対応することにした。
最後に
他社でどのような運用をしているか知りたいので、ぜひ教えてください。