はじめに#
セキュリティ アサーション マークアップ ランゲージ (SAML) は、特にアイデンティティ プロバイダーとサービス プロバイダーの間で、認証および認可データを交換するためのオープン スタンダードです。SAML はセキュリティ アサーション用の XML ベースのマークアップ言語であり、シングル サインオン (SSO) およびアイデンティティ フェデレーションに使用されます。これは、主にエンタープライズ環境で認証および認可の目的で使用されます。
標準 SAML 認証フロー#
- ユーザーはクライアント アプリケーションにアクセスを要求します。これがサービス プロバイダー (SP) として機能します。
- SP は SAML SSO 認証要求をアイデンティティ プロバイダー (IdP) に送信し、ユーザーを IdP にリダイレクトします。
- ユーザーがまだ認証されていない場合、IdP はユーザーに資格情報の入力を促します。
- ユーザーは資格情報を入力し、IdP がユーザーを認証します。
- IdP は、ユーザーの認証ステータスと属性を含む SAML 応答アサーションを SP に送信します。それから、IdP はユーザーを SP に戻します。
- SP は SAML 応答アサーションを受信し、それを検証してユーザーにアクセスを許可します。
SAML のセキュリティ要因#
SP エンティティ ID#
SP エンティティ ID は、SAML 認証コンテキスト内での SP のユニークなバッジと考えてください。これは IdP と SP がやり取りする際に IdP を認識するための指紋のようなものです。この ID は SP のメタデータの重要な部分であり、IdP と共有され、信頼を築き、セキュアな通信を確保します。
SP エンティティ ID の使用法:
- メタデータ登録:
EntityID 属性は SP のメタデータの一部であり、IdP と共有され、信頼関係を確立します。これは SP のメタデータを位置特定し、SAML やりとりに必要な構成の詳細を取得するユニークな識別子として機能します。
- 認証要求: SP のエンティティ ID は IdP に送信される SAML 認証要求に含まれ、要求元の SP を明確に識別します。IdP はこの情報を使用して要求を検証し、適切な認証コンテキストを決定します。
- アサーションの対象: ユーザーの認証が成功した後、SP のエンティティ ID は SAML アサーションにオーディエンス制限として含まれます。この措置により、アサーションが指定された SP のためだけに意図されていることが保証され、他の SP によって悪用されることができません。
IdP エンティティ ID#
逆に、IdP エンティティ ID は IdP の特別なラベルです。これにより、SAML エコシステム内で IdP を識別し、SP がそれを見つけやすくします。この ID は IdP のメタデータに含まれ、SP と共有され、信頼関係の構築とセキュアな接続を促進します。
IdP エンティティ ID の使用法:
- メタデータ登録:
EntityID 属性はまた、信頼関係を確立するために IdP のメタデータに含まれ、SP と共有されます。これは、IdP のメタデータを位置特定し、SP が SAML 応答を検証するために必要な構成詳細を取得するためのユニークな識別子として機能します。
- アサーション発行者: IdP が SAML アサーションを生成する際、そのエンティティ ID を発行者として含めます。この属性はアサーションを発行したエンティティを示し、SP がアサーションの信頼性と一貫性を検証するのに役立ちます。
リレーステート#
リレーステートは、SP と IdP 間の状態情報の転送を容易にする SAML 認証で使用されるパラメータです。これは、認証プロセス中にユーザーのコンテキストとセッション状態を維持し、SP が開始した SSO フローと IdP が開始した SSO フローの間の橋渡し役として機能します。
リレーステートの使用法:
- ユーザーコンテキストの維持: リレーステートにより、SP は認証プロセス中に IdP に追加情報を渡すことができます。この情報には、ユーザーのセッション状態、アプリケーションコンテキスト、または認証にまたがって維持する必要がある他の関連データが含まれる可能性があります。たとえば、認証前にユーザーがアクセスしていたアプリケーションの URL またはセッション ID などです。
- CSRF 攻撃の防止: リレーステートは、SAML 認証中にクロスサイトリクエストフォージェリ (CSRF) 攻撃を防止するために重要です。認証要求にユニークで予測不可能なリレーステート値を含めることにより、SP は SAML 応答の完全性を検証し、それが元の要求に対応していることを保証できます。
アサーションの署名#
アサーションの署名は、SAML における重要なセキュリティ機能であり、SAML アサーションの完全性、信頼性、非否認を保証します。これは、IdP の秘密鍵を使用して SAML アサーションにデジタル署名することにより、SP がアサーションの出所を確認し、改ざんの試みを検出するのを可能にします。
アサーションの署名のしくみ:
- 鍵ペアの生成: IdP は、秘密鍵を使用して SAML アサーションに署名し、公開鍵を SP と共有して検証するための公開秘密鍵ペアを生成します。この非対称暗号化方式により、IdP のみがアサーションに署名できる一方で、SP はそれを検証できます。
- 共有証明書: IdP は SP に公開鍵証明書を提供します。この証明書にはアサーションの署名を検証するために使用される公開鍵が含まれています。通常、この証明書は IdP のメタデータの一部となるか、SP が安全なダウンロードプロセスを通じてそれを取得できます。
- アサーション署名: ユーザーを認証した後、IdP はその秘密鍵を使用して SAML アサーションにデジタル署名します。この署名はアサーションに含まれ、公開鍵証明書と共に SP で検証できるようにします。
- アサーションの検証: SAML アサーションを受信すると、SP は IdP の公開鍵を使用してアサーションの署名を検証します。署名が有効である場合、SP はアサーションを信頼し、ユーザーにアクセスを許可できます。
アサーションの暗号化#
署名に加えて、SAML は IdP と SP 間で送信される機密ユーザー属性とデータを保護するために、アサーションの暗号化をサポートしています。アサーションを暗号化することで、IdP は意図された受信者 (SP) のみがアサーションの内容を復号化してアクセスでき、ユーザーのプライバシーと機密性が保護されます。アサーションの暗号化は、データ保護を強化するために使用される SAML のオプションのセキュリティ機能です。
アサーションの暗号化の使用法:
- 機密属性の保護: アサーションの暗号化は、個人を特定できる情報 (PII)、財務データ、医療記録などの機密ユーザー属性を保護するために特に有効です。これらの属性をアサーション内で暗号化することで、IdP は不正アクセスを防止し、データの機密性を確保します。
アサーションの暗号化のしくみ:
- 鍵交換: IdP と SP は、SAML アサーションを保護するための暗号化キーを共有するための安全な鍵交換メカニズムを確立します。これは、対称暗号鍵やパブリックキー暗号方式など、暗号化アルゴリズムと鍵管理戦略に応じて行われます。
- 属性の暗号化: IdP は SAML アサーションを生成した後、共有暗号化キーを使用して機密ユーザー属性を暗号化します。暗号化された属性はアサーション内に埋め込まれ、SP のみがデータを復号化してアクセスできるようにします。
- アサーションの復号化: 暗号化されたアサーションを受信すると、SP は共有暗号化キーを使用して保護された属性を復号化します。このプロセスにより、SP はユーザーの機密データに安全にアクセスし、必要に応じて処理することができます。
バインディング方式#
SAML バインディング方式は、SP と IdP 間で異なる通信プロトコルを介して SAML メッセージが送信される方法を定義します。それらは、エンコーディング、トランスポート、セキュリティメカニズムを指定し、関連する当事者間での SAML アサーションと要求の交換を確保しています。
SP と IdP の両方が、そのメタデータ内にどのバインディング方式をサポートするかを指定し、SAML やり取りのための適切な方式を交渉できるようにします。バインディング方式の選択は、メッセージサイズ、セキュリティ要件、通信チャネルの特性などの要因に依存します。
SAML バインディング方式:
- HTTP リダイレクト: SAML メッセージは URL パラメータとしてエンコードされて HTTP リダイレクトを介して送信されます。このバインディングは、メッセージサイズが限定され、通信チャネルが安全でないシナリオに適しています。
- HTTP POST: SAML メッセージはフォーム パラメータとしてエンコードされて HTTP POST リクエストを介して送信されます。このバインディングは、メッセージサイズが URL の長さ制限を超える場合や、追加のセキュリティ対策が必要な場合に使用されます。
- アーティファクト: SAML メッセージはアーティファクトと呼ばれる短命のトークンを使用して送信され、SP と IdP 間の安全なバックチャネルを介して交換されます。このバインディングは、メッセージの機密性と完全性が重要で、通信チャネルが安全であるシナリオに適しています。
最も一般的なバインディング方式:
- 認証要求: SP から IdP への認証要求は、そのシンプルさと効率性のために通常は HTTP リダイレクトを使用して送信されます。SP は SAML 要求を URL パラメータとしてエンコードし、ユーザーのブラウザを IdP にリダイレクトして認証させます。これは SP によって開始された SSO フローとして知られています。
- アサーション応答: IdP から SP への SAML 応答アサーションは通常、HTTP POST バインディング方式を使用して送信されます。IdP は SAML アサーションをフォーム パラメータとしてエンコードし、それを SP に投稿して検証します。これにより、アサーションがセキュアに送信され、URL に機密データが露出されないことが保証されます。また、HTTP POST バインディングは HTTP リダイレクト バインディングと比較して、より大きなメッセージサイズを処理できる。
SAML アサーションのセキュリティ要素と考慮事項#
発行者#
前述のように、発行者は SAML アサーションで、アサーションを発行したエンティティを識別する重要な属性です。発行者は通常、ユーザーを認証してアサーションを生成した IdP です。アサーションに発行者属性を含めることで、SP はアサーションの出所を検証し、それが信頼できるソースからのものであることを確認できます。
SAML アサーションの署名要素には、IdP によって生成され、アサーションの完全性と真正性を確保するデジタル署名が含まれています。署名は IdP の秘密鍵を使用して作成され、公開鍵証明書と共にアサーションに含まれ、SP によって検証されます。署名を検証することにより、SP はアサーションが改ざんされておらず、期待される IdP によって供給されたことを確認できます。
SAML アサーションの条件要素は、アサーションの有効性と使用に適用される制約と制限を定義します。これには、アサーションの有効期間、オーディエンス制限、および SP がアサーション処理時に適用する必要があるその他のコンテキストに関連する制約が含まれています。
認証ステートメント#
認証ステートメント (AuthnStatement) は、ユーザーの認証ステータスとコンテキストに関する情報を提供する SAML アサーションの重要な要素です。ここには使用された認証方法、認証時刻、および関連する認証コンテキスト情報などの詳細が含まれており、SP はユーザーの認証状態に基づいてアクセス制御の判断を行うことができます。
認証ステートメント属性:
- AuthenticationContext: ユーザー認証の方法とコンテキストを説明し、ユーザー名とパスワード、多要素認証、またはシングル サインオンなどの情報が含まれます。この属性は、SP が認証プロセスの強度と信頼性を評価し、適切なアクセス制御を決定するのに役立ちます。
- AuthenticationInstant: IdP によってユーザーが認証された時刻を示します。このタイムスタンプは、認証の新鮮さを確認し、リプレイ攻撃やセッションハイジャックを防ぐために重要です。
- SessionNotOnOrAfter: ユーザーのセッションの有効期限を指定し、それ以降は再度認証する必要があります。この属性は、セッション管理ポリシーを強制し、不正アクセスのリスクを軽減するのに役立ちます。
SAML セキュリティのベスト プラクティス#
- セキュアなバインディング方式の使用: セキュリティ要件と通信チャネルの特性に基づいて適切な SAML バインディング方式を選択します。機密データの送信に HTTP POST を使用し、単純な要求に HTTP リダイレクトを使用します。
- アサーション署名の検証: SAML アサーションのデジタル署名を検証して、その完全性と真正性を確認します。IdP の公開鍵証明書を使用して署名を検証し、改ざんの試みを検出します。
- オーディエンス制限の強制: SAML アサーションにオーディエンス制限を含め、アサーションのスコープを意図された SP に限定します。これにより、アサーションのリプレイ攻撃や他のサービス プロバイダーによる不正アクセスを防ぎます。
- メタデータ交換の保護: SP と IdP のメタデータ交換を保護し、メタデータの改ざんやなりすまし攻撃を防ぎます。安全なチャネルとメカニズムを使用して、メタデータを安全に共有します。
- セキュアなリレーステート処理の実装: SAML 認証中に CSRF 攻撃を防ぐため、ユニークで予測不可能なリレーステート値を使用します。リレーステートを検証して、その完全性と信頼性を確保します。
- セッション管理の強制: セッションの有効期限ポリシーを定義し、セッションのタイムアウトを強制して、セッションハイジャックや不正アクセスのリスクを軽減します。SAML アサーション内のセッション関連属性を使用して、ユーザーセッションをセキュアに管理します。
- 機密属性の暗号化: 必要に応じて、SAML アサーション内の機密ユーザー属性を暗号化し、ユーザーのプライバシーとデータの機密性を保護します。信頼できる暗号化アルゴリズムと鍵管理プラクティスを使用して、機密データを保護します。
SAML の代替#
SAML は、SSO とアイデンティティ フェデレーションのために広く採用されているスタンダードとして、強力な機能セットとセキュリティ メカニズムを提供していますが、その古さが現代のアプリケーションの進化するセキュリティと使いやすさのニーズに対応する上で課題となる可能性があります。OAuth 2.0 ベースの OpenID Connect (OIDC) と比較した場合、SAML はより複雑であり、OIDC が提供するいくつかの強化されたセキュリティ機能を欠いています。たとえば、OIDC のマルチセキュリティ要求の承認コード フローは、比較的単純な SAML アサーション交換フローよりも安全なアプローチを提供します。より現代的で柔軟なアイデンティティ フェデレーション ソリューションを採用したい組織にとっては、OIDC は SAML の妥当な代替案となる可能性があります。