NodePend WAF 高级防护使用说明

NodePend WAF 高级防护使用说明

入口:选择网站 → 设置 → WAF → 高级防护。

当网站遇到接口被反复提交异常参数、账号被频繁尝试登录、攻击突然增多,或支付页面出现陌生脚本时,可以使用高级防护进行请求检查、频率限制和异常监控。

高级防护包括 API 防护、登录防护、攻击量突增告警和客户端脚本监控。可用功能取决于网站套餐;页面提示未开放时,需要使用包含相应功能的套餐。

先看业务场景:我遇到的问题适合用哪项功能?

适用业务场景 常见痛点 对应功能 能带来的帮助
商城下单、App 后端、合作伙伴 API 接口不断收到缺字段、类型错误或不符合约定的请求,后端反复处理并产生错误日志 OpenAPI 请求校验 按接口文档识别异常请求,配合规则在到达源站前拦截,减少无效处理;仅记录模式也可帮助排查客户端接入问题
会员中心、SaaS 业务接口 受保护接口反复收到无令牌、令牌过期或签名无效的调用 JWT 校验 提前筛除这类请求,减少源站重复验签与处理;具体用户能操作哪些数据仍由源站判断
使用 GraphQL 的商品、内容或数据查询 层层嵌套的查询可能带来大量后端查询,拖慢接口 GraphQL 深度限制 拦截超过设定嵌套深度的查询,减轻部分复杂查询带来的压力
商城、论坛、会员系统的账号登录 同一账号被反复尝试登录,或用户继续使用曾公开泄露的密码 登录防护 限制同一账号的登录提交频率;识别泄露密码后,供源站提示改密或追加验证
没有专人持续查看安全日志的网站 攻击量突然上升,却要等用户反馈异常才开始排查 攻击量突增告警 当 WAF 拦截/挑战量达到条件时发送站内消息,帮助运营和运维及时安排排查
支付页、结算页、关键业务表单 接入多个第三方组件后,不容易发现页面新增了陌生脚本来源 客户端脚本监控 收集浏览器报告,帮助定位未允许的脚本来源,并核实其业务用途

API 和登录防护需要配合入站规则执行;攻击告警负责通知,脚本监控负责报告。可根据实际业务选用,不必一次开启全部功能。

一、首次使用:先配置,再启用规则

  1. 确认网站 WAF 已开启。使用 API/登录防护时,还需开启入站防护。
  2. 在「高级防护」中启用需要的功能,填写参数,点击页面底部「保存」。
  3. 如果页面提示缺少 API/登录防护规则组,点击「添加预设规则」。请先保存已填写的参数,添加预设后页面会刷新。
  4. 前往「入站规则」,检查相应规则组和具体规则。新添加的预设规则默认关闭,并设置为「仅记录」;需要手动启用准备使用的规则。
  5. 先保持「仅记录」,用正常业务请求和预期会命中的测试请求验证,查看日志是否符合预期。
  6. 确认作用范围和动作正确后,再对需要执行防护动作的规则取消「仅记录」。保存后,等待节点更新配置。

「仅记录」适合观察命中情况,不会执行拦截动作。取消后执行规则配置的动作;如果动作只是打标签,仍不会拦截请求。

二、API 防护

适用于开放接口、需要登录的业务接口和 GraphQL 服务。开启「API 防护」后,按业务选择需要的校验方式,不必填写全部项目。

OpenAPI 请求校验

业务场景:下单接口不断收到不符合约定的参数。 例如数量字段缺失、数值被传成文本,可能来自客户端版本不兼容、接入错误或异常调用。先用「仅记录」了解哪些请求不符合文档,修正正常客户端后,再拦截确定无效的请求,减少源站反复处理这类请求的成本。

将后端提供的 OpenAPI 3 文档粘贴到「OpenAPI 文档」,支持 JSON 或 YAML。系统据此检查请求路径、HTTP 方法、参数和请求体。

例如,接口文档要求 POST /api/orders 的请求体包含整数类型的 quantity,可以用缺少该字段或类型错误的请求验证规则。必填条件需要在 OpenAPI 文档中明确声明。

接着到入站规则启用「不符合 OpenAPI 定义」。该预设正式执行时返回 HTTP 400;保持「仅记录」时用于观察。

请把规则限定到文档覆盖的 API 路径。 未写入文档的路径也可能被判定为不符合,整站应用可能影响首页、静态文件或其他公开页面。文档留空时不进行此项校验。

JWT 校验

业务场景:会员接口反复被无效令牌调用。 对必须登录才能访问的订单、个人资料等接口,可在边缘节点校验令牌,让缺少令牌、签名无效或已过期的请求提前结束。源站仍需检查有效令牌对应的用户是否有权读取或修改目标数据,例如用户 A 不能访问用户 B 的订单。

JWT 是登录系统签发的访问令牌。请按现有登录系统的配置填写:

配置项 填写说明
令牌位置 通常使用 Authorization 请求头,例如 Authorization: Bearer <令牌>;也可指定 Cookie 名称
JWKS 地址 认证服务提供的公网 HTTPS 公钥地址,例如 https://auth.example.com/.well-known/jwks.json;需要能从节点访问
公钥(PEM) 使用公钥验签时,填写认证服务提供的 PEM 公钥,不要填写私钥
HMAC 密钥 使用 HMAC 签名时,填写与认证服务一致的共享密钥;至少 16 个字符
签发者 可选,对应令牌中的 iss;填写后校验是否一致
接收方 可选,对应 aud;多个值用逗号分隔,令牌需匹配其中至少一个

JWKS、公钥和 HMAC 密钥按认证服务的签名方式选择一项。JWKS 不应填写 localhost 或内网地址。令牌需要包含有效的到期时间 exp。如果同时配置 Cookie 和请求头,存在指定 Cookie 时优先使用 Cookie。

到入站规则启用「JWT 无效」。该预设会匹配没有令牌、令牌无效或令牌过期的请求,正式执行时返回 HTTP 401。

务必将 JWT 规则限定在需要鉴权的路径,例如 /api/private/。 登录接口、公开接口和其他允许匿名访问的页面应按业务需求排除;跨域预检请求也需要单独确认。JWT 校验不能替代源站对用户身份、角色和资源归属的权限检查。

GraphQL 防护

业务场景:一个请求层层查询商品、店铺、商品列表等关联数据。 这类深层嵌套可能让一次请求触发大量后端处理。设置查询深度上限,可限制其中过深的请求。深度只是查询成本的一个因素,字段数量、分页大小和数据库开销仍需由业务服务控制。

在「GraphQL 路径」填写接口路径,多个用逗号分隔;留空使用 /graphql。这里按路径精确匹配,例如 /graphql 不包含 /graphql/admin。

到入站规则启用「GraphQL 查询过深」。当前预设匹配嵌套超过 10 层的查询,正式执行时返回 HTTP 400;可根据实际查询结构在规则中调整阈值。

三、登录防护

适用于商城、论坛、会员系统等账号密码登录接口,主要帮助处理两类问题:

  • 同一账号被反复尝试登录。 为账号设置提交频率限制,减少短时间重复尝试,有助于缓解针对同一账号的密码猜测。它不是对所有撞库行为的完整识别,仍应结合业务的多因素认证等措施。
  • 用户使用了曾公开泄露的密码。 用户可能不知道常用密码已出现在公开泄露库中。检查结果可交给源站,在登录流程中提醒修改密码或追加验证,帮助降低重复使用泄露密码带来的风险。
配置项 填写说明
登录接口路径 填写实际接收登录提交的路径,例如 /api/auth/login;多个用逗号分隔
用户名字段 例如 username 或 email;多个用逗号分隔
密码字段 例如 password 或 pwd;多个用逗号分隔
检查泄露密码 查询密码是否出现在 Have I Been Pwned 的公开泄露密码库
告诉源站 将可用的密码检查结果放入转发请求头,供源站处理

登录识别只针对指定路径的 POST 请求,路径精确匹配。填写的是登录提交接口,未必是浏览器打开的登录页面。支持普通 URL 编码表单或 JSON 顶层字段;例如 {"email":"[email protected]","password":"示例密码"},用户名字段填写 email,密码字段填写 password。嵌套结构如 user.password 不能直接作为字段名读取。

字段名留空时,会识别常见名称:用户名包括 username、email、user、account、login、phone;密码包括 password、pass、pwd、passwd。

在入站规则中,可选择启用:

  • 同一账号频繁登录:当前预设为同一账号 5 分钟内超过 10 次登录请求,正式执行时对超出的请求返回 HTTP 429。统计的是登录请求次数,不是源站确认的密码错误次数,可按业务调整。
  • 使用已泄露的密码登录:当前预设动作为添加 leakedPassword 标签,便于查看日志,不会自动拒绝登录或修改密码。

密码库查询仅向查询服务发送密码 SHA-1 摘要的前 5 个十六进制字符,不会向该查询服务发送明文密码。正常登录请求仍会转发给源站。命中表示该密码曾出现在公开泄露库中,不代表当前账号已被盗;未命中也不代表密码一定安全。

启用「告诉源站」后,源站可读取:

请求头结果 含义
X-Password-Leaked: 1 密码命中公开泄露库
X-Password-Leaked: 0 本次查询未命中
没有此请求头 可能未执行检查、未读取到密码或查询失败,不能当作检查通过

源站需要自行实现修改密码提示、二次验证等业务流程。仅开启该选项不会自动给用户展示提示。

四、攻击量突增告警

业务场景:活动期间攻击突然增多,运营人员没有持续查看日志。 可以设置绝对次数和相对历史水平的变化条件,在达到条件时收到消息并安排排查。告警间隔用于控制重复通知频率;收到通知后,可结合命中规则和正常业务访问情况,判断是否需要进一步处理。

该功能每 5 分钟统计一次被 WAF 拦截或挑战的请求,达到条件后,通过站内消息通知网站所有者。「仅记录」的命中不计入攻击量。

配置项 含义 配置示例
告警阈值 一个 5 分钟窗口内的最低攻击次数,至少 10 次 1000 次/5 分钟
突增倍数 当前次数需达到前一小时每 5 分钟平均次数的指定倍数;填 0 只看阈值 5 倍
告警间隔 两次通知之间至少间隔多久,至少 5 分钟 60 分钟

以上是说明用的示例,需按网站实际攻击量调整。例如,前一小时平均每 5 分钟 300 次,设置阈值 1000、倍数 5,则当前窗口需达到 1500 次,并满足告警间隔,才会通知。历史平均值为 0 时,按绝对阈值判断。

告警依赖日志和安全分析正常采集,适合用于发现攻击量变化;开启告警本身不会自动调整拦截规则。

五、客户端脚本监控

业务场景:支付或结算页面接入了支付组件、客服和统计脚本,后续却出现一个不认识的脚本来源。 监控报告可以帮助你发现这个变化,核实它来自正常业务上线、第三方组件变化,还是需要进一步排查的异常引入。

先将已确认的正常来源加入允许列表,再关注新出现的报告。该功能提供排查线索,不会自动判定脚本是否恶意,也不会阻止其运行;已允许来源上的脚本内容被修改,未必会触发报告。

  1. 开启「客户端脚本监控」。

  2. 在「监控的页面」填写路径前缀,例如 /checkout, /pay。

  3. 在「允许的脚本来源」中填写确认使用的来源,每行一个,例如:

    https://js.stripe.com
    https://cdn.example.com
    
  4. 点击「保存」,等待配置生效后,用浏览器访问相应页面。

  5. 查看「近 30 天上报的脚本」。核实来源属于正常业务后,可点击「允许」,然后再次点击页面底部「保存」。

需要了解的行为:

  • 监控页面使用前缀匹配,例如 /pay 也会匹配 /payment,请根据需要选择前缀。
  • 与网站同源的外部脚本默认允许;页面内联脚本仍可能产生报告。
  • 功能通过 Content-Security-Policy-Report-Only 请求浏览器报告异常,只报告,不阻止脚本执行。
  • 监控适用于匹配路径、状态为 200 的 HTML 响应。如果源站已有该报告策略响应头,系统不会覆盖它。
  • 表格展示上报来源、次数和访客 IP 数,不是网站所有脚本的完整清单。历史记录不会因加入允许列表而立即消失。
  • 已允许来源上的脚本内容变化,不一定会被该功能发现;它不提供脚本文件完整性校验。

发现陌生来源时,先核实是否来自支付组件、统计工具或其他业务依赖,再决定是否允许。

六、示例:一个会员商城如何选配

假设商城有订单接口、账号密码登录和结算页面,可以分步配置:

业务目标 配置方式 如何确认效果
减少无效下单请求 为订单 API 配置 OpenAPI 文档,将规则限定到文档覆盖的接口 正常订单请求通过;缺少文档规定的必填参数时产生预期记录,正式执行后被拒绝
提前拒绝无效登录令牌 为必须登录的 API 配置 JWT 校验,排除登录和公开接口 有效令牌正常访问;缺失或过期令牌被对应规则命中;源站继续检查订单归属
缓解账号重复登录尝试 配置实际登录提交路径及字段,启用账号频率规则 正常登录不受影响;测试账号超过配置频率后命中规则
提醒用户处理泄露密码 开启密码检查和「告诉源站」,由源站接入改密提示或追加验证 源站能够区分命中、未命中和没有检查结果三种情况
在攻击量异常时安排排查 按平时攻击水平设置告警阈值、倍数和间隔 统计达到条件时,网站所有者收到站内消息
发现结算页陌生脚本来源 监控 /checkout,允许已核实的支付和其他必要脚本来源 在测试页面引入受控、未允许来源的无害脚本后,检查是否出现对应报告

只提供内容展示的网站,可以先考虑攻击告警和关键页面脚本监控;使用 JWT 或 GraphQL 的业务,再启用相应 API 防护。所有拦截规则都应先观察,再结合实际流量调整。

七、常见问题

问题 检查方法
开启 API/登录防护后没有拦截 检查 WAF、入站防护、规则组、具体规则是否开启,以及规则是否仍为「仅记录」;确认节点已更新配置
普通页面突然返回 400/401 检查 OpenAPI/JWT 规则是否覆盖了公开页面;可先把相关规则改回「仅记录」,调整路径范围后再验证
登录请求没有被识别 核对实际提交路径、POST 方法、表单/JSON 格式,以及用户名和密码字段名
开启密码检查后没有提示用户 需要源站读取检查结果并实现提示流程;预设只打标签
有 WAF 命中却没有攻击告警 检查是否仅记录、阈值和倍数是否同时满足、是否仍在告警间隔内,以及日志采集是否正常
脚本监控没有报告 核对页面路径、200 HTML 响应和报告策略响应头;确认浏览器实际访问,且出现了未允许来源;没有报告不代表页面没有脚本
点击「允许脚本来源」后未生效 还需点击「保存」,并等待节点更新配置

每次调整后,请同时验证正常业务请求和预期会被命中的请求,确认访问结果、日志和源站行为符合预期。