Amazon Cognito ユーザープールでの SAML セッション開始 - Amazon Cognito

Amazon Cognito ユーザープールでの SAML セッション開始

Amazon Cognito は、サービスプロバイダーが開始した (SP が開始した) シングルサインオン (SSO) と IdP が開始した SSO をサポートしています。セキュリティのベストプラクティスとして、SP が開始した SSO をユーザープールに実装します。SAML V2.0 技術概要のセクション 5.1.2 では、SP で開始される SSO について説明します。Amazon Cognito は、アプリケーションの ID プロバイダー (IdP) です。アプリケーションは、認証されたユーザーのトークンを取得するサービスプロバイダー (SP) です。ただし、サードパーティー IdP を使用してユーザーを認証する場合、Amazon Cognito は SP です。SAML 2.0 ユーザーが、SP が開始したフローで認証する場合、常に Amazon Cognito にリクエストを行い、認証のために IdP にリダイレクトする必要があります。

一部のエンタープライズユースケースでは、内部アプリケーションへのアクセスは Enterprise IdP がホストするダッシュボードのブックマークから始まります。ユーザーがブックマークを選択すると、IdP は SAML 応答を生成して SP に送信し、アプリケーションでユーザーを認証します。

IdP が開始した SSO をサポートするように、ユーザープールで SAML IdP を設定できます。IdP が開始した認証をサポートする場合、Amazon Cognito は SAML リクエストで認証を開始しないため、受信した SAML レスポンスを要請したことを検証できません。SP が開始した SSO では、Amazon Cognito は、元のリクエストに対して SAML レスポンスを検証する状態パラメータを設定します。SP が開始したサインインを使用すると、クロスサイトリクエストフォージェリ (CSRF) から保護することもできます。

SP が開始した SAML サインインの使用

ベストプラクティスとして、ユーザープールに、サービスプロバイダーが開始した (SP が開始した) サインインを実装します。Amazon Cognito はユーザーのセッションを開始し、IdP にリダイレクトします。この方法を使用すると、サインインリクエストを提示するユーザーの制御が最大になります。特定の条件下で、IdP が開始したサインインを許可することもできます。

以下のプロセスは、ユーザーが SAML プロバイダーを介してユーザープールへの SP が開始したサインインを完了する方法を示しています。

Amazon Cognito の SP が開始した SAML サインインの認証フロー図。
  1. ユーザーはサインインページで E メールアドレスを入力します。ユーザーの IdP へのリダイレクトを判断するには、カスタムアプリケーションで E メールアドレスを収集するか、ウェブビューでホストされた UI を呼び出します。IdP のリストを表示するか、E メールアドレスのみを求めるようにホスト UI を設定できます。

  2. アプリケーションは、ユーザープールリダイレクトエンドポイントを呼び出し、アプリケーションに対応するクライアント ID と、ユーザーに対応する IdP ID を持つセッションをリクエストします。

  3. Amazon Cognito は、AuthnRequest 要素内の、オプションで署名された、SAML リクエストを使用して、ユーザーを IdP にリダイレクトします。

  4. IdP は、インタラクティブに、またはブラウザ Cookie で記憶されたセッションを使用して、ユーザーを認証します。

  5. IdP は、POST ペイロードで、オプションで暗号化された SAML アサーションを使用して、ユーザーをユーザープールの SAML レスポンスエンドポイントにリダイレクトします。

    注記

    Amazon Cognito は、5 分以内にレスポンスを受信しないセッションをキャンセルし、ホストされた UI にユーザーをリダイレクトします。ユーザーにこの結果が生じると、Something went wrong エラーメッセージを受け取ります。

  6. SAML アサーションが検証され、レスポンスのクレームからユーザー属性がマッピングされると、Amazon Cognito がユーザープールのユーザープロファイルを内部で作成または更新します。通常、ユーザープールはユーザーのブラウザセッションに認可コードを返します。

  7. ユーザーは、認可コードをアプリケーションに提示します。アプリケーションはコードを JSON ウェブトークン (JWT) と交換します。

  8. アプリケーションは、ユーザーの ID トークンを認証として受け入れて処理し、アクセストークンを使用してリソースへの認可されたリクエストを生成し、更新トークンを保存します。

ユーザーが認証して、認可コード付与を受け取ると、ユーザープールは ID、アクセス、更新トークンを返します。ID トークンは、OIDC ベースの ID 管理用の認証オブジェクトです。アクセストークンは、OAuth 2.0 スコープを持つ認可オブジェクトです。更新トークンは、ユーザーの現在のトークンの有効期限が切れたときに新しい ID トークンとアクセストークンを生成するオブジェクトです。ユーザープールアプリケーションクライアントでユーザーのトークンの期間を設定できます。

更新トークンの期間を選択することもできます。ユーザーの更新トークンの有効期限が切れたら、再度サインインする必要があります。SAML IdP を介して認証された場合、ユーザーのセッション期間は、IdP とのセッションの有効期限ではなく、トークンの有効期限によって設定されます。アプリケーションは、各ユーザーの更新トークンを保存し、有効期限が切れたらセッションを更新する必要があります。ホストされた UI は、1 時間有効なブラウザ Cookie でユーザーセッションを維持します。

IdP が開始した SAML サインインの使用

IdP が開始した SAML 2.0 サインイン用に ID プロバイダーを設定すると、認可エンドポイント でセッションを開始することなく、ユーザープールドメインの saml2/idpresponse エンドポイントに SAML アサーションを提示できます。この設定を持つユーザープールは、リクエストされたアプリケーションクライアントがサポートするユーザープールの外部 ID プロバイダーから、IdP が開始した SAML アサーションを受け入れます。次の手順では、IdP が開始した SAML 2.0 プロバイダーを使用した設定とサインインの全体的なプロセスについて説明します。

  1. ユーザープールとアプリケーションクライアントを作成または指定します。

  2. ユーザープールで SAML 2.0 IdP を作成します。

  3. IdP の開始をサポートするように IdP を設定します。IdP が開始した SAML では、他の SSO プロバイダーには適用されないセキュリティ上の考慮事項が導入されています。このため、IdP が開始したサインインで SAML プロバイダーを使用するアプリケーションクライアントに、ユーザープール自体を含む非 SAML IdP を追加することはできません。

  4. IdP が開始した SAML プロバイダーを、ユーザープール内のアプリケーションクライアントに関連付けます。

  5. SAML IdP のサインインページにユーザーを誘導し、SAML アサーションを取得します。

  6. SAML アサーションを使用して、ユーザーをユーザープール saml2/idpresponse エンドポイントに誘導します。

  7. JSON ウェブトークン (JWT) を受け取ります。

ユーザープールで未承諾の SAML アサーションを受け入れるには、アプリケーションセキュリティへの影響を考慮する必要があります。リクエストスプーフィングと CSRF の試行は、IdP が開始したリクエストを受け入れるときに行われる可能性があります。ユーザープールは IdP が開始したサインインセッションを検証できませんが、Amazon Cognito はリクエストパラメータと SAML アサーションを検証します。

さらに、SAML アサーションに InResponseTo クレームが含まれておらず、過去 6 分以内に発行されている必要があります。

IdP が開始した SAML を使用してリクエストを /saml2/idpresponse に送信する必要があります。SP が開始した、ホストされた UI 認可リクエストの場合、リクエストされたアプリケーションクライアント、スコープ、リダイレクト URI、およびその他の詳細を、HTTP GET リクエストのクエリ文字列パラメータとして識別するパラメータを指定する必要があります。ただし、IdP が開始した SAML アサーションの場合、リクエストの詳細は、HTTP POST リクエスト本文の RelayState パラメータとしてフォーマットする必要があります。また、リクエスト本文には、SAML アサーションを SAMLResponse パラメータとして含める必要もあります。

以下は、IdP が開始した SAML プロバイダーのリクエストの例です。

POST /saml2/idpresponse HTTP/1.1 User-Agent: USER_AGENT Accept: */* Host: example.auth.us-east-1.amazoncognito.com Content-Type: application/x-www-form-urlencoded SAMLResponse=[Base64-encoded SAML assertion]&RelayState=identity_provider%3DMySAMLIdP%26client_id%3D1example23456789%26redirect_uri%3Dhttps%3A%2F%2Fwww.example.com%26response_type%3Dcode%26scope%3Demail%2Bopenid%2Bphone HTTP/1.1 302 Found Date: Wed, 06 Dec 2023 00:15:29 GMT Content-Length: 0 x-amz-cognito-request-id: 8aba6eb5-fb54-4bc6-9368-c3878434f0fb Location: https://www.example.com?code=[Authorization code]
AWS Management Console
IdP が開始した SAML の IdP を設定するには
  1. ユーザープールアプリケーションクライアント、および SAML ID プロバイダーを作成します。

  2. 関連付けられている場合、すべてのソーシャル ID プロバイダーと OIDC ID プロバイダーについてアプリケーションクライアントから関連付けを解除します。

  3. ユーザープールの [サインインエクスペリエンス] タブに移動します。

  4. [フェデレーション ID プロバイダーのサインイン] で、SAML プロバイダーを編集または追加します。

  5. [IdP が開始した SAML サインイン] で、[SP が開始した/IdP が開始した SAML アサーションを受け入れる] を選択します。

  6. [Save changes] (変更の保存) をクリックします。

API/CLI

IdP が開始した SAML の IdP を設定するには

CreateIdentityProvider API リクエストまたは UpdateIdentityProvider API リクエストの IDPInit パラメータを使用して、IdP が開始した SAML を設定します。以下は、IdP が開始した SAML をサポートする IdP の ProviderDetails の例です。

"ProviderDetails": { "MetadataURL" : "https://myidp.example.com/saml/metadata", "IDPSignout" : "true", "RequestSigningAlgorithm" : "rsa-sha256", "EncryptedResponses" : "true", "IDPInit" : "true" }