Kongではリクエストの認証にSAMLを使うプラグインが用意されており、これはサービスプロバイダ(SP)として機能し、リクエストにSAML認証を挟みたい場合、IdPへのログインを手助けしてくれる。
ここではEntra IDを使って簡単な使い方を検証する。
プラグインのドキュメントはこちら。
ちなみにSAMLプラグインに関する詳細な公式ブログが以下用意されている。
- How to Configure SAML Plugin using Kong and Azure AD
- Configure SAML 2.0 Single Sign-on with Kong Enterprise
こちらも併せてチェックしておくと良いと思う。
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_signature
にfalse
を指定する。
前提条件の準備
始めるにあたり、Kong Gatewayは起動済みで、HTTPSで利用するものとする。
Kong Gateway側の用意
最初にConsumerを用意する。
SAMLで使うユーザとKong GatewayのConsumerをマッピングして使う方法があるのだが、今回は簡略化してanonymousで進める。
ということで以下でanonymousのConsumerを作成する。
curl -i -k -X PUT https://localhost:8444/consumers/anonymous
次にServiceとRouteを作成する。
ここではhttps://httpbin.konghq.comへのアクセスを/httpbin
で転送する設定とする。
curl -i -k -X POST https://localhost:8444/services \
-d name=httpbin_svc \
-d url='https://httpbin.konghq.com'
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
エンティティIDはテナント内で一意であればいいので、適当に設定した。
応答URLは
- Kong Gatewayを介してのアクセス先URL+
assertion_consumer_path
=https://localhost:8443/httpbin/saml-acs
ということで、後でPlugin設定時にassertion_consumer_path
にsaml-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
認証情報を入力して認証を突破すると正常にアクセスできたことが確認できる。
なお、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)
これにより、アサーションの検証も適切に行われていることが確認できる。