Skip to content

MS_SAMLCore

nishi_74322014 edited this page Aug 12, 2026 · 1 revision

SAML Core

概要

汎用認証サイトに SAML2.0を実装するため仕様を読む。

  • ターゲットは SP Initiated な Web Browser SSO Profile に絞る。
  • ココに書いた情報は、SAML の Core の範囲。

Introduction

  • Core = Assertion 自体、または Assertion の対象に関して通信するための Protocol

  • Assertion の構造と関連する Protocol のセットと
    システムの管理に含まれる処理規則を定義する。

  • [XMLNS]

    • Assertion と Protocol メッセージは XML でエンコード
    • XML 名前空間を使用し、他のトランスポート構造に埋め込まれる。
  • [SAMLBind]
    SAMLバインディング仕様は、
    Protocol メッセージの埋め込みと転送のためのフレームワーク

  • [SAMLProf]
    SAMLプロファイル仕様は、

    • 特定のユースケースを達成するため、
    • または SAML 機能を使用するときに相互運用性を達成するために、

    Assertion と Protocol を使用するための Profile のベースラインセットを提供

  • SAML の用語と概念の詳細

    • [SAMLTechOvw]: SAML の技術概要
    • [SAMLGloss]: SAML 用語集
  • 特定の情報だけを含むファイル

    • [SAML-XSD]: SAML アサーションスキーマ
    • [SAMLConform]: SAML 適合文書は、SAML V2.0 を構成するすべての仕様をリスト

Notation

Schema Organization and Namespaces

対象 スキーマ XML 名前空間
SAML Assertion 構造 [SAML-XSD] urn:oasis:names:tc:SAML:2.0:assertion
SAML 要求 / 応答 Protocol 構造 SAMLP-XSD urn:oasis:names:tc:SAML:2.0:protocol
XML 署名 [XMLSig] http://www.w3.org/2000/09/xmldsig#
XML 暗号化 [XMLEnc] http://www.w3.org/2001/04/xmlenc#
  • インポート
    • [SAML-XSD] スキーマは、SAMLP-XSD スキーマにインポートされる。
    • [XMLEnc] スキーマは、[SAML-XSD] スキーマにインポートされる。
    • [XMLSig] スキーマは、[SAML-XSD]、SAMLP-XSD の両スキーマにインポートされる。

補足(実装上の注意): 名前空間プレフィックスは慣例で
saml:(assertion)/ samlp:(protocol)が使われるが、
プレフィックス名は仕様上任意である。
実際、Microsoft Entra ID のメッセージは
<samlp:Response> の中の要素に既定名前空間を使う
(= saml: プレフィックスが付かない)ことがある。

したがって XPath でプレフィックス名を決め打ちすると壊れる
名前空間 URI で解決すること。

Common Data Types

  • SAML スキーマ全体に現れる一般的なデータ型の使用方法と解釈方法を定義
  • XML Schema Datatypes 仕様 [Schema2] に組み込まれている。

String Values

SAML 文字列値(xs:string

  • 少なくとも 1 つの非空白文字で構成されている必要がある。

  • 比較

    • 厳密なバイナリ比較を使用して比較
    • エンコーディングが異なる場合、[UNICODE-C] に変換して比較する。
    • 大文字と小文字を区別する。
  • 以下に依存しない。

    • 空白の正規化またはトリミング
    • 数字や通貨などのロケール固有の形式
  • XML に指定された正規化規則(XML 勧告 Section 2.11)

    • 行末は、改行文字(ASCII コード 10 Decimal)を使用
    • すべての空白文字は空白に置き換えられる(ASCII コード 32 Decimal)
    • XML 属性値は、[XML] セクション 3.3.3 で説明されているように正規化
  • XML 要素・属性値の照合順序や並べ替え順序は定義されない。
    故に、実装は値の特定のソート順に依存してはいけない。

補足(実装で刺さる点): 「厳密なバイナリ比較」「大文字小文字を区別」は
NameID の突合で問題になる

FormatemailAddress の場合、
IdP が John.Doe@example.com を、次回は john.doe@example.com
返してくると、別人として扱われて重複アカウントが生まれる

仕様は「区別する」だが、実務では正規化(小文字化)してから突合し、
かつ NameID ではなく不変の内部 ID に紐づけて保持するのが安全である。

URI Values

SAML URI 参照値(xs:anyURI

  • 少なくとも 1 つの非空白文字で構成されている必要がある。
  • 以下の識別子として URI 参照を広く使用している。
    • ステータスコード / フォーマットタイプ / 属性 / システムエンティティ名 / etc.

Time Values

SAML 時間値(xs:dateTime

  • タイムゾーンコンポーネントなしの UTC 形式で表現する。
  • ミリ秒よりも細かい時間分解能に頼るべきではない。
  • うるう秒を指定する瞬間を生成してはならない。

補足(時刻ずれ対策): NotBefore / NotOnOrAfter の判定は、
IdP と SP の時計がずれていると即座に失敗する
SAML で最も多い障害原因の一つである。

  • サーバは NTP で同期する(必須)。
  • 検証時は **数分程度の許容差(clock skew)**を設ける
    (多くの実装は既定 5 分)。
  • .NET の DateTime で扱う場合、DateTimeKind を UTC に固定する。
    ローカル時刻として解釈されると時差の分だけずれる。

ID and ID Reference Values

SAML ID 単純型(xs:ID

  • 要求、および応答の SAML 識別子を宣言するために使用

  • 宣言が 1 つだけ存在すること(重複しない事)

    • 重複の可能性は極僅かであることを保証する。
    • 2 つのランダムに選択された識別子が同一である確率
      • 2-128 以下でなければならず(MUST)
      • 2-160 以下であるべき(SHOULD)。
    • これは、長さが 128-160 ビットのランダム値で満たされる。
  • xs:ID の識別子の参照

    • xs:NCName を使用できる。
    • xs:IDREF は重複するため使用できない。

補足(xs:ID の落とし穴): xs:ID
XML の名前(NCName)でなければならないため、
数字で始まってはならない

GUID をそのまま入れると 3f7b3dcf-... のように数字始まりになりうるため、
実装は先頭に _id を付ける
(仕様例が _a75adf55-...identifier_1 になっているのはこのため)。

また、同一文書内で ID 値が重複してはならない
重複を許すパーサだと、XML Signature Wrapping(XSW)攻撃の
足がかりになる(XML署名・暗号を参照)。

詳細

Name Identifier Format Identifiers

実装レベル

Format URI 説明
Unspecified urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified 要素の内容の解釈は個々の実装に任されている。
Entity Identifier urn:oasis:names:tc:SAML:2.0:nameid-format:entity SAML プロファイルの参加者の識別子
Email Address urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress E メールアドレス、[RFC 2822] の 3.4.1 で定義された "addr-spec" の形式。
Persistent Identifier urn:oasis:names:tc:SAML:2.0:nameid-format:persistent プライバシー保護の永続的仮名
Transient Identifier urn:oasis:names:tc:SAML:2.0:nameid-format:transient プライバシー保護の一時的仮名
その他 X.509 subject name / Windows domain qualified name / Kerberos principal name

Persistent Identifier

プライバシー保護の永続的仮名を使用する。

  • 永続的である必要がある。

    • UserId に Hash を適用したり
    • UserId に紐付けた GUID を返したり
  • OIDC の Subject Identifier Types = pairwiseに該当。

  • NameQualifier 属性と SPNameQualifier 属性で動作が変わる。

    • 通常単一の SP でのみ使用するために確立される。
    • 明示的に削除されるまでローカル ID と関連付けられたままになる。
    • Name Identifier Mapping Protocol により所属という概念に対するサポートも提供。

補足(entity は Subject に使わない): 上表の
nameid-format:entity は「SP / IdP といったシステムのエンティティ」を
指すためのもので、エンドユーザの NameID としては使わない
<Issuer>Format に指定するのが本来の用途である。

Transient Identifier

プライバシー保護の一時的仮名を使用する。

  • 一時的である必要がある。GUID などを生成して返せばイイ

    • IdP で作成された使い捨て識別子に対応するため、SP での匿名性をサポート。
    • SP で特定のローカル ID と関連付けられておらず、セッションが終了すると破棄される。
  • ユーザを特定可能な形で連携すると意味がなくなるので注意。

    • 様々なクレームを AttributeStatement > Attribute > AttributeValue に指定できる。

その他

SAML Versioning

2.0 でほぼ Fix なので読まなくてよさそう。

補足: 実際、SAML 2.0 は 2005 年の勧告から仕様が凍結している。
SAML 3.0 は存在せず、新規開発は
OpenID Connect へ移っている。
ただし SAML 2.0 は SaaS の SSO で今なお広く使われており、
当面なくならない

SAML Extensibility

  • SAML アサーションとプロトコルによる拡張機能
  • 新しい Profile を定義する方法は、[SAMLProf](SAML Profiles)を参照

SAML-Defined Identifiers

  • URI ベースの識別子
  • Subject 名識別子の形式
  • 属性名の形式

参考

https://docs.oasis-open.org/security/saml/v2.0/saml-core-2.0-os.pdf

1 Introduction
1.1 Notation
1.2 Schema Organization and Namespaces

1.3 Common Data Types
1.3.1 String Values
1.3.2 URI Values
1.3.3 Time Values
1.3.4 ID and ID Reference Values

4 SAML Versioning
4.1 SAML Specification Set Version
4.1.1 Schema Version
4.1.2 SAML Assertion Version
4.1.3 SAML Protocol Version
4.1.3.1 Request Version
4.1.3.2 Response Version
4.1.3.3 Permissible Version Combinations
4.2 SAML Namespace Version
4.2.1 Schema Evolution

7 SAML Extensibility
7.1 Schema Extension
7.1.1 Assertion Schema Extension
7.1.2 Protocol Schema Extension
7.2 Schema Wildcard Extension Points
7.2.1 Assertion Extension Points
7.2.2 Protocol Extension Points
7.3 Identifier Extension

8 SAML-Defined Identifiers
8.1 Action Namespace Identifiers
8.1.1 Read/Write/Execute/Delete/Control
8.1.2 Read/Write/Execute/Delete/Control with Negation
8.1.3 Get/Head/Put/Post
8.1.4 UNIX File Permissions
8.2 Attribute Name Format Identifiers
8.2.1 Unspecified
8.2.2 URI Reference
8.2.3 Basic
8.3 Name Identifier Format Identifiers
8.3.1 Unspecified
8.3.2 Email Address
8.3.3 X.509 Subject Name
8.3.4 Windows Domain Qualified Name
8.3.5 Kerberos Principal Name
8.3.6 Entity Identifier
8.3.7 Persistent Identifier
8.3.8 Transient Identifier
8.4 Consent Identifiers
8.4.1 Unspecified
8.4.2 Obtained
8.4.3 Prior
8.4.4 Implicit
8.4.5 Explicit
8.4.6 Unavailable
8.4.7 Inapplicable

9 References
9.1 Normative References
9.2 Non-Normative References

Appendix A. Acknowledgments
Appendix B. Notices

Tags: 移行, IT国際標準, 認証基盤, クレームベース認証, SAML

NetDevInfraWiki

マイクロソフト系技術情報 Wiki
Open 棟梁 Wiki

(未着手)

開発基盤部会 Wiki

移行管理: DONETODO

Clone this wiki locally