はじめに
今やさまざまなSaaSでSSO(SAML2.0)できるようになってきました。しかし、SAMLは仕様が複雑でなかなか理解しにくいものです。そこで、できるかぎりわかりやすく解説して行きたいと思います。
なお、本稿では、SP-initiated SAMLをベースに解説します。
SAML2.0ベースでのSSO
用語
- Idp(Identity Provider):認証情報を提供する側。シングルサイン元
- SP(Service Provider):認証情報の利用側。シングルサイン先
- AuthnRequest:認証要求。SP側がIdpへ認証を要求する際に発行される要求
- SAMLResponse:認証応答(認証情報含む)。認証要求に対する認証情報を含んだ応答
事前
- 事前にIdpとSPは信頼関係を結ぶ(公開鍵を交換し合う)
- IdpとSPにそれぞれ対になるアカウントが登録されている(なければ作成するというのもあるが、ここでは既に登録されていることとする)
処理
- ユーザーはSPに対しアクセスする
- ユーザーはSP未認証のため、SPはIdpにAuthnRequestを送信する(リダイレクト)
- Idpはユーザーの認証状況を確認する。ここでは、既に認証済み(ログイン済み)とする
- Idpはユーザーの認証情報をSAMLResponse(Idpの秘密鍵で署名する)としてSPに送信する(リダイレクト)
- SPはSAMLResponseをIdpの公開鍵で検証する
- SPはSAMLResponseに含まれる認証情報を基にSP側の紐づくアカウントで認証したことにする
- SPにアクセスが許可され、利用する
難しすぎます。。。
例えで理解する
例
旅行者が日本から米国に観光に行くことに例えて説明する
ユーザー=旅行者
Idp=日本国
SP=米国
事前
- 日本国と米国は条約を締結して旅行者の入国を認める
- =IdpとSPが公開鍵を交換して信頼関係を結ぶ
- 日本人の旅行者(住民)は米国のestaに事前に登録しておく
- =IdpとSPに対になるアカウントが登録されている
入国手続き(処理)
- 旅行者は渡米する
- 米国の入国管理官は、パスポートを出すように要求する
- =AuthnRequest
- 旅行者は日本国のパスポートは発行済み
- =Idpにログイン済み
- 米国の入国管理官にパスポートを差し出す
- =SAMLResponseを送信する
- 入国管理官はパスポートをチェックする(ICチップ等)
- =SAMLResponseの署名を検証
- パスポートの情報とestaの申請を照らし合わせる
- =SP側の紐づくアカウントで認証したことにする
- 入国を許可される
- SPにアクセスが許可される
どうでしょうか?なんとなくイメージできましたか?若干パスポートを発行するあたりの時系列がSAMLと異なりますが、だいたい合っているので許してください。
終わりに
SAMLにはいろいろなパターンがあり、すべてを理解するのは難しいかもしれません。しかし、最も基本的なパターンについて理解できたのではないでしょうか。これでSAMLでのSSOは、もう怖くありませんね。Let' SSO!!