🔑

SSO/SAMLをざっくり理解する

2024/01/10に公開

認証方式って多くて覚えるのがたいへんですよね。
私も毎回毎回ググって「ああ、こんな感じだったな…」と思いながら、日々を過ごしています。
特にSaaSにおいては、複数の認証方式をサポートしていることが多く、忘れたころに問い合わせが来たりして脳内にロードするためのコストを毎度払っています。

今回は、脳内へのロード時間を減らすためにSSO/SAMLにおけるざっくり概念を書き残しておきます。

SSOとSAMLとは何か?

まずはSSOとSAMLの概念を整理します。

  • SSOとは、一度のユーザー認証によって業務アプリケーションやクラウドサービスといった、複数のシステムの利用が可能になるしくみ
  • SAMLとは、 Security Assertion Markup Languageという、Webアプリケーションのシングルサインオン (SSO) を実現するXMLベースの規格

ssoとsamlの関係を表す概念図

標準化団体のOASISの文書にもしっかりと規格が記載されていますね。

登場人物の整理

登場人物 説明
ユーザー 認証を受けるユーザー
ID Provider(IdP) ユーザーIDを提供するもの。ユーザーの認証情報を含む"Assertion"の発行等のSAMLのやりとりを司る
Service Provider(SP) Webサーバを提供するもの(= SSOで認証されるサーバ)当然SAMLに対応している必要がある

SaaSにおいては、以下のような関係性になります。

SaaSにおける登場人物の整理

大まかなSAMLフロー

SP-initiated SSOやIdP-initiated SSO等の詳細な認証フローについては他サイトに譲るとして、ここでは大まかなSAMLフローについて記載します。おおきく以下2つの流れで構成されています。

  1. IdPに対してSAMLの認証リクエストを投げる
    samlフロー1

  2. SAMLの認証レスポンスを用いてSPに認証を求める
    samlフロー2

詳細なシーケンスについてはこちらのサイトがわかりやすいと思います。

SAML認証レスポンスに含まれるフィールド

主なフィールドとして、以下が含まれます。

フィールド 説明
アサーション(Assertion) ユーザーの認証情報
ステータスコード(Status Code) 応答の成功、失敗、そのほかのステータスを示す
発行者(Issuer) 応答を生成したエンティティの識別子
ユーザー情報(Subject) 認証されたユーザーの識別情報
署名(Signature) 応答の真正性を保証するためのデジタル署名

署名・暗号化の箇所を詳細にみてみる

SAMLにおける署名/暗号化は主に2種類あります。ちなみに併用が可能です。

  1. デジタル署名
  2. Assertionの暗号化

1. デジタル署名

これはデジタル署名の目的そのもので「本当にIdPから来たSAML Assertionなのか?」を解決するための策となります。
オリジン/送信元であるIdPのなりすまや通信経路上での改竄を防止し、SAML Assertion・リクエスト・レスポンスなどのメッセージの完全性を保証します。

デジタル署名フロー

Assertionを含むレスポンスが、ユーザーのブラウザを介して届けられる場合は、デジタル署名が義務付けられています。 SaaSでのユースケースにおいては、必須と言って良いでしょう。

必要な証明書

  • トークン署名証明書

2. Assertionの暗号化

通信路上においてAssertionが漏洩した際に、SAML Assertionが漏洩・改竄することを防ぐための策となります。
中間者攻撃や傍受攻撃を防止し、SAML Assertionの秘密性を保証します。

SAMLは、HTTPS(HTTP over SSL/TLS)で暗号化された状態で使用することが推奨されています。 つまり、リクエストおよびレスポンスは(Assertionの暗号化を行わなくとも)HTTPSの範囲においての暗号化はすでに行われています。
それに加えてAssertionの暗号化を行うことで、受信者である特定のService ProviderのみがSAML Assertionの内容を解読できるようにし、よりセキュアにやりとりができるようしくみを提供しています。

Assertionの暗号化フロー

必要な証明書

  • トークン暗号化解除証明書

参考文献

GitHubで編集を提案
OPEN8 テックブログ

Discussion