WAF CheckResponse 拦截查询

前置条件

预检查:需要 Aliyun CLI >= 3.3.3

运行 aliyun version 验证 >= 3.3.3。如果未安装或版本过低,
参阅 https://help.aliyun.com/document_detail/139508.html 获取安装说明。

预检查:需要更新 Aliyun CLI 插件

[必须] 运行 aliyun configure set --auto-plugin-install true 启用插件自动安装。
[必须] 运行 aliyun plugin update 确保现有插件始终为最新版本。

可观测性

UA 模板 —— 每次 aliyun CLI 命令调用都必须包含 --user-agent,格式如下:

AlibabaCloud-Agent-Skills/alibabacloud-waf-checkresponse-intercept-query/{session-id}

session-id 生成规则

  • 每个 Skill 会话开始时(首条 CLI 命令之前)生成一次
  • 格式:32 位小写十六进制字符串(例如 a1b2c3d4e5f67890abcdef1234567890
  • 生成方式:python3 -c "import uuid; print(uuid.uuid4().hex)"
  • 同一会话中所有 CLI 命令复用同一个 session-id

示例:

开始时生成一次 session-id

SESSION_ID=$(python3 -c "import uuid; print(uuid.uuid4().hex)")

在每条 CLI 命令中使用

aliyun waf-openapi describe-instance --region cn-hangzhou \

--user-agent "AlibabaCloud-Agent-Skills/alibabacloud-waf-checkresponse-intercept-query/${SESSION_ID}"


执行前,你**必须**从用户处收集以下信息:

| 参数 | 说明 | 必填 |
|-----------|-------------|----------|
| Request ID | 从 WAF 拦截响应的 HTML body 获取的 traceid,或浏览器中显示的 405 拦截页上的 Request ID | 是 |

**可选**:WAF 实例 ID、SLS Project 名称、SLS Logstore 名称(未提供时会自动发现)

**注意**:
- Request ID(traceid)从 WAF 拦截响应的 HTML body 获取,或从浏览器中显示的 405 拦截页获取
- 使用阿里云默认凭证链认证(ECS RAM Role、~/.alibabacloud/config 等)

地域信息

RegionId 值地域说明
cn-hangzhou中国大陆中国大陆内的 WAF 实例
ap-southeast-1中国大陆以外海外及港澳台地区的 WAF 实例

查询工作流

步骤 1:信息收集

与用户确认 Request ID(traceid)。如果用户未提供,引导他们从以下位置获取:

  1. 浏览器中显示的 405 拦截页,直接显示 Request ID
  2. WAF 拦截响应的 HTML body,包含 traceid

步骤 2:自动发现 WAF 实例并验证日志服务

如果用户未提供 WAF 实例 ID 和 SLS 配置,执行自动发现:

#### 步骤 2a:发现 WAF 实例

并行查询两个地域的 WAF 实例

aliyun waf-openapi describe-instance --region cn-hangzhou --user-agent "AlibabaCloud-Agent-Skills/alibabacloud-waf-checkresponse-intercept-query/${SESSION_ID}"

aliyun waf-openapi describe-instance --region ap-southeast-1 --user-agent "AlibabaCloud-Agent-Skills/alibabacloud-waf-checkresponse-intercept-query/${SESSION_ID}"


#### 步骤 2b:检查日志服务状态(查询日志前强制)

**在获取 SLS 配置之前,你必须先通过调用 `describe-sls-log-store-status` 验证 WAF 实例已启用日志服务**:

aliyun waf-openapi describe-sls-log-store-status --region <region-id> --instance-id '<instance-id>' --user-agent "AlibabaCloud-Agent-Skills/alibabacloud-waf-checkresponse-intercept-query/${SESSION_ID}"


- 如果响应表明日志服务**已启用**(`SlsLogStoreStatus` 为 true/enabled),**跳过**启用操作,直接进入**步骤 2c**(幂等:无冗余写入)。
- 如果日志服务**未启用**,告知用户必须先激活 WAF 日志服务才能进行日志查询。经用户同意后,调用 `modify-user-waf-log-status` 启用它:

aliyun waf-openapi modify-user-waf-log-status \

--region <region-id> \

--instance-id '<instance-id>' \

--log-status 1 \

--user-agent "AlibabaCloud-Agent-Skills/alibabacloud-waf-checkresponse-intercept-query/${SESSION_ID}"


> **约束**:本 Skill 只支持**启用**日志服务(`--log-status 1`)。**不允许**禁用日志服务。绝不要用 `--log-status 0` 调用此 API。

启用后,稍等片刻并用 `describe-sls-log-store-status` 重新验证以确认激活。

#### 步骤 2c:获取 SLS 配置(确认日志服务已启用后强制)

一旦 `describe-sls-log-store-status` 确认日志服务已启用,你**必须立即**调用 `describe-sls-log-store` 获取 WAF 日志 Project 和 Logstore 信息:

aliyun waf-openapi describe-sls-log-store --region <region-id> --instance-id '<instance-id>' --user-agent "AlibabaCloud-Agent-Skills/alibabacloud-waf-checkresponse-intercept-query/${SESSION_ID}"


`describe-sls-log-store` 响应中的关键字段:

| 字段 | 说明 |
|-------|-------------|
| `ProjectName` | 与 WAF 实例关联的 SLS Project 名称 |
| `LogStoreName` | WAF 日志的 SLS Logstore 名称 |
| `Ttl` | 日志保留期(天) |

**跨地域注意事项**:SLS 日志存储地域可能与 WAF 实例地域不同(例如 WAF 在 `ap-southeast-1` 但 SLS 日志存储在 `ap-southeast-5`)。在步骤 3 查询 SLS 时,始终使用 SLS Project 所在地域,而非 WAF 实例地域。

> **注意**:`describe-instance` 命令在指定 `--region` 时不需要 `--biz-region-id`。`--region` flag 决定 endpoint 路由。仅当你需要单独覆盖业务地域与 endpoint 时才传 `--biz-region-id`。

### 步骤 3:查询 SLS 日志

使用步骤 2 获得的 `ProjectName`、`LogStoreName` 和 SLS 地域查询拦截日志(优先使用 Python 脚本):

使用脚本查询(推荐,支持自动扩展时间范围)

python3 scripts/get_waf_logs.py \

--project <project-name> \

--logstore <logstore-name> \

--request-id <request-id> \

--region <sls-region>


或直接使用 CLI:

TO_TIME=$(python3 -c "import time; print(int(time.time()))")

FROM_TIME=$((TO_TIME - 86400))

aliyun sls get-logs \

--project <project-name> \

--logstore <logstore-name> \

--from $FROM_TIME \

--to $TO_TIME \

--query "<request-id>" \

--region <sls-region> \

--user-agent "AlibabaCloud-Agent-Skills/alibabacloud-waf-checkresponse-intercept-query/${SESSION_ID}"


**重要**:这里的 `--region` 必须是 SLS 日志存储地域,可能与 WAF 实例地域不同。检查步骤 2 的 `describe-sls-log-store` 响应以确定正确的 SLS 地域。

### 步骤 4:查询规则详情

从日志中提取 `rule_id` 和 `final_plugin` 以查询规则配置。

**注意**:如果不知道 `TemplateId`,先用 `describe-defense-templates` 找到包含该规则的模板。`describe-defense-templates` API 使用 `--defense-scene` 按场景过滤:

| final_plugin | DefenseScene |
|--------------|---------------|
| customrule | custom_acl 或 custom_cc |
| waf | waf_group |
| scanner_behavior | antiscan |
| dlp | dlp |
| tamperproof | tamperproof |

步骤 4a:找到包含规则的模板(用 --defense-scene 过滤)

aliyun waf-openapi describe-defense-templates \

--region <region-id> \

--instance-id '<instance-id>' \

--defense-scene '<defense-scene>' \

--user-agent "AlibabaCloud-Agent-Skills/alibabacloud-waf-checkresponse-intercept-query/${SESSION_ID}"

步骤 4b:查询规则详情(describe-defense-rule 不使用 --defense-scene)

aliyun waf-openapi describe-defense-rule \

--region <region-id> \

--instance-id '<instance-id>' \

--template-id <template-id> \

--rule-id <rule-id> \

--user-agent "AlibabaCloud-Agent-Skills/alibabacloud-waf-checkresponse-intercept-query/${SESSION_ID}"


### 步骤 5:输出分析报告

使用以下模板输出:

WAF 拦截分析报告

请求信息

  • Request ID: {request_id}
  • 拦截时间: {time}
  • 客户端 IP: {real_client_ip (masked, e.g. 192.*.*.***)}
  • 请求 URL: {host}{request_path}?{masked_query_params}

拦截详情

  • 规则 ID: {rule_id}
  • 规则名称: {rule_name}
  • 动作: {action}

建议

{根据规则类型提供建议,参阅 references/common-block-reasons.md}

故障排查

未找到日志

  1. 重新检查全局日志服务状态(步骤 2b 应已验证,但再确认一次):
   aliyun waf-openapi describe-sls-log-store-status --region <region-id> --instance-id '<instance-id>' --user-agent "AlibabaCloud-Agent-Skills/alibabacloud-waf-checkresponse-intercept-query/${SESSION_ID}"

如果未启用,提示用户并用 modify-user-waf-log-status 启用(见步骤 2b)。只允许启用(--log-status 1)。

  1. 列出防护对象(为下一步获取资源名):
   aliyun waf-openapi describe-defense-resources --region <region-id> --instance-id '<instance-id>' --query '{"PageNumber":1,"PageSize":20}' --user-agent "AlibabaCloud-Agent-Skills/alibabacloud-waf-checkresponse-intercept-query/${SESSION_ID}"

从响应中每项的 Resource 字段提取(例如 ddddingdang.xyz-wafalb-xxx-alb)。

  1. 检查防护对象日志开关
   aliyun waf-openapi describe-resource-log-status --region <region-id> --instance-id '<instance-id>' --resources '<resource-name-1>,<resource-name-2>' --user-agent "AlibabaCloud-Agent-Skills/alibabacloud-waf-checkresponse-intercept-query/${SESSION_ID}"

--resources 值是上面 describe-defense-resources 获得的资源名的逗号分隔列表。

  1. 启用防护对象日志采集(先检查后操作:仅当 describe-resource-log-status 显示目标资源日志采集已禁用时才执行;已启用则跳过):
   aliyun waf-openapi modify-resource-log-status \
     --region <region-id> \
     --instance-id '<instance-id>' \
     --resource '<resource-name>' \
     --status true \
     --user-agent "AlibabaCloud-Agent-Skills/alibabacloud-waf-checkresponse-intercept-query/${SESSION_ID}"

防护对象命名约定见 references/common-block-reasons.md

权限被拒错误

如果遇到权限错误,检查以下内容:

  1. 验证 CLI profile 配置
   aliyun configure list
  1. 检查 RAM 策略权限

所需权限:

  • waf-openapi:DescribeInstance
  • waf-openapi:DescribeSlsLogStoreStatus
  • waf-openapi:DescribeSlsLogStore
  • waf-openapi:ModifyUserWafLogStatus(可选,用于启用日志服务)
  • waf-openapi:DescribeDefenseRule(用于规则详情)
  • sls:GetLogs(用于日志查询)
  1. 尝试指定其他 profile
   aliyun waf-openapi describe-instance --profile <profile-name> --region <region-id> --user-agent "AlibabaCloud-Agent-Skills/alibabacloud-waf-checkresponse-intercept-query/${SESSION_ID}"

未找到 Request ID

如果日志中未找到 Request ID:

  1. 验证 Request ID 格式:应为 32 个字符且无连字符
  2. 检查时间范围:脚本自动扩展搜索至最多 90 天
  3. 验证正确地域:尝试 cn-hangzhouap-southeast-1
  4. 检查日志保留期(TTL):默认 180 天,如不同则使用 --ttl 参数

多实例场景

如果同时存在中国大陆和非中国大陆实例,根据查询结果判断:

  • 仅一个地域找到日志 -> 直接使用该地域
  • 两个地域都找到日志 -> 请用户澄清
  • 两个地域都未找到日志 -> 询问用户预期地域,检查防护对象日志开关

注意:遵循与步骤 2 相同的发现命令,然后在所有发现的 SLS project 中查询日志,直到找到 Request ID。

规则操作约束

警告:规则禁用策略

当用户请求禁用规则时:

  1. 先检查当前规则状态——调用 describe-defense-rule 查询规则当前状态。如果规则已处于目标状态(例如已禁用),跳过写操作并告知用户(幂等先检查后操作模式)
  2. 只执行禁用操作modify-defense-rule-status--rule-status 0
  3. 绝不删除规则
  4. 绝不修改规则内容
  5. 执行前必须与用户确认

禁用规则(仅在确认其当前已启用后)

aliyun waf-openapi modify-defense-rule-status \

--region <region-id> \

--instance-id '<instance-id>' \

--rule-id <rule-id> \

--rule-status 0 \

--user-agent "AlibabaCloud-Agent-Skills/alibabacloud-waf-checkresponse-intercept-query/${SESSION_ID}"


详细说明见 [references/rule-operations.md](references/rule-operations.md)。

参考