关于 alibabacloud-waf-checkresponse-intercept-query
此技能通过 Aliyun CLI 查询 Alibaba Cloud WAF 拦截请求的日志和规则详情,并生成分析报告。适用于需要追查拦截原因的运维人员。
主要功能
- 01按 Request ID 查找拦截日志
- 02自动发现 WAF 实例与 SLS 配置
- 03检查并按同意启用日志服务
- 04查询命中规则详情并整理报告
适用场景
- 01排查浏览器 405 拦截页面
- 02根据 traceid 定位 WAF 拦截记录
- 03查看触发规则及其配置
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ aliyun/ alibabacloud-aiops-skills --skill alibabacloud-waf-checkresponse-intercept-query安装后在 Claude Code 中输入/alibabacloud-waf-checkresponse-intercept-query确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
references/common-block-reasons.mdram-policies.mdrule-config-details.mdrule-operations.mdscripts/get_waf_logs.py详细介绍
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 生成规则:
- 在每个技能会话开始时生成一次(首次运行 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 Logstore 名称(如果未提供,将自动发现)
注意:
- 请求 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}"
限制:此技能仅支持启用日志服务(
--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 实例地域。
注意:指定
--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 中验证,但请再次确认):
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 配置文件配置:
aliyun configure list -
检查 RAM 策略权限: 所需权限:
waf-openapi:DescribeInstancewaf-openapi:DescribeSlsLogStoreStatuswaf-openapi:DescribeSlsLogStorewaf-openapi:ModifyUserWafLogStatus(可选,用于启用日志服务)waf-openapi:DescribeDefenseRule(用于查询规则详情)sls:GetLogs(用于查询日志)
-
尝试指定其他配置文件:
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查询规则的当前状态。如果规则已经处于目标状态(例如,已禁用),则跳过写入操作并告知用户(先检查再操作的幂等模式) - 仅执行禁用操作(使用
--rule-status 0调用modify-defense-rule-status) - 绝不删除规则
- 绝不修改规则内容
- 执行前必须获得用户确认
# 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。