发送 Block 操作的自定义响应 - AWS WAF、AWS Firewall Manager、AWS Shield Advanced 和 AWS Shield 网络安全分析器

介绍 AWS WAF 的全新控制台体验

现在,您可以使用更新后的体验访问控制台中任意位置的 AWS WAF 功能。有关更多详细信息,请参阅 使用更新的控制台体验

发送 Block 操作的自定义响应

本节介绍对于设置为 AWS WAF 的规则操作或保护包(web ACL)默认操作如何指示 Block 将自定义 HTTP 响应发送回客户端。有关规则操作的更多信息,请参阅 在 AWS WAF 中使用规则操作。有关默认保护包(web ACL)操作的更多信息,请参阅 在 AWS WAF 中设置保护包(web ACL)默认操作

在为 Block 操作定义自定义响应处理时,您可以定义状态代码、标头和响应正文。有关可与 AWS WAF 配合使用的状态代码列表,请参阅以下部分 自定义响应支持的状态码

使用案例

自定义响应的使用案例包括:

  • 将默认状态码发送回客户端。

  • 将自定义响应标头发送回客户端。您可以为指定任何标头名称,除 content-type 外。

  • 将静态错误页面发送回客户端。

  • 将客户端重定向到其他 URL。为此,您需要指定一个 3xx 重定向状态码,例如 301 (Moved Permanently)302 (Found),然后以新 URL 指定一个名为 Location 的新标头。

与您在受保护资源中定义的响应进行交互

您为 AWS WAF Block 操作指定的自定义响应优先于您在受保护资源中定义的任何响应规范。

您以 AWS WAF 保护的 AWS 资源的主机服务可能允许对 web 请求进行自定义响应处理。示例包括:

  • 使用 Amazon CloudFront,您可以根据状态码自定义错误页面。有关更多信息,请参阅 Amazon CloudFront 开发人员指南中的生成自定义错误响应

  • 使用 Amazon API Gateway,您可以为网关定义响应和状态码。有关更多信息,请参阅 Amazon API Gateway 开发人员指南中的 API Gateway 中的 Gateway 响应

在受保护的 AWS 资源中,您不能将 AWS WAF 自定义响应设置与自定义响应设置结合使用。任何单个 web 请求的响应规范要么完全来自 AWS WAF,要么完全来自受保护的资源。

对于 AWS WAF 阻止的 web 请求,以下为其优先顺序。

  1. AWS WAF 自定义响应:如果 AWS WAF Block 操作启用了自定义响应,则受保护的资源会将配置的自定义响应发送回客户端。您在受保护的资源中定义的任何响应设置(如有)均无效。

  2. 在受保护资源中定义的自定义响应:否则,如果受保护资源有指定的自定义响应设置,则受保护资源将使用这些设置来响应客户端。

  3. AWS WAF 默认 Block 响应:否则,受保护资源将使用 AWS WAF 默认 Block 响应 403 (Forbidden) 来响应客户端。

对于 AWS WAF 允许的 web 请求,您对受保护资源的配置决定了它发送回客户端的响应。您无法在 AWS WAF 中为允许的请求配置响应设置。您可以在 AWS WAF 中为允许的请求配置的唯一自定义是在原始请求中插入自定义标头,然后再将请求转发到受保护的资源。上一节 为非阻止操作插入自定义请求标头 中介绍了此选项。

自定义响应标头

您可以为指定任何标头名称,除 content-type 外。

自定义响应正文

您可以在要使用的保护包(web ACL)或规则组的上下文中定义自定义响应的正文。定义自定义响应正文后,您可以在保护包(web ACL)或创建它的规则组中任何其他位置通过引用来使用它。在单个 Block 操作设置中,您可以引用要使用的自定义正文,并定义自定义响应的状态代码和标头。

在控制台中创建自定义响应时,您可以从已定义的响应正文中进行选择,也可以创建新的响应正文。在控制台之外,您可以在保护包(web ACL)或规则组级别定义自定义响应正文,然后从 保护包(web ACL)或规则组中的操作设置中进行引用。这在下一节的 JSON 示例中有所体现。

自定义响应示例

以下示例列出了具有自定义响应设置的规则组的 JSON。为整个规则组定义自定义响应正文,然后由规则操作中的键来引用。

{ "ARN": "test_rulegroup_arn", "Capacity": 1, "CustomResponseBodies": { "CustomResponseBodyKey1": { "Content": "This is a plain text response body.", "ContentType": "TEXT_PLAIN" } }, "Description": "This is a test rule group.", "Id": "test_rulegroup_id", "Name": "TestRuleGroup", "Rules": [ { "Action": { "Block": { "CustomResponse": { "CustomResponseBodyKey": "CustomResponseBodyKey1", "ResponseCode": 404, "ResponseHeaders": [ { "Name": "BlockActionHeader1Name", "Value": "BlockActionHeader1Value" } ] } } }, "Name": "GeoMatchRule", "Priority": 1, "Statement": { "GeoMatchStatement": { "CountryCodes": [ "US" ] } }, "VisibilityConfig": { "CloudWatchMetricsEnabled": true, "MetricName": "TestRuleGroupReferenceMetric", "SampledRequestsEnabled": true } } ], "VisibilityConfig": { "CloudWatchMetricsEnabled": true, "MetricName": "TestRuleGroupMetric", "SampledRequestsEnabled": true } }