Redash 認可・権限まとめ

Redashの認可についてドキュメントがなく、運用上把握する必要があったためソースコードを読みました。
その内容をここへまとめます。

権限について確認したい方は一番下の表へ

# 前提

## 環境

Redash 8.0.0+b32245 (a16f551e)

## 扱うこと

- バックエンドでの認可及び権限

## 扱わないこと
オブジェクト[^1]は、admin or オブジェクトの所有者であれば当然ながらアクセスすることができます。
そのようなケースをここでは扱いません。

また、フロントエンドでの表示の出し分けについても扱いません。

# Redashの認可とは
Redashの認可はざっくりと3つあります。

1.WebAPI実行の認可
2.データソースの認可
3.クエリ等オブジェクトの認可

1,2 はグループで、3 はユーザに対して個別で設定することができます。

## WebAPIの認可
特定のエンドポイントでは、実行するために権限が必要となります。
この権限はグループに対して設定することができ、グループに所属するユーザへ間接的に付与されます。

## データソースの認可
クエリを実行するためには、データソースへアクセスする権限が必要となります。
この権限はグループに対して設定することができ、グループに所属するユーザへ間接的に付与されます。

## クエリ等オブジェクトの認可
クエリやダッシュボードを変更できるのは、adminもしくはそのオブジェクトの所有者のみです。
他のユーザでも変更できるようにするためには、 `access_permissions` テーブルを操作することになります。
以降では取り扱いません。
以下を参考すると権限の設定を行うこと出来ます。
https://qiita.com/kam0chi/items/b5c6ba2e14c8d50d0343


# Redash の権限について
前述したようにグループは、所属しているユーザに権限を割り当てる所謂ロールとしての機能があります。

標準でadmin、defaultというグループがあります。
それぞれが保持する権限は以下となります。

**adminグループ**

- admin 
- super_admin

**defaultグループ**

- 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

FYI: https://github.com/getredash/redash/blob/004bc7a2ac0de041907ab0b9b560151ea7057332/redash/models/users.py#L260

新規作成したグループもdefaultと同じ権限を持ちます。

この権限はCLIより操作することができます。
やりかたはこちら。
https://qiita.com/kam0chi/items/ec78ec075c7c8410d02c


# 権限できること

## ダッシュボード
| WebAPI | 実行に必要な権限 | アクセス先のオブジェクトに対する権限 | NOTE |
| --- | --- | --- | --- |
| 作成 | list_dashboards |  |  |
| 編集 | edit_dashboard | require_object_modify_permission[^2] |  |
| 削除 | edit_dashboard |  | 誰でもできる |
| Widget追加 | edit_dashboard | require_object_modify_permission |  |
| Widget編集 | edit_dashboard | require_object_modify_permission |  |
| Widget削除 | edit_dashboard | require_object_modify_permission |  |
| 一覧取得 | list_dashboards  |  | 自分が参照できるデータソースのクエリを持つDashboard |
| 検索 | list_dashboards  |  | 自分が参照できるデータソースのクエリを持つDashboard |
| 取得 | list_dashboards  |  |  |


## クエリ
| WebAPI | 実行に必要な権限 | アクセス先のオブジェクトに対する権限 | NOTE |
| --- | --- | --- | --- |
| 作成 | create_query | データソースのFullAccess権限 |  |
| 編集 | edit_query | require_object_modify_permission |  |
| QueryAPIKey再生成 | edit_query | require_admin_or_owner |  |
| fork | edit_query | データソースのFullAccess権限 |  |
| Visualization作成 | edit_query | require_object_modify_permission |  |
| Visualization更新 | edit_query | require_object_modify_permission |  |
| Visualization削除 | edit_query | require_object_modify_permission |  |
| 保存されたクエリの実行 | view_query | データソースのViewOnly権限以上 |  |
| クエリの実行結果取得 | view_query | データソースのViewOnly権限以上 |  |
| 保存されてないQueryの実行 | execute_query | データソースのFullAccess権限 |  |
| 検索 | view_query |  | 自分が参照できるデータソースのクエリ |
| 取得 | view_query | データソースのViewOnly権限以上 |  |

## Alert
| WebAPI | 実行に必要な権限 | アクセス先のオブジェクトに対する権限 | NOTE |
| --- | --- | --- | --- |
| 作成 |  |  | 誰でも |
| 一覧取得 | list_alerts |  |  |


## データソース
| WebAPI | 実行に必要な権限 | アクセス先のオブジェクトに対する権限 | NOTE |
| --- | --- | --- | --- |
| 一覧 | list_data_sources |  | - admin<br>- 自身が所属しているグループで参照できるもの |
| データソースの設定取得 | admin |
| データソースの設定作成 | admin |
| データソースの設定変更 | admin |
| データソースの設定削除 | admin |

※データソースの設定変更は、細かくAPIが別れていましたが全てadmin権限が必要なので集約しました。


## Org
| WebAPI | 実行に必要な権限 | アクセス先のオブジェクトに対する権限 | NOTE |
| --- | --- | --- | --- |
| 設定取得 | admin |  |  |
| 設定変更 | admin |  |  |



## グループ
| WebAPI | 実行に必要な権限 | アクセス先のオブジェクトに対する権限 | NOTE |
| --- | --- | --- | --- |
| グループの設定作成 | admin |  |  |
| グループの設定一覧取得 |  |  | - admin<br>- 自身が所属しているグループで参照できるもの |
| グループの設定取得 |  |  | - admin<br>- 自身が所属しているグループで参照できるもの |
| グループの設定変更 | admin |  |  |
| グループの設定削除 | admin |  |  |
| グループのメンバ取得 | list_users |  | - admin<br>- 自身が所属しているグループ |
| グループのメンバが参照できるデータソース一覧取得 | admin |  |  |
| グループのメンバが参照できるデータソース変更 | admin |  |  |
| グループのメンバが参照できるデータソース削除 | admin |  |  |


## ユーザ
| WebAPI | 実行に必要な権限 | アクセス先のオブジェクトに対する権限 | NOTE |
| --- | --- | --- | --- |
| 一覧取得 | list_users |
| 追加 | admin |
| パスワードリセット | admin | 
| 削除 | admin |
| 無効化 | admin |


## Alert Destination
| WebAPI | 実行に必要な権限 | アクセス先のオブジェクトに対する権限 | NOTE |
| --- | --- | --- | --- |
| 一覧取得 | admin |
| 取得 | admin |
| 作成 | admin |
|変更 | admin |
| 削除 | admin |

## Events
| WebAPI | 実行に必要な権限 | アクセス先のオブジェクトに対する権限 | NOTE |
| --- | --- | --- | --- |
一覧取得 | admin |
| 作成 |  |  | 誰でも|




[^1]: クエリやダッシュボード、データソース、ユーザなどのこと
[^2]: admin or 所有者 or `access_permissions` テーブルのレコードで変更権限を持っていること