配置速率限制

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

准备工作

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

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

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

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

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

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

具有 Security Admin 角色 (roles/iam.securityAdmin) 并且 Compute Network Admin 角色可以使用 SecurityPolicies API 方法 getlistgetRule 查看 Google 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 错误代码。

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 错误代码。

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 评估,请参阅聊天机器人管理概览

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"

基于 JA3 指纹的速率限制

您可以将 JA3 指纹用作速率限制密钥。以下示例将根据客户端的 JA3 指纹创建一条优先级为 1000throttle 规则,该规则的速率限制为每 5 分钟 20 个请求,该规则匹配具有 /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-ja3-fingerprint

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

当您收到通过上游代理发送的请求时,可以根据源客户端的 IP 地址应用速率限制。以下示例创建了一条优先级为 1000throttle 规则,根据源客户端的 IP 地址,该规则的速率限制为每 5 分钟 20 个请求,该规则匹配具有 /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 错误代码。

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 地址创建一条优先级为 100 的基于速率的禁止规则,并在其速率超过每 120 秒 50 个请求的限制时将其禁止 300 秒。被屏蔽的请求会返回错误代码 404

gcloud compute security-policies rules create 100 \
    --security-policy=sec-policy \
    --expression="request.headers['fish'] == 'tuna'" \
    --action=rate-based-ban \
    --rate-limit-threshold-count=50 \
    --rate-limit-threshold-interval-sec=120 \
    --ban-duration-sec=300 \
    --conform-action=allow \
    --exceed-action=deny-404 \
    --enforce-on-key=IP

例如,以下 gcloud CLI 命令会创建优先级为 101 的基于速率的禁止规则,以将区域代码与 US 匹配的所有请求限制为每 60 秒 10 个请求。如果来自 US 区域的请求的速率超出每 600 秒 1000 次请求的限制,则此规则还会屏蔽这些请求 300 秒。被屏蔽的请求会返回错误代码 403

gcloud compute security-policies rules create 101 \
    --security-policy sec-policy \
    --expression "origin.region_code == 'US'" \
    --action rate-based-ban \
    --rate-limit-threshold-count 10 \
    --rate-limit-threshold-interval-sec 60 \
    --ban-duration-sec 300 \
    --ban-threshold-count 1000 \
    --ban-threshold-interval-sec 600 \
    --conform-action allow \
    --exceed-action deny-403 \
    --enforce-on-key ALL

例如,以下 gcloud CLI 命令会创建优先级为 102 的基于速率的禁止规则,以将来自任何源 IP 地址范围的所有请求限制为每 60 秒 20 个请求。如果请求速率超过每 400 秒 500 个请求的限制,该规则还会禁止来自任何源 IP 地址范围的请求 600 秒。被屏蔽的请求会返回错误代码 429

gcloud compute security-policies rules create 102 \
    --security-policy sec-policy \
    --src-ip-ranges="*" \
    --action rate-based-ban \
    --rate-limit-threshold-count 20 \
    --rate-limit-threshold-interval-sec 60 \
    --ban-duration-sec 600 \
    --ban-threshold-count 500 \
    --ban-threshold-interval-sec 400 \
    --conform-action allow \
    --exceed-action deny-429 \
    --enforce-on-key ALL

后续步骤