速率限制概览

Google Cloud Armor 提供的功能可可使您的 Google Cloud 应用免受各种第 3 层和第 7 层攻击。基于速率的规则有助于保护您的应用免受大量请求涌入实例并阻止合法用户进行访问的影响。

速率限制可实现以下各项:

  • 防止任何特定客户端耗尽应用资源。
  • 保护您的应用实例免受客户端请求速率不稳定和不可预测峰值的影响。

此外,当为某个资源提供了来自少量客户端的大量流量时,您可以防止其他客户端受到来自该少量客户端的流量高峰的影响,从而使资源能够处理尽可能多的请求。

Google Cloud Armor 提供两种基于速率的规则类型:

  1. 节流规则:您可以通过将各个客户端节流为用户配置的阈值,为每个客户端或所有客户端强制实施请求数上限。
  2. 基于速率的屏蔽规则:您可以按客户端对与规则匹配的请求进行速率限制,然后如果这些客户端超出用户配置的阈值时,则暂时将这些客户端在配置的一段时间内屏蔽。

Google Cloud Armor 会将速率限制阈值应用于每个关联的后端。例如,如果您有两个后端服务,并且配置的速率限制规则的阈值为每分钟 1,000 个请求,则每个后端服务每分钟最多可以收到 1,000 个请求,然后 Google Cloud Armor 才会应用规则操作。

您可以通过使用预览模式并检查请求日志,来预览安全政策中速率限制规则的效果。

确定要进行速率限制的客户端

Google Cloud Armor 通过使用以下键类型来聚合请求并强制执行速率限制,来确定要进行速率限制的各个客户端。

  • 全部:请求满足规则匹配条件的所有客户端的单个键。
  • IP:用于其请求满足规则匹配条件的每个客户端来源 IP 地址的唯一键。
  • HTTP_HEADER:已配置名称的每个唯一 HTTP 标头值的唯一键。键值会被截断为标头值的前 128 个字节。如果不存在此类标头,或者您尝试将此密钥类型与外部代理网络负载均衡器结合使用,则密钥类型默认为 ALL。
  • XFF_IP:客户端的每个原始来源 IP 地址的唯一密钥,即 X-Forwarded-For HTTP 标头中指定的 IP 列表中的第一个 IP 地址。如果不存在此类标头、值不是有效的 IP 地址,或者您尝试将此密钥类型与外部代理网络负载均衡器结合使用,则密钥类型默认为 IP 地址。
  • HTTP_COOKIE:已配置名称的每个 HTTP Cookie 值对应的唯一键。键值会被截断为 Cookie 值的前 128 个字节。如果不存在此类 Cookie,或者您尝试将此密钥类型与外部代理网络负载均衡器结合使用,则密钥类型默认为 ALL。
  • HTTP_PATH:HTTP 请求的网址路径。密钥值被截断为前 128 个字节。
  • SNI:HTTPS 请求的 TLS 会话中的服务器名称指示。 键值被截断为前 128 个字节。对于 HTTP 会话,密钥类型默认为 ALL
  • REGION_CODE:发起请求的国家/区域。
  • TLS_JA3_FINGERPRINT:JA3 TLS/SSL 指纹(如果客户端使用 HTTPSHTTP/2HTTP/3 进行连接)。如果不可用,密钥类型默认为 ALL。如需详细了解 JA3,请参阅规则语言参考文档
  • USER_IP:源客户端的 IP 地址,包含在 userIpRequestHeaders 下配置的标头中,其值由上游代理填充。如果没有 userIpRequestHeaders 配置,或者无法从该配置解析 IP 地址,密钥类型默认为 IP。如需了解详情,请参阅规则语言参考文档

您可以单独使用上述键,也可以根据最多三个键的组合来应用速率限制。您可以使用多个 HTTP-HEADERHTTP-COOKIE 密钥,且其他密钥类型只能使用一个。如需了解详情,请参阅基于多个键的速率限制

节流流量

规则中的 throttle 操作允许您按客户端强制实施请求阈值,以保护后端服务。此规则会强制实施阈值,以限制来自满足规则中匹配条件的每个客户端的流量。阈值配置为指定时间间隔内指定的请求数。

例如,您可以将请求阈值设置为 1200 秒(20 分钟)内 2000 个请求。如果客户端在任一 1200 秒内发送了 2500 个请求,则大约有 20% 的流量会被节流,直到允许的请求量保持在配置的阈值或低于配置的阈值。

您可以设置以下参数来控制操作:

  • rate_limit_threshold:指定时间间隔内允许的每个客户端的请求数。最小值为 1,最大值为 10000。
    • interval_sec:时间间隔中的秒数。该值必须为 10、30、60、120、180、240、300、600、900、1200、1800、2700 或 3600 秒。
  • exceed_action:当请求超过 rate_limit_threshold 时,Google Cloud Armor 会应用已配置的 exceed_actionexceed_action 的可能值如下:
    • deny(status):拒绝请求并返回指定的错误代码(有效值为 403404429502)。我们建议您使用 429 (Too Many Requests) 响应代码。
    • redirect:系统会根据 exceed_redirect_options 参数将请求重定向到 reCAPTCHA Enterprise 评估或重定向到其他网址。
  • exceed_redirect_options:当 exceed_actionredirect 时,使用此参数指定重定向操作:
    • type:重定向操作的类型,即 GOOGLE_RECAPTCHAEXTERNAL_302
    • target:重定向操作的网址目标。仅在 typeEXTERNAL_302 时适用。
  • conform_action:这是请求数量低于 rate_limit_threshold 时执行的操作。这始终是 allow 操作。

当客户端的流量速率低于或等于 rate_limit_threshold 时,请求将遵循 conform_action(始终为 allow 操作)。请求通过安全政策允许,并且可以到达其目的地。当客户端的流量速率超过指定的 rate_limit_threshold 时,Google Cloud Armor 会将 exceed_action(可能是 denyredirect)应用于针对阈值间隔的其余部分超过限制的请求。

根据请求速率屏蔽客户端

通过规则中的 rate_based_ban 操作,您可以强制执行个别客户端阈值,在可配置的时间段内对来自客户端的所有请求应用配置的 exceed_action,从而暂时禁止超过此限制的客户端。阈值配置为指定时间间隔内指定的请求数。您可以暂时禁止用户配置的时间段 ('ban_duration_sec') 的流量,前提是该流量与指定的匹配条件匹配并超过配置的阈值。

例如,您可以将请求阈值设置为 1200 秒(20 分钟)内 2000 个请求。如果客户端在任一 1200 秒内发送 2500 个请求,则 Google Cloud Armor 会将 exceed_action 应用于来自该客户端的流量(超过 2000 个请求阈值),直到这一整段 1200 秒的时间过去并设置额外的秒数作为屏蔽时间段。例如,如果屏蔽时间段设置为 3600,则来自客户端的流量在阈值时间间隔结束之后将被屏蔽 3600 秒(一小时)。

以下参数可控制 rate_based_ban 规则的操作:

  • rate_limit_threshold:指定时间间隔内允许的每个客户端的请求数。最小值为 1 个请求,最大值为 10000 个请求。
    • interval_sec:时间间隔中的秒数。该值必须为 10、30、60、120、180、240、300、600、900、1200、1800、2700 或 3600 秒。
  • exceed_action:当请求超过 rate_limit_threshold 时,Google Cloud Armor 会应用已配置的 exceed_actionexceed_action 的可能值如下:
    • deny(status):拒绝请求并返回指定的错误代码。错误代码的有效值包括 403404429502。我们建议您使用响应代码 429 (Too Many Requests)
    • redirect:系统会根据 exceed_redirect_options 参数将请求重定向到 reCAPTCHA Enterprise 评估或重定向到其他网址。
  • exceed_redirect_options:当 exceed_actionredirect 时,使用此参数指定重定向操作:
    • type:重定向操作的类型,即 GOOGLE_RECAPTCHAEXTERNAL_302
    • target:重定向操作的网址目标。仅在 typeEXTERNAL_302 时适用。
  • conform_action:这是请求数量低于 rate_limit_threshold 时执行的操作。这始终是 allow 操作。
  • ban_threshold_count:这是 Google Cloud Armor 禁止每个客户端的请求数量。如果指定,当超过 rate_limit_threshold_count 的请求数也超过此 ban_threshold_count 时,系统将禁止配置的 ban_duration_sec 使用该密钥。
  • ban_duration_sec:这是在 interval_sec 时间段过后客户端被禁止的附加秒数。该值必须为 60、120、180、240、300、600、900、1200、1800、2700 或 3600 秒。

当客户端的请求速率低于速率限制阈值时,这会立即允许请求转到后端服务。当客户端的流量速率超过指定的 rate_limit_threshold 时,无论是否超过阈值,Google Cloud Armor 会将 exceed_action 应用于来自阈值间隔剩余时间和下一个 ban_duration_sec 秒的客户端传入请求。

采用这种配置时,可能会意外地将只是偶尔超出允许的请求速率的欢迎客户端屏蔽。为防止出现这种情况,并仅屏蔽频繁超出请求速率的客户端,您可以选择根据名为 ban_threshold_count 的额外(最好是更长)的阈值配置跟踪客户端的总请求次数。在此模式下,只有当请求速率超过配置的 ban_threshold_count 时,系统才会针对配置的 ban_duration_sec 禁止客户端。如果请求速率未超过 ban_threshold_count,则请求会一直受限于 rate_limit_threshold。为了计算 ban_threshold_count,系统会统计来自客户端的请求总数(包括限制之前的所有传入请求)。

默认的速率限制安全政策

在负载均衡器创建期间配置默认安全政策时,默认阈值为每 1 分钟间隔 500 个请求(rate_limit_thresholdinterval_sec 分别为 50060)。如果您想选择其他阈值,我们建议您按照以下步骤调整参数:

  1. 启用 Cloud Logging,并查询通过 Google Cloud Armor 保护的后端服务在一天或更长时间内每个 IP 地址以及每分钟到达的最大请求数。

    例如,假设您认为您收到的 99% 网络流量不应受到速率限制规则的影响。在这种情况下,我们建议您将速率限制阈值设置为从 Cloud Logging 数据生成的分布的每个 IP 地址和每分钟最大请求数的第 99 个百分位。

  2. 如果您仍然发现默认速率限制规则屏蔽合法流量,请考虑执行以下额外步骤:

    1. 启用缓存(Cloud CDN 或媒体 CDN)。
    2. 增加节流时间间隔(每几分钟接收一次请求,而不是每 60 秒接收一次请求)。
    3. 您可以禁止客户端,以便在初始波攻击后进一步减少攻击影响。通过 Google Cloud Armor rate_based_ban 操作,您可以在用户指定的窗口中禁止所有超出限制次数过多的客户端,从而实现此目的。例如,如果客户端在一分钟内超过 10 次,则可能会在 15 分钟内被禁止。

阈值强制实施

我们会在部署 HTTP(S) 后端服务的每个 Google Cloud 区域中单独强制实施为节流和基于速率的屏蔽配置的阈值。例如,如果您的服务部署在两个区域中,则这两个区域中的每个区域都会将每个键限制为配置的阈值,因此您的后端服务可能会出现跨区域汇总流量是所配置阈值的两倍的情况。如果配置的阈值设置为 5000 个请求,则后端服务可能会从一个区域收到 5000 个请求,从另一个区域收到 5000 个请求。

但是,对于键类型 IP 地址,合理的做法是假设来自同一客户端 IP 地址的流量被定向到距离部署后端的区域最近的区域。在这种情况下,无论在哪个区域部署,速率限制都会被视为在后端服务级别强制执行。

请务必注意,强制执行的速率限制是近似值,与配置的阈值相比,可能不严格准确。此外,在极少数情况下,由于内部路由行为,系统可能会在比部署的区域更多的区域中强制执行速率限制,因而会影响准确性。为此,我们建议您仅将速率限制用于滥用行为缓解或维持应用和服务可用性,而不用于强制执行严格的配额或许可要求。

日志记录

Cloud Logging 会在请求日志中记录安全政策名称、匹配的速率限制规则优先级、规则 ID、关联的操作以及其他信息。如需详细了解日志记录,请参阅使用请求日志记录

与 reCAPTCHA Enterprise 集成

您可以对某些 reCAPTCHA Enterprise 资源应用速率限制,以减少令牌滥用并限制令牌重用。这些资源包括操作令牌、会话令牌和豁免 Cookie。如需详细了解如何对 reCAPTCHA Enterprise 使用速率限制,请参阅机器人管理概览

后续步骤