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

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

使用自适应身份验证

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

Amazon Cognito 向亚马逊发布了有关登录尝试、其风险等级和挑战失败的指标。 CloudWatch有关更多信息,请参阅 查看威胁防护指标

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

自适应身份验证概览

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

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

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

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

选项

操作

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

您无需验证电话号码即可将其SMS用作第二个身份验证因素。

向API请求中添加用户设备和会话数据

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

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

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

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

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

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

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

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

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

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

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

  1. 登录 Amazon Cognito 控制台

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

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

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

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

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

  7. 选择 Save changes(保存更改)

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

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

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

ContextDataUserContextData 资源

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

当您启用高级安全威胁防护时,Amazon Cognito 会为用户的每个身份验证事件生成日志。默认情况下,您可以在 Amazon Cognito 控制台的 “用户” 选项卡中或通过操作查看用户日志。AdminListUserAuthEventsAPI您也可以将这些事件导出到外部系统,例如 CloudWatch 日志、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 令牌 (JWTs)

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

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

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响应正文。以下是未发现包含风险因素的托管界面登录事件的响应示例:

{ "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操作和 AWS CLI 命令 admin-update-auth-event-fe AdminUpdateAuthEventFeedbackedback 提供反馈。

当你在 Amazon Cognito 控制台中选择 “设置为有效” 或valid在中提供FeedbackValue值时,你会告诉 Amazon CognitoAPI,你信任的用户会话是 Amazon Cognito 已经评估了一定程度的风险。当你在 Amazon Cognito 控制台中选择 “设置为无效” 或invalid在中提供FeedbackValue值时API,你会告诉 Amazon Cognito 你不信任用户会话,或者你认为 Amazon Cognito 评估的风险等级不够高。

发送通知消息

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

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

通知用户

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

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