-
Notifications
You must be signed in to change notification settings - Fork 0
MS_SAMLCore
- 戻る(SAMLの仕様を読む。)
- SAML Core
- SAML Profiles
- SAML Bindings
- SAML Metadata
汎用認証サイトに SAML2.0を実装するため仕様を読む。
- ターゲットは SP Initiated な Web Browser SSO Profile に絞る。
- ココに書いた情報は、SAML の Core の範囲。
-
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 を構成するすべての仕様をリスト
- 技術文書中での Shall / Should / May
- この仕様では従来の XML 名前空間プレフィックスが使用される。
- , etc.
| 対象 | スキーマ | 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:(assertion)/samlp:(protocol)が使われるが、
プレフィックス名は仕様上任意である。
実際、Microsoft Entra ID のメッセージは
<samlp:Response>の中の要素に既定名前空間を使う
(=saml:プレフィックスが付かない)ことがある。したがって XPath でプレフィックス名を決め打ちすると壊れる。
名前空間 URI で解決すること。
- SAML スキーマ全体に現れる一般的なデータ型の使用方法と解釈方法を定義
- XML Schema Datatypes 仕様 [Schema2] に組み込まれている。
SAML 文字列値(xs:string)
-
少なくとも 1 つの非空白文字で構成されている必要がある。
-
比較
- 厳密なバイナリ比較を使用して比較
- エンコーディングが異なる場合、[UNICODE-C] に変換して比較する。
- 大文字と小文字を区別する。
-
以下に依存しない。
- 空白の正規化またはトリミング
- 数字や通貨などのロケール固有の形式
-
XML に指定された正規化規則(XML 勧告 Section 2.11)
- 行末は、改行文字(ASCII コード 10 Decimal)を使用
- すべての空白文字は空白に置き換えられる(ASCII コード 32 Decimal)
- XML 属性値は、[XML] セクション 3.3.3 で説明されているように正規化
-
XML 要素・属性値の照合順序や並べ替え順序は定義されない。
故に、実装は値の特定のソート順に依存してはいけない。
補足(実装で刺さる点): 「厳密なバイナリ比較」「大文字小文字を区別」は
NameIDの突合で問題になる。
FormatがemailAddressの場合、
IdP がJohn.Doe@example.comを、次回はjohn.doe@example.comを
返してくると、別人として扱われて重複アカウントが生まれる。仕様は「区別する」だが、実務では正規化(小文字化)してから突合し、
かつNameIDではなく不変の内部 ID に紐づけて保持するのが安全である。
SAML URI 参照値(xs:anyURI)
- 少なくとも 1 つの非空白文字で構成されている必要がある。
- 以下の識別子として URI 参照を広く使用している。
- ステータスコード / フォーマットタイプ / 属性 / システムエンティティ名 / etc.
SAML 時間値(xs:dateTime)
- タイムゾーンコンポーネントなしの UTC 形式で表現する。
- ミリ秒よりも細かい時間分解能に頼るべきではない。
- うるう秒を指定する瞬間を生成してはならない。
補足(時刻ずれ対策):
NotBefore/NotOnOrAfterの判定は、
IdP と SP の時計がずれていると即座に失敗する。
SAML で最も多い障害原因の一つである。
- サーバは NTP で同期する(必須)。
- 検証時は **数分程度の許容差(clock skew)**を設ける
(多くの実装は既定 5 分)。- .NET の
DateTimeで扱う場合、DateTimeKindを UTC に固定する。
ローカル時刻として解釈されると時差の分だけずれる。
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署名・暗号を参照)。
※ 実装レベル
| 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 |
プライバシー保護の永続的仮名を使用する。
-
永続的である必要がある。
- UserId に Hash を適用したり
- UserId に紐付けた GUID を返したり
-
NameQualifier属性とSPNameQualifier属性で動作が変わる。- 通常単一の SP でのみ使用するために確立される。
- 明示的に削除されるまでローカル ID と関連付けられたままになる。
- Name Identifier Mapping Protocol により所属という概念に対するサポートも提供。
補足(
entityは Subject に使わない): 上表の
nameid-format:entityは「SP / IdP といったシステムのエンティティ」を
指すためのもので、エンドユーザのNameIDとしては使わない。
<Issuer>のFormatに指定するのが本来の用途である。
プライバシー保護の一時的仮名を使用する。
-
一時的である必要がある。GUID などを生成して返せばイイ
- IdP で作成された使い捨て識別子に対応するため、SP での匿名性をサポート。
- SP で特定のローカル ID と関連付けられておらず、セッションが終了すると破棄される。
-
ユーザを特定可能な形で連携すると意味がなくなるので注意。
- 様々なクレームを
AttributeStatement > Attribute > AttributeValueに指定できる。
- 様々なクレームを
2.0 でほぼ Fix なので読まなくてよさそう。
補足: 実際、SAML 2.0 は 2005 年の勧告から仕様が凍結している。
SAML 3.0 は存在せず、新規開発は
OpenID Connect へ移っている。
ただし SAML 2.0 は SaaS の SSO で今なお広く使われており、
当面なくならない。
- SAML アサーションとプロトコルによる拡張機能
- 新しい Profile を定義する方法は、[SAMLProf](SAML Profiles)を参照
- 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
このWikiは「Open棟梁Project」,「OSSコンソーシアム 開発基盤部会」によって運営されています。