Auth0でRedashとSSOする

# はじめに
はじめましての方ははじめまして！
[HITOTSU株式会社](https://www.hitotsu.co.jp) の宮といいます。

昨年から本格的にプロダクト開発を進めてきたのですが、ひょんなことからアドカレやるかと言うと、ほぼ冗談で言ったにも関わらずメンバーがギラギラしてたのでやることになりました。
とはいえ、書くからには弊社で割と色々経験して取り入れてきたものを共有できると言いなと思ってますので、宜しくお願いいたします。

なのでこの記事は [HITOTSU株式会社のアドベントカレンダー](https://qiita.com/advent-calendar/2022/hitotsu) の3日目です。

# TL;DR
- Auth0使ってて、Redash使ってるならSSOしたら便利
- ActionsやRulesで制限かけるのがオススメ
- 何回か命救われたぞ

# Redashって？
[こちらの記事](https://qiita.com/ririco/items/2c15727141aba89b0812) で詳細に構築の方法やRedashそのもののことは解説頂いていますが、軽く触れると Amazon Athena や Amazon CloudWatch などをデータソースとして、BIを構築できるツールです。

AWSにおいては、Redashは [AMIが公開されている](https://redash.io/help/open-source/setup#aws) ので、比較的簡便に構築できますし、一応最低インフラ要件を満たしておけばそこそこ快適に動作するので、プロダクトメトリクスの分析やアクティビティログの分析など色々な用途を簡単にプロダクトの外側に組み込めるので重宝しています。

## RedashとAuth0のSSO

Redashを初期構築した場合、Redash内部にユーザーアカウントが作成されるため、メールアドレスとパスワードで認証することになるのですが、Auth0などのIDaaSとSAMLベースでSSOすることができます。
ぶっちゃけ [Redashのこの記事](https://redash.io/help/user-guide/users/authentication-options#Auth0) に方法は書いてあるのですが、一応QiitaにAuth0とのSSOについては日本語情報がなかったので、今回掲載しておくことにしました。

## 設定方法

### 完成形

まずRedashをSAMLログインできるようにするとこんな流れになります。

1. Redashにアクセス
もはやAuth0以外でログインしないので、SAML Loginのみにしています。<br /><img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239882/6db6a53f-5861-d524-7c1d-dd50facdde2f.png" />

1. SAMLログインをクリックするとAuth0にRedirect
いつものAuth0のログイン画面に飛びます。<br /><img width="250" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239882/ecac90bb-bee1-9fcd-7fb1-072cf0cb5332.png" />


1. ログイン完了
ユーザー情報は、Auth0のプロフィールが適用されます。<br /><img width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239882/44f21b79-fa9f-15a9-fea4-f0957ddeac76.png" />

### まず前提になるHTTPSのRedashのURL

Auth0でリダイレクト先のURLにはHTTPSしか使えないので、RedashにHTTPSのURLを設定する必要があります。
Route53やACMで先に良い感じのURLと証明書を取得しておきましょう。

### Auth0の設定

Auth0側では、下記の設定が必要になります。

1. Applications で SSO 用の Regular Web Applications を１つ建てる。
1. アプリケーションのSettingsメニューで、Allowed Callback Urls と Allowed Logout Urlに、下記のURLを設定する。
`https://[上で設定したドメイン]/saml/callback?org_slug=default`
1. アプリケーションのAddonsメニューで、「SAML2 Web App」をアクティブに。<br /><img width="450" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239882/7afa98cd-a404-f1d0-af97-2b372e7255d2.png" />
1. SAML2 Web Appをクリック → SettingsメニューのSettingsのところに下記のJSONを貼り付け
```JSON
{
  "mappings": {
    "given_name": "FirstName",
    "family_name": "LastName"
  },
  "passthroughClaimsWithNoMapping": false,
  "includeAttributeNameFormat": false
}
```

※Connectionsの設定は普通のAuth0で認証を行う場合のアプローチと同一なので割愛

### Redashの設定

Redash側では、下記の設定が必要になります。

1. Setting画面から、Settingsメニューを開く<br /><img width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239882/062c3f6d-2df5-4ecf-c46f-73ec571203c2.png" />
1. Settingsメニューの最下部にあるSAMLセクションから下記の設定を追加<br /><img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239882/e59bd264-cbb6-eb81-bdd6-b7221c14f470.png" />
    -  SAML EnabledをONにする
    -  SAML Metadata URL に次のURLを設定<br />`https://[テナントのドメイン]/samlp/metadata/[Redash用のアプリケーションのClient ID]`
    -  SAML Entity IDに次の文字列を設定 <br /> `urn:auth0:[テナント名]:[コネクション名]`
    -  SAML NameID Format： `EmailAddress` で固定

### 補足

JSONのmappingsが姓名の紐付けを表します。
Auth0上ではgiven_name, family_nameと扱われている項目を、Redashでは FirstName, LastName として扱います。

given_nameはAuth0ではnullableなのですが、nullの場合はRedashが落ちるので気をつけましょう。。

# アクセス制限

SAMLでSSOできるようにすると、接続したAuth0のアカウントを持っている人は全員Redashにアクセスできるようになります。
BIツールは割と横断的にデータ閲覧できる可能性を持っているので、アクセス制限や認可はきちんとするようにしましょう。
Auth0の場合、RulesやActionsなどで特定のアプリケーションに対して、ホワイトリスト接続することが設定可能ですし、Redashでもクエリやダッシュボードに対して権限を設定して閲覧制御できます。

もし不意にRedashにアクセスして、アクセス制御できていないと大問題になる可能性も大いにあるので、アクセス制限とセットでSSOは使うようにしてください。

# まとめ
BIツールとしてRedashは手軽だし、Auth0も手軽なので両者でSSOできるのはとても便利です。
設定は結構簡単にできますが、アクセス制限していないととんでもない事になりかねないので、絶対にアクセス制限をかけましょう。

弊社ではデータ解析やプロダクトメトリクスの分析用に活用していますが、それだけでも充分な効力を発揮しており、幾度となく命が救われる様な効果を発揮してくれています。
自社用のBIはプロダクト開発していく中で遅かれ早かれ必要になりますが、手軽に構築しつつ、セキュリティにも気を払いつつ進めていけるとプロダクトの進化を早められるなと感じています。