mcpField
A
alibabacloud-waf-checkresponse-intercept-query

alibabacloud-waf-checkresponse-intercept-query

github.com/aliyun安全281167 次安装1 天前更新
代码仓库

关于 alibabacloud-waf-checkresponse-intercept-query

此技能通过 Aliyun CLI 查询 Alibaba Cloud WAF 拦截请求的日志和规则详情,并生成分析报告。适用于需要追查拦截原因的运维人员。

主要功能

  1. 01按 Request ID 查找拦截日志
  2. 02自动发现 WAF 实例与 SLS 配置
  3. 03检查并按同意启用日志服务
  4. 04查询命中规则详情并整理报告

适用场景

  1. 01排查浏览器 405 拦截页面
  2. 02根据 traceid 定位 WAF 拦截记录
  3. 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.md
ram-policies.md
rule-config-details.md
rule-operations.md
scripts/
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)。如果用户尚未提供,请引导其通过以下方式获取:

  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}"

限制:此技能仅支持启用日志服务(--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 名称
LogStoreNameWAF 日志的 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_pluginDefenseScene
customrulecustom_acl 或 custom_cc
wafwaf_group
scanner_behaviorantiscan
dlpdlp
tamperprooftamperproof
# 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 中验证,但请再次确认):

    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)。

  2. 列出防护对象(获取下一步所需的资源名称):

    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)。

  3. 检查防护对象日志开关:

    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。

  4. 启用防护对象日志采集(先检查再执行:仅当 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 配置文件配置:

    aliyun configure list
    
  2. 检查 RAM 策略权限: 所需权限:

    • waf-openapi:DescribeInstance
    • waf-openapi:DescribeSlsLogStoreStatus
    • waf-openapi:DescribeSlsLogStore
    • waf-openapi:ModifyUserWafLogStatus(可选,用于启用日志服务)
    • waf-openapi:DescribeDefenseRule(用于查询规则详情)
    • sls:GetLogs(用于查询日志)
  3. 尝试指定其他配置文件:

    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-hangzhou 和 ap-southeast-1
  4. 检查日志保留时间(TTL):默认值为 180 天,如果不同,请使用 --ttl 参数
多实例场景

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

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

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

规则操作约束

警告:禁用规则政策

当用户请求禁用规则时:

  1. 先检查规则的当前状态——调用 describe-defense-rule 查询规则的当前状态。如果规则已经处于目标状态(例如,已禁用),则跳过写入操作并告知用户(先检查再操作的幂等模式)
  2. 仅执行禁用操作(使用 --rule-status 0 调用 modify-defense-rule-status)
  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。

参考资料

评论

支持 Markdown