View a markdown version of this page

关联一个 Amazon WAF 带有用户池的 Web ACL - Amazon Cognito
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)。

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

关联一个 Amazon WAF 带有用户池的 Web ACL

Amazon WAF 是 Web 应用程序防火墙。借助 Amazon WAF 网络访问控制列表 (Web ACL),您可以保护您的用户池免受对经典托管用户界面、托管登录和 Amazon Cognito API 服务终端节点的不必要请求。Web ACL 使您可以对用户池响应的所有 HTTPS Web 请求进行精细控制。有关 Amazon WAF Web ACL 的更多信息,请参阅 Amazon WAF 开发人员指南 中的管理和使用 Web 访问控制列表(web ACL)。

当您的 Amazon WAF Web ACL 与用户池关联时,Amazon Cognito 会将您的用户请求中选定的非机密标头和内容转发到。 Amazon WAF Amazon WAF 检查请求的内容,将其与您在网页 ACL 中指定的规则进行比较,然后向 Amazon Cognito 返回响应。Amazon Cognito 转发的请求组件 Amazon WAF 取决于请求的类型。对于托管登录和经典托管用户界面,Amazon Cognito 不会转发请求正文。有关更多信息,请参阅 要知道的事情 Amazon WAF 网络 ACL 和 Amazon Cognito。

要知道的事情 Amazon WAF 网络 ACL 和 Amazon Cognito

  • 您无法配置 Web ACL 规则以匹配用户池请求中的个人身份信息(PII),例如用户名、密码、电话号码或电子邮件地址。此数据将不可用 Amazon WAF。应改为配置 Web ACL 规则,使其基于标头、路径和正文中的会话数据进行匹配,例如 IP 地址、浏览器代理和所请求的 API 操作。

  • Amazon Cognito 仅支持对用户池 API 的请求使用基于正文的 Web ACL 规则。对于托管登录和经典托管用户界面,Amazon Cognito 不会转发请求正文,而只检查标头和其他非正文组件。

  • 只有当浏览器加载托管登录页面时,Web ACL 规则才能返回您的自定义屏蔽响应。页面在不重新加载的情况下发送的请求(例如用户提交登录表单时)将改为收到默认403屏蔽响应。

  • 被阻止的请求 Amazon WAF 不计入任何请求类型的请求速率配额。 Amazon WAF 处理程序在 API-level 限制处理程序之前被调用。

  • 当您创建 Web ACL 时,Web ACL 要经过一小段时间才能完全传播并可供 Amazon Cognito 使用。传播时间可以从几秒钟到几分钟不等。 Amazon WAF WAFUnavailableEntityException当您尝试在 Web ACL 完全传播之前将其关联时,将返回。

  • 您可以将一个 Web ACL 与每个用户池相关联。

  • 您的请求可能会导致负载超出 Amazon WAF 可以检查的负载限制。请参阅Amazon WAF 开发者指南中的超大请求组件处理,了解如何配置如何 Amazon WAF 处理来自 Amazon Cognito 的超大请求。

  • 您无法将使用防 Amazon WAF 欺诈控制账户盗用 (ATP) 的网络 ACL 与 Amazon Cognito 用户池相关联。ATP 功能位于 AWS-AWSManagedRulesATPRuleSet 托管规则组中。在将您的 Web ACL 与用户池关联之前,请确保它不使用此托管规则组。

  • 当您的 Amazon WAF Web ACL 与用户池相关联,并且您的 Web ACL 中的规则显示了验证码时,这可能会导致托管登录 TOTP 注册中出现不可恢复的错误。要创建具有 CAPTCHA 操作且不影响托管登录 TOTP 的规则,请参阅配置你的 Amazon WAF 用于托管登录的网页 ACL TOTP MFA。

  • 当您的 Web ACL 中的规则返回自定义屏蔽响应时,Amazon Cognito 会在该响应中添加 Content-Security-Policy 标头。此政策仅允许来自与您的用户池域相同的来源以及来自 Amazon Cognito 提供的 Amazon WAF 验证码和挑战脚本的脚本。它会阻止任何其他内联脚本或第三方脚本,包括您的自定义响应正文用于重定向用户的脚本。有关更多信息,请参阅 Content-Security-Policy 关于自定义区块响应。

  • 当您的 Web ACL 中的规则针对托管登录或经典托管用户界面请求返回 HTTP 状态码为 500 或更高的自定义区块响应时,Amazon Cognito 会改为返回403 (Forbidden)状态码。有关更多信息,请参阅 自定义区块响应中的状态码。

Amazon WAF 检查对以下端点的请求。

托管登录和经典托管 UI

对 用户池端点和托管登录参考 中所有端点的请求。

公有 API 操作

您的应用程序向 Amazon Cognito API 发出的不使用 Amazon 凭证进行授权的请求。这包括InitiateAuthRespondToAuthChallenge、和 API 操作GetUser。范围内的 API 操作 Amazon WAF 不需要使用 Amazon 凭据进行身份验证。它们未经身份验证,或者是使用会话字符串或访问令牌授权的。有关更多信息,请参阅 按授权模型分组的 API 操作列表。

您可以使用以下规则操作在 Web ACL 中配置规则:计数、允许、阻止,或者提供一个 CAPTCHA 以响应符合规则的请求。有关更多信息,请参阅 Amazon WAF 开发人员指南 中的 Amazon WAF 规则。根据规则操作,您可以自定义 Amazon Cognito 返回给用户的响应。

重要

自定义错误响应的选项取决于您发出 API 请求的方式。

  • 您可以自定义托管登录请求的错误代码和响应正文。Amazon Cognito 返回的自定义错误代码为 500 及更高。403有关更多信息,请参阅 自定义区块响应中的状态码。您只能在托管登录中为用户提供 CAPTCHA 以解决此问题。

  • 对于您使用 Amazon Cognito 用户池 API 提出的请求,可以自定义收到阻止响应的请求的响应正文。您也可以指定 400–499 范围内的自定义错误代码。

  • Amazon Command Line Interface (Amazon CLI) 和 Amazon 软件开发工具包ForbiddenException会向生成区块或验证码响应的请求返回错误。

Content-Security-Policy 关于自定义区块响应

如果您的自定义区块响应依赖于脚本,则此策略可能会影响其行为方式。当 Web ACL 规则向托管登录或经典托管用户界面返回自定义屏蔽响应时,Amazon Cognito 会在该响应中添加一个 Content-Security-Policy (CSP) 标头。CSP 是一种浏览器安全机制,用于限制页面可以加载哪些脚本和其他资源。该政策将响应限制如下:

  • 响应可能包括来自与您的用户池域相同来源的脚本和其他资源。

  • 响应可能包括 Amazon Amazon WAF Cognito 提供的验证码和质询脚本。Amazon Cognito 将这些脚本列入许可名单,以便 Amazon WAF 验证码和质疑规则操作继续发挥作用。

任何其他内联脚本以及托管在用户池域以外的域上的任何脚本都不会运行。这包括自定义响应正文用于重定向用户、提交表单或发送网络请求的脚本。

如果您的自定义响应需要重定向用户,请返回 HTTP 3xx 状态码和Location标头,而不是基于脚本的重定向。这种模式不依赖于脚本执行,也不受到 CSP 的影响。

此行为适用于所有可以将 Web ACL 与用户池关联 Amazon Web Services 区域 的地方。

自定义区块响应中的状态码

Amazon Cognito 不会返回来自 Amazon WAF 自定义区块响应的5xx状态码。当 Web ACL 规则返回状态码为 500 或更高的自定义区块响应时,Amazon Cognito 会改为使用403 (Forbidden)状态代码进行响应。响应中仍包含您的自定义响应的标题和正文。此行为适用如下:

  • 托管登录页面 — 当浏览器加载托管登录页面时,Amazon Cognito 会返回403您的自定义响应中的标题和正文。页面在不重新加载的情况下发送的请求(例如表单提交)会收到默认的403区块响应,而没有您的自定义标题或正文。

  • 经典托管用户界面页面和其他用户池终端节点 — Amazon Cognito 会返回403您对经典托管 UI 页面的自定义响应中的标题和正文。无论您的用户池使用托管登录还是经典的托管 UI 品牌,身份提供商和信赖方端点的行为方式都是一样的。

  • 用户池 API — 用户池 API 仅在您的自定义状态码介于 400—499 范围内时才会返回该代码,403对于其他状态码,则返回。

将 Web ACL 与您的用户池相关联

要在您的用户池中使用网络 ACL,您的 Amazon Identity and Access Management (IAM) 委托人必须具有以下 Amazon Cognito 和 Amazon WAF 权限。有关 Amazon WAF 权限的信息,请参阅《Amazon WAF 开发者指南》中的 Amazon WAF API 权限。

JSON
{ "Version":"2012-10-17", "Statement": [ { "Sid": "AllowWebACLUserPool", "Effect": "Allow", "Action": [ "cognito-idp:ListResourcesForWebACL", "cognito-idp:GetWebACLForResource", "cognito-idp:AssociateWebACL" ], "Resource": [ "arn:aws:cognito-idp:*:123456789012:userpool/*" ] }, { "Sid": "AllowWebACLUserPoolWAFv2", "Effect": "Allow", "Action": [ "wafv2:ListResourcesForWebACL", "wafv2:AssociateWebACL", "wafv2:DisassociateWebACL", "wafv2:GetWebACLForResource" ], "Resource": "arn:aws:wafv2:*:123456789012:*/webacl/*/*" }, { "Sid": "DisassociateWebACL1", "Effect": "Allow", "Action": "wafv2:DisassociateWebACL", "Resource": "*" }, { "Sid": "DisassociateWebACL2", "Effect": "Allow", "Action": [ "cognito-idp:DisassociateWebACL" ], "Resource": [ "arn:aws:cognito-idp:*:123456789012:userpool/*" ] } ] }

尽管您必须授予 IAM 权限,但列出的操作仅用于说明权限,不对应于任何 API 操作。

要激活 Amazon WAF 用于您的用户池并关联 Web ACL
  1. 登录 Amazon Cognito 控制台。

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

  3. 在安全性部分,选择 Amazon WAF 选项卡。

  4. 选择编辑。

  5. 选择 “ Amazon WAF 与您的用户池一起使用”。

    选中 “与您的用户池 Amazon WAF 一起使用” 的 Amazon WAF 对话框的屏幕截图。
  6. 选择您已经创建的Amazon WAF Web ACL,或者选择在中创建 Web ACL Amazon WAF,在中的新 Amazon WAF 会话中创建一个 Web ACL Amazon Web Services 管理控制台。

  7. 选择保存更改。

要以编程方式将 Web ACL 与 Amazon Command Line Interface 或 SDK 中的用户池关联,请使用 Amazon WAF API AssociateWeb中的 ACL。Amazon Cognito 没有可关联 Web ACL 的单独 API 操作。

测试和记录 Amazon WAF 网页 ACL

当您在 Web ACL 中将规则操作设置为 C ou nt 时, Amazon WAF 会将该请求添加到与该规则匹配的请求计数中。要使用您的用户池测试 Web ACL,请将规则操作设置为计数,并考虑与每条规则匹配的请求数量。例如,如果您要设置为阻止操作的规则与您确定为正常用户流量的大量请求相匹配,则您可能需要重新配置规则。有关更多信息,请参阅《Amazon WAF 开发人员指南》中的测试和调整您的 Amazon WAF 保护。

您还可以配置 Amazon WAF 为将请求标头记录到亚马逊 CloudWatch 日志组、亚马逊简单存储服务 (Amazon S3) 存储桶或亚马逊数据 Firehose。您可以通过 x-amzn-cognito-client-id 和 x-amzn-cognito-operation-name 识别您使用用户池 API 发出的 Amazon Cognito 请求。托管登录请求仅包含 x-amzn-cognito-client-id 标头。有关更多信息,请参阅 Amazon WAF 开发人员指南 中的记录 Web ACL 流量。

Amazon WAF Web ACL 在所有用户池功能计划中都可用。 Amazon WAF 的安全功能可作为 Amazon Cognito 威胁防护的补充。您可以在用户池中激活这两项功能。 Amazon WAF 对用户池请求的检查单独收费。有关更多信息,请参阅Amazon WAF 定价。

日志 Amazon WAF 请求数据需要按您定位日志的服务收取额外费用。有关更多信息,请参阅 Amazon WAF 开发人员指南 中的记录 Web ACL 流量信息的定价。