Google Cloud Armor 提供的功能可可使您的 Google Cloud 应用免受各种第 3 层和第 7 层攻击。基于速率的规则有助于保护您的应用免受大量请求涌入实例并阻止合法用户进行访问的影响。
速率限制可实现以下各项:
- 防止任何特定客户端耗尽应用资源。
- 保护您的应用实例免受客户端请求速率不稳定和不可预测峰值的影响。
此外,当为某个资源提供了来自少量客户端的大量流量时,您可以防止其他客户端受到来自该少量客户端的流量高峰的影响,从而使资源能够处理尽可能多的请求。
Google Cloud Armor 提供两种基于速率的规则类型:
- 节流规则:您可以通过将各个客户端节流为用户配置的阈值,为每个客户端或所有客户端强制实施请求数上限。
- 基于速率的屏蔽规则:您可以按客户端对与规则匹配的请求进行速率限制,然后如果这些客户端超出用户配置的阈值时,则暂时将这些客户端在配置的一段时间内屏蔽。
配置采用基于速率的禁用操作的规则后,您无法将其更改为节流操作。不过,如果您配置了采用节流操作的规则,日后可以将其更改为采用基于速率的屏蔽操作。如需了解详情,请参阅基于多个键的速率限制。
Google Cloud Armor 会将速率限制阈值应用于每个关联的后端。例如,如果您有两个后端服务,并且配置了每分钟 1,000 个请求的阈值速率限制规则,那么在 Google Cloud Armor 应用规则操作之前,每个后端服务每分钟可以接收 1,000 个请求。
您可以通过使用预览模式并检查请求日志,来预览安全政策中速率限制规则的效果。
确定要进行速率限制的客户端
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:如果客户端使用
HTTPS
、HTTP/2
或HTTP/3
进行连接,则为 JA3 TLS/SSL 指纹。如果不可用,则键类型默认为 ALL。如需详细了解 JA3,请参阅规则语言参考文档。 - USER_IP:来源客户端的 IP 地址,包含在
userIpRequestHeaders
下配置的标头中,其值由上游代理填充。如果没有userIpRequestHeaders
配置,或者无法从中解析 IP 地址,则键类型默认为 IP。如需了解详情,请参阅规则语言参考文档。
您可以单独使用上述键,也可以根据最多三把键的组合应用速率限制。您可以使用多个 HTTP-HEADER
或 HTTP-COOKIE
键,但每种其他键类型只能使用一个。如需了解详情,请参阅基于多个键的速率限制。
节流流量
规则中的 throttle
操作允许您按客户端强制实施请求阈值,以保护后端服务。此规则会强制实施阈值,以限制来自满足规则中匹配条件的每个客户端的流量。阈值配置为指定时间间隔内指定的请求数。
例如,您可以将请求阈值设置为 1200 秒(20 分钟)内 2000 个请求。如果客户端在任一 1200 秒内发送了 2500 个请求,则大约有 20% 的流量会被节流,直到允许的请求量保持在配置的阈值或低于配置的阈值。
当客户端的流量速率低于或等于 rate_limit_threshold_count
时,请求将遵循 conform_action
(始终为 allow
操作)。请求通过安全政策允许,并且可以到达其目的地。当客户端的流量速率超过指定的 rate_limit_threshold_count
时,Google Cloud Armor 会将 exceed_action
(可能是 deny
或 redirect
)应用于针对阈值间隔的其余部分超过限制的请求。
您可以设置以下参数来控制操作:
rate_limit_threshold_count
:指定时间间隔内允许的每个客户端的请求数。最小值为 1,最大值为 1,000,000。interval_sec
:时间间隔中的秒数。该值必须为 10、30、60、120、180、240、300、600、900、1200、1800、2700 或 3600 秒。
exceed_action
:当请求超过rate_limit_threshold_count
时,Google Cloud Armor 会应用已配置的exceed_action
。exceed_action
的可能值如下:deny(status)
:拒绝请求并返回指定的错误代码(有效值为403
、404
、429
和502
)。我们建议您使用429 (Too Many Requests)
响应代码。redirect
:系统会根据exceed_redirect_options
参数将请求重定向到 reCAPTCHA 评估或重定向到其他网址。
exceed_redirect_options
:当exceed_action
为redirect
时,使用此参数指定重定向操作:type
:重定向操作的类型,即GOOGLE_RECAPTCHA
或EXTERNAL_302
。target
:重定向操作的网址目标。仅在type
为EXTERNAL_302
时适用。
conform_action
:这是请求数量低于rate_limit_threshold_count
时执行的操作。这始终是allow
操作。
根据请求速率屏蔽客户端
规则中的 rate_based_ban
操作允许您实施每个客户端的阈值,以便通过应用配置的 exceed_action
到可配置的时间段内对来自客户端的所有请求,来临时禁止超过限制的客户端。阈值配置为指定时间间隔内指定的请求数。您可以暂时禁止用户配置的时间段 ('ban_duration_sec'
) 的流量,前提是该流量与指定的匹配条件匹配并超过配置的阈值。
例如,您可以将请求阈值设置为 1200 秒(20 分钟)内 2000 个请求。如果客户端在任一 1200 秒内发送 2500 个请求,则 Google Cloud Armor 会将 exceed_action
应用于来自该客户端的流量(超过 2000 个请求阈值),直到这一整段 1200 秒的时间过去并设置额外的秒数作为屏蔽时间段。例如,如果屏蔽时间段设置为 3600
,则来自客户端的流量在阈值时间间隔结束之后将被屏蔽 3600 秒(一小时)。
当客户端的请求速率低于速率限制阈值时,这会立即允许请求转到后端服务。当客户端的流量速率超过指定的 rate_limit_threshold_count
时,无论是否超过阈值,Google Cloud Armor 会将 exceed_action
应用于来自阈值间隔剩余时间和下一个 ban_duration_sec
秒的客户端传入请求。
采用这种配置时,可能会意外地将只是偶尔超出允许的请求速率的欢迎客户端屏蔽。为防止出现这种情况,并仅屏蔽频繁超出请求速率的客户端,您可以选择根据名为 ban_threshold_count
的额外(最好是更长)的阈值配置跟踪客户端的总请求次数。在此模式下,仅当请求速率超出配置的 ban_threshold_count
时,客户端才会在配置的 ban_duration_sec
秒内被屏蔽。如果请求速率未超过 ban_threshold_count
,则请求会一直被节流为 rate_limit_threshold_count
。对于 ban_threshold_count
,来自客户端的总请求次数(包括节流之前的所有传入请求)会计算在内。
以下参数可控制 rate_based_ban
规则的操作:
rate_limit_threshold_count
:指定时间间隔内允许的每个客户端的请求数。最小值为 1 个请求,最大值为 10000 个请求。interval_sec
:时间间隔中的秒数。该值必须为 10、30、60、120、180、240、300、600、900、1200、1800、2700 或 3600 秒。
exceed_action
:当请求超过rate_limit_threshold_count
时,Google Cloud Armor 会应用已配置的exceed_action
。exceed_action
的可能值如下:deny(status)
:拒绝请求并返回指定的错误代码。错误代码的有效值包括403
、404
、429
和502
。我们建议您使用响应代码429 (Too Many Requests)
。redirect
:系统会根据exceed_redirect_options
参数将请求重定向到 reCAPTCHA 评估或重定向到其他网址。
exceed_redirect_options
:当exceed_action
为redirect
时,使用此参数指定重定向操作:type
:重定向操作的类型,即GOOGLE_RECAPTCHA
或EXTERNAL_302
。target
:重定向操作的网址目标。仅在type
为EXTERNAL_302
时适用。
conform_action
:这是请求数量低于rate_limit_threshold_count
时执行的操作。这始终是allow
操作。ban_threshold_count
:这是指定时间间隔内允许的每个客户端的请求数,超过该数目后 Google Cloud Armor 会禁止请求。如果指定了此值,当超出rate_limit_threshold_count
的请求数量也超出此ban_threshold_count
时,系统会禁止在配置的ban_duration_sec
内使用相应键。ban_threshold_interval_sec
:ban_threshold_count
的时间间隔(以秒为单位)。该值必须为 10、30、60、120、180、240、300、600、900、1200、1800、2700 或 3600 秒。
ban_duration_sec
:这是在interval_sec
时间段过后客户端被禁止的附加秒数。该值必须为 60、120、180、240、300、600、900、1200、1800、2700 或 3600 秒。
默认速率限制安全政策
在负载均衡器创建期间配置默认安全政策时,默认阈值为每 1 分钟间隔 500 个请求(rate_limit_threshold_count
和 interval_sec
分别为 500
和 60
)。如果您想选择其他阈值,我们建议您按照以下步骤调整参数:
启用 Cloud Logging,并查询通过 Google Cloud Armor 保护的后端服务在一天或更长时间内每个 IP 地址以及每分钟到达的最大请求数。
例如,假设您认为自己收到的 99% 网络流量不应受到速率限制规则的影响。在这种情况下,我们建议您将速率限制阈值设置为从 Cloud Logging 数据生成的分布的每个 IP 地址和每分钟最大请求数的第 99 个百分位。
如果您仍发现默认速率限制规则阻止了合法流量,不妨考虑采取以下额外措施:
- 启用缓存(Cloud CDN 或媒体 CDN)。
- 增加节流时间间隔(每几分钟接收一次请求,而不是每 60 秒接收一次请求)。
- 在初始攻击波次过后,您可以禁止客户端,以进一步降低攻击影响。通过 Google Cloud Armor
rate_based_ban
操作,您可以在用户指定的窗口中禁止所有超出限制次数过多的客户端,从而实现此目的。例如,如果客户在 1 分钟内超出限制 10 次,则可能会被禁止 15 分钟。
阈值强制实施
我们会在部署 HTTP(S) 后端服务的每个 Google Cloud 区域中单独强制实施为节流和基于速率的屏蔽配置的阈值。例如,如果您的服务部署在两个区域中,则这两个区域中的每个区域都会将每个键限制为配置的阈值,因此您的后端服务可能会出现跨区域汇总流量是所配置阈值的两倍的情况。如果配置的阈值设置为 5000 个请求,则后端服务可能会从一个区域收到 5000 个请求,从另一个区域收到 5000 个请求。
但是,对于键类型 IP 地址,合理的做法是假设来自同一客户端 IP 地址的流量被定向到距离部署后端的区域最近的区域。在这种情况下,无论在哪个区域部署,速率限制都会被视为在后端服务级别强制执行。
请务必注意,强制执行的速率限制是近似值,与配置的阈值相比,可能不严格准确。此外,在极少数情况下,由于内部路由行为,系统可能会在比部署的区域更多的区域中强制执行速率限制,因而会影响准确性。为此,我们建议您仅将速率限制用于滥用行为缓解或维持应用和服务可用性,而不用于强制执行严格的配额或许可要求。
日志记录
Cloud Logging 会在请求日志中记录安全政策名称、匹配的速率限制规则优先级、规则 ID、关联的操作以及其他信息。如需详细了解日志记录,请参阅使用请求日志记录。
与 reCAPTCHA 集成
您可以对某些 reCAPTCHA 资源应用速率限制,以减少令牌滥用并限制令牌重用。这些资源包括操作令牌、会话令牌和豁免 Cookie。如需详细了解如何对 reCAPTCHA 使用速率限制,请参阅机器人管理概览。