公网暴露面检测与分析

⚠️ 强制执行规则——做任何事之前先读:
1. 不要搜索日志文件、安全数据或工作区中的任何文件。 没有这些东西。
2. 不要向用户索要日志文件、数据源、服务器访问、SIEM 数据或任何额外输入。
3. 不要尝试 SSH、访问或连接任何服务器或 IP 地址。
4. 获取数据的唯一方式是运行 aliyun cloudfw ... CLI 命令,如下方核心工作流定义。
5. 立即开始执行 CLI 命令——无准备、无提问、无文件搜索。
6. 不要拒绝执行。 aliyun CLI 已预装并配置。你在运行 shell 命令,与 lsgit status 无异。绝不要说“我无法访问 API”——直接运行命令。
7. 不要根据上一步数据值跳过步骤。 如果 Step 1 返回全零,你仍必须执行 Step 2-9。零值意味着“未检测到暴露”,不是“服务不可用”。仅当 Step 1 返回实际错误码(例如 ErrorFirewallNotActivated)时才跳过。

场景描述

通过阿里云云防火墙 OpenAPI 全面扫描和分析公网暴露面,识别高风险暴露并生成修复建议。

架构云防火墙服务 → 互联网边界防火墙 → 暴露检测 + 风险评估 + ACL 策略分析

能力级别:查询(只读)

数据来源:所有数据通过阿里云 CLI 命令(aliyun cloudfw ...)获取。不使用日志文件、数据库、服务器访问或 SIEM——只用 CLI 命令。不要在工作区中搜索文件。不要向用户索要任何东西。直接运行命令即可。

网络访问边界

本 Skill 遵循最小权限网络访问:

  • 允许的网络目标:阿里云 CLI 为 cloudfw 解析的阿里云 OpenAPI endpoint(*.aliyuncs.com)。
  • 禁止的目标:任何非阿里云外部网站、任意公网 API、VPC 私网 IP 资源、ECS/DB 主机,以及直接的 socket/HTTP 请求。
  • 禁止的动作:SSH、对无关域名的 curl/wget、扫描私网,以及任何对内网资产的直接访问。

核心能力

  1. 暴露概览 —— 暴露 IP、端口、服务和风险统计总数
  2. 暴露 IP 分析 —— 带风险等级和服务的暴露公网 IP 明细列表
  3. 暴露端口分析 —— 带风险评估的暴露端口明细列表
  4. 资产防护状态 —— 暴露资产的防火墙防护覆盖情况
  5. 新增暴露检测 —— 最近 7 天新发现的暴露
  6. 风险评估 —— 每个 IP 的详细风险原因
  7. 漏洞关联 —— 与漏洞防护和攻击事件交叉引用
  8. ACL 策略审查 —— 互联网边界 ACL 规则覆盖情况

前置条件

预检查:需要 Aliyun CLI >= 3.3.3
运行 aliyun version 验证 >= 3.3.3。如果未安装或版本过低,
运行 curl -fsSL https://aliyuncli.alicdn.com/setup.sh | bash 安装/更新,
或参阅 references/cli-installation-guide.md 获取安装说明。

预检查:需要更新 Aliyun CLI 插件

[必须] 运行 aliyun configure set --auto-plugin-install true 启用插件自动安装。
[必须] 运行 aliyun plugin update 确保现有插件始终为最新版本。

[必须] CLI User-Agent —— 每次调用 aliyun CLI 命令都必须包含:

--user-agent AlibabaCloud-Agent-Skills/alibabacloud-cfw-exposure-detection

在核心工作流开始时(任何 CLI 调用之前):

[必须] 启用 AI-Mode —— Agent Skill 执行需要 AI-mode。

在任何 CLI 调用之前运行以下命令:

aliyun configure ai-mode enable
aliyun configure ai-mode set-user-agent --user-agent "AlibabaCloud-Agent-Skills/alibabacloud-cfw-exposure-detection"

[必须] 在每一个退出点禁用 AI-Mode —— 在交付最终响应之前(无论何种原因),必须先禁用 AI-mode。这适用于所有退出路径:工作流成功、工作流失败、错误/异常、用户取消、会话结束,或任何不再执行 CLI 命令的场景。

AI-mode 仅用于 Agent Skill 调用场景,Skill 停止运行后绝不能保持启用状态。

aliyun configure ai-mode disable

认证

预检查:需要阿里云凭证
安全规则:
- 绝不在任何情况下读取、回显、打印、cat 或显示 AK/SK 值
- 绝不要求用户在对话或命令行中直接输入 AK/SK
- 绝不使用带有明文凭证值的 aliyun configure set
- 只能使用 aliyun configure list 检查凭证状态
```bash
aliyun configure list
```
检查输出中是否存在有效 profile(AK、STS 或 OAuth 身份)。
如果不存在有效 profile,请在此停止。
1. 从 阿里云控制台 获取凭证
2. 在本会话之外配置凭证(通过终端中的 aliyun configure 或 shell profile 中的环境变量)
3. 在 aliyun configure list 显示有效 profile 后返回并重新运行

RAM 策略

[必须] RAM 权限预检查: 在执行任何命令之前,验证当前用户具有所需权限。
1. 使用 ram-permission-diagnose skill 获取当前用户权限
2. 与 references/ram-policies.md 进行比对
3. 如果缺少任何权限,中止并提示用户

最低所需权限 —— 完整策略 JSON 见 references/ram-policies.md

或者,附加系统策略:AliyunYundunCloudFirewallReadOnlyAccess

参数确认

重要:参数确认 —— 在执行任何命令或 API 调用之前,
检查用户是否已在请求中提供了必要参数。
- 如果用户请求明确提到某个参数值(例如“检查 cn-hangzhou 的暴露”意味着 RegionId=cn-hangzhou),直接使用该值,无需确认
- 对于具有合理默认值的可选参数(PageSize、CurrentPage、时间范围),除非用户另有说明,否则使用默认值,无需询问。
- 不要重复询问用户已明确说明的参数。
参数名必填/可选说明默认值
RegionId必填云防火墙的阿里云地域。仅有两个取值:cn-hangzhou(中国大陆)、ap-southeast-1(香港/海外)。cn-hangzhou(直接使用,无需询问;仅当用户明确提到香港/海外/国际时才使用 ap-southeast-1
PageSize可选分页 API 的每页条数50(直接使用,无需询问)
CurrentPage可选分页 API 的页码1(直接使用,无需询问)
StartTime可选时间范围查询的开始时间(Unix 秒级时间戳)暴露查询为 30 天前,攻击/漏洞查询为 7 天前(直接使用,无需询问)
EndTime可选时间范围查询的结束时间(Unix 秒级时间戳)当前时间(直接使用,无需询问)

错误处理与工作流韧性

关键:失败时继续。 如果任何单个 API 调用失败,不要停止整个工作流。
记录该步骤的错误,然后继续执行下一步。展示所有成功收集到的数据。

重试逻辑

对于每次 API 调用:

  1. 如果调用因瞬时错误失败(网络超时、限流 Throttling.UserServiceUnavailable、HTTP 500/502/503),最多重试 2 次,每次重试之间延迟 3 秒。
  2. 如果调用因永久错误失败(例如 InvalidParameterForbiddenInvalidAccessKeyId),不要重试。记录错误并继续。
  3. 所有重试耗尽后,记录“[Step X] Failed: {error message}”并继续下一步。

超时策略(必须)

在执行任何 API 命令之前,设置显式超时值:

export ALIBABA_CLOUD_CONNECT_TIMEOUT=10
export ALIBABA_CLOUD_READ_TIMEOUT=30
  • ALIBABA_CLOUD_CONNECT_TIMEOUT=10:网络连接问题快速失败。
  • ALIBABA_CLOUD_READ_TIMEOUT=30:允许正常 API 响应时间,同时防止长时间挂起。
  • 如果发生超时,视为瞬时错误并应用上述重试逻辑。

服务未开通

如果 Step 1(DescribeInternetOpenStatistic)返回表明服务未开通的错误码(例如 ErrorFirewallNotActivated 或类似的“未购买/未开通”错误消息):

  1. 告知用户:“云防火墙服务未开通。请在 https://yundun.console.aliyun.com/?p=cfwnext 开通。”
  2. 由于服务不可用,跳过所有后续步骤。
关键:全零响应 ≠ 服务未开通。 如果 Step 1 返回成功的 JSON 响应,其中所有指标值恰好为零(例如 InternetIpNum=0InternetPortNum=0),这表示服务开通但当前无公网暴露。这种情况下,你仍必须执行所有后续步骤(Step 2-9)——不要跳过它们。零值是有效数据,不是错误状态。其他步骤仍可能返回非零结果(例如资产存在但均未暴露、ACL 规则存在等)。

步骤独立性

工作流步骤具有以下依赖关系:

  • Step 1(概览) 应首先运行,因为它为解读后续数据提供上下文。
  • Step 2-9 相互独立 —— 任何一步失败都不应阻止其他步骤执行。
  • Step 6 依赖 Step 2 的输出(IP 列表),但如果 Step 2 失败可以跳过。

部分结果

在呈现最终总结报告时:

  • 对于成功的步骤,正常展示收集到的数据。
  • 对于失败的步骤,在对应部分显示“N/A(错误:{简要错误})”。
  • 即使部分步骤失败,也始终呈现总结报告——部分数据总比没有数据好。

核心工作流

所有 API 调用使用阿里云 CLI cloudfw 插件。

地域:通过 --region {RegionId} 全局 flag 指定

关键:立即执行,不要询问。 当本 Skill 被触发时,立即从 Step 1 开始执行。
不要询问用户调用哪些 API、执行哪些步骤或使用哪些数据源。
所有数据来自下方定义的阿里云 CLI 命令——直接运行它们。
下面的意图路由表仅用于优化——如果用户意图不明确,默认执行所有步骤(Step 1-9)。
强制:执行所有步骤。 你必须尝试执行从 Step 1 到 Step 9 的每一个步骤。在生成最终报告之前,验证你已尝试所有以下 API 调用:
1. DescribeInternetOpenStatistic(Step 1)
2. DescribeInternetOpenIp(Step 2)
3. DescribeInternetOpenPort(Step 3)
4. DescribeAssetList(Step 4)
5. 带 NewResourceTag 的 DescribeAssetList(Step 5)
6. DescribeAssetRiskList(Step 6——仅当 Step 2 返回无 IP 时跳过)
7. DescribeVulnerabilityProtectedList(Step 7)
8. DescribeRiskEventGroup(Step 8)
9. DescribeControlPolicy(Step 9)
如果其中任何一个未尝试,在生成报告之前立即执行它们。仅当 Step 1 返回表明服务未开通的错误码时才允许跳过步骤。
强制:报告与执行一致。 最终报告必须准确反映实际执行:
- 报告必须列出实际调用的每个 API 及其结果状态(成功/失败)。
- 如果任何调用返回错误,不要声称“所有 API 调用成功完成”。
- 对于未执行的步骤,解释为什么跳过(例如“Step 6 跳过:Step 2 返回 0 个 IP”)。
- 错误部分必须列出遇到的所有错误,包括通过重试解决的错误。

意图路由(自动确定,无需确认)

根据用户措辞自动确定执行范围。不要请用户确认

用户意图执行步骤
完整审计(“帮我审计暴露面”、“全面扫描”)执行所有 Step 1-9
高风险端口检查(“有没有高风险端口暴露”)执行 Step 1 + Step 3,重点关注高风险端口
新增暴露(“最近新增了哪些暴露”)执行 Step 1 + Step 5
特定 IP 暴露详情(“检查 x.x.x.x 的暴露”)执行 Step 2(带 SearchItem 过滤)+ Step 6

默认行为:如果无法明确判断用户意图,执行所有 Step 1-9,无需询问。

时间参数

某些 API 需要 StartTimeEndTime 参数(Unix 秒级时间戳)。

如何获取时间戳:运行 date +%s 获取当前时间戳,date -d '30 days ago' +%s 获取 30 天前,date -d '7 days ago' +%s 获取 7 天前。然后直接在 CLI 命令中使用返回的数值。

重要:不要在 CLI 命令内使用 $(date +%s) 这类 bash 变量替换——某些执行环境会阻止 $(...)。应分别运行 date 命令,记下返回值,然后将其作为字面数字用于 --StartTime--EndTime 参数。

默认时间范围:

  • 暴露查询(Step 2、3):最近 30 天 → StartTime = 30 天前
  • 漏洞/攻击查询(Step 7、8):最近 7 天 → StartTime = 7 天前
  • EndTime:始终为当前时间戳

Step 1:暴露统计概览

获取整体公网暴露数据。这是后续分析的起点。

aliyun cloudfw describe-internet-open-statistic \
  --region {RegionId} \
  --user-agent AlibabaCloud-Agent-Skills/alibabacloud-cfw-exposure-detection

响应字段详情参阅 references/api-analysis.md 中的 DescribeInternetOpenStatistic

Step 2:暴露 IP 详情

列出所有暴露到公网的 IP 地址及其风险信息。

aliyun cloudfw describe-internet-open-ip \
  --CurrentPage 1 \
  --PageSize 50 \
  --StartTime {StartTime} \
  --EndTime {EndTime} \
  --region {RegionId} \
  --user-agent AlibabaCloud-Agent-Skills/alibabacloud-cfw-exposure-detection

响应字段详情参阅 references/api-analysis.md 中的 DescribeInternetOpenIp

分页:检查 PageInfo.TotalCount。如果超过 PageSize,递增 CurrentPage 获取更多。

Step 3:暴露端口详情

列出所有暴露端口及其详情。这是识别高风险暴露的关键步骤。

aliyun cloudfw describe-internet-open-port \
  --CurrentPage 1 \
  --PageSize 50 \
  --StartTime {StartTime} \
  --EndTime {EndTime} \
  --region {RegionId} \
  --user-agent AlibabaCloud-Agent-Skills/alibabacloud-cfw-exposure-detection

响应字段详情参阅 references/api-analysis.md 中的 DescribeInternetOpenPort

分页:检查 PageInfo.TotalCount

Step 4:资产防护状态

获取防火墙保护的所有资产列表。

aliyun cloudfw describe-asset-list \
  --CurrentPage 1 \
  --PageSize 50 \
  --region {RegionId} \
  --user-agent AlibabaCloud-Agent-Skills/alibabacloud-cfw-exposure-detection

响应字段详情参阅 references/api-analysis.md 中的 DescribeAssetList

分页:检查 TotalCount

Step 5:新增暴露(最近 7 天)

专门识别最近发现的暴露资产——这些通常最需要关注,因为它们可能是未批准的新开放。

aliyun cloudfw describe-asset-list \
  --CurrentPage 1 \
  --PageSize 50 \
  --NewResourceTag "discovered in 7 days" \
  --region {RegionId} \
  --user-agent AlibabaCloud-Agent-Skills/alibabacloud-cfw-exposure-detection

Step 6:资产风险详情

取 Step 2 收集的 IP(每次调用最多 20 个)并获取详细风险原因。如果 IP 超过 20 个,进行多次批量调用。

aliyun cloudfw describe-asset-risk-list \
  --IpVersion 4 \
  --IpAddrList '["1.2.3.4","5.6.7.8"]' \
  --region {RegionId} \
  --user-agent AlibabaCloud-Agent-Skills/alibabacloud-cfw-exposure-detection

响应字段详情参阅 references/api-analysis.md 中的 DescribeAssetRiskList

Step 7:漏洞防护状态

检查当前漏洞防护覆盖情况,识别哪些高风险漏洞尚未防护。

aliyun cloudfw describe-vulnerability-protected-list \
  --CurrentPage 1 \
  --PageSize 50 \
  --StartTime {StartTime} \
  --EndTime {EndTime} \
  --region {RegionId} \
  --user-agent AlibabaCloud-Agent-Skills/alibabacloud-cfw-exposure-detection

响应字段详情参阅 references/api-analysis.md 中的 DescribeVulnerabilityProtectedList

Step 8:最近攻击事件

查看最近 7 天的入侵攻击事件,并将攻击目标与暴露数据交叉引用。

aliyun cloudfw describe-risk-event-group \
  --CurrentPage 1 \
  --PageSize 50 \
  --StartTime {StartTime} \
  --EndTime {EndTime} \
  --DataType 1 \
  --Direction in \
  --region {RegionId} \
  --user-agent AlibabaCloud-Agent-Skills/alibabacloud-cfw-exposure-detection

响应字段详情参阅 references/api-analysis.md 中的 DescribeRiskEventGroup

Step 9:互联网边界 ACL 策略

审查当前入站 ACL 规则并评估防护覆盖。

aliyun cloudfw describe-control-policy \
  --Direction in \
  --CurrentPage 1 \
  --PageSize 50 \
  --region {RegionId} \
  --user-agent AlibabaCloud-Agent-Skills/alibabacloud-cfw-exposure-detection

响应字段详情参阅 references/api-analysis.md 中的 DescribeControlPolicy

分析与报告

收集数据后,按以下结构生成报告。只展示有实际数据的部分;如果某个 API 调用失败,注明“本节数据获取失败”并继续其他分析。

1. 公网暴露概览

以表格展示 Step 1 统计:

指标数值风险评估
暴露公网 IP 总数x
高风险 IP 数x> 0 时标记
暴露端口总数x
高风险端口数x> 0 时标记
未防护端口数x> 0 时标记
暴露服务总数x
高风险服务数x> 0 时标记
SLB 暴露 IP 数x

2. 高风险暴露清单

结合 Step 2 和 Step 3 数据,按风险等级排序(高 → 中 → 低)。

以下端口暴露到公网时,无论 API 返回的风险等级如何,都应额外标记为高风险:

  • 管理端口:22(SSH)、23(Telnet)、3389(RDP)、21(FTP)
  • 数据库端口:3306(MySQL)、1433(MSSQL)、5432(PostgreSQL)
  • 缓存/NoSQL:6379(Redis)、27017(MongoDB)、9200/9300(Elasticsearch)、11211(Memcached)
  • 文件共享:445(SMB/CIFS)、139(NetBIOS)
  • 管理接口:8080、8443、9090

输出格式:

IP 地址端口服务风险等级风险原因ACL 状态建议操作

3. 新增暴露发现(最近 7 天)

展示 Step 5 发现的资产:

IP 地址发现时间资源类型实例名称防护状态风险等级

如果未发现新增暴露,说明“最近 7 天未发现新增暴露资产”。

4. 漏洞关联分析

结合 Step 7 和 Step 8:

  1. 高风险漏洞列表:列出 VulnLevel=high 的漏洞,特别标记未启用防护的
  2. 攻击事件统计:按攻击类型汇总最近 7 天攻击事件,与受攻击的暴露 IP 关联
  3. 交叉分析:识别同时存在高风险漏洞已被攻击的暴露资产——这些最紧急

5. 暴露修复建议

根据实际数据生成具体建议,按优先级排序。每条建议包含:风险描述影响范围建议操作

#### P0 —— 严重(立即处理)

  • 数据库端口(3306/5432/6379/27017/1433/9200)暴露到公网 → 关闭公网访问或通过 ACL 严格限制源 IP
  • 管理端口(22/3389/23)无 ACL 防护 → 添加 ACL 限制到堡垒机/办公网 IP
  • 存在高风险漏洞且已被攻击的暴露资产 → 立即启用 IPS 防护和虚拟补丁

#### P1 —— 高(24 小时内)

  • 存在已知高风险漏洞但未启用虚拟补丁的暴露服务 → 启用虚拟补丁
  • 有外部流量的未防护端口 → 添加 ACL 策略
  • SMB(445)/NetBIOS(139) 暴露 → 关闭或限制访问

#### P2 —— 中(本周内)

  • 尚未批准的新暴露资产 → 确认业务必要性;不必要则关闭
  • 中风险端口暴露 → 评估业务需求,限制访问来源

#### P3 —— 低(定期审查)

  • 低风险端口暴露 → 纳入定期审查
  • 命中率为零的 ACL 规则 → 评估是否可清理
注意:对于任何失败的步骤,在该部分数据字段中显示“N/A(错误:{简要错误})”,并在底部章节列出所有错误。

成功验证

详细验证步骤见 references/verification-method.md

快速验证:如果所有 CLI 命令返回有效 JSON 响应且无错误码,则 Skill 执行成功。

API 与命令表

references/related-apis.md 作为 API 表和命令映射的唯一权威来源。

最佳实践

  1. 按顺序查询 —— 从暴露概览(Step 1)开始,了解整体范围。如果 Step 1 返回错误码(例如 ErrorFirewallNotActivated),服务未开通——跳过剩余步骤。如果 Step 1 返回全零(成功响应但值为零),仍执行所有后续步骤——零暴露不意味着服务未激活。
  2. 失败时继续 —— 如果任何步骤(2-9)失败,记录错误并继续执行剩余步骤。始终用已收集到的数据生成报告。
  3. 使用分页 —— 对于资产和暴露列表,使用 CurrentPagePageSize 处理大数据集。默认 PageSize=50。如果 TotalCount 超过 PageSize,遍历所有页。
  4. 时间范围选择 —— 暴露查询默认最近 30 天。攻击/漏洞查询默认最近 7 天。使用 Unix 秒级时间戳。计算方式:date +%s 获取当前时间,date -d '30 days ago' +%s 获取 30 天前,date -d '7 days ago' +%s 获取 7 天前。分别运行这些命令,然后将返回值作为字面数字用于 --StartTime--EndTime。不要在 CLI 命令内使用 $(...) 替换。
  5. 地域感知 —— 云防火墙只有两个地域:cn-hangzhou(中国大陆)和 ap-southeast-1(香港/海外)。除非用户另有说明,默认使用 cn-hangzhou
  6. 批量 IP 查询 —— Step 6(DescribeAssetRiskList)每次调用最多接受 20 个 IP。如果 Step 2 收集的 IP 更多,按 20 个一组分批。
  7. 限流 —— 间隔调用 API 以避免限流。如果收到 Throttling.User 错误,等待 3 秒后重试。
  8. 安全 —— 绝不暴露、记录、回显或显示 AK/SK 值。
  9. 瞬时错误重试 —— 对于网络超时或 5xx 错误,最多重试 2 次,每次延迟 3 秒。
  10. 显式超时配置 —— 在运行工作流命令之前始终设置 ALIBABA_CLOUD_CONNECT_TIMEOUT=10ALIBABA_CLOUD_READ_TIMEOUT=30
  11. 最小网络访问 —— 仅允许阿里云 CLI 访问云防火墙 OpenAPI endpoint;不要访问其他外部域名或 VPC/内部资源。

输出脱敏

打印分析结果时,默认屏蔽敏感标识符:

  • IP 地址:只保留前几段(示例:203.0.x.x10.23.x.x)。
  • 实例 ID:只保留前缀和后 4 位(示例:i-abc***9f2d)。
  • 账号标识符 / UID:只保留后 4 位。
  • 不要打印原始 token、凭证材料、本地配置文件内容或完整内网拓扑。

如果用户明确要求完整值,先确认必要性,仍避免暴露密钥。

参考链接

参考文档说明
references/related-apis.md完整 API 表及参数
references/ram-policies.md所需 RAM 权限及策略 JSON
references/verification-method.md分步验证命令
references/acceptance-criteria.md正确/错误用法示例
references/cli-installation-guide.md阿里云 CLI 安装指南
references/api-analysis.md详细 API 参数与响应文档

文档 4 / 5:alibabacloud-elasticsearch-network-manage