opensearchのダッシュボードのユーザ認証にKeycloakを使う

OpenSearchダッシュボードへのサインイン手段としてKeycloak＋SAMLを使ったSSOを設定したので、備忘録としてアウトプット。

- OpenSearchのバージョン：OpenSearch_2_11_R20231113-P3  
- Keycloakのバージョン：23.0.7

また、Keycloakは例のごとくWSL上で起動したものを使用する。

## Openserach側の設定

セキュリティ設定のタブの「設定」をクリックします。

![スクリーンショット 2024-03-11 085916.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/389171/5564f0a8-2fff-80f4-09bb-d6f17ebbb055.png)

「OpenSearch Dashboards/Kibana 用の SAML 認証」の「SAML認証を有効化」にチェックを付けます

![スクリーンショット 2024-03-11 090057.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/389171/f0050b84-793c-226e-68d9-94af2c6d0784.png)

「IdPメタデータをインポート」にKeycloakのメタデータをコピペします

![スクリーンショット 2024-03-11 090155.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/389171/59c7ceac-37f5-b358-93eb-5754a62dafb2.png)

「SAMLマスターバックエンドロール」に管理者権限を設定するロールの名前を入力します
(オプションですが、最初に色々な設定を行うためにマスターの権限が必要なので、設定します)

![スクリーンショット 2024-03-10 184405.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/389171/85959bd4-f761-58e7-8802-11ebf76e4c9c.png)

「ロールキー」に管理者権限を与えるユーザにバインディングするロールの属性名を入力します

![スクリーンショット 2024-03-10 184453.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/389171/9e132841-aeab-5661-246e-b5c73e197f5f.png)

「変更の保存」をクリックします

## keycloak側の設定

### クライアントを追加する

- レルムの管理権限を持つユーザでKeycloakの管理コンソールへ入ります
- 「Create client」をクリックして新しくクライアントを作成する画面へ移動します
- 以下の値を入力します

|項目|値|
|---|---|
|プロトコル|SAML|
|クライアントID|OpenSearchのドメインエンドポイント|

- 「次へ」をクリックします

### クライアントの設定

#### 「設定」タブ

ほぼデフォルト設定ですが、以下の追加で以下のように設定しました。

|項目|値|補足|
|---|---|---|
|有効なリダイレクトURI|<ドメインエンドポイント>/*|クライアントがリダイレクトする際に有効なURI。今回使用するOpenSearch宛は全て有効にしたいのでワイルドカードを使用します|
|IDP Initiated SSOを行う際にクライアントを参照するためのURLフラグメント名を設定します。|opensearch|IDP起点のSSOを行う際のURLの組み立てに使うクライアントの識別子的なもの。|

#### 「鍵」タブ

クライアント署名はサポートされていないので、「クライアント署名が必須」はオフにします。(ざっと調べた感じ、OpenSearch側のメタデータは提供されていない？)

#### 「ロール」タブ

OpenSearch上でバックエンドロールとして使用するクライアントロールを作成します。
今回は以下のように設計しました。

|ロール|用途|OpenSearch上のロール|
|---|---|---|
|Admin|フルアクセス|all_access/security_manager|
|User|参照権限|readall(要マッピング)|

#### 「クライアント・スコープ」タブ

- 割り当てられたDedicatedスコープがあるので選択します
- 「スコープ」タブで「フルスコープを許可」をオフにします
- 「マッパー」タブで以下のマッパーを作成します

|項目|値|
|---|---|
|マッパータイプ|Role list|
|クライアント・スコープの名前。|Role|
|Role attribute name|Role|
|SAML Attribute NameFormat|Basic|

#### 「Advanced」タブ

SAMLエンドポイントの詳細設定で以下の値を入力します。

|項目|値|備考|
|---|---|---|
|アサーション・コンシューマー・サービスのPOSTバインディングURL|IdP によって開始された SSO URL※1|SAMLアサーションをPOSTする先のURL|
|ログアウト・サービスのRedirectバインディングURL|IDP Initiated SSOのURL※2|ログアウトレスポンスを転送する先のURL。Kecloakの認証画面に戻す。POSTすると404が返ってきたので、Redirect先として設定|

※1：OpenSearchへSAML認証を設定する際に、OpenSearchの画面上で確認できます
※2：フォーマットは「{server-root}/realms/{realm}/protocol/saml/clients/{client-url-name}」となります

### OpenSearchのロール設定

#### Adminロールを使用できるユーザでOpenSearchへログイン

keycloakでOpenSearchのAdmin権限を持たせるユーザへクライアントロール「Admin」をバインドした上で、ユーザ認証し、OpenSearchへログインする。
ログインできたら、画面右上のユーザアイコンをクリックし、「View Roles and Identities」をクリックする。

![スクリーンショット 2024-03-11 091046.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/389171/e5862735-7b25-5eb2-3242-bfbdf26d3bae.png)

このロールが「all_access」のロールに紐づいていることを確認する。

![スクリーンショット 2024-03-11 091029.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/389171/d5825083-563d-243b-80ac-0eaeda512529.png)

左ペインのリストから「Securiy」->「Roles」へと進む。

![スクリーンショット 2024-03-11 091335.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/389171/cec63662-1d0f-eded-db86-c475966b3a76.png)

「readall」のロールを探し、選択する。

![スクリーンショット 2024-03-11 091443.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/389171/7dcc0db0-0302-b74a-eb42-eab6d04d070f.png)

「Mapped Users」タブから「Manage mapping」をクリックする。

![スクリーンショット 2024-03-11 091631.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/389171/d6c23cff-3c47-efcc-e938-39b9ccea1cb7.png)

「Backend roles」に「User」を追加して、「Map」をクリックする。

![スクリーンショット 2024-03-11 091710.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/389171/6afa8ffb-5994-5d9a-6f6c-1b6d6fbe33c0.png)

マッピングが完了したら、一度ログアウトする。

#### Userロールを使用できるユーザでOpenSearchへログイン

keycloakでOpenSearchの参照権限を持たせるユーザへクライアントロール「User」をバインドした上で、ユーザ認証し、OpenSearchへログインする。
ログインできたら、画面右上のユーザアイコンをクリックし、「View Roles and Identities」をクリックする。

![スクリーンショット 2024-03-11 092146.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/389171/7f0182e9-a8d8-2d5f-1bc7-18b3a538901d.png)

このユーザは「readall」のロールがマップされていることを確認する。

## まとめ
OpenSearchにKeycloakを使ってSSOをする方法をまとめました。最低限の設定なので、使っていく中でパラメータのチューニングは必要ですが、SAMLについての理解が多少深まったと思います。(感想)