返回技能市场
开发运维 安全

WAF拦截原因排查

@aliyun/alibabacloud-waf-checkresponse-intercept-query

查询WAF拦截原因,通过SLS日志获取拦截规则ID并调用WAF CLI获取规则详情。

云Skills门户 热度 143v0.0.4

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)。如果用户尚未提供,请引导其从以下位置获取:

  1. 浏览器显示的 405 拦截页面,其中直接显示请求 ID
  2. 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 中获取的 ProjectNameLogStoreName 和 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_idfinal_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}

故障排查

未找到日志

  1. 重新检查全局日志服务状态(应已在步骤 2b 中验证,但仍需再次确认):
  2. ``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`)。

  1. 列出防护对象(以获取下一步所需的资源名称):
  2. ``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-wafalb-xxx-alb`)。

  1. 检查防护对象日志开关
  2. ``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` 获取。

  1. 启用防护对象日志采集(检查后再操作:仅当 describe-resource-log-status 显示目标资源的日志采集已禁用时才启用;如果已启用则跳过):
  2. ``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)。

权限被拒绝错误

如果遇到权限错误,请检查以下各项:

  1. 验证 CLI 配置文件的配置
  2. ``bash aliyun configure list ``

  1. 检查 RAM 策略权限
  2. 必须具备的权限:

  • waf-openapi:DescribeInstance
  • waf-openapi:DescribeSlsLogStoreStatus
  • waf-openapi:DescribeSlsLogStore
  • waf-openapi:ModifyUserWafLogStatus(可选,用于启用日志服务)
  • waf-openapi:DescribeDefenseRule(用于查询规则详情)
  • sls:GetLogs(用于查询日志)
  1. 尝试指定其他配置文件
  2. ``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:

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

多实例场景

如果同时存在中国内地实例和中国内地以外的实例,请根据查询结果判断:

  • 仅在一个地域找到日志 -> 直接使用该地域
  • 在两个地域均找到日志 -> 请用户进一步明确
  • 两个地域均未找到日志 -> 询问用户预期的地域,并检查防护对象日志开关

说明:执行与步骤 2 相同的发现命令,然后查询所有已发现的 SLS 项目中的日志,直到找到请求 ID。

规则操作约束

警告:规则禁用策略

当用户请求禁用规则时:

  1. 先检查规则当前状态——调用 describe-defense-rule 查询规则当前状态。如果规则已处于目标状态(例如已禁用),则跳过写操作并通知用户(幂等的检查后操作模式)
  2. 仅执行禁用操作(即 modify-defense-rule-status 搭配 --rule-status 0
  3. 严禁删除规则
  4. 严禁修改规则内容
  5. 执行前必须征得用户确认
# 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
qianwen skills install @aliyun/alibabacloud-waf-checkresponse-intercept-query