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)。如果用户未提供,引导他们从以下位置获取:
- 浏览器中显示的 405 拦截页,直接显示 Request ID
- 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}
故障排查
未找到日志
- 重新检查全局日志服务状态(步骤 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)。
- 列出防护对象(为下一步获取资源名):
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-waf、alb-xxx-alb)。
- 检查防护对象日志开关:
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 获得的资源名的逗号分隔列表。
- 启用防护对象日志采集(先检查后操作:仅当
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。
权限被拒错误
如果遇到权限错误,检查以下内容:
- 验证 CLI profile 配置:
aliyun configure list
- 检查 RAM 策略权限:
所需权限:
waf-openapi:DescribeInstancewaf-openapi:DescribeSlsLogStoreStatuswaf-openapi:DescribeSlsLogStorewaf-openapi:ModifyUserWafLogStatus(可选,用于启用日志服务)waf-openapi:DescribeDefenseRule(用于规则详情)sls:GetLogs(用于日志查询)
- 尝试指定其他 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:
- 验证 Request ID 格式:应为 32 个字符且无连字符
- 检查时间范围:脚本自动扩展搜索至最多 90 天
- 验证正确地域:尝试
cn-hangzhou和ap-southeast-1 - 检查日志保留期(TTL):默认 180 天,如不同则使用
--ttl参数
多实例场景
如果同时存在中国大陆和非中国大陆实例,根据查询结果判断:
- 仅一个地域找到日志 -> 直接使用该地域
- 两个地域都找到日志 -> 请用户澄清
- 两个地域都未找到日志 -> 询问用户预期地域,检查防护对象日志开关
注意:遵循与步骤 2 相同的发现命令,然后在所有发现的 SLS project 中查询日志,直到找到 Request ID。
规则操作约束
警告:规则禁用策略
当用户请求禁用规则时:
- 先检查当前规则状态——调用
describe-defense-rule查询规则当前状态。如果规则已处于目标状态(例如已禁用),跳过写操作并告知用户(幂等先检查后操作模式) - 只执行禁用操作(
modify-defense-rule-status带--rule-status 0) - 绝不删除规则
- 绝不修改规则内容
- 执行前必须与用户确认
禁用规则(仅在确认其当前已启用后)
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)。
阿里云skills
◯ 评论 0