【SAML】シングルサインオン(SSO)の動作概要

複数の SaaS アプリを使う場合、アプリごとに ID とパスワードを管理するのは大変です。ユーザはアプリを使うたびに ID とパスワードを入力・管理する必要があり、使い勝手が下がります。管理者にとっても、複数のアプリにまたがって ID を管理するのは大きな負担です。

SAML(Security Assertion Markup Language)は、一度の認証で、組織の外にある複数のアプリにもログインできる(シングルサインオン)ようにする仕組みで、XML をベースにした標準規格です。中央の ID 管理システムで一度認証されたユーザは、複数の SaaS アプリにパスワードを入力し直さずにアクセスできます。

この記事でわかること
  1. SAML の登場人物(IdP と SP)と、署名を使った信頼関係
  2. SP から始まるシングルサインオンの処理の流れ
  3. 2つ目以降のアプリでパスワードを入力しなくてよい理由
  4. IdP と SP で登録し合うパラメータ

SAMLの概要

SAML の登場人物は、IdP と SP です。IdP(ID プロバイダ)は、ユーザ ID やパスワードなどの認証情報を持ち、ユーザを認証するサービスです。SP(サービスプロバイダ)は、ユーザが使いたい SaaS アプリなどのサービスです。

ユーザが SP を使うときは、まず IdP で認証を受けます。認証に成功すると、IdP は「このユーザを認証した」という証明(アサーション)を発行し、SP はそれを信用してユーザを受け入れます。

通常、IdP と SP は別の組織(ドメイン)のサービスです。IdP の例には Microsoft Entra ID(旧 Azure AD)、Okta、PingFederate、JumpCloud などがあり、SP には Box など多くの SaaS アプリがあります。

署名を使った信頼関係

IdP と SP は別の組織なので、あらかじめ信頼関係を結んでおき、IdP が認証した結果を SP が信用できるようにします。この信頼関係には、公開鍵暗号のデジタル署名を使います。

IdP は署名用の鍵ペアと、その公開鍵を入れた証明書を持っています。事前に IdP の証明書を SP に登録しておき、IdP は発行するアサーション(または応答全体)に自分の秘密鍵で署名します。SP は、登録してある証明書の公開鍵で署名を検証し、信頼している IdP が作ったもので、途中で書き換えられていないことを確かめます。

IdP(ID プロバイダ)SP(SaaS アプリなど)秘密鍵アサーション(認証結果)ユーザ:user01@…発行者:IdPIdP の秘密鍵で署名署名を検証IdP の署名用証明書IdP の公開鍵(事前に登録)事前に IdP の証明書を SP に登録しておくことで、SP は IdP が作ったアサーションだと確かめられる
図1 IdP がアサーションに署名し、SP が IdP の証明書で検証する

署名の仕組みは、次の記事も参考にしてください。

SAML処理フロー

ユーザが SaaS アプリ(SP)に接続してから、シングルサインオンでアプリを使えるようになるまでの流れは、次のとおりです。ここでは、ユーザが SP に接続するところから始まる「SP-initiated(SP 起点)」の流れを示します。

クライアント(ブラウザ)IdPSP(例:Microsoft Entra ID)(例:SaaS アプリ)① サービスに接続② IdP のログイン URL へリダイレクト認証要求(AuthnRequest)を付けて送る③ IdP のログイン URL に接続④ ユーザ ID・パスワードなどで認証⑤ アサーションを含む応答を返す応答 URL へ自動で POST するフォーム⑥ 応答 URL にアサーションを POSTSAMLResponse⑦ 署名・宛先・有効期限などを検証⑧ アプリへリダイレクトSP のセッション(Cookie)を発行⑨ アプリにアクセス
図2 SP から始まる SAML シングルサインオンの流れ

SP に接続し、IdP へリダイレクトされる(①〜③)

クライアントは、ブラウザなどで SP(SaaS アプリ)に接続します。まだログインしていないので、SP は認証要求(AuthnRequest)を作り、あらかじめ設定された IdP のログイン URL(サインオン URL)にリダイレクトするようブラウザに返します。ブラウザは、その URL で IdP に接続します。

IdP で認証し、アサーションを受け取る(④〜⑤)

IdP は、ユーザ ID とパスワードなどの入力を求めて、ユーザを認証します。認証に成功すると、IdP はユーザ名や属性値などを入れたアサーションを作り、署名します。そして、アサーションを含む応答(SAMLResponse)を、あらかじめ設定された SP の応答 URL へ自動で送信(POST)するフォームとしてブラウザに返します。

SP がアサーションを検証し、アプリを使えるようにする(⑥〜⑨)

ブラウザは、応答 URL にアサーションを POST します。SP は、信頼している IdP の署名かどうかを検証し、自分あての応答か、有効期限内かなども確かめます。問題がなければ、SP は自分のセッション(Cookie)を発行し、ブラウザを SaaS アプリへリダイレクトします。ブラウザがアプリにアクセスすると、ログインした状態で使えます。

ポイント

IdP と SP が直接通信して認証結果を受け渡すのではなく、認証要求もアサーションも、ユーザのブラウザを経由して受け渡されます。そのため、SP が IdP に直接接続できなくても動作します。SP がブラウザから受け取ったアサーションを信用できるのは、IdP の署名を検証しているからです。

2つ目以降のアプリはパスワード不要

同じブラウザで別の SaaS アプリ(SP-B)に接続すると、また IdP にリダイレクトされます。このとき IdP には、最初の認証で作られたセッション(Cookie)が残っているので、IdP はパスワードを求めずに SP-B 用のアサーションを発行します。こうして、ユーザは ID やパスワードを入力し直さずに、複数の SaaS アプリにログインできます。

ブラウザIdP のセッション(Cookie)ありIdPSP-Aログイン済みSP-Bはじめて接続① SP-B に接続 → IdP へリダイレクト② IdP に接続③ アサーションを発行パスワード入力なし
図3 IdP のセッションが残っていれば、2つ目のアプリでもパスワード入力なしでログインできる
IdP から始める場合

この記事の流れとは逆に、ユーザが先に IdP のポータル(アプリの一覧画面など)にログインし、そこからアプリを選んで始める「IdP-initiated(IdP 起点)」の流れもあります。この場合は ①〜③ がなく、IdP がいきなりアサーションを発行して、SP の応答 URL に送ります。

SAMLで使用するパラメータ

IdP と SP では、たとえば次のようなパラメータを発行します。基本的に、IdP で発行したパラメータは SP に登録し、SP で発行したパラメータは IdP に登録します。これにより、IdP と SP の信頼関係が結ばれます。

IdP が発行する情報ログイン URL(サインオン URL)ログアウト URLIdP の識別子(エンティティ ID)署名用の証明書SP が発行する情報SP の識別子(エンティティ ID)応答 URL(ACS URL)サインオン URLログアウト URLSP に登録IdP に登録メタデータ(XML ファイル)でまとめて受け渡すこともできる
図4 IdP と SP で登録し合うパラメータ
パラメータ発行する側意味
ログイン URL(サインオン URL)IdPSP がユーザをリダイレクトする IdP の認証窓口
ログアウト URLIdPログアウトするときに使う IdP の URL
IdP の識別子(エンティティ ID)IdPアサーションの発行者として IdP を識別する値
署名用の証明書IdPアサーションの署名を SP が検証するための公開鍵が入った証明書
SP の識別子(エンティティ ID)SPアサーションのあて先として SP を識別する値
応答 URL(ACS URL)SPIdP がアサーションを送る先(Assertion Consumer Service)
サインオン URLSPSP 起点でログインを始めるときに使う SP の URL
ログアウト URLSPログアウトするときに使う SP の URL

これらの情報は、メタデータと呼ばれる XML ファイルにまとめて受け渡すこともできます。Microsoft Entra ID の場合は、エンタープライズアプリケーションの SAML の設定画面(Basic SAML Configuration)で SP の識別子(Identifier)、応答 URL(Reply URL)、サインオン URL(Sign on URL)を設定し、IdP 側の情報としてログイン URL(Login URL)、Microsoft Entra の識別子、ログアウト URL、署名用の証明書を SP に渡します。実際の設定は、IdP と SP それぞれが公開しているドキュメントを見ながら行います。

うまくいかないとき

状態よくある原因確認すること
SP で署名の検証に失敗するSP に登録した証明書が古い(IdP 側で証明書を更新した)IdP の現在の署名用証明書と、SP に登録した証明書が一致しているか
IdP でエラーになり、SP に戻らない応答 URL や SP の識別子が、IdP に登録した値と一致しないIdP と SP の両方の設定で、識別子と応答 URL が一字一句同じか
アサーションは届くが期限切れと言われるIdP と SP の時刻のずれサーバや機器の時刻同期(NTP)
ログインできるが、別のユーザになる・ユーザがいないアサーションで送るユーザの識別子(NameID)や属性が、SP 側のユーザと合っていないNameID の形式と値(メールアドレス、UPN など)、属性のマッピング

まとめ

項目ポイント
SAML一度の認証で複数のアプリにログインできるようにする、XML ベースの標準規格
IdP と SPIdP がユーザを認証してアサーションを発行し、SP がそれを信用してユーザを受け入れる
信頼関係IdP がアサーションに秘密鍵で署名し、SP は事前に登録した IdP の証明書で検証する
受け渡しの経路認証要求もアサーションもブラウザ経由で受け渡す(IdP と SP は直接通信しない)
シングルサインオンIdP のセッションが残っていれば、2つ目以降のアプリではパスワード入力なしでアサーションが発行される
パラメータIdP の情報(ログイン URL、識別子、証明書)は SP に、SP の情報(識別子、応答 URL)は IdP に登録する

コメント