0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Kong GatewayのSAML PluginでリクエストにSAML認証を挟む

Posted at

Kongではリクエストの認証にSAMLを使うプラグインが用意されており、これはサービスプロバイダ(SP)として機能し、リクエストにSAML認証を挟みたい場合、IdPへのログインを手助けしてくれる。
ここではEntra IDを使って簡単な使い方を検証する。

プラグインのドキュメントはこちら
ちなみにSAMLプラグインに関する詳細な公式ブログが以下用意されている。

こちらも併せてチェックしておくと良いと思う。

SAMLプラグインについて

SAML PluginはSPとして動作し、実際に動作する際は以下のようなフローとなる。

このフローに関連するプラグインの設定項目はおそらく以下のような感じとなる。

設定項目 意味
idp_sso_url Entra IDのサインオンURLで③④で使用
issuer Entra IDのアプリケーションの識別子で④で使用
assertion_consumer_path SAMLからの応答のためのエンドポイントでhttps://Proxy/<Route>/指定値がフルパスとなる。⑤で使用

その他必須の設定項目として、session_secretがありセッションデータを暗号化するための秘密鍵として利用される。
また、アサーションの検証のためにidp_certificateも指定が必要だが、アサーションの検証を省略する場合は省略可能で、その際はvalidate_assertion_signaturefalseを指定する。

前提条件の準備

始めるにあたり、Kong Gatewayは起動済みで、HTTPSで利用するものとする。

Kong Gateway側の用意

最初にConsumerを用意する。
SAMLで使うユーザとKong GatewayのConsumerをマッピングして使う方法があるのだが、今回は簡略化してanonymousで進める。
ということで以下でanonymousのConsumerを作成する。

consumer
curl -i -k -X PUT https://localhost:8444/consumers/anonymous

次にServiceとRouteを作成する。
ここではhttps://httpbin.konghq.comへのアクセスを/httpbinで転送する設定とする。

service
curl -i -k -X POST https://localhost:8444/services \
  -d name=httpbin_svc \
  -d url='https://httpbin.konghq.com'
route
curl -i -k -X POST https://localhost:8444/services/httpbin_svc/routes \
  -d 'paths[]=/httpbin' \
  -d name=httpbin_rt

Entra ID側の用意

Entra IDでSAML認証用にエンタープライズアプリケーションを作成する。
作成方法については「Konnectのログイン認証をEntra IDのSAMLで行う」で紹介しているのでここでは割愛する。

作成後、管理->シングルサインオンからSAMLを選択する。
基本的な SAML 構成の編集ボタンを押し、ここでは以下のように設定した。

  • 識別子 (エンティティ ID):https://hoge.fuga/mysaml
  • 応答 URL (Assertion Consumer Service URL):https://localhost:8443/httpbin/saml-acs

20250409172442.png

エンティティIDはテナント内で一意であればいいので、適当に設定した。
応答URLは

  • Kong Gatewayを介してのアクセス先URL+assertion_consumer_path = https://localhost:8443/httpbin/saml-acs

ということで、後でPlugin設定時にassertion_consumer_pathsaml-acsを指定するようにする。

設定後、アサーションの検証で利用するために③のSAML証明書の証明書 (Base64)の横のダウンロードをクリックして証明書をダウンロードしておく。

また、後で設定値は環境変数に入れてPluginを登録するので、以下で設定値を環境変数に保存しておく。
ENTRAID_IDENTITY_IDには先程設定したエンティティIDを、ENTRAID_SIGN_ON_URLには④で取得できるログインURLを設定する。

ENTRAID_IDENTITY_ID=https://hoge.fuga/mysaml
ENTRAID_SIGN_ON_URL=https://login.microsoftonline.com/f177c1d6-50cf-49e0-818a-xxxxxxx/saml2

最後にこのアプリケーションにユーザも追加する。
管理->ユーザーとグループからユーザーまたはグループの追加をクリックしSAML認証で使うユーザを追加する。

SAML Pluginの利用

最初にアサーションの検証をスキップ(config.validate_assertion_signature=false)にして試してみる。
以下でプラグインをServicehttpbin_svcに対して有効化する。

curl -i -k -XPOST https://localhost:8444/services/httpbin_svc/plugins \
 -H 'Content-Type: multipart/form-data' \
 -F name=saml \
 -F config.anonymous=anonymous \
 -F config.issuer=$ENTRAID_IDENTITY_ID \
 -F config.idp_sso_url=$ENTRAID_SIGN_ON_URL \
 -F config.assertion_consumer_path=/saml-acs \
 -F config.validate_assertion_signature=false \
 -F config.session_secret=12345678901234567890123456789012

上記のプラグインを設定した上で設定したService/Routeにブラウザでアクセスする。ここではhttps://httpbin.konghq.com/anythingにKong Gateway経由でアクセスしてみる。

open https://localhost:8443/httpbin/anything

アクセスするとMicrosoftに飛ばされる。
20250409173426.png

認証情報を入力して認証を突破すると正常にアクセスできたことが確認できる。
20250409173653.png

なお、Kongが付与するヘッダからanonymousでログインしていることも確認できる。

次にアサーションの検証をするよう証明書を設定し直す。
設定したプラグイン設定を一度削除し、プラグインを再度設定する。
まず、証明書を環境変数に設定する。Certificate is valid, but isn’t being acceptedによると証明書内のヘッダとフッタは削除した方がよいようなので、以下のような感じで環境変数に設定する。

IDP_CERT=$(grep -v CERTIFICATE saml-plugin-test.cer | tr -d '\r\n')

プラグインを設定する。

curl -i -k -XPOST https://localhost:8444/services/httpbin_svc/plugins \
 -H 'Content-Type: multipart/form-data' \
 -F name=saml \
 -F config.anonymous=anonymous \
 -F config.issuer=$ENTRAID_IDENTITY_ID \
 -F config.idp_sso_url=$ENTRAID_SIGN_ON_URL \
 -F config.assertion_consumer_path=/saml-acs \
 -F config.validate_assertion_signature=true \
 -F config.session_secret=12345678901234567890123456789012 \
 -F config.idp_certificate=$IDP_CERT

こちらもブラウザからアクセスして、問題なくアクセスできることを確認する。

open https://localhost:8443/httpbin/anything

設定ミスがなければ、先程と同じようにhttpbinの内容が表示されるはずだ。

せっかくなので、本当に証明書の内容を見ているか確認してみる。
プラグインを削除し、証明書を以下のように細工してプラグインを再適用する。

IDP_CERT=$(echo -n $IDP_CERT | sed s/y/z/g)

この状態でアクセスすると以下のように401が返ってくる。
20250409180541.png

これにより、アサーションの検証も適切に行われていることが確認できる。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?