使用 Amazon WAF 保护 Amazon AppSync API
Amazon WAF 是一个 Web 应用程序防火墙,可帮助保护 Web 应用程序和 API 免受攻击。通过使用该功能,您可以配置一组规则(称为 Web 访问控制列表 (Web ACL)),这些规则根据您定义的可自定义 Web 安全规则和条件允许、阻止或监控(统计)Web 请求。在将 Amazon AppSync API 与 Amazon WAF 集成时,您可以更好地控制和了解 API 接受的 HTTP 流量。要了解 Amazon WAF 的更多信息,请参阅 Amazon WAF Developer Guide 中的 How Amazon WAF Works。
您可以使用 Amazon WAF 保护 AppSync API 以免受到常见的 Web 攻击,例如 SQL 注入和跨站脚本 (XSS) 攻击。这些威胁可能会影响 API 的可用性和性能、损害安全性或消耗过多的资源。例如,您可以创建规则以允许或阻止以下请求:来自指定 IP 地址范围的请求;来自 CIDR 块的请求;源自特定国家/地区或区域的请求;包含恶意 SQL 代码的请求;或者包含恶意脚本的请求。
您还可以创建与 HTTP 标头、方法、查询字符串、URI 和请求正文中的指定字符串或正则表达式模式匹配的规则(限制为前 8 KB)。此外,您可以创建规则来阻止来自特定用户代理、恶意机器人和内容抓取程序的攻击。例如,您可以使用基于速率的规则来指定每个客户端 IP 在尾随的、不断更新的 5 分钟期间内允许的 Web 请求数。
要了解支持的规则类型和其他 Amazon WAF 功能的更多信息,请参阅 Amazon WAF Developer Guide 和 Amazon WAF API Reference。
重要
Amazon WAF 是抵御 Web 漏洞攻击的第一道防线。如果在 API 上启用了 Amazon WAF,将在其他访问控制功能(例如 API 密钥授权、IAM 策略、OIDC 令牌和 Amazon Cognito 用户池)之前评估 Amazon WAF 规则。
将 AppSync API 与 Amazon WAF 集成
您可以使用 Amazon Web Services Management Console、Amazon CLI、Amazon CloudFormation 或任何其他兼容客户端,将 AppSync API 与 Amazon WAF 集成在一起。
将 Amazon AppSync API 与 Amazon WAF 集成
-
创建一个 Amazon WAF Web ACL。有关使用 Amazon WAF 控制台
的详细步骤,请参阅 Creating a web ACL。 -
定义 Web ACL 的规则。在创建 Web ACL 的过程中定义了一个或多个规则。有关如何构建规则的信息,请参阅 Amazon WAF rules。有关您可以为 Amazon AppSync API 定义的有用规则的示例,请参阅为 Web ACL 创建规则。
-
将 Web ACL 与一个 Amazon AppSync API 相关联。您可以在 Amazon WAF 控制台
或 AppSync 控制台 中执行该步骤。 -
要在 Amazon WAF 控制台中将 Web ACL 与一个 Amazon AppSync API 关联,请按照 Amazon WAF Developer Guide 的 Associating or disassociating a Web ACL with an Amazon resource 中的说明进行操作。
-
在 Amazon AppSync 控制台中将 Web ACL 与 Amazon AppSync API 关联
-
登录到 Amazon Web Services Management Console,然后打开 AppSync 控制台
。 -
选择您希望与 Web ACL 关联的 API。
-
在导航窗格中,选择 Settings(设置)。
-
在 Web 应用程序防火墙部分中,开启启用 Amazon WAF。
-
在 Web ACL 下拉列表中,选择要与您的 API 关联的 Web ACL 名称。
-
选择保存以将该 Web ACL 与您的 API 关联。
-
-
注意
在 Amazon WAF 控制台中创建 Web ACL 后,新的 Web ACL 可能需要几分钟才能使用。如果您在 Web 应用程序防火墙菜单中没有看到新创建的 Web ACL,请等待几分钟,然后重试将 Web ACL 与您的 API 关联的步骤。
注意
Amazon WAF 集成仅支持实时终端节点的 Subscription registration message
事件。对于 Amazon WAF 阻止的任何 Subscription registration message
,Amazon AppSync 使用一条错误消息进行响应,而不是 start_ack
消息。
在将 Web ACL 与 Amazon AppSync API 关联后,您将使用 Amazon WAF API 管理 Web ACL。您不需要将 Web ACL 与 Amazon AppSync API 重新关联,除非您希望将 Amazon AppSync API 与不同的 Web ACL 关联。
为 Web ACL 创建规则
规则定义如何检查 Web 请求以及在 Web 请求符合检查条件时执行的操作。规则在 Amazon WAF 中不是单独存在的。您可以在规则组或定义规则的 Web ACL 中按名称访问规则。有关更多信息,请参阅 Amazon WAF rules。以下示例说明了如何定义和关联用于保护 AppSync API 的规则。
例 用于限制请求正文大小的 Web ACL 规则
以下是限制请求正文大小的规则示例。在 Amazon WAF 控制台中创建 Web ACL 时,将在规则 JSON 编辑器中输入该规则。
{ "Name": "BodySizeRule", "Priority": 1, "Action": { "Block": {} }, "Statement": { "SizeConstraintStatement": { "ComparisonOperator": "GE", "FieldToMatch": { "Body": {} }, "Size": 1024, "TextTransformations": [ { "Priority": 0, "Type": "NONE" } ] } }, "VisibilityConfig": { "CloudWatchMetricsEnabled": true, "MetricName": "BodySizeRule", "SampledRequestsEnabled": true } }
在使用上一示例规则创建 Web ACL 后,您必须将其与 AppSync API 相关联。作为使用 Amazon Web Services Management Console 的替代方法,您可以在 Amazon CLI 中运行以下命令以执行该步骤。
aws waf associate-web-acl --web-acl-id
waf-web-acl-arn
--resource-arnappsync-api-arn
可能需要几分钟才能传播更改,但在运行该命令后,包含的正文大于 1024 字节的请求将被 Amazon AppSync 拒绝。
注意
在 Amazon WAF 控制台中创建新的 Web ACL 后,可能需要几分钟才能将 Web ACL 与 API 关联。如果您运行 CLI 命令并出现 WAFUnavailableEntityException
错误,请等待几分钟,然后再次尝试运行该命令。
例 限制来自单个 IP 地址的请求的 Web ACL 规则
以下是一个规则示例,它将 AppSync API 限制为来自单个 IP 地址的 100 个请求。在 Amazon WAF 控制台中创建具有基于速率的规则的 Web ACL 时,将在规则 JSON 编辑器中输入该规则。
{ "Name": "Throttle", "Priority": 0, "Action": { "Block": {} }, "VisibilityConfig": { "SampledRequestsEnabled": true, "CloudWatchMetricsEnabled": true, "MetricName": "Throttle" }, "Statement": { "RateBasedStatement": { "Limit": 100, "AggregateKeyType": "IP" } } }
在使用上一示例规则创建 Web ACL 后,您必须将其与 AppSync API 相关联。您可以在 Amazon CLI 中运行以下命令以执行该步骤。
aws waf associate-web-acl --web-acl-id
waf-web-acl-arn
--resource-arnappsync-api-arn
例 禁止对 API 运行 GraphQL __schema 自省查询的 Web ACL 规则
以下是一个禁止对 API 运行 GraphQL __schema 自省查询的规则示例。将阻止任何包含字符串“__schema”的 HTTP 正文。在 Amazon WAF 控制台中创建 Web ACL 时,将在规则 JSON 编辑器中输入该规则。
{ "Name": "BodyRule", "Priority": 5, "Action": { "Block": {} }, "VisibilityConfig": { "SampledRequestsEnabled": true, "CloudWatchMetricsEnabled": true, "MetricName": "BodyRule" }, "Statement": { "ByteMatchStatement": { "FieldToMatch": { "Body": {} }, "PositionalConstraint": "CONTAINS", "SearchString": "__schema", "TextTransformations": [ { "Type": "NONE", "Priority": 0 } ] } } }
在使用上一示例规则创建 Web ACL 后,您必须将其与 AppSync API 相关联。您可以在 Amazon CLI 中运行以下命令以执行该步骤。
aws waf associate-web-acl --web-acl-id
waf-web-acl-arn
--resource-arnappsync-api-arn