祝日のない6月ですが、OPTiM はお誕生日のお祝い で今年も元気いっぱいです。
こんにちは、技術統括本部 の Kikuchi です。1年ちょっとぶりの登場となります。
中の人ですが、最近発表された OPTiM ID+ で SAML と戯れていました。
SAML わからない、わからない、と泣きながら戦っていましたので、今日はそんな SAML と、少しだけ仲良くなるためのアレコレをお話しようと思います。
SAML の基本的なおさらい
SAML (Security Assertion Markup Language) とは、OASIS が策定している、異なるセキュリティドメイン間で情報を安全に交換するためのXMLマークアップ仕様です。
B2Bサービスのフェデレーションプロトコルとしてよく利用されており、最新のバージョンは v2.0 です。
SAML 自体は大きなフレームワークになっているため、仕様全体を理解するのは非常に大変ですが、B2Bサービスのフェデレーションプロトコルとしてよく用いられているのは、 Web SSO Profile と呼ばれるプロファイルとなっているようです。
今回は SAML の仕様解説ではないので詳細はおいておくとして、Web SSO Profile は大雑把に言うと、
- AuthnRequest と呼ばれる認証要求を送り、
- AuthnResponse という認証応答を受け取る
という動きをします。(IdP Initiate SSO など AuthnRequest がない場合もある)
基本はこの2つのリクエストを追っていけば、トラブルの原因におよそ辿り着ける、ということになります。
SAML の動作をデバッグしていこう
SAML の設定は非常に難解なので、設定ができたつもりでもうまく動かない!ということは結構あるかと思います。
設定はあってるはずなのにうまく動かない・・・というときは、AuthnRequest/AuthnResponse が期待通りになっているかを見てみるのが手っ取り早かったりします。
AuthnRequest/AuthnResponse をキャプチャする
覗いてみるために使えそうな手法は、大きく分けると3つあります。
1. ブラウザの開発者コンソールを利用する
Google Chrome などのブラウザでは、開発者コンソールに通信の履歴が表示されています。
そこから、AuthnRequest/Response に相当する部分を取得してしまう、というのが1つ目です。
- メリット: ブラウザだけで取得できる
- デメリット: 適切なリクエストを探すのがめんどくさい
2. Fiddler や Charles といった HTTP キャプチャを利用する
基本的なことは 1 と同じです。
もし HTTP キャプチャツールを使い慣れているのであれば、こちらを使うのも手だと思います。
- メリット: ブレークポイントなどを利用することで、ログを探すのが用意になる
- デメリット: フィルターを使わないと、HTTP通信がすべて紛れ込んでくるので、ノイズが多いかもしれない
3. ブラウザのプラグインを利用する
もう少し手軽に取得したい!という場合、ブラウザのプラグインを使うのも手だと思います。
Google Chrome だと、以下のようなプラグインがあるようです。(インストールは自己責任でお願いします)
chrome.google.com chrome.google.com
- メリット: プラグインが自動的に AuthnRequest/Response を検知して、デコードしてくれる
- デメリット: プラグインに通信を監視される不安感やセキュリティ的な危険性
AuthnRequest/AuthnResponse をデコードして読む
取得できたら次はデコードです。デコードにも使える方法がいくつかあります。
1. ブラウザのプラグインを利用する
上記で 3 を選択した場合、多くのプラグインではデコードして XML の形で表示してくれる機能を持っているため、それを利用するのが便利でしょう。
2. VSCode のプラグインを利用する
以下のようなプラグインを使うことで、VSCode でデコードすることも出来るようです。
ブラウザのプラグインを使わずに、ローカルでデコードしたい!という場合には便利なのではないでしょうか?
3. SAML Decoder を利用する
Onelogin 社が提供している SAML Decoder というサイトも便利です。 ただし、Form POST している = このサービスのサーバーに情報を送信しているため、テスト用の Request/Response 以外での利用は避けたほうが良いかもしれません。
メッセージを読もう
ここまで来れば、XML が目の前にあると思います。あとは頑張って読みましょう。
読む時に見ていく点はこのあたりだと思います。
- AuthnRequest
- Issuer、NameIDPolicy の format
- AuthnResponse
- Issuer 値、NameID 値、Audience 値、有効期限、XML署名の範囲、AttributeMapping 値(必要な場合)
なにか期待と一致しないところがあれば、まずはその値に関連する設定を見直してみることで、正しい設定にたどり着きやすくなると思います。
まとめ: SAML はむずかしい
今回、SAML と真面目に向き合ってみて、やっぱり難しいなと感じました。
SPによっては謎の方言を喋っているやつがいたり(規定されていない Format を指定したり、RelayState を変な使い方していたり、・・・)して、仕様通りに実装して/されていてもなんかうまく行かない、ということが多々発生する現実を、身を持って感じました。
あとは個人的には XML であることもつらさの一つに感じます。XML 署名も難しいので、このあたりは JSON ベースとなった OpenID Connect のほうが好みだなと感じました。
もう少し平和な世界が来てほしいなと思いつつ、FastFed がこのあたりの難しさをなんとか解決してくれないかな、と密かに期待しています。
オプティム では、一緒に SAML に苦しむ 働く仲間を募集しています。興味のある方は、こちらをご覧ください。