SlackとKeycloakでSSO環境を構築する

## はじめに
SlackのプラスプランとEnterprise GridプランではSSOを有効にすると、IDP経由でSlackにアクセスできるようになります。
[こちら](https://davidops.com/posts/setting-up-slack-saml-sso-with-keycloak/)のページを参考にしましたがそのままではうまくいかず、悪戦苦闘してなんとかSSOすることができました。
そこから得たSSO構築できるまでの手順を記述します。

## 環境情報
Slackプラン・・・Enterprise Grid
IDP・・・KeyCloak

## KeyCloak側の設定
### クライアント作成
Clientsにアクセスして表示された画面から「Create」をクリックすると以下の画面が表示されます。
![b854c2a6-ab36-40f4-b089-0d62167af0ee.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397203/04b2c2f7-7b2a-e217-4e45-eae66a94cd75.png)

"Client ID"は```https://slack.com```とします。
値を入力したら「Save」をクリックします。

### Clientの設定
以下の画面を参考にして設定してください。
![0c1bf768-1fc0-4bc7-b435-2ec2ac5e9c3e_png__3840×3286_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397203/203f2438-9c3e-0765-6ac6-e82e9e06f2c0.png)

- "Valid Redirect UIs" には2つの値を設定します。
    - https://[your-slack-url]/
    - https://[your-slack-url]/*
- “Assertion Consumer Service POST Binding URL” には “https://[your-slack-url]/sso/saml” を入力します
- “Logout Service POST Binding URL” には “https://[your-slack-url]/sso/saml/logout” を入力します

値を入力したら「Save」をクリックします。

### Client Scopeの設定
Client Scopeのタブに移動します。
初期はrole_listがアサインされています。
「Remove selected」をクリックして外します。
以下のようになればOKです。
![305fc27e-ce42-411d-8327-b307e66d1981-960x199r.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397203/3b8187a3-b10e-af80-5721-875f02d25e77.png)

### Mapperの追加
Mappersタブを選択すると以下の画面が表示されます。
![6dc31805-e83f-4b38-9a9a-7c2e7995a568-960x114r.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397203/3ba34a3e-6bbb-ea01-01f8-562afee6486e.png)
Mappersタブから「Add Builtin」をクリックすると以下の画面が表示されます。
![df75c6e1-fb01-4a92-a63e-68bb1f078e94-960x151r.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397203/7dccfef7-15bb-be93-de06-f6d996de4f7f.png)
"X500 email" , "X500 givenName" , "X500 surname" にチェックを入れて「Add selected」をクリックします。
追加したMapperが表示されます。
![b02f4286-a120-46de-b720-bd9f33cc7e41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397203/8d5d92cd-aaed-356f-1586-f38e1bf7eb61.png)

それぞれを以下のように編集します。

1.email
“SAML Attribute Name” を “User.Email”に書き換えます。
![7954c4aa-84e9-44a2-b8b2-7f25ac58c9da.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397203/31a25de4-c741-9f67-89c4-2ea2ad5ab127.png)
書き換えたら「Save」をクリックします

2.givenName
“SAML Attribute Name” を “first_name”に書き換えます。
![b1a894a5-f026-4ea5-9b91-4774b590cbb5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397203/fa737bdd-b018-96c4-f769-7d6b3248e8a0.png)
書き換えたら「Save」をクリックします。

3.surname
“SAML Attribute Name” を “last_name”に書き換えます。
![889eb350-a2a8-4c01-ac2a-1b73f41bc1c6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397203/4c2b1100-ed1e-b494-0caa-a67771f1b8a8.png)
書き換えたら「Save」をクリックします。

4.Username
Mappersの画面で「Create」をクリックし、以下のように設定します。
![f582a3b3-0b84-4e14-b35b-70ac65280f7e.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397203/ebc05b63-a7fd-3336-abd4-12595c65a661.png)
書き換えたら「Save」をクリックします。

### Metadata取得
`https://[keycloak-location]/auth/realms/[realm]/protocol/saml/descriptor`にアクセスします。

表示されたファイルをローカルにclient-tailored-saml-idp-metadata.xmlなどの任意の名前で保存します。

## Slack側の設定
Orgの管理画面からセキュリティ > SSO設定へ移動します。
![f66fe7d8-df29-4b2d-bedc-7d3373463ca5_png__2336×1906_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397203/b1f6b7d4-1bec-7861-c5b6-d35a29476ea3.png)
「SSOを構成する」をクリックします。
 
- “SAML 2.0 Endpoint (HTTP)” には "https://[kc-base-url]/auth/realms/[realm-name]/protol/saml" に設定します（メタデータ内のSingleSignOnServiceプロパティの"Location"フィールドにあります）
- “Identity Provider Issuer” には "https://[kc-base-url]/auth/realms/[realm-name]" に設定します（メタデータ内の"EntityDescriptor"プロパティの"entityID"フィールドにあります）
- "サービスプロバイダ発行者のURL" は `https://slack.com` とします
- "公開(X.509)証明書" には "\<ds:X509Certificate>" のフィールドの値を設定します
- "AuthnContextClassRef" は "このバリューを送信しない" を選択します
- "SAMLレスポンスの署名" は両方にチェックを入れます
入力し終わると以下のようになります。

![f6d50bba-4cb6-4730-92d4-15812d525e2d_png__1416×1798_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397203/1fa54a64-d460-fab5-7057-d0d94490acc6.png)
![8368b08d-b215-4f3d-9d33-5c2d1a53e9df.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397203/a8a048c7-7577-e8e1-0067-1846148cba17.png)
「テスト設定」をクリックします。
KeyCloakのログイン画面が表示されるのでログインします。
設定が成功すると以下のような画面が表示されます。
![6afad65f-c68b-4daa-8395-b8f08df07743_png__3830×1730_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397203/15f54bf3-c192-3a31-2da0-5baea5d6abd7.png)
同じ画面からSSOの環境設定が可能です。
組織のルールに合わせて変更できます。
![b2e0a27f-9e03-4609-8673-69dc711edfd0_png__3820×1914_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397203/d49c1f78-7898-d1c8-f368-77a108b637e9.png)
ここまでで設定は完了です。ログインしてみましょう。


## ログイン
ログイン確認用にSlackとKeyCloakのそれぞれに同一のメールアドレスのアカウントを準備しておきます。（メールアドレスが同じであれば自動的に紐付けられます）
アカウントが作成できたらブラウザからSlackのURL（https://[your-slack-url]）にアクセスしてみましょう。
プライベートブラウザを使うのがおすすめです。
以下のような画面が表示されるはずです。
![2cf7d20c-58a7-4727-8bf4-09b40b1947fd_png__3840×2338_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397203/f7e16db5-1dd1-3371-a2ad-f22f2b7c76bb.png)
「Sign in with SAML」をクリックするとKeyCloakのログイン画面に遷移します。
![79aee09d-9448-463d-96b1-a6b894214d86_png__3840×2338_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397203/aea6beb3-acec-8ef3-1cd7-7503886575e1.png)
ログインが成功すると紐付いているアカウントが所属するワークスペースの画面が表示されました。
![64d466c2-7584-46c0-8d7a-9101f93880e2_png__3840×2338_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397203/8e5542f3-aabe-6ac3-f4cb-7756c616b1ae.png)
これでSSOの設定は完了です。お疲れさまでした。

## おまけ
### おまけ１：ユーザーを無効にする
あるユーザーを無効にしてSSOできないようにしたいときの手順です。
KeyCloak側のUsers画面から無効にしたいユーザーを表示します。
"User Enabled"を"OFF"にします。
![b20ae3c4-2c81-4b1b-96d0-ac377f7a65c5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397203/14de5fb8-2392-3781-8c39-e07e626f9450.png)

変更できたら「Save」をクリックします。

Slackにアクセスしてログインしてみましょう。（セッションが残っている場合はログアウトしてください）
以下のように表示されログインできなくなりました。
![db019d13-4c27-49e2-996a-5a38c337a126_png__3840×2338_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397203/cd305b38-5a5f-0705-59b2-b609c1ddc1fd.png)

### おまけ２：ユーザーを削除（解除）する
KeyCloakからユーザーを削除した場合、ログインはできなくなりますがSlack側も連動してユーザーが解除されることはありません。
ユーザーがログアウトしない限りはSlackの画面が見えてしまいますので、Slack側でもユーザーを解除する必要があります。
Orgの管理画面からメンバーディレクトリ > メンバーを開いて、該当のユーザーを見つけます。
ユーザーの右端の「…」をクリックし「解除する」をクリックします。
![63852ffe-69ea-46dc-bf47-5a308d4f569d_png__3814×932_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397203/e9d30852-f4f6-03cc-d765-91e1b1c9ffe1.png)
以下のような確認画面が出ます。
![02254e9e-f7a5-4aa3-8a68-e4a33eaa496d_png__1174×640_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397203/95d439ef-bfa4-7946-bf9a-875ab98618fe.png)
「アカウントを解除する」をクリックすると解除されます。

解除されると該当ユーザーはすぐにSlackからログアウトされ、以下のような画面が表示されました。![f07c8274-4e04-4987-8780-f13634ae6470.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397203/3d96b44f-60f0-b4ba-df0d-cee6c3fc1842.png)
解除されたユーザーは解除済みユーザーとして登録されているため、すぐに復活させることができます。

### おまけ３：セッションの有効期限を付ける
Orgの管理画面からセキュリティ > セキュリティの設定を開きます。
![e1452979-d985-4ef9-8ec9-2b2360e9d502_png__3780×1592_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397203/57f2ee2c-b94e-e0e0-d7a9-ab468cb6379e.png)
「セッションの有効期限」の右端にある「有効にする」をクリックします。
設定画面が出るので何時間セッションを維持させたいかを入力します。
![e6b1cc1e-389c-49cf-9d77-333ac69e8651.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397203/1c60ea4d-811d-ed77-ec63-567b595c876d.png)
「有効にする」をクリックで設定完了です。
![3800c325-0b2e-4314-b481-b32b768e4384_png__3788×954_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397203/e4ae54af-8b05-b7df-b1a3-738f4acbd9e7.png)

## 参考ページ
- [【Slack】カスタムSAMLシングルサインオン](https://slack.com/intl/ja-jp/help/articles/205168057-%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%A0-SAML-%E3%82%B7%E3%83%B3%E3%82%B0%E3%83%AB%E3%82%B5%E3%82%A4%E3%83%B3%E3%82%AA%E3%83%B3)
- [Setting up Slack SAML SSO with Keycloak](https://davidops.com/posts/setting-up-slack-saml-sso-with-keycloak/)