Redash で google login を有効にする方法。権限変更のためのmanage.pyが動かない時の代替案


# これは何
自分で`AWS`で提供されているAMIを使ってインストールした場合、google loginはデフォルトで無効になっていた。
最初はRedash独自の認証機構を使っていたが以下の問題があった。

* 社内のRedashユーザが退職したケースに対応が面倒。毎回忘れずにユーザ削除をしないといけない
* 多要素認証がない

Redash は google login を使えるので、導入して上記問題を解決したい。

Redash とは？というのは、他にもたくさん情報があるので割愛します。https://redash.io/
よく`Re:dash`と表記されているのでそれが正式名称なのかな？と思いましたが、公式サイトだと`Redash`の表記になっていたのでこの記事ではその表記に合わせます。

# google login を入れた時に考えられる問題点

社内ドメインのアドレスのユーザだったら誰でもログインできる？

* google login を有効にして、許可するドメインをかくと、そのドメインをもつメールアドレスのユーザが誰でもログインしてRedashを使ってQueryを書くことができる。センシティブなデータを扱っている場合、誰でも入れるというのは避けたい
* 新規ユーザには default の group がデフォルトでつくようになっているが、その権限を制限できるか？

解決策？

* ここら辺を確認して権限をつけたり外したりできそう　http://next4us-ti.hatenablog.com/entry/2019/03/20/180311
* manage.py がどんなサブコマンでも全く応答しないので使えない

真：解決策

* default グループから権限を剥奪する
* member グループとでも命名したものにデフォルト同様の権限をつける（新規作成でデフォルトの権限）。新たにRedashを使うユーザにはこのグループをGUIから操作して手動で割り当てる
* 私の環境はで**manage.pyは全く応答しなかったので、データベースを直接いじることにした**。これについてはハマりどころの章で説明します。


# google login有効化まではこの通りにやればできる手順書
* token 作成はこれに沿ってやる => https://redash.io/help/open-source/admin-guide/google-developer-account-setup
* token をサーバに設定するのはこの手順でやる => https://redash.io/help/open-source/setup#Google-OAuth-Setup


# ハマりどころ（この記事のメインコンテンツ）
特にAWSのAMIを使った場合は内部的にdockerで動いているので、ちょっとだけハマったのでそれについてだけ補足説明を書いておきます。

### docker-compose.yml と env のありか

サーバにsshログインすると以下のディレクトリに置かれているのがわかります。
**envにpostgresのパスワードなどが書かれている**ので、中身見ておきましょう。

```
# pwd
/opt/redash
# ls
docker-compose.yml  env  postgres-data
```

サーバログインして`sudo su -` で root になってディレクトリ移動し、dockerコンテナ全部再起動すると env 読み込みできる。うまくいかなければサーバ再起動でもOK。
dockerコンテナ再起動方法は以下のもの

```
$ docker-compose down
$ docker-compose up -d
```

### group権限の書き換え

権限やクエリを保存している postgres に繋いで、 groups テーブルの default グループの permissions のところを書き換えて権限0にする。
AWS AMIから作ったインスタンスはデフォルトでローカルにpostgresコンテナが立っているようなので、ここに接続する。


```
# docker exec -it --user root redash_postgres_1 bash
// docker コンテナの中で以下のコマンド
// password はenv ファイルに書かれているものを使用
# psql -h localhost -U postgres -d postgres --password
```

postgres に入った後はMySQLとの対応コマンドリストを参照してみていく。神ドキュメント => 　https://qiita.com/aosho235/items/c657e2fcd15fa0647471

コンソールでグループを作った上で以下の作業を行う。グループ作成の時に空白を入れないこと。DBにそのまま保存されてしまう、whereで絞る時に苦労する。


```
postgres=# select * from groups;
 id | org_id |  type   |    name    |                                                                              permissions                                                                               |          created_at
----+--------+---------+------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-------------------------------
  1 |      1 | builtin | admin      | {admin,super_admin}                                                                                                                                                    | 2020-06-30 05:12:08.756199+00
  2 |      1 | builtin | 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} | 2020-06-30 05:12:08.756199+00
  3 |      1 | regular | member     | {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} | 2020-07-01 09:44:08.588092+00
(3 rows)

```


```
# UPDATE groups SET permissions = '{}' WHERE name = 'default';
```


```
postgres=# select name, permissions from groups;
            name             |                                                                              permissions
-----------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 admin                       | {admin,super_admin}
 default                     | {}
 member                      | {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}
```

これで、このグループをつけたユーザがどうなるか？というところだが、自分のプロフィール以外実質何もできなくなったのでOK。一応ログインはできる。

### インスタンスサイズが小さいと動かない

Redashに割り当てるインスタンスサイズは t2.micro だとnginxがエラー（確か internal server error？）を吐いてしまいました。おそらくメモリサイズが足りないのだろうと思って t3.small を割り当てると動きました。