Konnectのログイン認証をEntra IDのSAMLで行う


以前「[Konnectのログイン認証をEntra ID(旧Azure AD)で行う](https://qiita.com/ipppppei/items/89303943dff6baf1c258)」という内容でKonnectの認証にOIDCを使う方法を紹介した。
今回はそのSAML版。
Konnectの公式ドキュメントは[こちら](https://docs.konghq.com/konnect/org-management/sso/#set-up-sso-in-konnect)と[こちら](https://docs.konghq.com/konnect/reference/saml-idp-mappings/)。


## 前提

検証開始時、以下が揃っているものとする。

- [Konnect](https://cloud.konghq.com/)にログインできる
- Entra IDのエンタープライズアプリケーションを作成できる権限がある

2番目の作成にはかなり強力な権限が必要になるので、会社のEntra IDを使って検証するには少しハードルが高いかもしれない。

## Entra IDの設定

### アプリケーションの作成
Entra IDにログインし、`エンタープライズアプリケーション`->`新しいアプリケーション`をクリックする。
検証目的だとギャラリーにある[Microsoft Entra SAML Toolkit](https://samltoolkit.azurewebsites.net/)も使えるが、ここでは`独自のアプリケーションの作成`から新規に作成する。

作成時は名前は任意のものを入力し、`ギャラリーに見つからないその他のアプリケーションを統合します（ギャラリー以外）`を選択して作成をクリックする。
![20250403104123.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547981/77cc78a3-b495-40be-b9b3-0e9cf9a1c9e0.png)

### グループの割り当て
作成したエンタープライズアプリケーションに対し、ログインするユーザを割り当てる。
ここではログインするユーザがグループに属しているものとし、グループのみ割り当てる。
エンタープライズアプリケーションの`管理`->`ユーザーとグループ`から`ユーザーまたはグループの追加`をクリックする。
すると割り当て画面に遷移するので、`ユーザーとグループ`で利用するユーザが属するグループを選択し、ロールは`Default Access`か最初からある`User`を選択する。
![20250408171852.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547981/27142537-804d-4b79-905e-dd12f27bdb34.png)

なお、今回はセキュリティグループを利用する。
グループ名をクリックするとオブジェクトIDが取得できるが、これは後で利用するのでメモっておく。
![20250408172407.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547981/ba77ad84-5639-4fe8-9922-e5a4da7c10d9.png)


### SAMLの設定

エンタープライズアプリケーションの`管理`->`シングルサインオン`からSAMLを選択する。

#### `基本的な SAML 構成`の設定
画面遷移後、`基本的な SAML 構成`を編集し、以下を設定する。
- 識別子 (エンティティID)：https://cloud.konghq.com/sp/< KonnectのOrganizationID>
- 応答URL (Assertion Consumer Service URL)：
https://global.api.konghq.com/v2/authenticate/<ログインに使用するパス>/saml/acs
- サインオンURL：
https://cloud.konghq.com/login/<ログインに使用するパス>

`<ログインに使用するパス>`の部分はSAML認証時にアクセスするパスの一部で自身で任意のものを決めて設定する。
ここでは`my-saml-test`とする。
![20250403105443.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547981/33e893a4-68b4-45c8-bdf1-457b70758e39.png)

#### `属性とクレーム`の設定
次に`属性とクレーム`を編集し、属性を設定する。
こちらに関してはKonnectのドキュメントの[IdP SAML attribute mapping reference](https://docs.konghq.com/konnect/reference/saml-idp-mappings/)が参考となる。
ここでは以下のように設定する。

必要な要求  
|クレーム名|値|
|---|---|
|一意のユーザー識別子|`user.principalname`|

追加の要求  
|クレーム名|値|
|---|---|
|email|`user.email`|
|firstname|`user.givenname`|
|lastname|`user.surname`|
|groups|`user.groups`|

一意のユーザー識別子についてはデフォルト値のまま使用する。
追加の要求で設定するクレームについては`名前空間`の項目は空欄とし、groupsについては`グループ要求を追加する`から追加する。
groupsについては以下のように設定している。
![20250408173649.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547981/056bd9c1-fe9d-4859-b131-fd051b0870de.png)
ソース属性がグループIDとなっており、グループIDを用いてKonnectのTeams（ロール）とマッピングすることになる。
最終的には以下のようになる。
![20250408173818.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547981/aa8e68f3-daed-48c1-a002-753206a37dd0.png)


#### アプリのフェデレーション メタデータ URLの取得
最後に、SAML証明書の項目にある`アプリのフェデレーション メタデータ URL`をコピーして手元にメモっておく。
こちらは後でKonnectの設定で利用する。

## Konnectの設定
### SAMLの設定

Konnectにログインし、`Organization`->`Settings`から`Authentication Scheme`のタブの中にあるSAMLの`Configure`をクリックする。
![20250401090358.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547981/a80edbef-6efd-4a3c-b5cb-d92749cef4d4.png)

クリックすると`IDP Metadata URL`と`Login Path`の入力が求められる。
ここでは以下のように入力した。
- IDP Metadata URL: `https://login.microsoftonline.com/f177c1d6-50cf-49e0-818a-xxxxxx/federationmetadata/2007-06/federationmetadata.xml`
- Login Path: `my-saml-test`

設定後、`Single Sign-On URL`と`Audience URI`が表示されるが、`Single Sign-On URL`はEntra ID側で設定したSAMLの応答URLと一致していることを確認しておく。

問題なければ`Enable SAML`をクリックしてSAMLを有効化する。
![20250408174613.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547981/fb416471-5dc3-4c67-8424-aea809761513.png)

なお、EnableにするとKonnectにはログインできるようになるが、権限がないので以下のように権限不足の画面が表示されるのみとなる。

![20250408174905.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547981/4d980bfb-c6c2-4dab-bdea-ec6f99b5609a.png)


### RBACの設定
SAML認証で許可するグループがKonnectのどの権限を持つかを設定する。
`Organization`->`Settings`から`Teams Mappings`のタブの中にある`IdP Mapping Enabled`をチェックする。
チェックするとどのTeam（ロール）にどのグループを割り当てるかの画面が表示されるので、Entra IDのグループのオブジェクトIDを設定する。
ここではOrganization Adminにグループを設定する。
![20250408175246.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547981/8f5ec1f9-e9bb-417a-890c-d50131c992d1.png)

### 動作確認
SAML経由でKongにアクセスするには先程設定したログインパスを指定してアクセスする。
URLは以下となる。
https://cloud.konghq.com/login/<指定したログインパス>>

アクセスするとMicrosoftの認証に飛ばされる。
![20250408190226.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547981/7196d4af-0bf5-4870-b736-8720f12ac977.png)

ログイン情報を入力してログインすると、Konnectの画面が表示される。
![20250408192458.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547981/23123a83-bdce-4163-a684-861182ad7323.png)

`Organization`->`Users`でログインユーザが作成されている事がわかる。
作成されたユーザをクリックすると、からログインしたアカウントをクリックすると`Organization Admin`が設定されていることも確認できる。
![20250408192624.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547981/e4e1621c-6029-407b-a4da-5fef68eeea91.png)