降低用户注册欺诈和短信轰炸的风险,使用 Amazon Cognito 用户池 安全博客

使用 Amazon Cognito 用户池降低用户注册欺诈和短信灌输的风险

作者:Edward Sun Steve de Vera Tony Suarez 发布日期:2024年9月13日高级 (300) Amazon Cognito AWS WAF 安全、身份与合规 技术操作指南永久链接 评论

关键要点

开启自助注册功能可能会导致用户注册欺诈和短信灌输的风险。亚马逊 Cognito 提供了一些功能来验证用户并降低这些风险。在用户注册过程中采取防范措施,例如:使用 CAPTCHA、验证手机号和自定义确认流程,可以有效抵制恶意注册。监控和检测异常活动,使用 AWS 工具如 CloudWatch 和 CloudTrail有助于识别潜在的攻击。

如果您拥有面向客户的应用程序,可能希望启用自助注册功能,以允许潜在客户在互联网上创建帐户并访问您的应用程序。然而,为合法用户提供注册的必要性同时也可能为不良行为者提供了利用自助注册选项的机会。这些不良行为者可能利用用户注册流程,进行大规模分布式拒绝服务 (DDoS) 攻击,干扰合法用户的访问,或者实施一种称为短信灌输的电信欺诈。

短信灌输是指不良行为者从电信提供商购买一批高费率电话号码,诱导无辜的服务向这些号码发送短信。Amazon Cognito 是一个托管的 OpenID Connect (OIDC) 身份提供者 (IdP),您可以使用它将自助注册、登录和访问控制功能添加到您的网页和移动应用程序中。当启用 SMS 功能时例如,在注册过程中进行用户手机号验证,或支持 SMS 多因素身份验证,AWS 客户在使用 Cognito 的过程中可能会遇到短信灌输。在本博客中,我们将探讨如何实施这些防护措施来降低风险,包括阻止意外用户注册、检测异常情况以及响应风险事件。

Cognito 用户注册流程

在用户通过 Amazon Cognito 用户池注册后,用户帐户会处于 “已注册未确认” 状态,用户无法立即登录。您可以使用 Cognito 辅助的验证与确认流程来验证用户提供的属性如电子邮件或手机号码,然后确认用户的状态。此经过验证的属性也用于多因素身份验证和帐户恢复目的。如果选择验证用户的手机号,Cognito 会通过 SMS 发送一次性密码 (OTP)。用户提供正确的 OTP 后,其电子邮件或手机号将被标记为已验证,用户即可登录应用。

图1:Amazon Cognito 注册流程的可视化

如果注册流程没有得到保护,不良行为者可以通过编写脚本或部署机器人,注册大量帐户,短时间内导致大量短信发送。这就需要深入了解可以实施的防范、检测和修复机制与策略,帮助保护您的 Cognito 用户池免受短信灌输的影响。

保护注册流程

在本节中,我们将回顾几种防止短信注册欺诈的策略,以减少发送给不良行为者的短信数量。

实施机器人防护

实施机器人防护技术,例如 CAPTCHA,可以有效防止简单机器人注册用户帐户。您可以在应用程序的前端集成 CAPTCHA 框架,以验证发起注册请求的客户端是由人类用户操作的。如果用户通过验证,则将 CAPTCHA 的用户响应令牌与用户属性一起传递到 Amazon Cognito 的 SignUp API 调用中。在注册流程中,Cognito 会调用一个名为 pre signup Lambda trigger 的 AWS Lambda 函数,用于拒绝未呈现有效 CAPTCHA 令牌的注册请求。这将减缓机器人的速度,并帮助减少在 Cognito 用户池中意外创建的帐户数量。

在用户注册前验证手机号

另一种防护措施是在应用程序的注册过程中早期识别用户的手机号。您可以在后端验证用户提供的手机号,以捕获格式不正确的手机号,添加逻辑以帮助过滤出不需要的手机号,避免信息发送至这些号码。 Amazon Pinpoint 提供了一个 Phone Number Validate 功能,帮助您确定用户提供的手机号是否有效,确定手机号类型例如移动、固话或 VoIP,并识别与该手机号关联的国家和服务提供商。返回的手机号元数据可用于决定用户是否继续注册流程并向该用户发送短信。在使用手机号验证服务时,可能会产生额外费用。有关更多信息,请参见 Amazon Pinpoint 定价。

要将此验证检查纳入 Amazon Cognito 的注册流程,您可以自定义 pre signup Lambda trigger,Cognito 会在允许用户注册并发送 SMS OTP 前调用您的代码。Lambda 触发器会调用 Amazon Pinpoint 手机号码验证 API,并根据验证响应,您可以构建自定义模式,使其适合您的应用程序,决定是否继续或拒绝用户注册。例如,您可以拒绝来自 VoIP 号段的用户注册,或者拒绝提供与您未运营的国家相关的手机号,甚至拒绝某些移动服务提供商的用户。在使用 Lambda 触发器拒绝用户注册后,Cognito 将拒绝该用户的注册请求,并不会触发用户确认流程或发送 SMS 短信。

示例:使用 AWS CLI 验证手机号命令

shellaws pinpoint phonenumbervalidate numbervalidaterequest PhoneNumber=155501001234

当您向 Amazon Pinpoint 手机号码验证服务发送请求时,返回以下关于手机号的元数据。以下示例表示有效的移动电话号集:

json{ NumberValidateResponse { Carrier ExampleCorp Mobile City Seattle CleansedPhoneNumberE164 155501001234 CleansedPhoneNumberNational 55501001234 Country United States CountryCodeIso2 US CountryCodeNumeric 1 OriginalPhoneNumber 155501001234 PhoneType MOBILE PhoneTypeCode 0 Timezone America/Seattle ZipCode 98109 }}

请注意,PhoneType 包括类型移动、固话、VoIP、无效或其他。无效的手机号不包含与该手机号相关的运营商或位置的信息,并且不太可能属于实际接收者。这有助于您决定何时拒绝用户注册,减少短信发送至不需要的手机号。您可以在 Amazon Pinpoint 开发者文档 中查看其他响应的详细信息。

示例:阻止除了有效 MOBILE 号码以外的用户注册的 pre signup Lambda 函数

以下 pre signup Lambda 函数的示例调用 Amazon Pinpoint 手机号码验证服务,拒绝用户注册,除非验证服务返回有效的移动手机号。

飞鸟加速器最新版

javascriptimport { PinpointClient PhoneNumberValidateCommand } from @awssdk/clientpinpoint // ES模块导入

const validatePhoneNumber = async (phoneNumber) =gt { const pinpoint = new PinpointClient() const input = { // PhoneNumberValidateRequest NumberValidateRequest { // NumberValidateRequest PhoneNumber phoneNumber } } const command = new PhoneNumberValidateCommand(input) const response = await pinpointsend(command)

return response}

const handler = async (event context callback) =gt { const phoneNumber = eventrequestuserAttributesphonenumber const validationResponse = await validatePhoneNumber(phoneNumber)

if (validationResponseNumberValidateResponsePhoneType !== MOBILE) { const error = new Error(Cannot register users without a mobile number) // 返回错误到 Amazon Cognito callback(error event) } // 返回到 Amazon Cognito callback(null event)}

export { handler }

使用自定义用户自发确认流程或替代 OTP 传送方式

在用户池配置中,您可以选择不使用 Amazon Cognito 辅助的验证和确认方法发送短信以确认用户。相反,您可以构建自定义的反向 OTP 流,要求用户主动发起用户确认过程。例如,您的应用程序可以显示 OTP,并引导用户通过将 OTP 发短信到您的服务号码来启动 SMS 对话。您的应用程序在收到此短信并确认正确的 OTP 后,可以调用 AdminConfirmSignUp 管理 API 操作确认用户,随后调用 AdminUpdateUserAttributes 将 phonenumberverified 属性设置为 true,以指示该用户的手机号已验证。

您还可以选择通过电子邮件等其他方式发送 OTP,尤其是在您的应用程序不需要用户的手机号时。在用户注册过程中,您可以在 Amazon Cognito 中配置 自定义 SMS 发送 Lambda 触发器,通过电子邮件或其他方法发送用户验证代码。此外,您还可以使用 Cognito 电子邮件 MFA 功能 通过电子邮件发送 MFA 代码。

检测短信灌输

在考虑各种预防选项时,设置检测机制以识别短信灌输事件也很重要。在本节中,我们将展示如何使用 AWS CloudTrail 和 Amazon CloudWatch 监控您的 Amazon Cognito 用户池,检测可能导致短信灌输的异常情况。请注意,基于异常构建检测机制需要了解您的平均或基线流量,以及代表正常活动和可能指示未授权或意外活动的度量差异。

降低用户注册欺诈和短信轰炸的风险,使用 Amazon Cognito 用户池 安全博客

服务配额仪表板和 CloudWatch 警报

不良行为者可能会试图利用 Amazon Cognito 的注册确认或重置密码功能。如前所述,当新用户注册到您的 Cognito 用户池时,会调用 SignUp API 操作。当用户提供 OTP 确认代码时,会调用 ConfirmSignUp API 操作。这两个 API 的调用率在 服务配额仪表板 的 Amazon Cognito 服务下的 “用户创建请求率” 中被集中跟踪。

您可以设置 Amazon CloudWatch 警报,监控并在接近配额值阈值时发出通知。这些警报可能是突然用量增加的早期迹象,您可以利用它们来排查潜在的事件。

此外,当您的服务发送 SMS 短信时,这些事务会计入 Amazon Simple Notification Service (Amazon SNS) 服务配额。您应设置警报以监控每秒传输 SMS 短信的发送速率和 SMS 消息花费的 USD 限额。

CloudTrail 事件历史记录

当不良行为者计划短信灌输时,他们往往试图诱使您发送尽可能多的短信,而不是完成用户确认过程。在用户注册事件的上下文中,您可能会注意到 CloudTrail 事件历史中 SignUp 和 ResendConfirmationCode 事件这些事件都将发送 SMS 短信的发生次数超过了 ConfirmSignUp 操作的数量,这表示用户已启动但未完成注册过程。您可以使用 Amazon Athena 或 CloudWatch Logs Insights 查询并分析 Amazon Cognito 的 CloudTrail 事件,以确定是否存在用户注册过程完成数量显著下降的情况。

图2:CloudTrail 事件历史中记录的 SignUp API

类似地,您可以通过分析 ForgotPassword API 和 ConfirmForgotPassword API 操作的偏差,应用这种可观察性到用户密码重置流程中。

请注意,仅凭 CloudTrail 事件历史中用户完成流的轻微偏差,可能并不能说明未授权活动,但如果偏差幅度显著高于正常基线,则可能表示存在意外使用。

监控过度账单

通过使用 AWS 成本探查器,您可以找到检测和识别未授权 Amazon Cognito 活动的另一个机会。您可以使用该界面可视化、理解和管理 AWS 的成本和使用情况,可能有助于突显出在您 AWS 帐户中超出正常范围的费用来源。请注意,帐户中的收费可能需要长达 24 小时才能显示,因此尽管此方法可以帮助识别短信灌输活动,但它应仅作为其他检测方法的补充。

使用成本探查器的步骤:

打开 AWS 管理控制台,并转到 计费与成本管理。在导航面板中,选择 成本分析,然后选择 成本探查器。在 成本与使用报告中,选择 报告参数,选择要应用筛选的时间段的开始和结束日期。在以下图3中,我们使用 2024年7月3日至2024年7月17日的示例日期范围。在同一 报告参数 区域,选择 过滤器,对于 服务,选择 SNS (Simple Notification Service)。由于 Amazon Cognito 使用 Amazon SNS 发送 SMS 短信,筛选 SNS 服务可以帮助您识别过度的费用。

图3:按服务审核账单费用

应用 AWS WAF 规则作为缓解措施

建议您 将 AWS WAF 应用到 Amazon Cognito 用户池 以保护常见威胁。在本节中,我们将展示一些使用 AWS WAF 规则阻止或限制特定不良行为者流量的高级选项,尤其当您观察到不规则注册尝试并怀疑这些尝试属于欺诈活动时。

针对特定不良行为者的 IP 地址

在构建 AWS WAF 修复策略时,您可以首先构建 IP 拒绝列表,阻止来自已知恶意 IP 地址的流量。这种方法简单明了,并且在防止不必要的访问方面效果显著。有关如何建立 IP 拒绝列表的详细说明,请参见 创建 IP 集。

针对特定手机号区号的正则表达式模式

在短信灌输方案中,不良行为者通常会从无线服务提供商处购买手机号码块,使用同一区号的号码。如果您观察到模式并识别出这些尝试使用相同的区号,您可以应用 AWS WAF 规则来阻止特定流量。

要配置 AWS WAF Web ACL 以使用区号正则表达式模式进行阻止:

打开 AWS WAF 控制台。在导航面板下,选择

发表评论

订阅我们的邮箱