使用自适应身份验证 - Amazon Cognito

使用自适应身份验证

借助自适应身份验证,可以将用户池配置为阻止可疑登录,或为响应增加的风险级别添加第二安全要素身份验证。对于每次登录尝试,Amazon Cognito 都会生成一个风险分数来表示登录请求来自遭盗用源的可能性。此风险评分基于您的应用程序提供的设备和用户因素,以及 Amazon Cognito 从请求中得出的其他因素。会影响 Amazon Cognito 风险评估的一些因素包括:IP 地址、用户代理以及与其他登录尝试之间的地理距离。当 Amazon Cognito 检测到用户会话中存在风险且用户尚未选择多重身份验证(MFA)方法时,自适应身份验证可以为用户池中的用户开启或要求 MFA。当您为用户激活 MFA 时,无论您如何配置自适应身份验证,他们都会收到在身份验证期间提供或设置第二因素的质询。从用户的角度来看,您的应用程序可以帮助他们设置 MFA,也可以选择让 Amazon Cognito 阻止他们再次登录,直到他们配置了附加因素。

Amazon Cognito 将向 Amazon CloudWatch 发布有关登录尝试、其风险级别和失败质询的指标。有关更多信息,请参阅 查看威胁防护指标

要向用户池添加自适应身份验证,请参阅 用户池高级安全特征

自适应身份验证概览

在 Amazon Cognito 控制台中的高级安全性选项卡上,您可以选择自适应身份验证的设置,包括在不同风险级别下采取什么操作,以及向用户发送的通知消息的自定义设置。您可以为所有应用程序客户端分配全局高级安全配置,但将客户端级配置应用于各个应用程序客户端。

Amazon Cognito 自适应身份验证为每个用户会话分配以下风险级别之一:无风险

强制执行方法仅限审计更改为完整功能时,请仔细斟酌您的选项。您对风险等级应用的自动响应会影响 Amazon Cognito 为具有相同特征的后续用户会话分配的风险等级。例如,在您选择不采取任何操作或允许之后,对于 Amazon Cognito 最初评估为高风险的用户会话,Amazon Cognito 会认为类似会话的风险较低。

对于每个风险级别,您可以选择以下选项:

选项

操作

允许 用户无需额外安全要素即可登录。
可选 MFA 已配置第二安全要素的用户需要完成第二安全要素质询才能登录。用于 SMS 的电话号码和 TOTP 软件令牌是可供使用的第二个安全要素。未配置第二个因素的用户只能使用一组凭证登录。
需要 MFA 已配置第二安全要素的用户需要完成第二安全要素质询才能登录。Amazon Cognito 阻止未配置第二个安全要素的用户登录。
阻止 Amazon Cognito 阻止指定风险级别下的所有登录尝试。
注意

您无需验证手机号码即可将其用于 SMS 来作为第二个身份验证要素。

将用户设备和会话数据添加到 API 请求

当您使用 API 对用户进行注册、登录和重置密码时,可以收集用户会话的相关信息并将其传递给 Amazon Cognito 高级安全功能。此信息包括用户的 IP 地址和唯一的设备标识符。

您可能在用户和 Amazon Cognito 之间有中间网络设备,例如代理服务或应用程序服务器。您可以收集用户的上下文数据并将其传递给 Amazon Cognito,以便自适应身份验证根据用户端点(而不是服务器或代理)的特征来计算风险。如果您的客户端应用程序直接调用 Amazon Cognito API 操作,自适应身份验证会自动记录源 IP 地址。但是,它不会记录其他设备信息(例如 user-agent),除非您也收集设备指纹。

使用 Amazon Cognito 上下文数据收集库生成此数据,然后使用 ContextDataUserContextData 参数将它提交到 Amazon Cognito 高级安全功能。上下文数据收集库包含在 AWS SDK 中。有关更多信息,请参阅将 Amazon Cognito 与 Web 和移动应用程序集成。如果您已在用户池中激活了高级安全功能,则可以提交 ContextData。有关更多信息,请参阅配置高级安全功能

当您从应用程序服务器调用以下经过 Amazon Cognito 身份验证的 API 操作时,请在 ContextData 参数中传递用户设备的 IP。此外,请传递服务器名称、服务器路径和编码的设备指纹数据。

当您调用 Amazon Cognito 未经身份验证的 API 操作时,您可以将 UserContextData 提交到 Amazon Cognito 高级安全功能。此数据在 EncodedData 参数中包括设备指纹。如果您符合以下条件,也可以在 UserContextData 中提交 IpAddress 参数:

您的应用程序可以在以下 Amazon Cognito 未经验证的 API 操作中,使用编码的设备指纹数据和用户设备的 IP 地址填充 UserContextData 参数。

接受额外的用户上下文数据(AWS Management Console)

激活接受其他用户上下文数据功能后,用户池在 UserContextData 参数中接受 IP 地址。在以下情况下,您无需激活此功能:

  • 您的用户只能使用经过身份验证的 API 操作(如 AdminInitiateAuth)进行登录,而您使用 ContextData 参数。

  • 您只希望未经身份验证的 API 操作向 Amazon Cognito 高级安全功能发送设备指纹,而不是 IP 地址。

在 Amazon Cognito 控制台中按如下方式更新应用程序客户端,以添加对其他用户上下文数据的支持。

  1. 登录 Amazon Cognito 控制台

  2. 在导航窗格中,选择 管理您的用户池,然后选择要编辑的用户池。

  3. 选择应用程序集成选项卡。

  4. 应用程序客户端和分析下,选择或创建应用程序客户端。有关更多信息,请参阅配置用户池应用程序客户端

  5. 应用程序客户端信息容器中选择编辑

  6. 在应用程序客户端的高级身份验证设置下,选择接受其他用户上下文数据

  7. 选择保存更改

要将应用程序客户端配置为在 Amazon Cognito API 中接受用户上下文数据,请在 CreateUserPoolClientUpdateUserPoolClient 请求中将 EnablePropagateAdditionalUserContextData 设置为 true。有关从 Web 或移动应用程序激活高级安全功能的信息,请参阅从应用程序中激活用户池高级安全功能。当您的应用程序从服务器调用 Amazon Cognito 时,从客户端收集用户上下文数据。以下是使用 JavaScript 开发工具包方法 getData 的示例。

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

在设计应用程序以使用自适应身份验证时,我们建议您将最新的 Amazon Cognito 开发工具包集成到应用程序中。最新版本的开发工具包收集设备指纹信息,如设备 ID、模型和时区。有关 Amazon Cognito SDK 的更多信息,请参阅安装用户池 SDK。Amazon Cognito 高级安全功能只为应用程序以正确格式提交的事件保存和分配风险评分。如果 Amazon Cognito 返回错误响应,请检查您的请求是否包含有效的密钥哈希值,以及 IPaddress 参数是否为有效的 IPv4 或 IPv6 地址。

ContextDataUserContextData 资源

查看和导出用户事件历史记录

当您启用高级安全威胁防护时,Amazon Cognito 会为用户的每个身份验证事件生成日志。默认情况下,您可以在 Amazon Cognito 控制台的用户选项卡中查看用户日志,也可以使用 AdminListUserAuthEvents API 操作查看用户日志。您也可以将这些事件导出到外部系统,例如 CloudWatch Logs、Amazon S3 或 Amazon Data Firehose。导出特征使您自己的安全分析系统更容易访问有关应用程序中用户活动的安全信息。

查看用户事件历史记录(AWS Management Console)

要查看某个用户的登录历史记录,您可以在 Amazon Cognito 控制台的用户选项卡中选择该用户。Amazon Cognito 会将用户事件历史记录保留两年。

用户事件历史记录

每个登录事件都有一个事件 ID。该事件还包含对应的上下文数据,如位置、设备详细信息和风险检测结果。

您还可以将事件 ID 与 Amazon Cognito 在记录事件时发放的令牌关联起来。ID 和访问令牌在其有效负载中包含此事件 ID。Amazon Cognito 还将刷新令牌的使用与原始事件 ID 相关联。您可以通过原始事件 ID 追溯到导致颁发 Amazon Cognito 令牌的登录事件的事件 ID。您可以跟踪系统中的令牌在特定身份验证事件中的使用。有关更多信息,请参阅 了解用户池 JSON Web 令牌(JWT)

查看用户事件历史记录(API/CLI)

您可以使用 Amazon Cognito API 操作 AdminListUserAutEvents 或者使用 AWS Command Line Interface(AWS CLI)通过 admin-list-user-auth-events 来查询用户事件历史记录。

AdminListUserAuthEvents request

以下请求正文 AdminListUserAuthEvents 返回一个用户的最新活动日志。

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

以下请求 admin-list-user-auth-events 返回一个用户的最新活动日志。

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. 选择用户池

  3. 从列表中选择一个现有用户池,或创建一个用户池

  4. 选择高级安全选项卡。找到导出用户活动日志,然后选择编辑

  5. 日志记录状态下,选中激活用户活动日志导出旁边的复选框。

  6. 日志记录目标下,选择要用于处理日志的 AWS 服务:CloudWatch 日志组Amazon Data Firehose 流S3 存储桶

  7. 您的选择将使用相应的资源类型填入资源选择器。从列表中选择日志组、流或存储桶。您也可以选择创建按钮,导航到所选服务的 AWS Management Console 并创建新资源。

  8. 选择保存更改

API

为您的用户活动日志选择一种目标类型。

以下是将 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 控制台中,从用户选项卡中选择一个用户,然后选择提供事件反馈。您可以查看事件详细信息,并选择设为有效设为无效

控制台的用户和组选项卡中列出了登录历史记录。您可以选择某个条目来将事件标记为有效或无效。您还可以通过用户池 API 操作 AdminUpdateAuthEventFeedback、AWS CLI 命令 admin-update-auth-event-feedback 提供反馈。

当您在 Amazon Cognito 控制台中选择设为有效或在 API 中提供 validFeedbackValue 值时,您告诉 Amazon Cognito 您信任某个用户会话(Amazon Cognito 已在其中评估了某种风险等级)。当您在 Amazon Cognito 控制台中选择设为无效或在 API 中提供 invalidFeedbackValue 值时,您告诉 Amazon Cognito 您不信任某个用户会话,或者您不认为 Amazon Cognito 评估的风险等级足够高。

发送通知消息

借助高级安全保护措施,Amazon Cognito 可以通知您的用户存在有风险的登录尝试。Amazon Cognito 还可以提示用户选择链接以指示登录是有效还是无效。Amazon Cognito 使用此反馈来提高用户池的风险检测准确性。

自动风险响应部分,对低、中或高风险案例选择通知用户

通知用户

无论您的用户是否验证了电子邮件地址,Amazon Cognito 都会向他们发送电子邮件通知。

您可以自定义通知电子邮件消息,并提供这些消息的纯文本和 HTML 版本。要自定义您的电子邮件通知,请在高级安全配置中,从自适应身份验证消息中打开电子邮件模板。要了解有关电子邮件模板的更多信息,请参阅 消息模板