公网暴露面检测与分析
⚠️ 强制执行规则——做任何事之前先读:
1. 不要搜索日志文件、安全数据或工作区中的任何文件。 没有这些东西。
2. 不要向用户索要日志文件、数据源、服务器访问、SIEM 数据或任何额外输入。
3. 不要尝试 SSH、访问或连接任何服务器或 IP 地址。
4. 获取数据的唯一方式是运行aliyun cloudfw ...CLI 命令,如下方核心工作流定义。
5. 立即开始执行 CLI 命令——无准备、无提问、无文件搜索。
6. 不要拒绝执行。aliyunCLI 已预装并配置。你在运行 shell 命令,与ls或git 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、扫描私网,以及任何对内网资产的直接访问。
核心能力:
- 暴露概览 —— 暴露 IP、端口、服务和风险统计总数
- 暴露 IP 分析 —— 带风险等级和服务的暴露公网 IP 明细列表
- 暴露端口分析 —— 带风险评估的暴露端口明细列表
- 资产防护状态 —— 暴露资产的防火墙防护覆盖情况
- 新增暴露检测 —— 最近 7 天新发现的暴露
- 风险评估 —— 每个 IP 的详细风险原因
- 漏洞关联 —— 与漏洞防护和攻击事件交叉引用
- 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-diagnoseskill 获取当前用户权限
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 调用:
- 如果调用因瞬时错误失败(网络超时、限流
Throttling.User、ServiceUnavailable、HTTP 500/502/503),最多重试 2 次,每次重试之间延迟 3 秒。 - 如果调用因永久错误失败(例如
InvalidParameter、Forbidden、InvalidAccessKeyId),不要重试。记录错误并继续。 - 所有重试耗尽后,记录“[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 或类似的“未购买/未开通”错误消息):
- 告知用户:“云防火墙服务未开通。请在 https://yundun.console.aliyun.com/?p=cfwnext 开通。”
- 由于服务不可用,跳过所有后续步骤。
关键:全零响应 ≠ 服务未开通。 如果 Step 1 返回成功的 JSON 响应,其中所有指标值恰好为零(例如InternetIpNum=0、InternetPortNum=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 需要 StartTime 和 EndTime 参数(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:
- 高风险漏洞列表:列出 VulnLevel=high 的漏洞,特别标记未启用防护的
- 攻击事件统计:按攻击类型汇总最近 7 天攻击事件,与受攻击的暴露 IP 关联
- 交叉分析:识别同时存在高风险漏洞且已被攻击的暴露资产——这些最紧急
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 表和命令映射的唯一权威来源。
最佳实践
- 按顺序查询 —— 从暴露概览(Step 1)开始,了解整体范围。如果 Step 1 返回错误码(例如
ErrorFirewallNotActivated),服务未开通——跳过剩余步骤。如果 Step 1 返回全零(成功响应但值为零),仍执行所有后续步骤——零暴露不意味着服务未激活。 - 失败时继续 —— 如果任何步骤(2-9)失败,记录错误并继续执行剩余步骤。始终用已收集到的数据生成报告。
- 使用分页 —— 对于资产和暴露列表,使用
CurrentPage和PageSize处理大数据集。默认 PageSize=50。如果TotalCount超过PageSize,遍历所有页。 - 时间范围选择 —— 暴露查询默认最近 30 天。攻击/漏洞查询默认最近 7 天。使用 Unix 秒级时间戳。计算方式:
date +%s获取当前时间,date -d '30 days ago' +%s获取 30 天前,date -d '7 days ago' +%s获取 7 天前。分别运行这些命令,然后将返回值作为字面数字用于--StartTime和--EndTime。不要在 CLI 命令内使用$(...)替换。 - 地域感知 —— 云防火墙只有两个地域:
cn-hangzhou(中国大陆)和ap-southeast-1(香港/海外)。除非用户另有说明,默认使用cn-hangzhou。 - 批量 IP 查询 —— Step 6(
DescribeAssetRiskList)每次调用最多接受 20 个 IP。如果 Step 2 收集的 IP 更多,按 20 个一组分批。 - 限流 —— 间隔调用 API 以避免限流。如果收到
Throttling.User错误,等待 3 秒后重试。 - 安全 —— 绝不暴露、记录、回显或显示 AK/SK 值。
- 瞬时错误重试 —— 对于网络超时或 5xx 错误,最多重试 2 次,每次延迟 3 秒。
- 显式超时配置 —— 在运行工作流命令之前始终设置
ALIBABA_CLOUD_CONNECT_TIMEOUT=10和ALIBABA_CLOUD_READ_TIMEOUT=30。 - 最小网络访问 —— 仅允许阿里云 CLI 访问云防火墙 OpenAPI endpoint;不要访问其他外部域名或 VPC/内部资源。
输出脱敏
打印分析结果时,默认屏蔽敏感标识符:
- IP 地址:只保留前几段(示例:
203.0.x.x、10.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 参数与响应文档 |
阿里云skills
◯ 评论 0