Azure AD を IdP にしてSAMLでSSOする方法

[Looker Advent Calendar 2020](https://qiita.com/advent-calendar/2020/looker) 5日目の記事です。

こんにちは、株式会社 Speee でエンジニアをやっています mistral です。

Lookerにログインする方法はパスワード認証の他にGoogle、LDAP、SAML、OpenID Connect での SSO に対応しています。
弊社では Azure AD による SSO 基盤が存在しており、SAML を使った連携が可能です。
今回はこれで何が実現でき、どうやって設定するかを解説したいと思います。

# 何ができるようになるか

- Azure AD での認証で Looker にログインできる
    - Looker上にユーザーが作成されていなくても Azure AD 上でログインできるように設定しておくことで初ログイン時に自動的にユーザーが作成されます
- Azure AD 上でユーザー毎に設定されている属性を Looker で利用することが可能
    - Look ML 上から Azure AD に登録されているユーザー属性が利用できるよにうなるため Looker 上で各ユーザーに対してカスタム属性を付与する必要がなくなります
- Azure AD 上のグループ単位での権限設定が可能
    - グループ毎に適切な権限を付与できるので Looker 側から直接各ユーザーへ権限設定する必要がなくなります
- Looker で直接権限設定を抑止でき Azure AD 側で統一した権限管理が可能
    - SAML でログインしたユーザーに対して Looker 側から直接権限を設定することを抑止するようなオプション群が用意されています

# 設定方法
Azure AD による SAML 連携を行うためには、Azure AD 側と Looker 側でそれぞれ設定が必要となります。

## Azure AD 側設定
### エンタプライズアプリケーションの作成
![ss10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480/b608e9d8-8d9f-f584-23f5-b711adf08f80.png)

- Azure AD ギャラリーから Looker と入力し Looker Analytics Platform を選択
- アプリケーションの名前を入力して作成
 
### Looker アプリケーションの設定(シングルサインオン)
![ss12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480/d2279e70-1430-80b2-44d0-57865e0cdf6a.png)

- エンタープライズアプリケーションから上記アプリケーションを選択
- サイドバーナビゲーションからシングルサインオンを選択
- SAMLを選択

#### 基本的な SAML 構成

![ss13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480/efec2f8c-11db-d435-5098-ddeb440f77cc.png)

- 識別子 (エンティティ ID)
  - Lookerを利用しているドメイン
    - 例: `sample.jp.looker.com`
- 応答URL
  - Lookerを利用しているURL + `/samlcallback`
    - 例: `https://sample.jp.looker.com/samlcallback`
- サインオンURL、リレー状態、ログアウトURLは空白でOK

#### ユーザー属性とクレーム

![ss14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480/f4d9fc04-a910-946e-5671-c9c8ff0a88c2.png)

- SSOを提供するだけであればデフォルトのままでOK
![ss11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480/5ff46d3a-9442-21c4-c1b4-6fc2d2124474.png)
- SAMLでログインしてきたユーザーの所属しているグループによって自動的に権限を付与したい場合、下記の手順を実行(詳細は後述)
  - `グループ要求を追加する` をクリック
  - `クレームで返される必要があるのは、ユーザーに関連付けられているどのグループですか?`
      - `セキュリティ グループ` を選択
  - `ソース属性`
      - `グループID` を選択
  - `保存` をクリック


- もし Azure AD 側の属性を Looker でも参照したい場合は、`新しいクレームの追加` から参照したい属性を設定します

#### SAML 署名証明書
- `フェデレーション メタデータ XML` をダウンロードしておきます

### Looker アプリケーションの設定(メンバー)
Looker にログインを許可するユーザーやグループを登録します。
後で Looker 側の設定の最後にテストできるようにするため最低限設定者だけでもメンバーに追加しておく必要があります。

## Looker 側設定
SAML 認証はデフォルトでは設定できるようになっていないのでチャットサポートや
[Looker Help Center](https://help.looker.com/hc/en-us)から依頼をすることで設定できるようになります。

### SAML Authentication
![ss09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480/7fea6290-87e5-3d3e-bd4b-eeefaf9fd246.png)

- ヘッダーナビゲーションから Admin -> SAML をクリックして SAML 設定ページへ遷移します
- ページ上部のラジオボタンで `Enabled` を選択すると詳細な設定画面が表示されます

#### SAML Auth Settings

![ss08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480/840635d6-e5f2-eccd-646c-087b30c96186.png)

- `フェデレーション メタデータ XML` をテキストエディタで開き、XMLをコピーして `IdP Metadata` 欄にペーストしてその下の `Load ボタン` をクリックすることで、`IdP URL`、`IdP Issuer`、`IdP Certificate` が自動的に入力されます
- `SP Entity / IdP Audience` には Azure AD 側で設定した `識別子 (エンティティ ID)` で入力したものと同様の値を入力する
  - 例: `sample.jp.looker.com`

#### User Attribute Settings

![ss07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480/79760266-076e-1a71-4015-74fe91db68ae.png)


- 下記の通りそれぞれの属性で参照するSAML属性名を設定します

| ラベル     | 値                                                                 |
| ---------- | ------------------------------------------------------------------ |
| Email Attr | http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress |
| FName Attr | http://schemas.xmlsoap.org/ws/2005/05/identity/claims/givenname    |
| LName Attr | http://schemas.xmlsoap.org/ws/2005/05/identity/claims/surname      |

- もし Azure AD 側の属性を Looker でも参照したい場合は `Attribute Pairings` で対応関係を設定します。

#### Groups & Roles
`Mirror SAML Groups` を有効にすることで、ログインしたユーザーが所属しているグループから自動的に Role を割り当てることが可能です

##### `Mirror SAML Groups` Off の時

![ss06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480/d6675f9e-92f8-7371-3ed7-00f0fd5e3781.png)

Looker への初回ログイン時に自動的にあらかじめ作成していた Group や Role の割り当てができます

- New User Groups
  - 初回ログイン時に所属させる Group を指定(複数可)
- New User Roles
  - 初回ログイン時に割り当てる Role を指定(複数可)

##### `Mirror SAML Groups` On の時
![ss05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480/1f66fdae-42c3-f8d5-846a-cfe5f14c7eff.png)

`Azure AD 側設定 - ユーザー属性とクレーム` でグループ情報を取得できるようにしておくことで Azure AD のグループ毎に Looker 側でも Group が作成され、Role の割り当てが可能になります。

- Group Finder Strategy
  - `Groups as values of single attribute (typical)` を選択
- Groups Attribute
  - `http://schemas.microsoft.com/ws/2008/06/identity/claims/groups` を入力
- Preferred Group Name / Roles / SAML Group ID
  - Group Name(Custom Name)
      - Looker 側で作成する Group の名前
  - Roles
      - この Group に割り当てる Role を指定(複数可)
  - SAML Group ID
      - Azure AD 上のグループのオブジェクトID

**Advanced Role Management**

![ss04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480/b0885f0a-dfd5-b1e8-8f89-f843267c8fd0.png)

SAML ログインのユーザーに対して Looker 側からの直接 Role 付与を防止するなど権限管理に制限をかけることができます。

- Prevent individual SAML users from receiving direct roles
  - SAMLログインのユーザーに直接 Role を付与することを防止する
- Prevent direct membership in non-SAML groups
  - SAMLログインのユーザーを上記で設定したグループ以外のグループに所属させることを防止する
- Prevent role inheritance from non-SAML groups
  - SAMLログインのユーザーは上記で設定したグループ以外で割り当てられている Role が付与されること防止する
- Auth Requires Role
  - Role が付与されていないユーザーのログインを防止する

#### Migration Options
![ss03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480/907d72ff-2144-a808-d75d-6721201147ed.png)

Email でのログインや Google でのログインしているユーザーにが SAML ログインに移行しても権限や作成したリソースを引き続き利用し続けられるようにどの属性で突合させるかを設定できます。

- Alternate Login for Specified Users
    - Admin および「login_special_email」権限を持つ指定ユーザに対して、「/login/email」を介した代替の電子メールベースのログインを許可します
    - 万が一間違った設定で SAML 認証を有効にしてしまった時や、IdP 側に接続できなかったときにフォールバックできるようになります

#### Test User Authentication
![ss02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480/385277c0-2861-c928-e31d-9f77c6bd2f98.png)

上記設定を終えたら `Test SAML Authentication` をクリック。
クリックしたユーザーによりSAML認証を使ってLookerにログインを試行します。別タブでテスト結果が表示されます。

![ss01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480/ebe6da7e-6a8a-6373-20ea-779b92a39a3f.png)

このタブでは SAML サーバーからのレスポンス内容や、レスポンスのパース状況、Looker側でどのように認識されるか等詳細にレポートされます。
エラーが発生していないか、意図通りの結果が得られているか確認できます。

#### Save and Apply Settings

![ss15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480/8af7c31b-0d3f-3257-ec07-a0cceb6c98a6.png)

`I have confirmed the configuration above and want to enable applying it globally.` のチェックボックスをクリックし、
`Update Settings` ボタンをクリックすることで、全体に設定を反映します。

このとき、もし他のSSO(Google等)を設定していた場合、これらは無効になってしまうので十分に動作確認を行ってからこの操作を行うこととおすすめします。