アダプティブ認証の使用 - Amazon Cognito

アダプティブ認証の使用

アダプティブ認証では、リスクレベルの上昇に対応して、疑わしいサインインをブロックする、または 2 番目の要素認証を追加するようにユーザープールを設定できます。Amazon Cognito はサインインの試行ごとに、サインインリクエストが侵害されたソースからのものである可能性についてリスクスコアを生成します。このリスクスコアは、アプリケーションが提供するデバイスとユーザーの要因、および Amazon Cognito がリクエストから派生するその他の要因に基づいています。Amazon Cognito によるリスク評価の要因には、IP アドレスとユーザーエージェント 、ユーザーエージェント、および他のサインイン試行からの地理的距離があります。アダプティブ認証は、Amazon Cognito がユーザーのセッションでリスクを検出し、ユーザーがまだ MFA メソッドを選択していない場合に、ユーザープール内のユーザーに対して多要素認証 (MFA) を有効にする、または多要素認証 (MFA) を要求することができます。ユーザーに MFA を有効にすると、アダプティブ認証の設定方法にかかわらず、認証中に必ず 2 つ目の要素を提供または設定するように求めるチャレンジが常に表示されます。ユーザーの観点から見ると、アプリは MFA の設定を支援し、また、オプションとして、Amazon Cognito では、ユーザーが追加の要素を設定するまで、ユーザーが再度サインインできないようにすることもできます。

Amazon Cognito は、サインイン試行、試行のリスクレベル、および失敗したチャレンジに関するメトリクスを Amazon CloudWatch にパブリッシュします。詳細については、「脅威保護メトリクスの表示」を参照してください。

アダプティブ認証をユーザープールに追加するには、「ユーザープールの高度なセキュリティ機能」を参照してください。

アダプティブ認証の概要

アダプティブ認証の設定は、Amazon Cognito コンソールの [高度なセキュリティ] タブから選択できます。これには、異なるリスクレベルで実行するアクションの設定や、ユーザーへの通知メッセージのカスタマイズなどが含まれます。すべてのアプリクライアントにグローバルな高度なセキュリティ設定を割り当てることができますが、個々のアプリクライアントにはクライアントレベルの設定を適用できます。

Amazon Cognito アダプティブ認証は、各ユーザーセッションに「高」「中」「低」「リスクなし」のいずれかのリスクレベルを割り当てます。

[Enforcement method] (強制実行メソッド) を [Audit-only] (監査専用) から [Full-function] (完全な機能) に変更する場合は、選択肢を慎重に検討してください。リスクレベルに適用する自動応答は、Amazon Cognito が同じ特性を持つ後続のユーザーセッションに割り当てるリスクレベルに影響します。例えば、Amazon Cognito が最初にリスクが高いと評価したユーザーセッションに何もしないか、[Allow] (許可) を選択すると、Amazon Cognito では同様のセッションのリスクが低いと見なします。

リスクレベルごとに、以下のオプションから選択できます。

オプション

アクション

許可 ユーザーは、追加要素なしでサインインできます。
オプションの MFA 第 2 要素を設定しているユーザーは、サインインするために第 2 要素のチャレンジを完了する必要があります。SMS の電話番号と TOTP ソフトウェアトークンが利用可能な第 2 要素です。2 番目の要素が設定されていないユーザーは、1 つの認証情報のみでサインインできます。
MFA が必要 第 2 要素を設定しているユーザーは、サインインするために第 2 要素のチャレンジを完了する必要があります。Amazon Cognito は、第 2 要素が設定されていないユーザーのサインインをブロックします。
ブロック Amazon Cognito は、指定されたリスクレベルですべてのサインイン試行をブロックします。
注記

SMS を 2 番目の認証要素として使用するために電話番号を検証する必要はありません。

API リクエストへのユーザーデバイスおよびセッションデータの追加

API を使用してサインアップ、サインイン、パスワードのリセットを行う際に、ユーザーのセッションに関する情報を収集し、Amazon Cognito のアドバンストセキュリティに渡すことができます。この情報には、ユーザーの IP アドレスと一意のデバイス識別子が含まれます。

ユーザーと Amazon Cognito の間に、プロキシサービスやアプリケーションサーバーなど、中間ネットワークデバイスがある場合があります。ユーザーのコンテキストデータを収集して Amazon Cognito に渡すことで、アダプティブ認証がサーバーやプロキシではなく、ユーザーエンドポイントの特性に基づいてリスクを計算できます。クライアント側アプリが Amazon Cognito API オペレーションを直接呼び出す場合、アダプティブ認証は送信元 IP アドレスを自動的に記録します。ただし、デバイスのフィンガープリントも収集しない限り、user-agent などの他のデバイス情報は記録されません。

Amazon Cognito コンテキストデータ収集ライブラリを使用してこのデータを生成し、ContextData パラメータと UserContextData パラメータで Amazon Cognito アドバンストセキュリティに送信します。コンテキストデータ収集ライブラリは、AWS SDK に含まれます。詳細については、「Amazon Cognito のウェブアプリケーションとモバイルアプリケーションとの統合」を参照してください。ユーザープールでアドバンストセキュリティ機能をアクティブ化している場合、ContextData を送信できます。詳細については、「アドバンストセキュリティ機能を設定する」を参照してください。

アプリケーションサーバーから以下の Amazon Cognito 認証 API オペレーションを呼び出す場合、ContextData パラメータにユーザーのデバイスの IP を渡します。また、サーバー名、サーバーパス、およびエンコードされたデバイスフィンガープリントデータを渡します。

Amazon Cognito の認証されていない API オペレーションを呼び出すと、Amazon Cognito のアドバンスドセキュリティ機能に UserContextData を送信できます。このデータには、EncodedData パラメータのデバイスフィンガープリントが含まれます。また、次の条件を満たす場合、UserContextDataIpAddress パラメータを送信できます。

アプリは、以下の Amazon Cognito の認証されていない API オペレーションで、UserContextData パラメータにエンコードされたデバイスフィンガープリントデータとユーザーのデバイスの IP アドレスを入力できます。

追加のユーザーコンテキストデータの受け入れ (AWS Management Console)

ユーザープールは [Accept additional user context data] (追加のユーザーコンテキストデータを受け入れる) 機能をアクティブ化すると、UserContextData パラメータで IP アドレスを受け入れます。次の場合は、この機能をアクティブ化する必要はありません。

  • ユーザーは、AdminInitiateAuth のような認証された API オペレーションでのみサインインし、ContextData パラメータを使用します。

  • 認証されていない API オペレーションから IP アドレスではなく、デバイスのフィンガープリントのみを Amazon Cognito のアドバンストセキュリティ機能に送信します。

Amazon Cognito コンソールでアプリクライアントを次のように更新し、追加のユーザーコンテキストデータのサポートを追加します。

  1. Amazon Cognito コンソールにサインインします。

  2. ナビゲーションペインで [ユーザープールの管理] を選択してから、編集するユーザープールを選択します。

  3. [App integration] (アプリケーションの統合) タブを選択します。

  4. [App clients and analytics] (アプリクライアントと分析) で、アプリクライアントを選択または作成します。詳細については、「ユーザープールのアプリクライアントの設定」を参照してください。

  5. [App client information] (アプリのクライアント情報) コンテナから [Edit] (編集) を選択します。

  6. アプリクライアントの [Advanced authentication settings] (詳細な認証設定) で、[Accept additional user context data] (追加のユーザーコンテキストデータを受け入れる) を選択します。

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

Amazon Cognito API でユーザーコンテキストデータを受け入れるようにアプリクライアントを設定するには、CreateUserPoolClient または UpdateUserPoolClient リクエストで EnablePropagateAdditionalUserContextDatatrue に設定します。ウェブまたはモバイルアプリからアドバンストセキュリティをアクティブ化する方法の詳細については、「アプリからユーザープールのアドバンストセキュリティを有効化する」を参照してください。アプリがサーバーから Amazon Cognito を呼び出すときに、クライアント側からユーザーコンテキストデータを収集します。以下は、JavaScript SDK メソッド getData 使用する例です。

var EncodedData = AmazonCognitoAdvancedSecurityData.getData(username, userPoolId, clientId);

アダプティブ認証を使用するようにアプリを設計する場合は、最新の Amazon Cognito SDK をアプリに組み込むことをお勧めします。SDK の最新バージョンでは、デバイス ID、モデル、およびタイムゾーンなどのデバイスフィンガープリント情報を収集します。Amazon Cognito SDK の詳細については、「ユーザープール SDK のインストール」を参照してください。Amazon Cognito アドバンストセキュリティでは、アプリが正しい形式で送信したイベントにのみ保存され、リスクスコアが割り当てられます。Amazon Cognito がエラーレスポンスを返す場合は、リクエストに有効なシークレットハッシュが含まれていることと、IPaddress パラメータが、有効な IPv4 または IPv6 アドレスであることを確認します。

ContextData および UserContextData リソース

ユーザーイベント履歴の表示とエクスポート

Amazon Cognito は、高度なセキュリティ脅威保護を有効にすると、ユーザーによる各認証イベントについてログを生成します。デフォルトでは、Amazon Cognito コンソールの [ユーザー] タブに、または AdminListUserAuthEvents API オペレーションを使用して、ユーザーログを表示できます。また、これらのイベントを、CloudWatch Logs、Amazon S3、Amazon Data Firehose などの外部システムにエクスポートすることもできます。エクスポート機能を使用すると、アプリケーション内のユーザーアクティビティに関するセキュリティ情報について、独自のセキュリティ分析システムにアクセスさせることが容易になります。

ユーザーイベント履歴の表示 (AWS Management Console)

ユーザーのサインイン履歴を表示するには、Amazon Cognito コンソールの [Users] (ユーザー) タブでユーザーを選択できます。Amazon Cognito は、ユーザーイベント履歴を 2 年間保持します。

ユーザーイベント履歴

各サインインイベントにはイベント ID があります。イベントには、場所、デバイスの詳細、およびリスク検出結果など、対応するコンテキストデータもあります。

また、イベント ID を Amazon Cognito がイベントを記録した時点で発行したトークンと関連付けることができます。ID とアクセストークンには、ペイロードにこのイベント ID が含まれます。Amazon Cognito はまた、更新トークンの使用を元のイベント ID に関連付けます。元のイベント ID は、Amazon Cognito トークンの発行につながったサインインイベントのイベント ID まで追跡できます。システム内のトークンの使用は、特定の認証イベントまで追跡できます。詳細については、「ユーザープール JSON ウェブトークン (JWT) の理解」を参照してください。

ユーザーイベント履歴の表示 (API/CLI)

Amazon Cognito API オペレーション AdminListUserAuthEvents または admin-list-user-auth-events を使用した AWS Command Line Interface (AWS CLI) でユーザーイベント履歴をクエリできます。

AdminListUserAuthEvents request

次の AdminListUserAuthEvents 用のリクエスト本文は、1 人のユーザーの最新のアクティビティログを返します。

{ "UserPoolId": "us-west-2_EXAMPLE", "Username": "myexampleuser", "MaxResults": 1 }
admin-list-user-auth-events request

次の admin-list-user-auth-events 用のリクエストは、1 人のユーザーの最新のアクティビティログを返します。

aws cognito-idp admin-list-user-auth-events --max-results 1 --username myexampleuser --user-pool-id us-west-2_EXAMPLE
Response

Amazon Cognito は、両方のリクエストに同じ JSON レスポンス本文を返します。以下は、リスク要因が含まれていないホストされた UI サインインイベントのレスポンスの例です。

{ "AuthEvents": [ { "EventId": "[event ID]", "EventType": "SignIn", "CreationDate": "[Timestamp]", "EventResponse": "Pass", "EventRisk": { "RiskDecision": "NoRisk", "CompromisedCredentialsDetected": false }, "ChallengeResponses": [ { "ChallengeName": "Password", "ChallengeResponse": "Success" } ], "EventContextData": { "IpAddress": "192.168.2.1", "DeviceName": "Chrome 125, Windows 10", "Timezone": "-07:00", "City": "Bellevue", "Country": "United States" } } ], "NextToken": "[event ID]#[Timestamp]" }

ユーザー認証イベントのエクスポート

ユーザープールを設定して、高度なセキュリティ脅威保護から外部システムに対してユーザーイベントをエクスポートします。サポートされている外部システムである Amazon S3、CloudWatch Logs、Amazon Data Firehose は、送信または取得するデータに対するコストを AWS 請求に追加する場合があります。詳細については、「高度なセキュリティユーザーアクティビティログのエクスポート」を参照してください。

AWS Management Console
  1. Amazon Cognito コンソールにサインインします。

  2. [User Pools] (ユーザープール) を選択します。

  3. リストから既存のユーザープールを選択するか、ユーザープールを作成します。

  4. [高度なセキュリティ] タブを選択します。[ユーザーアクティビティログをエクスポートする] を見つけて [編集] を選択します

  5. [ログ記録ステータス] で、[ユーザーアクティビティログのエクスポートをアクティブ化] の横にあるチェックボックスをオンにします。

  6. [ログ記録先] で、ログを処理する AWS のサービスを [CloudWatch ロググループ][Amazon Data Firehose ストリーム]、または [S3 バケット] の中から選択します。

  7. 選択すると、対応するリソースタイプがリソースセレクターに入力されます。リストからロググループ、ストリーム、またはバケットを選択します。[作成] ボタンを選択して、選択したサービスのAWS Management Consoleに移動し、新しいリソースを作成することもできます。

  8. [変更を保存] を選択します。

API

ユーザーアクティビティログの送信先のタイプを 1 つ選択します。

以下は、Firehose ストリームをログの送信先として設定する SetLogDeliveryConfiguration リクエスト本文の例です。

{ "LogConfigurations": [ { "EventSource": "userAuthEvents", "FirehoseConfiguration": { "StreamArn": "arn:aws:firehose:us-west-2:123456789012:deliverystream/example-user-pool-activity-exported" }, "LogLevel": "INFO" } ], "UserPoolId": "us-west-2_EXAMPLE" }

以下は、Amazon S3 バケットをログの送信先として設定する SetLogDeliveryConfiguration リクエスト本文の例です。

{ "LogConfigurations": [ { "EventSource": "userAuthEvents", "S3Configuration": { "BucketArn": "arn:aws:s3:::amzn-s3-demo-logging-bucket" }, "LogLevel": "INFO" } ], "UserPoolId": "us-west-2_EXAMPLE" }

以下は、CloudWatch ロググループをログの送信先として設定する SetLogDeliveryConfiguration リクエスト本文の例です。

{ "LogConfigurations": [ { "EventSource": "userAuthEvents", "CloudWatchLogsConfiguration": { "LogGroupArn": "arn:aws:logs:us-west-2:123456789012:log-group:DOC-EXAMPLE-LOG-GROUP" }, "LogLevel": "INFO" } ], "UserPoolId": "us-west-2_EXAMPLE" }

イベントフィードバックを提供します

イベントフィードバックは、リアルタイムでリスクの評価に反映され、リスク評価アルゴリズムを経時的に向上させます。ユーザーは、Amazon Cognito コンソールおよび API を使用して、サインイン試行の妥当性に関するフィードバックを提供できます。

注記

イベントフィードバックは、Amazon Cognito が同じ特性を持つ後続のユーザーセッションに割り当てるリスクレベルに影響します。

Amazon Cognito コンソールで、[Users] (ユーザー) タブからユーザーを選択し、[Provide event feedback] (イベントフィードバックを送信) を選択します。イベントの詳細を確認して、[Set as valid] (有効として設定) または [Set as invalid] (無効として設定) できます。

コンソールでは、[Users and groups] (ユーザーとグループ) タブにサインイン履歴が表示されます。エントリを選択すると、イベントを有効または無効としてマークできます。フィードバックは、ユーザープール API オペレーション AdminUpdateAuthEventFeedback、および AWS CLI コマンド admin-update-auth-event-feedback を通じて提供することもできます。

Amazon Cognito コンソールで [Set as valid] (有効として設定) を選択するか、API で validFeedbackValue 値を指定するとき、Amazon Cognito がある程度のリスクを評価したユーザーセッションを信頼することを Amazon Cognito に伝えます。Amazon Cognito コンソールで [Set as invalid] (無効として設定) を選択するか、API で invalidFeedbackValue 値を指定するとき、ユーザーセッションを信頼しないこと、または Amazon Cognito が十分に高いリスクレベルを評価したとは考えないことを Amazon Cognito に伝えます。

通知メッセージの送信

アドバンスドセキュリティ保護により、Amazon Cognito はユーザーにリスクの高いサインイン試行を通知できます。Amazon Cognito では、サインインが有効か無効かを示すリンクを選択するようユーザーに促すこともできます。Amazon Cognito はこのフィードバックを使用して、ユーザープールのリスク検出精度を向上させます。

[Automatic risk response] (自動リスク対応) セクションで、低、中、高のリスクケースに応じて [Notify Users] (ユーザーに通知) を選択します。

ユーザーに通知する

Amazon Cognito は、ユーザーが E メールアドレスを検証したかどうかに関係なく、E メール通知をユーザーに送信します。

通知 E メールメッセージをカスタマイズして、これらのメッセージのプレーンテキストと HTML の両バージョンを提供できます。E メール通知をカスタマイズするには、高度なセキュリティ設定の[Adaptive authentication messages] (アダプティブ認証メッセージ) から E メールテンプレートを開きます。E メールテンプレートの詳細については、「メッセージテンプレート」を参照してください。