-
Notifications
You must be signed in to change notification settings - Fork 0
MS_SAMLAssertions
- 戻る(SAML Core)
- SAML Assertions
- SAML Protocols
- SAML Signature or Encryption
汎用認証サイトに SAML2.0を実装するため仕様を読む。
- ターゲットは SP Initiated な Web Browser SSO Profile に絞る。
- ココに書いた情報は、SAML Core の Assertion の範囲。
アサーション内では、一連の内部要素が以下のステートメントを記述する。
- 認証:Subject は特定の時点で特定の手段によって認証されました。
- 属性:Subject は提供された属性に関連付けられています。
- 許可決定:指定されたリソースにアクセスする要求が許可または拒否されました。
※ saml-core-2.0-os.pdf の内容が微妙なので、
- サンプルをベースにそれぞれの仕様を確認する。
- 医療分野共通認証基盤整備コンソーシアムのPDFの内容がワリとイイ
補足(表中の「汎用認証サイト」列): この列は、
Open棟梁プロジェクトの汎用認証サイト(Multi-purpose Authentication Site)が
実装対象としたかどうかを示す。仕様上の必須/任意とは別物である。
| # | パラメタ | 要否 | 値 | 既定値 | 内容 | 汎用認証サイト |
|---|---|---|---|---|---|---|
| 1 | ID |
Required | xs:ID |
- | 400 ビット以内の ID | ○ |
| 2 | Version |
Required | - | "2.0" |
バージョンを指定 | ○ |
| 3 | IssueInstant |
Required | UTC time | - | 発行時刻を指定 | ○ |
| # | パラメタ | 要否 | 値 | 既定値 | 内容 | 汎用認証サイト |
|---|---|---|---|---|---|---|
| 1 | saml:Issuer |
Required | URI | - | IdP の URI | ○ |
| 2 | ds:Signature |
Optional | - | - | XML署名 | ○ |
| 3 | saml:Subject |
Optional | - | - | 拡張スキーマで定義される Subject | ○ |
| 4 | saml:Statement |
Optional | - | - | 任意情報 | ○ |
| 5 | saml:AuthnStatement |
Optional | - | - | 認証情報 | ○ |
| 6 | saml:AuthzDecisionStatement |
Optional | - | - | 認可情報 | - |
| 7 | saml:AttributeStatement |
Optional | - | - | 属性情報 | - |
| 8 | saml:Conditions |
Optional | - | - | 有効性を評価する時に考慮すべき条件 | - |
| 9 | saml:Advice |
Optional | - | - | 付加情報 | - |
移行メモ(正誤): 元ページは
ds:Signatureを Required としていたが、
スキーマ上は Optional である
(署名を必須にしているのは Web Browser SSO Profile の
POST Binding 使用時の規定であって、<Assertion>自体の要件ではない)。また要素名を
saml:AuthzStatementとしていたが、
正しくはsaml:AuthzDecisionStatementである。
- Elements
| # | パラメタ | 要否 | 値 | 既定値 | 内容 | 汎用認証サイト |
|---|---|---|---|---|---|---|
| 1 | saml:BaseID |
Choice | URI | - | Subject の識別子を指定 | - |
| 2 | saml:NameID |
Choice | URI | - | 同上 | ○ |
| 3 | saml:EncryptedID |
Choice | URI | - | 同上(暗号化) | - |
| 4 | saml:SubjectConfirmation |
Optional | - | - | Subject の情報(下記参照) | ○ |
- Attribute
| # | パラメタ | 要否 | 値 | 既定値 | 内容 | 汎用認証サイト |
|---|---|---|---|---|---|---|
| 1 | NameQualifier |
Optional | string | - | 識別名を衝突させないよう修飾するセキュリティまたは管理のドメイン | - |
| 2 | SPNameQualifier |
Optional | string | - | 名称を指定する付加的な手段を提供する SP またはプロバイダ連合の名称 | - |
| 3 | Format |
Optional | URI |
urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified(ユーザ名) |
識別子の分類を表す参照 URI | ○ |
| 4 | SPProvidedID |
Optional | string | - | SP が別名として設定した識別子 | - |
-
Formatに指定できる主な値(詳細は SAML Core)
| 値 | 内容 | 汎用認証サイト |
|---|---|---|
urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified |
ユーザ名 | ○ |
urn:oasis:names:tc:SAML:2.0:nameid-format:entity |
Public UserID | ○ |
urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress |
メアド | ○ |
urn:oasis:names:tc:SAML:2.0:nameid-format:persistent |
Pairwise UserID(永続的仮名) | ○ |
urn:oasis:names:tc:SAML:2.0:nameid-format:transient |
一時的仮名 | - |
移行メモ(正誤): 元ページの表は
Formatの値がすべて
urn:oasis:names:tc:SAML:**1.1**:...で始まっており、
かつpersistentが 2 行(Pairwise UserID と一時的)並んでいた。
正しくは
entity/persistent/transientは SAML 2.0 の名前空間unspecified/emailAddressは 1.1 の名前空間- 「一時的」は
persistentではなくtransientであるため、上表のとおり正した。
また
SPProvidedIDは「?」となっていたが、
SP がその Subject に対して用いる別名を IdP が知っている場合に、
IdP 側が付記するための属性である。
- Attribute
| # | パラメタ | 要否 | 値 | 既定値 | 内容 | 汎用認証サイト |
|---|---|---|---|---|---|---|
| 1 | Method |
Required | URI | urn:oasis:names:tc:SAML:2.0:cm:bearer |
bearer をポイント | ○ |
- Elements
| # | パラメタ | 要否 | 値 | 既定値 | 内容 | 汎用認証サイト |
|---|---|---|---|---|---|---|
| 1 | saml:BaseID |
Choice | URI | - | Subject の識別子を指定 | - |
| 2 | saml:NameID |
Choice | URI | - | 同上 | ○ |
| 3 | saml:EncryptedID |
Choice | URI | - | 同上 | - |
| 4 | saml:SubjectConfirmationData |
Optional | - | - | Subject の情報(下記参照) | ○ |
- Attribute
| # | パラメタ | 要否 | 値 | 既定値 | 内容 | 汎用認証サイト |
|---|---|---|---|---|---|---|
| 1 | InResponseTo |
Optional | xs:NCName |
- | 対応する要求メッセージの ID | ○ |
| 2 | NotBefore |
Optional | UTC time | - | Subject の利用の開始時刻を指定 | - |
| 3 | NotOnOrAfter |
Optional | UTC time | - | Subject の利用の終了時刻を指定 | ○ |
| 4 | Recipient |
Optional | URL | - | SP のエンドポイント(Assertion Consumer Service) | ○ |
| 5 | Address |
Optional | IP アドレス | - | **プレゼンタ(UA)**のアドレス | - |
移行メモ(正誤): 2 点訂正する。
InResponseToの説明が「Response メッセージの ID」となっていたが、
これは「対応する要求(<AuthnRequest>)の ID」である。Addressの説明が「IdP のエンドポイント」となっていたが、
仕様上は「アサーションを提示している側(=ブラウザ)のアドレス」である。なお、
bearerを使う Web Browser SSO Profile では
**NotBeforeを含めてはならない(MUST NOT)**という規定がある。
- Attribute
| # | パラメタ | 要否 | 値 | 既定値 | 内容 | 汎用認証サイト |
|---|---|---|---|---|---|---|
| 1 | NotBefore |
Optional | UTC time | - | Assertion の利用の開始時刻を指定 | ○ |
| 2 | NotOnOrAfter |
Optional | UTC time | - | Assertion の利用の終了時刻を指定 | ○ |
- Elements
| # | パラメタ | 要否 | 値 | 既定値 | 内容 | 汎用認証サイト |
|---|---|---|---|---|---|---|
| 1 | saml:AudienceRestriction |
AnyNumber | <saml:Audience> |
- |
<saml:Audience> に SP の URL |
○ |
| 2 | saml:OneTimeUse |
Optional | - | - | アサーションを保持しない(キャッシュ禁止) | - |
| 3 | saml:ProxyRestriction |
Optional |
Count / <saml:Audience>
|
- | 利用者による Assertion 発行に関する制約条件 | - |
| 4 | saml:Condition |
Optional | - | - | 拡張用の抽象要素 | - |
※ AnyNumber:型が違う時に要否が変わる場合は、この表現。
補足(
<AudienceRestriction>の検証は必須):<Audience>は
JWT のaudクレームに相当する。SP は「自分の EntityID が
<Audience>に含まれること」を必ず検証する。
ここを省くと、別の SP 向けに発行されたアサーションを受理してしまい、
悪意ある SP がユーザになりすませる。
<ProxyRestriction>は「IdP がプロキシとして再発行できる回数」を制限する
ものだが、実装はほとんど無い。
- Attribute
| # | パラメタ | 要否 | 値 | 既定値 | 内容 | 汎用認証サイト |
|---|---|---|---|---|---|---|
| 1 | AuthnInstant |
Required | UTC time | - | 認証した時間 | ○ |
| 2 | SessionIndex |
Optional | string | - | 認証セッションのインデックス | - |
| 3 | SessionNotOnOrAfter |
Optional | UTC time | - | 認証セッションの有効期限 | - |
- Elements
| # | パラメタ | 要否 | 値 | 既定値 | 内容 | 汎用認証サイト |
|---|---|---|---|---|---|---|
| 1 | saml:AuthnContext |
Required | - | - | 認証コンテキスト(下記参照) | ○ |
| 2 | saml:SubjectLocality |
Optional | - | - | Subject の DNS ドメイン名と IP アドレス | - |
移行メモ: 元ページは Elements の番号が「1, 1」と重複していたので
「1, 2」に改めた。補足:
SessionIndexは「Single Logout をサポートするなら必要」であり、
<LogoutRequest>でどのセッションを落とすかを指定するのに使う
(SAML Profilesを参照)。
AuthnInstantは「いつ認証したか」であって
「アサーションをいつ作ったか(IssueInstant)」ではない。
SSO では既存セッションを流用するため、
AuthnInstantが数時間前ということは普通に起こる。
再認証を強制したい場合は<AuthnRequest>のForceAuthnを使う。
- Elements
| # | パラメタ | 要否 | 値 | 既定値 | 内容 | 汎用認証サイト |
|---|---|---|---|---|---|---|
| 1 | saml:AuthnContextClassRef |
Choice | URI | - | 認証コンテキストのクラスの参照 URI | ○ |
| 2 | saml:AuthnContextDecl |
Choice | - | - | 認証コンテキスト宣言そのものを埋め込む | - |
| 3 | saml:AuthnContextDeclRef |
Choice | URI | - | 認証コンテキスト宣言への参照 URI | - |
| 4 | saml:AuthenticatingAuthority |
Zero or More | URI | - | 認証オーソリティの 0 以上の一意な識別子 | - |
移行メモ: 元ページで「?」となっていた
AuthnContextDecl/
AuthnContextDeclRefは、認証方式を URI クラスで丸めるのではなく、
宣言(Declaration)そのものを記述/参照するための要素である。
実装はほぼ無く、通常はAuthnContextClassRefだけを使う。
https://docs.oasis-open.org/security/saml/v2.0/saml-core-2.0-os.pdf
2 SAML Assertions
2.1 Schema Header and Namespace Declarations
2.2 Name Identifiers
2.2.1 Element <BaseID>
2.2.2 Complex Type NameIDType
2.2.3 Element <NameID>
2.2.4 Element <EncryptedID>
2.2.5 Element <Issuer>
2.3 Assertions
2.3.1 Element <AssertionIDRef>
2.3.2 Element <AssertionURIRef>
2.3.3 Element <Assertion>
2.3.4 Element <EncryptedAssertion>
2.4 Subjects
2.4.1 Element <Subject>
2.4.1.1 Element <SubjectConfirmation>
2.4.1.2 Element <SubjectConfirmationData>
2.4.1.3 Complex Type KeyInfoConfirmationDataType
2.4.1.4 Example of a Key-Confirmed <Subject>
2.5 Conditions
2.5.1 Element <Conditions>
2.5.1.1 General Processing Rules
2.5.1.2 Attributes NotBefore and NotOnOrAfter
2.5.1.3 Element <Condition>
2.5.1.4 Elements <AudienceRestriction> and <Audience>
2.5.1.5 Element <OneTimeUse>
2.5.1.6 Element <ProxyRestriction>
2.6 Advice
2.6.1 Element <Advice>
2.7 Statements
2.7.1 Element <Statement>
2.7.2 Element <AuthnStatement>
2.7.2.1 Element <SubjectLocality>
2.7.2.2 Element <AuthnContext>
2.7.3 Element <AttributeStatement>
2.7.3.1 Element <Attribute>
2.7.3.1.1 Element <AttributeValue>
2.7.3.2 Element <EncryptedAttribute>
2.7.4 Element <AuthzDecisionStatement>
2.7.4.1 Simple Type DecisionType
2.7.4.2 Element <Action>
2.7.4.3 Element <Evidence>
Tags: 移行, IT国際標準, 認証基盤, クレームベース認証, SAML
このWikiは「Open棟梁Project」,「OSSコンソーシアム 開発基盤部会」によって運営されています。