SAML (Security Assertion Markup Language) は、ID プロバイダ (IdP) とサービス プロバイダ (SP) 間で認証と認可を交換するための XML ベースのマークアップ言語です。
SAML 認証
認証とは、ユーザーの ID を検証するプロセスのことです。これは、システムに接続しているユーザーが接続を承認/許可されていることを確認するためです。ここ数年の間に、認証プロセスを ID プロバイダに委任することにより、認証プロセスを一元化するフェデレーション認証への大幅な移行がありました。SAML は、これを実現する方法の 1 つです。
SAML は、任意のシステムと相互運用できるように設計された標準化された形式です。SAML は IdP で単一の認証ポイントを提供するため、ホストされたサービスへの依存に移行するにつれて、組織にとって重要となります。SAML を使用して ID をアサートするため、認証情報は信頼されていない複数のデバイスには保存されません。ユーザーがアプリケーションにアクセスするために複数の認証情報を覚えておく必要がないため、ユーザー エクスペリエンスにもメリットがあります。ユーザーは、1 回のログインで、単一の認証情報セットを使用して複数のアプリケーションにアクセスできます。また、認証用ハードウェアとソフトウェアの保守、アプリケーション内での認証メカニズムの追加のオーバーヘッドも軽減されます。
SAML の用語
クライアント |
保護されたリソースにアクセスしようとしているユーザー。 |
SP と IdP 間のすべての通信は、クライアントのブラウザを介して行われます。 |
|
サービス プロバイダ (SP) |
保護されたリソースをホストし、クライアントにリソースへのアクセスを許可する前に ID プロバイダに認証情報を要求するエンティティ。 |
ID プロバイダ (IdP) |
クライアントの ID を検証し、SP に認証サービスを提供する信頼できるエンティティ。 |
アサーション |
IdP と SP 間で交換される XML メッセージ。 |
SAML 要求 |
SP が IdP に渡してクライアントを認証する要求。 |
SAML 応答 |
IdP が SP に渡す、クライアントに関する情報を含むアサーション。 |
アサーション コンシューマ サービス (ACS) |
SAML プロトコル メッセージを処理し、メッセージから抽出された情報を表す Cookie を返す、SP 内の HTTP リソース。IdP は SAML 応答アサーションを ACS に送信します。 |
エンティティ ID |
IdP と SP の両方で一致する一意の文字列。 |
メタデータ |
SP または IdP をプロビジョニングして相互に通信するために使用される構成データ。SAML 2.0 は、エンティティが信頼プロセスのブートストラップに利用できる、適切に定義された相互運用可能なメタデータ形式を提供します。 |
SAML プロセス
SAML プロセスには次の 2 種類があります。
- IdP によって開始された SSO:
-
クライアントは ID プロバイダに接続して認証され、サービス プロバイダからリソースにアクセスします。
- SP によって開始された SSO:
-
クライアントはサービス プロバイダに接続し、次にサービス プロバイダが認証のためにクライアントを ID プロバイダにリダイレクトします。正常に認証されると、クライアントはサービス プロバイダにリダイレクトされ、サービス プロバイダは、リソースへのアクセスを許可します。
NSX Advanced Load Balancer は、SP によって開始される SSO のみをサポートし、NSX Advanced Load Balancer 仮想サービスがサービス プロバイダとして機能します。
SAML バインド
IdP と SP は、クライアントを介して SAML 要求と SAML 応答を相互に交換します。これらのメッセージを転送する方法は、SAML バインドと呼ばれます。SAML は、複数の種類のバインドをサポートします。
サービス プロバイダとして機能する NSX Advanced Load Balancer 仮想サービスは、以下をサポートします。
バインドをリダイレクトして、クライアントを IdP にリダイレクトします。SAML 要求は、HTTP GET 要求の URL クエリ文字列で直接送信されます。
バインドを POST して SP に応答を送信します。SAML 応答は、Base64 でエンコードされたコンテンツを使用して HTML 形式で送信されます。
SAML アサーション
SAML アサーションは、IdP が SP に送信する、ユーザー情報を含む XML ドキュメントです。SAML アサーションには、次の 3 種類のステートメントがあります。
- 認証:
-
ユーザーの ID を証明します。
- 属性アサーション:
-
SAML 属性はアサーションの一部として SP に渡され、ユーザーに関する情報が提供されます。
- 認可アサーション:
-
ユーザーがサービスを使用する権限を持つ/持たないことを知ることができる SP 情報を提供します。
NSX Advanced Load Balancer 仮想サービスをサービス プロバイダとして使用するクライアントの SAML 認証
要求フローは次のとおりです。
ユーザーが NSX Advanced Load Balancer でホストされているリソースにアクセスしようとしています。つまり、NSX Advanced Load Balancer はサービス プロバイダとして動作しています:GET https://sales.avi.com/。
ユーザーがまだ認証されていない場合、NSX Advanced Load Balancer は SAML 要求を生成し、302 リダイレクトを使用して、ユーザーを ID プロバイダ SSO サービスにリダイレクトして認証するようにします。
クライアントのブラウザは、IdP の SSO サービスに GET 要求を送信します。SAML 要求は、HTTP GET 要求の URL クエリ文字列に直接送信されます。
例:
https://idp.example.com/app/avinetworks_samlapp_1/exkfop30u1uCi2FEv0h7/sso/saml?SAMLRequest=fZJfb4IwFMW%2FCum7UBRFGyVB0cxkf8gke9iL6aDMRmhrb8Ht26%2FgYtzDfD33nJz7u%2B0caF0pEjfmIF7ZqWFgnK%2B6EkD6wQI1WhBJgQMRtGZATE528dMjGbqYKC2NzGWFbiL3ExSAacOlQM42WaD9OIzH%2FjoI%2FHC9Ccc4CKbxJJ6Es1kwXo6SYYKcN6bB%2BhfIxm0IoGFbAYYKYyXszwZ4OMBh5k8JxmQUvCMnsQxcUNOnDsYoIJ5HWy6YOUt9BFceDVWatZyd3VzWHlXqdr7vMMpTIaw%2B2vse%2BzqWUo1w4zcrPtysW3wIPQDpdT7kbKTOWX%2B%2FBSppBazbMrWgvGVXJf291JKLgovP%2B0f6uJiAPGRZOkhfdhmK5l0Z6fF11EFZpk4yFtaltr0nATX3bo3zy%2Bs%2B24ptksqK59%2FdvjU1%2F2%2Fgu36v8GJQ9lbSCFAs5yVnBXLiqpLnlWbUXOm86NL69xtFPw%3D%3D
IdP は、ユーザーが同じブラウザ内の以前のセッションで IdP にすでに認証されていない限り、認証情報を入力するためのフォームをユーザーに提示します。認証情報が検証されると、ユーザーは IdP レベルで認証されます。
いずれの場合も、IdP の SSO サービスは、認証が成功した後に XHTML ドキュメントを返します。これには、SP が必要とする情報を持つ SAML 応答パラメータが含まれます。SAML 応答は次のようになります。
信頼された IdP から取得され、変更されていないことを示します。
ユーザーが IdP で正常に認証されたことを示します。
SAML アサーションで使用される標準属性である名前 ID を介してユーザーが誰であるかを示します。
SAML 応答パラメータは、POST 要求を使用してクライアントから NSX Advanced Load Balancer ACS サービスに渡されます。
NSX Advanced Load Balancer がアサーションを検証し、クライアントの Cookie を設定します
クライアントは、SP が提供した Cookie を使用してリソースにアクセスするための GET 要求を送信します。
これでクライアントがリソースを要求できるようになりました。
メタデータの例
次の例では、<ds:X509Certificate> and </ds:X509Certificate>
が IdP パブリック キーを囲んでいます。
<EntityDescriptor xmlns="urn:oasis:names:tc:SAML:2.0:metadata" entityID="https://app.onelogin.com/saml/metadata/48171389-531f-4d3f-b9e3-9d44abb23ee8"> <IDPSSODescriptor xmlns:ds="http://www.w3.org/2000/09/xmldsig#" protocolSupportEnumeration="urn:oasis:names:tc:SAML:2.0:protocol"> <KeyDescriptor use="signing"> <ds:KeyInfo xmlns:ds="http://www.w3.org/2000/09/xmldsig#"> <ds:X509Data> <ds:X509Certificate> MIID6zCCAtOgAwIBAgIUJMCbFE2bd/6sCjz7gZr8AJXM6vswDQYJKoZIhvcNAQEF BQAwSjEVMBMGA1UECgwMQXZpIG5ldHdvcmtzMRUwEwYDVQQLDAxPbmVMb2dpbiBJ ZFAxGjAYBgNVBAMMEU9uZUxvZ2luIEFjY291bnQgMB4XDTE4MDkyNDEyMjE0NVoX DTIzMDkyNDEyMjE0NVowSjEVMBMGA1UECgwMQXZpIG5ldHdvcmtzMRUwEwYDVQQL DAxPbmVMb2dpbiBJZFAxGjAYBgNVBAMMEU9uZUxvZ2luIEFjY291bnQgMIIBIjAN BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEApOIRYePmMm+LMxgvh4PQWxhBtwzf KPbFj2LUcVZQsNHDwZp7s1b+htv3DZ6OY7yJ1Judu6BcVGJMyTRlb3eZ++5YjRyX Zmabg4RQf1lBYfcdqmrIG5fMKoM9OWqQ7aRJb/KYtj/YymK0/Im3dFB7ioGkvSP0 b2Q5sle0HJnnpFih0LQjX0x6HaGBYvlF5tyrdKtUVXM7fLevwW0h0bB2LOhzKbgq paDn/yH0zGoGdHH3MA7C6s1Wdy2YqKxf6BVDNjzor0oOstdkkKT2IBpnqI56W5xJ w4rms2H6umk4G3zqKI4IWKPzQ7tPqZpsI+9zeitELOiOuyLbTO//YxRlbQIDAQAB o4HIMIHFMAwGA1UdEwEB/wQCMAAwHQYDVR0OBBYEFP0c2czccqKP14DFa+NHeTni 3ewfMIGFBgNVHSMEfjB8gBT9HNnM3HKij9eAxWvjR3k54t3sH6FOpEwwSjEVMBMG A1UECgwMQXZpIG5ldHdvcmtzMRUwEwYDVQQLDAxPbmVMb2dpbiBJZFAxGjAYBgNV BAMMEU9uZUxvZ2luIEFjY291bnQgghQkwJsUTZt3/qwKPPuBmvwAlczq+zAOBgNV HQ8BAf8EBAMCB4AwDQYJKoZIhvcNAQEFBQADggEBAKQQt1Goo3zeyAtjWkfxW9A8 o1ydzAqq7u779z9OsutbHsixy525Cs62Na/252CG39yk0Uy69ar+V9gBeBLaKNaz w4JbaweFQgHlCVmT4lGEe1kmnsPwgP7nLq2SvkwTYqpcVq5KE+UfRpTixA/KJ61C 6yV03UCM7/T9NZ1pw/oYaweuxbtOn7rXT/NTiPIm7owA4soegDBEXIZ20KuMAkGc dRAi5zoIqHsm7w/v/MT8DhTtZE2sH2mSegjUj8DOH5AcxdlNpp6VI2NApi+lTpEf rqnQoDKs3BPp6SwcIvNqmSZ+R3eZkyGeJuCK4sxj2Od1plRpYihaRe32sNNjnwM= </ds:X509Certificate> </ds:X509Data> </ds:KeyInfo> </KeyDescriptor> <SingleLogoutService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect" Location="https://avi-networks-test-dev.onelogin.com/trust/saml2/http-redirect/slo/869509"/> <NameIDFormat> urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress </NameIDFormat> <SingleSignOnService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect" Location="https://avi-networks-test-dev.onelogin.com/trust/saml2/http-redirect/sso/869509"/> <SingleSignOnService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST" Location="https://avi-networks-test-dev.onelogin.com/trust/saml2/http-post/sso/869509"/> <SingleSignOnService Binding="urn:oasis:names:tc:SAML:2.0:bindings:SOAP" Location="https://avi-networks-test-dev.onelogin.com/trust/saml2/soap/sso/869509"/> </IDPSSODescriptor> </EntityDescriptor>john-doe
SAML 要求の例
SP は、これを発行して、認証ステートメントを含むアサーションを暗黙的に要求します。
<samlp:AuthnRequest xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol" xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion" ID="_B28D3D30B4D077D88FA2C7BF64CC0F8B" Version="2.0" IssueInstant="2018-12-13T11:31:59Z" Destination="https://avi-networks-test-dev.onelogin.com/trust/saml2/http-redirect/sso/860690" ForceAuthn="false" IsPassive="false" ProtocolBinding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST"> <saml:Issuer>avi-saml-vs</saml:Issuer> <samlp:NameIDPolicy Format="urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified" AllowCreate="false"/> </samlp:AuthnRequest>
SAML 応答の例
次の例で、説明テキストが付いている矢印 <– を探してください。
<samlp:Response xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion" xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol" ID="R5e5c1b3cff12759e78f27c723a99963acf94fff5" Version="2.0" IssueInstant="2018-12-13T11:32:00Z" Destination="http:/test-onelogin.auth.com/sso/acs/" InResponseTo="_B28D3D30B4D077D88FA2C7BF64CC0F8B"> <saml:Issuer>https://app.onelogin.com/saml/metadata/4e4332e8-be0f-4650-9bac-2ea85fa16d12</saml:Issuer> samlp:Status> <samlp:StatusCode Value="urn:oasis:names:tc:SAML:2.0:status:Success"/> </samlp:Status> <saml:Assertion <-- Beginning of SAML assertion. Within assertion there can be kinds of statements: authentication statement, authorization statement and attribute statement. xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Version="2.0" ID="pfx01cfd769-cd0d-f4dd-677c-f24b1ff887ef" IssueInstant="2018-12-13T11:32:00Z"> <saml:Issuer>https://app.onelogin.com/saml/metadata/4e4332e8-be0f-4650-9bac-2ea85fa16d12</saml:Issuer> <-- The element which contains the identity provider's unique identifier <ds:Signature <-- This shows that this is a signed assertion. xmlns:ds="http://www.w3.org/2000/09/xmldsig#"> <ds:SignedInfo> <ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/> <ds:SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/> <ds:Reference URI="#pfx01cfd769-cd0d-f4dd-677c-f24b1ff887ef"> <ds:Transforms> <ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/> <ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/> </ds:Transforms> <ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/> <ds:DigestValue> 3fAOHPB8meQtrDlQIRz5gRzUAJs= </ds:DigestValue> </ds:Reference> </ds:SignedInfo> The below SignatureValue contains an integrity-preserving digital signature. ds:SignatureValue>aVpr6bjhsHW+SkkN5Fb0IMqZCBbfqucF12EhS+pO0ZrZM8qQ5LqOvNF9MY1WzO3tTscyYwsP3gScBaZzm0KHHIn/OyXj77nqT+BNBiDij7tyXfg4RvMYH6o7R36yRR8Bop9HeJ66fgRNkKA4j54sXF7BQXM+I7FFC5bT9GzXnEi47towME3kHAUlrggt+/GfA6z8Jot13a6xCmrnMaKDVOJbHqcO5LuK2zFd4VQYmpuB+0T6az19S/Hmyc89auI/dw/9uyOAC5on9b+3brKWzK1Qke54ZbQMU/ N3BNE8fwBAYIki5j6lnw0Txzun8EsW8UosSlh1tXlSwRhA76Wwng== </ds:SignatureValue> <ds:KeyInfo> <ds:X509Data> <ds:X509Certificate>MIID6zCCAtOgAwIBAgIUJMCbFE2bd/6sCjz7gZr8AJXM6vswDQYJKoZIhvcNAQEFBQAwSjEVMBMGA1UECgwMQXZpIG5ldHdvcmtzMRUwEwYDVQQLDAxPbmVMb2dpbiBJZFAxGjAYBgNVBAMMEU9uZUxvZ2luIEFjY291bnQgMB4XDTE4MDkyNDEyMjE0NVoXDTIzMDkyNDEyMjE0NVowSjEVMBMGA1UECgwMQXZpIG5ldHdvcmtzMRUwEwYDVQQLDAxPbmVMb2dpbiBJZFAxGjAYBgNVBAMMEU9uZUxvZ2luIEFjY291bnQgMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEApOIRYePmMm+LMxgvh4PQWxhBtwzfKPbFj2LUcVZQsNHDwZp7s1b+htv3DZ6OY7yJ1Judu6BcVGJMyTRlb3eZ++5YjRyXZmabg4RQf1lBYfcdqmrIG5fMKoM9OWqQ7aRJb/KYtj/YymK0/Im3dFB7ioGkvSP0b2Q5sle0HJnnpFih0LQjX0x6HaGBYvlF5tyrdKtUVXM7fLevwW0h0bB2LOhzKbgqpaDn/yH0zGoGdHH3MA7C6s1Wdy2YqKxf6BVDNjzor0oOstdkkKT2IBpnqI56W5xJw4rms2H6umk4G3zqKI4IWKPzQ7tPqZpsI+9zeitELOiOuyLbTO//YxRlbQIDAQABo4HIMIHFMAwGA1UdEwEB/wQCMAAwHQYDVR0OBBYEFP0c2czccqKP14DFa+NHeTni3ewfMIGFBgNVHSMEfjB8gBT9HNnM3HKij9eAxWvjR3k54t3sH6FOpEwwSjEVMBMGA1UECgwMQXZpIG5ldHdvcmtzMRUwEwYDVQQLDAxPbmVMb2dpbiBJZFAxGjAYBgNVBAMMEU9uZUxvZ2luIEFjY291bnQgghQkwJsUTZt3/qwKPPuBmvwAlczq+zAOBgNVHQ8BAf8EBAMCB4AwDQYJKoZIhvcNAQEFBQADggEBAKQQt1Goo3zeyAtjWkfxW9A8o1ydzAqq7u779z9OsutbHsixy525Cs62Na/252CG39yk0Uy69ar+V9gBeBLaKNazw4JbaweFQgHlCVmT4lGEe1kmnsPwgP7nLq2SvkwTYqpcVq5KE+UfRpTixA/KJ61C6yV03UCM7/T9NZ1pw/oYaweuxbtOn7rXT/NTiPIm7owA4soegDBEXIZ20KuMAkGcdRAi5zoIqHsm7w/v/MT8DhTtZE2sH2mSegjUj8DOH5AcxdlNpp6VI2NApi+lTpEfrqnQoDKs3BPp6SwcIvNqmSZ+ R3eZkyGeJuCK4sxj2Od1plRpYihaRe32sNNjnwM= </ds:X509Certificate> </ds:X509Data> </ds:KeyInfo> </ds:Signature> <saml:Subject> <saml:NameID <-- A standard attribute used in SAML assertions Format="urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress">[email protected] </saml:NameID> <saml:SubjectConfirmation Method="urn:oasis:names:tc:SAML:2.0:cm:bearer"> <saml:SubjectConfirmationData NotOnOrAfter="2018-12-13T11:35:00Z" Recipient="http:/test-onelogin.auth.com/sso/acs/" InResponseTo="_B28D3D30B4D077D88FA2C7BF64CC0F8B"/> </saml:SubjectConfirmation> </saml:Subject> <saml:Conditions NotBefore="2018-12-13T11:29:00Z" NotOnOrAfter="2018-12-13T11:35:00Z"> <saml:AudienceRestriction> <saml:Audience>jenkins-saml-vs</saml:Audience> </saml:AudienceRestriction> </saml:Conditions> <saml:AuthnStatement <-- marks the beginning of authentication statement, which says the principal identified in the <saml:Subject> element was authenticated at "2018-12-13T11:31:59Z" by means of a password sent over a protected channel. AuthnInstant="2018-12-13T11:31:59Z" SessionNotOnOrAfter="2018-12-14T11:32:00Z" SessionIndex="_a16c6df0-e0f8-0136-f6b8-5b63382161ef"> <saml:AuthnContext> <saml:AuthnContextClassRef>urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport</saml:AuthnContextClassRef> </saml:AuthnContext> </saml:AuthnStatement> <-- End of authentication statement <saml:AttributeStatement> <-- Beginning of attribute statement <saml:Attribute NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:basic" Name="User.email"> <saml:AttributeValue xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xs:string">[email protected] </saml:AttributeValue> </saml:Attribute> <saml:Attribute NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:basic" Name="User.FirstName"> <saml:AttributeValue xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xs:string">Mittali </saml:AttributeValue> </saml:Attribute> <saml:Attribute NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:basic" Name="PersonImmutableID"> <saml:AttributeValue xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xs:string"/> </saml:Attribute> <saml:Attribute NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:basic" Name="User.LastName"> <saml:AttributeValue xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xs:string">Chawla </saml:AttributeValue> </saml:Attribute> <saml:Attribute NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:basic" Name="memberOf"> <saml:AttributeValue xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xs:string"/> </saml:Attribute> </saml:AttributeStatement> <-- End of attribute statement </saml:Assertion> <-- End of assertion </samlp:Response> <-- End of SAML response