Google Cloud Armor实战:给网站API加WAF、限速和日志验证

很多小团队把业务放到云上后,第一反应是把服务器防火墙、安全组和Nginx规则配好。但如果网站或API已经通过Google Cloud外部应用负载均衡器对外服务,只靠后端实例自己扛恶意请求,很容易出现一个问题:攻击流量已经进入后端,成本和风险都被你自己吃下来了。

Google Cloud Armor的价值,是把允许、拒绝、限速和重定向等策略放到Google Cloud边缘侧,在请求进入后端服务前先做判断。本文用Google Cloud CLI演示一套最小可落地方案:创建Cloud Armor安全策略,添加IP封禁、预配置WAF规则和按IP限速,把策略绑定到后端服务,最后用Cloud Logging验证命中结果。

一、先看架构:Cloud Armor挡在哪一层

Google Cloud官方文档说明,Cloud Armor安全策略可以在Google Cloud边缘对请求执行allow、deny、rate-limit或redirect等动作,并保护后端服务避免不受欢迎流量消耗资源或进入VPC网络。

这句话里有两个关键点:

  • Cloud Armor不是装在虚拟机里的Agent,而是和外部应用负载均衡器、后端服务一起工作;
  • 它适合挡常见Web攻击、异常来源IP、简单CC流量和接口滥用,但不能替代应用鉴权、业务风控和代码层安全。

本文演练的链路是:

用户请求 → External Application Load Balancer → Cloud Armor安全策略 → Backend Service → 应用服务。

二、准备变量和前提

假设你已经有一个对外服务的后端服务web-backend-service。先准备变量:

bash 复制代码
export PROJECT_ID="your-project-id"
export REGION="global"
export BACKEND_SERVICE="web-backend-service"
export POLICY_NAME="web-api-basic-armor"
export BLOCK_IP="203.0.113.10"

gcloud config set project "$PROJECT_ID"
gcloud compute backend-services list

如果你的后端服务是区域级负载均衡,需要在相关命令里使用--region;如果是全局外部应用负载均衡器,通常使用--global。本文以全局后端服务为例。

确认后端服务:

bash 复制代码
gcloud compute backend-services describe "$BACKEND_SERVICE" \
  --global \
  --format="table(name,protocol,loadBalancingScheme,securityPolicy)"

如果这里查不到后端服务,不要继续执行。先确认负载均衡器类型、项目ID和后端服务名称。

三、创建Cloud Armor安全策略

创建一条后端安全策略:

bash 复制代码
gcloud compute security-policies create "$POLICY_NAME" \
  --type=CLOUD_ARMOR \
  --description="Basic WAF and rate limit policy for website API"

查看策略:

bash 复制代码
gcloud compute security-policies describe "$POLICY_NAME" \
  --format="yaml(name,type,description,rules)"

Cloud Armor策略里规则按优先级从小到大匹配。优先级数字越小,越先评估。默认规则通常在最低优先级,建议把明确的黑名单、WAF规则、限速规则和默认允许/拒绝逻辑按顺序设计好。

一个实用顺序是:

  1. 明确封禁IP或IP段;
  2. 预配置WAF规则;
  3. 关键接口限速;
  4. 默认允许。

四、添加IP封禁规则

先演示封禁一个来源IP。示例IP使用文档保留地址,生产环境替换为真实恶意来源或威胁情报列表:

bash 复制代码
gcloud compute security-policies rules create 1000 \
  --security-policy="$POLICY_NAME" \
  --expression="origin.ip == '$BLOCK_IP'" \
  --action=deny-403 \
  --description="Block known bad IP"

查看规则:

bash 复制代码
gcloud compute security-policies rules describe 1000 \
  --security-policy="$POLICY_NAME" \
  --format="yaml(priority,match,action,description)"

这个规则适合短期处置明确恶意来源。但不要把大量动态IP手工塞进规则里,维护成本会越来越高。大规模IP信誉和机器人识别,应结合更系统的安全策略。

五、添加预配置WAF规则

Cloud Armor支持预配置WAF规则集,可用于检测常见Web攻击类型。下面用SQL注入规则集举例,先以preview模式观察影响:

bash 复制代码
gcloud compute security-policies rules create 2000 \
  --security-policy="$POLICY_NAME" \
  --expression="evaluatePreconfiguredWaf('sqli-v33-stable')" \
  --action=deny-403 \
  --preview \
  --description="Preview SQL injection protection"

为什么先用preview?因为WAF规则可能误伤合法请求。预览模式可以在日志里看到如果正式启用会发生什么,但不会真的拦截请求。等你观察一段时间,确认误报可控,再取消preview。

取消preview示例:

bash 复制代码
gcloud compute security-policies rules update 2000 \
  --security-policy="$POLICY_NAME" \
  --no-preview

上线建议:不要一次性把所有WAF规则都开到强拦截。先从高风险接口、登录接口、搜索接口、提交表单接口开始观察,再逐步扩大。

六、给API加按IP限速

Google Cloud Armor官方限速文档说明,可以配置throttle或rate-based actions,按客户端控制请求速率,以帮助防止滥用并保证资源公平分配。

下面示例对/api/路径按客户端IP限速:每60秒允许120次请求,超过后返回429。

bash 复制代码
gcloud compute security-policies rules create 3000 \
  --security-policy="$POLICY_NAME" \
  --expression="request.path.startsWith('/api/')" \
  --action=throttle \
  --rate-limit-threshold-count=120 \
  --rate-limit-threshold-interval-sec=60 \
  --conform-action=allow \
  --exceed-action=deny-429 \
  --enforce-on-key=IP \
  --description="Throttle API requests per client IP"

这个参数组合的含义是:

  • request.path.startsWith('/api/'):只匹配API路径;
  • --action=throttle:超过阈值后执行限速动作;
  • 120/60秒:每个统计窗口最多120次;
  • --enforce-on-key=IP:按客户端IP分别计算;
  • deny-429:超过阈值返回HTTP 429。

注意,限速阈值不要凭感觉拍脑袋。建议先从日志里看正常用户和爬虫的请求频率,再设置比正常峰值略高的阈值。

七、绑定到后端服务

创建策略和规则后,还必须绑定到后端服务,否则不会生效:

bash 复制代码
gcloud compute backend-services update "$BACKEND_SERVICE" \
  --global \
  --security-policy="$POLICY_NAME"

验证绑定结果:

bash 复制代码
gcloud compute backend-services describe "$BACKEND_SERVICE" \
  --global \
  --format="value(securityPolicy)"

如果返回中包含$POLICY_NAME对应资源路径,说明策略已经绑定。

八、用日志验证是否命中

Cloud Armor日志属于Cloud Load Balancing日志。Google官方文档说明,可以在日志中查看每个由Cloud Armor安全策略评估的请求,以及根据最高优先级匹配规则采取的结果或动作。比如查看被安全策略拒绝的请求,可以用jsonPayload.enforcedSecurityPolicy.outcome="DENY"jsonPayload.statusDetails="denied_by_security_policy"等过滤条件。

常用日志查询:

text 复制代码
resource.type="http_load_balancer"
jsonPayload.enforcedSecurityPolicy.name="web-api-basic-armor"

查看被拒绝请求:

text 复制代码
resource.type="http_load_balancer"
jsonPayload.enforcedSecurityPolicy.outcome="DENY"

查看被安全策略拒绝的请求:

text 复制代码
resource.type="http_load_balancer"
jsonPayload.statusDetails="denied_by_security_policy"

查看限速相关结果时,可以结合状态码429和安全策略字段:

text 复制代码
resource.type="http_load_balancer"
httpRequest.status=429
jsonPayload.enforcedSecurityPolicy.name="web-api-basic-armor"

如果日志里看不到请求,先检查负载均衡器日志采样率。官方文档提醒,Cloud Armor日志受负载均衡日志采样率影响;如果你降低了负载均衡器采样率,Cloud Armor请求日志也会按较低采样率生成。

九、验收清单

发布前后至少做六项验收:

验收项 命令或方法 通过标准
策略存在 gcloud compute security-policies describe 能看到策略和规则
后端绑定 backend-services describe securityPolicy不为空
IP封禁 指定来源访问 返回403
WAF预览 构造测试请求 日志出现preview结果
API限速 压测/api/ 超阈值返回429
日志查询 Logs Explorer 能按策略名过滤

压测时可以用非常小的流量验证,不要对生产系统做大流量冲击。示例:

bash 复制代码
for i in {1..150}; do
  curl -s -o /dev/null -w "%{http_code}\n" https://example.com/api/ping
done

如果出现429,说明限速规则可能命中;再结合日志确认是否由Cloud Armor触发。

十、常见坑

第一,策略创建了但没绑定到后端服务。Cloud Armor不是创建即生效,绑定关系必须确认。

第二,规则优先级写反。数字越小越先匹配,如果默认允许规则放得太靠前,后面的拦截规则可能永远到不了。

第三,一上来就强拦截WAF。建议先preview,观察误伤,再转为正式拦截。

第四,限速阈值过低。移动网络、公司出口NAT、校园网可能多人共享IP,按IP限速过低会误伤正常用户。

第五,没有看日志采样率。采样率太低时,你以为规则没命中,实际上日志没完整记录。

第六,把Cloud Armor当作全部安全。它能挡很多边缘层攻击,但应用鉴权、输入校验、权限控制、审计日志仍要自己做好。

结语

小团队做网站和API安全,不必一开始就把安全体系做得很重。先用Cloud Armor建立三层基础防护:明确恶意来源封禁、预配置WAF规则、关键接口限速,再配合日志验证,就能把很多低成本攻击挡在后端服务之前。

如需国际云服务器合规开户流程咨询、Google Cloud负载均衡与Cloud Armor部署、实例选型、安全加固和运维支持,可通过平台私信说明业务地区、访问量、接口类型和预算上限。客户本人完成实名、验证码、支付和合同确认;本文不含返佣链接,不承诺百分百防护或固定节省比例。

官方资料

  1. Google Cloud Armor security policy overview:https://docs.cloud.google.com/armor/docs/security-policy-overview
  2. Create and manage security policies:https://docs.cloud.google.com/armor/docs/configure-security-policies
  3. Example security policies:https://docs.cloud.google.com/armor/docs/example-policies
  4. Configure rate limiting:https://docs.cloud.google.com/armor/docs/configure-rate-limiting
  5. Per-request logging:https://docs.cloud.google.com/armor/docs/request-logging
相关推荐
520拼好饭被践踏1 小时前
JAVA+Agent学习day22
java·开发语言·后端·学习
whi1 小时前
V 编译器 v3 ownership 模式:编译与使用指南
后端·编译器
swipe1 小时前
05|(前端转后全栈)不手写一堆 SQL,后端怎么操作数据库?MyBatis-Plus 入门
前端·后端·全栈
霸道流氓气质1 小时前
SpringBoot中使用JasperReports 报表引擎 — 介绍、原理与使用实践
java·spring boot·后端
swipe1 小时前
04|(前端转后全栈)前端状态为什么不够用?从页面数据到 MySQL 持久化
前端·后端·全栈
苏三说技术1 小时前
为什么越来越多人使用WebFlux?
后端
Database_Cool_1 小时前
LLM 应用怎么省 Token、加速响应——阿里云 Tair 语义缓存实战
阿里云·缓存·云计算
武子康2 小时前
Ask/Allow 不是安全边界:企业 Coding Agent 必须建立四层治理(Policy / Scoped Credential / Sandbox / Provenance)
人工智能·后端·agent
Wang's Blog2 小时前
Go-Zero项目开发17: IM私聊功能实现与消息存储设计
开发语言·后端·golang