本页面介绍了如何配置 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 insertSecurityPolicies deleteSecurityPolicies patchSecurityPolicies addRuleSecurityPolicies patchRuleSecurityPolicies removeRule
具有 Compute Network Admin 角色 (roles/compute.networkAdmin) 的用户可以执行以下操作:
- 为后端服务设置 Cloud Armor 安全政策
- 使用以下 API 方法:
BackendServices setSecurityPolicyBackendServices list(仅限gcloud)
具有 Security Admin 角色 (roles/iam.securityAdmin) 和 Compute Network Admin 角色 (roles/compute.networkAdmin) 的用户可以使用 SecurityPolicies API 方法 get、list 和 getRule 查看 Cloud Armor 安全政策。
为自定义角色设置 IAM 权限
下表列出了 IAM 角色的基本权限及其关联的 API 方法。
| IAM 权限 | API 方法 |
|---|---|
compute.securityPolicies.create |
SecurityPolicies insert |
compute.securityPolicies.delete |
SecurityPolicies delete |
compute.securityPolicies.get |
SecurityPolicies getSecurityPolicies getRule |
compute.securityPolicies.list |
SecurityPolicies list |
compute.securityPolicies.use |
BackendServices setSecurityPolicy |
compute.securityPolicies.update |
SecurityPolicies patchSecurityPolicies addRuleSecurityPolicies patchRuleSecurityPolicies 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 地址创建优先级为 105 的 throttle 规则,速率限制为每 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 命令创建优先级为 110 的 throttle 规则,对于来自 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 的所有请求中创建优先级为 115 的 throttle 规则,对于每个唯一的 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 指纹作为速率限制键。以下示例会创建一个优先级为 1000 的 throttle 规则,其速率限制为每 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 地址应用速率限制。以下示例会创建一个优先级为 1000 的 throttle 规则,速率限制为每 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-PATH 和 site_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 地址创建一条优先级为 100 的基于速率的禁止规则,并在其速率超过每 120 秒 50 个请求的限制时将其禁止 300 秒。被屏蔽的请求会返回状态代码 404 Not Found。
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 Forbidden。
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 Too Many Requests。
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
将节流规则更改为基于速率的禁止规则
您可以使用以下命令将现有规则的操作从节流操作更改为基于速率的禁止操作。
gcloud compute security-policies rules update 105 \
--action=rate-based-ban \
--security-policy=sec-policy \
--ban-duration-sec=600
您无法将现有规则的操作从基于速率的禁止操作更改为节流操作。