配置速率限制

本页面介绍了如何配置 Google Cloud Armor 规则,以通过配置节流操作或基于速率的屏蔽操作,按客户端强制执行速率限制。在配置速率限制之前,请确保您已熟悉速率限制概览中的信息。

准备工作

以下部分介绍了配置 Cloud Armor 安全政策所需的所有 Identity and Access Management (IAM) 角色和权限。对于本文档中的应用场景,您只需拥有 compute.securityPolicies.create 权限。

为 Cloud Armor 安全政策设置 IAM 权限

以下操作需要 Identity and Access Management (IAM) Compute Security Admin 角色 (roles/compute.securityAdmin):

  • 配置、修改、更新和删除 Cloud Armor 安全政策
  • 使用以下 API 方法:
    • SecurityPolicies insert
    • SecurityPolicies delete
    • SecurityPolicies patch
    • SecurityPolicies addRule
    • SecurityPolicies patchRule
    • SecurityPolicies removeRule

具有 Compute Network Admin 角色 (roles/compute.networkAdmin) 的用户可以执行以下操作:

  • 为后端服务设置 Cloud Armor 安全政策
  • 使用以下 API 方法:
    • BackendServices setSecurityPolicy
    • BackendServices list(仅限 gcloud

具有 Security Admin 角色 (roles/iam.securityAdmin) 和 Compute Network Admin 角色 (roles/compute.networkAdmin) 的用户可以使用 SecurityPolicies API 方法 getlistgetRule 查看 Cloud Armor 安全政策。

为自定义角色设置 IAM 权限

下表列出了 IAM 角色的基本权限及其关联的 API 方法。

IAM 权限 API 方法
compute.securityPolicies.create SecurityPolicies insert
compute.securityPolicies.delete SecurityPolicies delete
compute.securityPolicies.get SecurityPolicies get
SecurityPolicies getRule
compute.securityPolicies.list SecurityPolicies list
compute.securityPolicies.use BackendServices setSecurityPolicy
compute.securityPolicies.update SecurityPolicies patch
SecurityPolicies addRule
SecurityPolicies patchRule
SecurityPolicies removeRule
compute.backendServices.setSecurityPolicy BackendServices setSecurityPolicy

基于速率的节流规则

基于速率的节流规则在 Google Cloud CLI 中采用以下格式:

gcloud compute security-policies rules create PRIORITY \
    --security-policy=SECURITY_POLICY \
    {--expression=EXPRESSION | --src-ip-ranges=SRC_IP_RANGE} \
    --action "throttle" \
    --rate-limit-threshold-count=RATE_LIMIT_THRESHOLD_COUNT \
    --rate-limit-threshold-interval-sec=RATE_LIMIT_THRESHOLD_INTERVAL_SEC \
    --conform-action=[allow] \
    --exceed-action=[deny-403|deny-404|deny-429|deny-502|redirect] \
    --exceed-redirect-type=[google-recaptcha|external-302] \
    --exceed-redirect-target=REDIRECT_URL \
    --enforce-on-key=[IP | ALL | HTTP-HEADER | XFF-IP | HTTP-COOKIE | HTTP-PATH | SNI | REGION-CODE] \
    --enforce-on-key-name=[HTTP_HEADER_NAME|HTTP_COOKIE_NAME]

单个键的速率限制

例如,以下 gcloud CLI 命令为 1.2.3.0/24 中的每个 IP 地址创建优先级为 105throttle 规则,速率限制为每 60 秒 100 个请求。超出此节流限制的请求会返回 429 Too Many Requests 状态代码。

gcloud compute security-policies rules create 105 \
    --security-policy SECURITY_POLICY \
    --src-ip-ranges="1.2.3.0/24" \
    --action=throttle \
    --rate-limit-threshold-count=100 \
    --rate-limit-threshold-interval-sec=60 \
    --conform-action=allow \
    --exceed-action=deny-429 \
    --enforce-on-key=IP

例如,以下 gcloud CLI 命令创建优先级为 110throttle 规则,对于来自 1.2.3.0/24 中 IP 地址的所有请求中 HTTP 标头 User-Agent 的每个唯一值,速率限制为每 60 秒 10 个请求。超出此节流限制的请求会返回 429 Too Many Requests 状态代码。

gcloud compute security-policies rules create 110 \
    --security-policy SECURITY_POLICY \
    --src-ip-ranges="1.2.3.0/24" \
    --action=throttle \
    --rate-limit-threshold-count=10 \
    --rate-limit-threshold-interval-sec=60 \
    --conform-action=allow \
    --exceed-action=deny-429 \
    --enforce-on-key=HTTP-HEADER \
    --enforce-on-key-name='User-Agent'

最后,您可以为具有有效 reCAPTCHA 豁免 Cookie 的用户发出基于速率的禁止措施。例如,以下 gcloud CLI 命令在具有有效 reCAPTCHA 豁免 Cookie 的所有请求中创建优先级为 115throttle 规则,对于每个唯一的 reCAPTCHA 豁免 Cookie,速率限制为每 5 分钟 20 个请求。超出节流限制的请求会被重定向以进行 reCAPTCHA 评估。如需详细了解豁免 Cookie 和 reCAPTCHA 评估,请参阅 Cloud Armor 机器人管理概览

gcloud compute security-policies rules create 115 \
    --security-policy SECURITY_POLICY \
    --expression="token.recaptcha_exemption.valid" \
    --action=throttle \
    --rate-limit-threshold-count=20 \
    --rate-limit-threshold-interval-sec=300 \
    --conform-action=allow \
    --exceed-action=redirect \
    --exceed-redirect-type=google-recaptcha \
    --enforce-on-key=HTTP-COOKIE \
    --enforce-on-key-name="recaptcha-ca-e"

基于 JA4 和 JA3 指纹的速率限制

您可以使用 JA4 和 JA3 指纹作为速率限制键。以下示例会创建一个优先级为 1000throttle 规则,其速率限制为每 5 分钟 20 个请求,该速率限制基于客户端的 JA4 指纹,与路径为 /login 的请求进行匹配。超出节流限制的请求会被拒绝。

gcloud compute security-policies rules create 1000 \
    --security-policy SECURITY_POLICY \
    --expression "request.path.matches('/login')" \
    --action throttle \
    --rate-limit-threshold-count 20 \
    --rate-limit-threshold-interval-sec 300 \
    --conform-action allow \
    --exceed-action deny-429 \
    --enforce-on-key-configs tls-ja4-fingerprint

基于用户 IP 地址的速率限制

当您收到通过上游代理发出的请求时,可以根据来源客户端的 IP 地址应用速率限制。以下示例会创建一个优先级为 1000throttle 规则,速率限制为每 5 分钟 20 个请求,该速率限制基于来源客户端的 IP 地址,与路径为 /login 的请求相匹配。超出此节流限制的请求会被拒绝。

gcloud compute security-policies rules create 1000 \
    --security-policy SECURITY_POLICY \
    --expression "request.path.matches('/login')" \
    --action throttle \
    --rate-limit-threshold-count 20 \
    --rate-limit-threshold-interval-sec 300 \
    --conform-action allow \
    --exceed-action deny-429 \
    --enforce-on-key-configs user-ip

如需详细了解用户 IP 地址支持,请参阅规则语言参考文档

基于多个键的速率限制

您还可以使用 enforce-on-key-configs 标志根据多个速率限制键限制流量。此标志可取代 enforce-on-key 标志和 enforce-on-key-name 标志。enforce-on-key-configs 标志需要以英文逗号分隔的 KEY=NAME 对列表:但是,您无需为某些键提供名称。

以下示例为优先级为 105 的政策 POLICY_NAME 创建了 throttle 规则,对来自 1.2.3.0/24 中 IP 地址的所有请求的 HTTP-PATHsite_id 的每个组合的速率限制为每 60 秒 100 个请求。超出此节流限制的请求会返回 429 Too Many Requests 状态代码。

gcloud compute security-policies rules create 105 \
    --security-policy=POLICY_NAME \
    --src-ip-ranges="1.2.3.0/24" \
    --action=throttle \
    --rate-limit-threshold-count=100 \
    --rate-limit-threshold-interval-sec=60 \
    --conform-action=allow \
    --exceed-action=deny-429 \
    --enforce-on-key-configs="HTTP-PATH,HTTP-COOKIE=site_id"

基于速率的黑名单规则

基于速率的屏蔽规则在 gcloud CLI 中采用以下格式:

gcloud compute security-policies rules create PRIORITY \
    --security-policy=SECURITY_POLICY \
    {--expression=EXPRESSION | --src-ip-ranges=SRC_IP_RANGE} \
    --action "rate-based-ban" \
    --rate-limit-threshold-count=RATE_LIMIT_THRESHOLD_COUNT \
    --rate-limit-threshold-interval-sec=RATE_LIMIT_THRESHOLD_INTERVAL_SEC \
    --ban-duration-sec=BAN_DURATION_SEC \
    --ban-threshold-count=BAN_THRESHOLD_COUNT \
    --ban-threshold-interval-sec=BAN_THRESHOLD_INTERVAL_SEC \
    --conform-action=[allow] \
    --exceed-action=[deny-403|deny-404|deny-429|deny-502|redirect] \
    --exceed-redirect-type=[google-recaptcha|external-302] \
    --exceed-redirect-target=REDIRECT_URL \
    --enforce-on-key=[IP | ALL | HTTP-HEADER | XFF-IP | HTTP-COOKIE | HTTP-PATH | SNI | REGION-CODE] \
    --enforce-on-key-name=[HTTP_HEADER_NAME|HTTP_COOKIE_NAME]

例如,以下 gcloud CLI 命令会为请求与值为 tuna 的标头 fish 匹配的每个 IP 地址创建一条优先级为