WAF CheckResponse 拦截查询
前提条件
预检查:必须使用阿里云 CLI >= 3.3.3
运行 aliyun version,验证版本是否 >= 3.3.3。如果尚未安装或版本过低,
请参见 https://help.aliyun.com/document_detail/139508.html 中的安装说明。
预检查:必须更新阿里云 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
示例:
# Generate session-id once at the beginning
SESSION_ID=$(python3 -c "import uuid; print(uuid.uuid4().hex)")
# Use in every CLI command
aliyun waf-openapi describe-instance --region cn-hangzhou \
--user-agent "AlibabaCloud-Agent-Skills/alibabacloud-waf-checkresponse-intercept-query/${SESSION_ID}"
执行前,必须向用户收集以下信息:
| 参数 | 说明 | 是否必填 | |-----------|-------------|----------| | 请求 ID | 从 WAF 阻止(拦截)响应的 HTML 正文中获取的 traceid,或浏览器所显示 405 拦截页面上的请求 ID | 是 |
可选:WAF 实例 ID、SLS 项目名称、SLS 日志库名称(如未提供,将自动发现)
说明:
- 请求 ID(traceid)从 WAF 阻止响应的 HTML 正文或浏览器显示的 405 拦截页面中获取
- 使用阿里云默认凭据链进行身份验证(ECS RAM 角色、~/.alibabacloud/config 等)
地域信息
| RegionId 值 | 地域 | 说明 | |----------------|--------|-------------| | cn-hangzhou | 中国内地 | 中国内地的 WAF 实例 | | ap-southeast-1 | 中国内地以外 | 海外以及中国香港、中国澳门和中国台湾地区的 WAF 实例 |
查询工作流
步骤 1:信息收集
向用户确认请求 ID(traceid)。如果用户尚未提供,请引导其从以下位置获取:
- 浏览器显示的 405 拦截页面,其中直接显示请求 ID
- WAF 阻止(拦截)响应的 HTML 正文,其中包含 traceid
步骤 2:自动发现 WAF 实例并验证日志服务
如果用户尚未提供 WAF 实例 ID 和 SLS 配置,请执行自动发现:
步骤 2a:发现 WAF 实例
# Query WAF instances in both regions in parallel
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/已启用),请跳过启用操作并直接进入步骤 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 日志项目和日志库信息:
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 项目名称 | | LogStoreName | 用于存储 WAF 日志的 SLS 日志库名称 | | Ttl | 日志保留期限(单位:天) |
跨地域说明:SLS 日志存储地域可能与 WAF 实例地域不同(例如,WAF 位于 ap-southeast-1,但 SLS 日志存储在 ap-southeast-5)。在步骤 3 中查询 SLS 时,始终使用 SLS 项目所在的地域,而不是 WAF 实例地域。
说明:指定--region后,describe-instance命令无需使用--biz-region-id。--region标志决定端点路由。仅当需要独立于端点覆盖业务地域时,才传入--biz-region-id。
步骤 3:查询 SLS 日志
使用从步骤 2 中获取的 ProjectName、LogStoreName 和 SLS 地域查询拦截日志(优先使用 Python 脚本):
# Query using script (recommended, supports automatic time range expansion)
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 |
# Step 4a: Find the template containing the rule (use --defense-scene to filter)
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}"
# Step 4b: Query rule details (describe-defense-rule does NOT use --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 Block Analysis Report
### Request Information
- Request ID: {request_id}
- Block Time: {time}
- Client IP: {real_client_ip (masked, e.g. 192.***.***.***)}
- Request URL: {host}{request_path}?{masked_query_params}
### Block Details
- Rule ID: {rule_id}
- Rule Name: {rule_name}
- Action: {action}
### Recommendations
{Provide recommendations based on rule type, refer to references/common-block-reasons.md}
故障排查
未找到日志
- 重新检查全局日志服务状态(应已在步骤 2b 中验证,但仍需再次确认):
``bash 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`)。
- 列出防护对象(以获取下一步所需的资源名称):
``bash 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`)。
- 检查防护对象日志开关:
``bash 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显示目标资源的日志采集已禁用时才启用;如果已启用则跳过):
``bash 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](references/common-block-reasons.md)。
权限被拒绝错误
如果遇到权限错误,请检查以下各项:
- 验证 CLI 配置文件的配置:
``bash aliyun configure list ``
- 检查 RAM 策略权限:
必须具备的权限:
waf-openapi:DescribeInstancewaf-openapi:DescribeSlsLogStoreStatuswaf-openapi:DescribeSlsLogStorewaf-openapi:ModifyUserWafLogStatus(可选,用于启用日志服务)waf-openapi:DescribeDefenseRule(用于查询规则详情)sls:GetLogs(用于查询日志)
- 尝试指定其他配置文件:
``bash aliyun waf-openapi describe-instance --profile <profile-name> --region <region-id> --user-agent "AlibabaCloud-Agent-Skills/alibabacloud-waf-checkresponse-intercept-query/${SESSION_ID}" ``
未找到请求 ID
如果在日志中找不到请求 ID:
- 验证请求 ID 格式:应为不含连字符的 32 个字符
- 检查时间范围:脚本会自动将搜索范围扩大至最多 90 天
- 验证正确的地域:同时尝试
cn-hangzhou和ap-southeast-1 - 检查日志保留期(TTL):默认值为 180 天,如果不同,请使用
--ttl参数
多实例场景
如果同时存在中国内地实例和中国内地以外的实例,请根据查询结果判断:
- 仅在一个地域找到日志 -> 直接使用该地域
- 在两个地域均找到日志 -> 请用户进一步明确
- 两个地域均未找到日志 -> 询问用户预期的地域,并检查防护对象日志开关
说明:执行与步骤 2 相同的发现命令,然后查询所有已发现的 SLS 项目中的日志,直到找到请求 ID。
规则操作约束
警告:规则禁用策略
当用户请求禁用规则时:
- 先检查规则当前状态——调用
describe-defense-rule查询规则当前状态。如果规则已处于目标状态(例如已禁用),则跳过写操作并通知用户(幂等的检查后操作模式) - 仅执行禁用操作(即
modify-defense-rule-status搭配--rule-status 0) - 严禁删除规则
- 严禁修改规则内容
- 执行前必须征得用户确认
# Disable a rule (only after confirming it is currently enabled)
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)。
参考资料
- [RAM 权限策略要求](references/ram-policies.md)
- [规则配置详情](references/rule-config-details.md)
- [规则操作策略](references/rule-operations.md)
- [常见拦截原因](references/common-block-reasons.md)
- WAF OpenAPI