「マイクロソフト系技術情報 Wiki」は、「Open棟梁Project」,「OSSコンソーシアム .NET開発基盤部会」によって運営されています。
SAML2.0 の 技術概要
特定のユースケースを実現するための組み合わせ方を定義。
XMLデジタル署名処理規則と構文
※ 追加のサイトとアカウントリンクする場合は、
新たにフェデレーション名識別子を生成し、上記手順を繰り返す。
(プロファイル(バインディング(プロトコル(アサーション)))) ・メタデータ ・認証コンテキスト
アサーティング・パーティが真実であると主張するプリンシパルに関する
ステートメントを伝えるXMLスキーマによって定義されたアサーション。
参加者間でSAMLプロトコル・メッセージを転送するために下位レベルの
通信またはメッセージングプロトコル(HTTPまたはSOAPなど)を使用する方法
通常、アサーションは以下から構成される。
いくつかの一般化された要求/応答プロトコルを定義する。
トランスポート層上で、プロトコルメッセージをどのように伝達するか?
特定シナリオでアサーション、プロトコル、バインディングの組合せ(制約)を定義
Transport Protocol
1: <saml:Assertion 2: xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion" 3: Version="2.0" IssueInstant="2005-01-31T12:00:00Z"> 4: <saml:Issuer Format=urn:oasis:names:SAML:2.0:nameid-format:entity>> ... Nature of the assertion. 5: http://idp.example.org 6: </saml:Issuer> 7: <saml:Subject> ... Subject of the assertion. 8: <saml:NameID 9: Format="urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress"> 10: j.doe@example.com 11: </saml:NameID> 12: </saml:Subject> 13: <saml:Conditions ... Additional conditions of period. 14: NotBefore="2005-01-31T12:00:00Z" 15: NotOnOrAfter="2005-01-31T12:10:00Z"> 16: </saml:Conditions> 17: <saml:AuthnStatement ... Authentication statement 18: AuthnInstant="2005-01-31T12:00:00Z" SessionIndex="67775277772"> 19: <saml:AuthnContext> 20: <saml:AuthnContextClassRef> 21: urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport 22: </saml:AuthnContextClassRef> 23: </saml:AuthnContext> 24: </saml:AuthnStatement> 25: </saml:Assertion>
が属性に使用されているとは想定していない。
1: <saml:AttributeStatement> 2: <saml:Attribute ... SAML X.500 / LDAP属性プロファイル 3: xmlns:x500="urn:oasis:names:tc:SAML:2.0:profiles:attribute:X500" 4: NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri" 5: Name="urn:oid:2.5.4.42" FriendlyName="givenName"> 6: <saml:AttributeValue xsi:type="xs:string" x500:Encoding="LDAP"> 7: John 8: </saml:AttributeValue> 9: </saml:Attribute> 10: <saml:Attribute 11: NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:basic" 12: Name="LastName"> 13: <saml:AttributeValue xsi:type="xs:string"> 14: Doe 15: </saml:AttributeValue> 16: </saml:Attribute> 17: <saml:Attribute 18: NameFormat="http://smithco.com/attr-formats" 19: Name="CreditLimit"> 20: xmlns:smithco="http://www.smithco.com/smithco-schema.xsd" 21: <saml:AttributeValue xsi:type="smithco:type"> 22: <smithco:amount currency="USD">500.00</smithco:amount> 23: </saml:AttributeValue> 24: </saml:Attribute> 25: </saml:AttributeStatement>
1: <?xml version="1.0" encoding="UTF-8"?> 2: <env:Envelope 3: xmlns:env="http://www.w3.org/2003/05/soap/envelope/"> 4: <env:Body> 5: <samlp:AttributeQuery 6: xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion" 7: xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol" 8: ID="aaf23196-1773-2113-474a-fe114412ab72" 9: Version="2.0" IssueInstant="2006-07-17T20:31:40Z"> 10: <saml:Issuer> 11: http://example.sp.com 12: </saml:Issuer> 13: <saml:Subject> 14: <saml:NameID 15: Format="urn:oasis:names:tc:SAML:1.1:nameid-format:X509SubjectName"> 16: C=US, O=NCSA-TEST, OU=User, CN=trscavo@uiuc.edu 17: </saml:NameID> 18: </saml:Subject> 19: <saml:Attribute 20: NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri" 21: Name="urn:oid:2.5.4.42" FriendlyName="givenName"> 22: </saml:Attribute> 23: </samlp:AttributeQuery> 24: </env:Body> 25: </env:Envelope>
1: <?xml version="1.0" encoding="UTF-8"?> 2: <env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/"> 3: <env:Body> 4: <samlp:Response 5: xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol" 6: xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion" 7: ID="i92f8b5230dc04d73e93095719d191915fdc67d5e" 8: Version="2.0" IssueInstant="2006-07-17T20:31:41Z" 9: InResponseTo="aaf23196-1773-2113-474a-fe114412ab72 "> ... 応答先の要求を参照 10: <saml:Issuer> 11: http://idp.example.org 12: </saml:Issuer> 13: <samlp:Status> 14: <samlp:StatusCode Value="urn:oasis:names:tc:SAML:2.0:status:Success"/> 15: </samlp:Status> 16: ...SAML assertion... 17: </samlp:Response> 18: </env:Body> 19: </env:Envelope>
情報技術の文脈では、プライバシは一般に、
の両方を指す。
仮名の確立をサポート
使用される可能性が高い典型的なフロー
主に2つのオプションがある。
SP-Initiated SSO
https://idp.example.org/SAML2/SSO/Redirect?SAMLRequest=request&RelayState=token
<samlp:AuthnRequest xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol" xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion" ID="identifier_1" Version="2.0" IssueInstant="2004-12-05T09:21:59Z" AssertionConsumerServiceIndex="1"> <saml:Issuer> https://sp.example.com/SAML2 </saml:Issuer> <samlp:NameIDPolicy AllowCreate="true" Format="urn:oasis:names:tc:SAML:2.0:nameid-format:transient"/> </samlp:AuthnRequest>
<form method="post" action="https://sp.example.com/SAML2/SSO/POST" ...> <input type="hidden" name="SAMLResponse" value="response" /> <input type="hidden" name="RelayState" value="token" /> ... <input type="submit" value="Submit" /> </form>
POST /SAML2/SSO/POST HTTP/1.1 Host: sp.example.com Content-Type: application/x-www-form-urlencoded Content-Length: nnn SAMLResponse=response&RelayState=token
<samlp:Response xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol" xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion" ID="identifier_2" InResponseTo="identifier_1" Version="2.0" IssueInstant="2004-12-05T09:22:05Z" Destination="https://sp.example.com/SAML2/SSO/POST"> <saml:Issuer> https://idp.example.org/SAML2 </saml:Issuer> <samlp:Status> <samlp:StatusCode Value="urn:oasis:names:tc:SAML:2.0:status:Success"/> </samlp:Status> <saml:Assertion xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion" ID="identifier_3" Version="2.0" IssueInstant="2004-12-05T09:22:05Z"> <saml:Issuer> https://idp.example.org/SAML2 </saml:Issuer> <!-- a POSTed assertion MUST be signed --> <ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#"> ... </ds:Signature> <saml:Subject> <saml:NameID Format="urn:oasis:names:tc:SAML:2.0:nameid-format:transient"> 3f7b3dcf-1674-4ecd-92c8-1544f346baf8 </saml:NameID> <saml:SubjectConfirmation Method="urn:oasis:names:tc:SAML:2.0:cm:bearer"> <saml:SubjectConfirmationData InResponseTo="identifier_1" Recipient="https://sp.example.com/SAML2/SSO/POST" NotOnOrAfter="2004-12-05T09:27:05Z"/> </saml:SubjectConfirmation> </saml:Subject> <saml:Conditions NotBefore="2004-12-05T09:17:05Z" NotOnOrAfter="2004-12-05T09:27:05Z"> <saml:AudienceRestriction> <saml:Audience> https://sp.example.com/SAML2 </saml:Audience> </saml:AudienceRestriction> </saml:Conditions> <saml:AuthnStatement AuthnInstant="2004-12-05T09:22:00Z" SessionIndex="identifier_3"> <saml:AuthnContext> <saml:AuthnContextClassRef> urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport </saml:AuthnContextClassRef> </saml:AuthnContext> </saml:AuthnStatement> </saml:Assertion> </samlp:Response>
SP-Initiated SSO
<form method="post" action="https://idp.example.org/SAML2/SSO/POST" ...> <input type="hidden" name="SAMLRequest" value="request" /> <input type="hidden" name="RelayState" value="token" /> ... <input type="submit" value="Submit" /> </form>
POST /SAML2/SSO/POST HTTP/1.1 Host: idp.example.org Content-Type: application/x-www-form-urlencoded Content-Length: nnn SAMLRequest=request&RelayState=token
<samlp:ArtifactResolve xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol" xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion" ID="identifier_2" Version="2.0" IssueInstant="2004-12-05T09:22:04Z" Destination="https://idp.example.org/SAML2/ArtifactResolution"> <saml:Issuer> https://sp.example.com/SAML2 </saml:Issuer> <!-- an ArtifactResolve message SHOULD be signed --> <ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#"> ... </ds:Signature> <samlp:Artifact> artifact </samlp:Artifact> </samlp:ArtifactResolve>
<samlp:ArtifactResponse xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol" ID="identifier_3" InResponseTo="identifier_2" Version="2.0" IssueInstant="2004-12-05T09:22:05Z"> <!-- an ArtifactResponse message SHOULD be signed --> <ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#"> ... </ds:Signature> <samlp:Status> <samlp:StatusCode Value="urn:oasis:names:tc:SAML:2.0:status:Success"/> </samlp:Status> <samlp:Response xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol" xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion" ID="identifier_4" InResponseTo="identifier_1" Version="2.0" IssueInstant="2004-12-05T09:22:05Z" Destination="https://sp.example.com/SAML2/SSO/Artifact"> <saml:Issuer> https://idp.example.org/SAML2 </saml:Issuer> <ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#"> ... </ds:Signature> <samlp:Status> <samlp:StatusCode Value="urn:oasis:names:tc:SAML:2.0:status:Success"/> </samlp:Status> <saml:Assertion xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion" ID="identifier_5" Version="2.0" IssueInstant="2004-12-05T09:22:05Z"> <saml:Issuer> https://idp.example.org/SAML2 </saml:Issuer> <!-- a Subject element is required --> <saml:Subject> <saml:NameID Format="urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress"> user@mail.example.org </saml:NameID> <saml:SubjectConfirmation Method="urn:oasis:names:tc:SAML:2.0:cm:bearer"> <saml:SubjectConfirmationData InResponseTo="identifier_1" Recipient="https://sp.example.com/SAML2/SSO/Artifact" NotOnOrAfter="2004-12-05T09:27:05Z"/> </saml:SubjectConfirmation> </saml:Subject> <saml:Conditions NotBefore="2004-12-05T09:17:05Z" NotOnOrAfter="2004-12-05T09:27:05Z"> <saml:AudienceRestriction> <saml:Audience> https://sp.example.com/SAML2 </saml:Audience> </saml:AudienceRestriction> </saml:Conditions> <saml:AuthnStatement AuthnInstant="2004-12-05T09:22:00Z" SessionIndex="identifier_5"> <saml:AuthnContext> <saml:AuthnContextClassRef> urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport </saml:AuthnContextClassRef> </saml:AuthnContext> </saml:AuthnStatement> </saml:Assertion> </samlp:Response> </samlp:ArtifactResponse>
もともとSAML v1でサポートされていたIdP-Initiated SSOユースケースを引き続きサポート
OASISは「SGML Open」として1993年、
主に「研修活動を通じたSGMLの採用促進を目的として」結成された、
SGMLツール業者の業界団体。
http://docs.oasis-open.org/security/saml/v2.0/saml-2.0-os.zip
以下のQiitaを参考にすると、TechnicalOverview? をざっと眺めて、
どの Profile か選択してから Profile, binding, core と見ていくとイイらしい。
- https://www.oasis-open.org/committees/download.php/27819/sstc-saml-tech-overview-2.0-cd-02.pdf
- https://docs.oasis-open.org/security/saml/v2.0/saml-profiles-2.0-os.pdf
- https://docs.oasis-open.org/security/saml/v2.0/saml-bindings-2.0-os.pdf
- https://docs.oasis-open.org/security/saml/v2.0/saml-core-2.0-os.pdf
- https://www.w3.org/TR/xmldsig-core1/
SAMLのセキュリティとプライバシーの特性について分析/説明。
http://www.oasis-open.org/committees/security/.
http://www.oasis-open.org/committees/wss/
SAML 公式サイト
https://www.osstech.co.jp/_media/techinfo/opensso/osstech-opensso-study-02-saml.pdf
SAMLの構成要素
<saml:Assertion xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion" Version="2.0" ID="s2907181983bc6f588aeb045fca183d671224506ec" IssueInstant="2009-11-18T08:28:09Z"> アサーション発行者 アサーションのデジタル署名 アサーションの利用条件 ユーザ識別子(NameID) </saml:Assertion>
<samlp:AuthnRequest ID="xxx" Version="2.0" Destination="http://idp.osstech.co.jp/idp/sso"> 認証要求情報が入る </samlp:AuthnRequest>
<samlp:Response ID="xxx" Version="2.0" Destination="http://sp.osstech.co.jp/sp/sso"> <saml:Assertion ...> アサーションが入る </saml:Assertion> </samlp:AuthnRequest>
<EntityDescriptor entityID="google.com" xmlns="urn:oasis:names:tc:SAML:2.0:metadata"> <SPSSODescriptor protocolSupportEnumeration="urn:oasis:names:tc:SAML:2.0:protocol"> <NameIDFormat>urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified</NameIDFormat> <AssertionConsumerService index="1" Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST" Location="https://www.google.com/a/ドメイン名/acs" /> </SPSSODescriptor> </EntityDescriptor>
https://www.osstech.co.jp/_media/techinfo/seminar/hbstudy-20110416-sso.pdf
※同じ言葉でも、他のプロトコルでは意味が違うことがあるので注意
事前に IdP の証明書を SP に登録しておく必要がある(JWTみたいなもの)
<saml:Assertion xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion" Version="2.0" ID="s2907181983bc6f588aeb045fca183d671224506ec" IssueInstant="2009-11-18T08:28:09Z"> アサーション発行者 アサーションのデジタル署名 ユーザー識別子(NameID) </saml:Assertion>
<samlp:AuthnRequest ID="xxx" Version="2.0" Destination="http://idp.osstech.co.jp/idp/sso"> 認証要求情報 </samlp:AuthnRequest>
<samlp:Response ID="xxx" Version="2.0" Destination"http://sp.osstech.co.jp/sp/sso"> < saml:Assertion ...> アサーション </saml:Assertion> </samlp:AuthnRequest>
https://www.osstech.co.jp/_media/techinfo/openam/saml_authncontext_20150417.pdf
http://developer.cybozu.co.jp/tech/?p=4224
SAMLはSecurity Assertion Markup Languageの略で、OASIS3によって策定された、
異なるセキュリティドメイン間で、認証情報を連携するためのXMLベースの標準仕様。
Web Browser SSO Profileのシーケンス
Web Browser SSO Profileの要件
<md:EntityDescriptor entityID="https://(sub_domain).cybozu.com"> <md:SPSSODescriptor protocolSupportEnumeration="urn:oasis:names:tc:SAML:2.0:protocol"> <md:NameIDFormat> urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified </md:NameIDFormat> <md:AssertionConsumerService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST" Location="https://(sub_domain).cybozu.com/saml/acs" index="0"/> </md:SPSSODescriptor> </md:EntityDescriptor>
https://jp.cybozu.help/general/ja/admin/list_externalservices/list_saml/saml_settings.html
SAMLリクエストとSAMLレスポンスには、次のバインディングを使用する。
Tags: :IT国際標準, :認証基盤, :クレームベース認証, :SAML