3. 数据暴露面识别方法:攻击面分析与资产枚举

说实话,搞云安全这么多年,我最大的一个感受就是——你都不知道自己有什么,那肯定守不住。

很多团队一上来就搞WAF规则、搞渗透测试,结果呢?漏了个测试Bucket在外面裸奔,数据早被人拖走了。所以我个人的习惯是,先摸家底,再谈防御。这一章我们就聊聊:怎么系统地识别你的数据暴露面。

3.1 攻击面分析:你到底暴露了什么?

先讲个真事。有一次我去帮一家金融科技公司做审计,他们的安全负责人信誓旦旦说“我们所有资产都在VPC里,很安全”。结果我用一个简单的子域名枚举,找到了一个dev-billing-db.internal-company.com的DNS记录——解析到一个公网IP,端口5432还开着。你猜怎么着?那是他们生产环境的PostgreSQL,里面有几百万条交易记录。

为什么会这样?因为他们只盯着主域名和主账号,忘了开发人员随手搭的测试环境和影子IT。这就是典型的攻击面盲区。

3.1.1 攻击面的四个维度

我个人习惯把云上的攻击面分成四个维度来排查,这样不容易漏:

维度 典型暴露点 我的排查重点
网络面 公网IP、开放端口、负载均衡器 NACL、安全组是否过度放行;是不是所有服务都必须挂公网ELB
应用面 API端点、Web控制台、管理接口 有没有未认证的API?管理后台是否暴露在公网?
身份面 IAM角色、AK/SK、临时凭证 AK是不是硬编码在代码里?角色信任策略是不是“*”?
数据面 公开的S3桶、未加密的数据库、配置错误的KMS 对象存储的ACL是不是公开读写?RDS是不是开启了Public Access?

核心要点:攻击面不是静态的。你上线一个新服务、开一个安全组规则,攻击面就在变。所以我建议至少每周做一次自动化暴露面扫描。

3.2 资产枚举:把家底翻个底朝天

攻击面分析是“找漏洞”,资产枚举是“找资产”。没有后者,前者就是瞎蒙。

你想想看,如果你的一个离职员工手上还有AK/SK,这个AK能列出所有的S3桶内容。你光盯着CVE打补丁有什么用?那个AK本身就是个巨大暴露面。

资产枚举,说白了就是回答三个问题:

  1. 有什么?——所有云资源、子域名、API、账号
  2. 在哪?——属于哪个Region、VPC、项目组
  3. 谁在用?——关联的IAM身份、服务角色、外部集成

3.2.1 动手:枚举云上资产

我用AWS举个例。假设你有个账号,想看看所有的存储服务暴露情况。手工点控制台太慢,我建议走CLI:

# 1. 先枚举所有S3桶,看看哪个是Public的
aws s3api list-buckets --query "Buckets[].Name"

# 2. 查看某个桶的公开状态
aws s3api get-bucket-acl --bucket your-bucket-name

# 3. 枚举所有RDS实例,抓重点:PubliclyAccessible字段
aws rds describe-db-instances \
    --query "DBInstances[?PubliclyAccessible==`true`].[DBInstanceIdentifier,Endpoint.Address]"

# 4. 看看安全组开了哪些公网端口
aws ec2 describe-security-groups \
    --filters Name=ip-permission.cidr,Values="0.0.0.0/0" \
    --query "SecurityGroups[].[GroupName,IpPermissions[].FromPort]"

我之前有个客户,用这套命令一跑,发现三个RDS实例的PubliclyAccessible是true。一问,全是开发人员为了“本地调试方便”开的。嗯,还好发现的早。

3.2.2 别忘了“影子资产”

避坑指南:我曾经在一个项目里,翻遍了主账号的所有资源清单,都觉得没问题。结果后来通过DNS枚举发现一个 log-collector.staging.internal 解析到了公网IP——那是某位工程师用一个废弃的个人账号创建的EC2,上面跑着一个没认证的Logstash,里面全是用户行为日志。

这种资产,你从主账号永远查不到。它叫影子资产。

怎么抓影子资产?我给你三个方向:

  • DNS枚举:用工具(比如Amass、Subfinder)枚举所有关联域名和子域名,找到那些没在资源清单里的记录。
  • 凭证泄漏扫描:在GitHub、Pastebin上搜你的域名或关键桶名,看看有没有暴露的AK/SK或内网地址。
  • 云API调用日志:在CloudTrail里找SourceIP为公网IP、但UserAgent明显是SDK/CLI的调用——这些往往是没被管住的“野生”服务。

3.3 一张图看懂:暴露面识别流程

上面说了那么多,我把整个逻辑画成一张流程框架图。这张图是我自己梳理的,每次做新项目审计都按照这个节奏走,基本不会漏。

数据暴露面识别流程框架 ① 资产枚举 计算/存储/网络/数据库 ② 接口分析 API/SDK/控制台/CLI ③ 标识暴露点 公网/未认证/弱权限 ④ 数据敏感度评级 PII/财务/商业秘密/公开 ⑤ 攻击路径模拟 一条AK到核心数据库的链路 ⑥ 风险可视化与报告 攻击路径图 + 修复优先级 💡 关键提醒 资产枚举是基础中的基础——你连自己有什么都不知道,就谈不上“保护”。

3.4 工具链推荐:自动化你的暴露面扫描

手工枚举一次还行,每周都这么搞肯定不现实。所以一定要用工具,我把自己常用的几个列出来:

工具 定位 我拿它做什么
CloudSploit / ScoutSuite 云配置审计 一键扫描S3公开桶、安全组过度放行、未加密存储
Amass / Subfinder 子域名枚举 找到那些不在资源清单里的“野生”子域名和公网服务
Nmap / Masscan 端口扫描 验证云上公网IP到底开了哪些端口,是不是应该关
Prowler CIS基线检查 对照最佳实践,看看你的IAM、日志、监控有没有缺漏
Custom脚本(Python + Boto3) 定制化枚举 把上面几步串起来,每天跑一遍,出报告发邮件

一个小技巧:你可以在CloudTrail里建一个异常暴露面告警。比如,当有人创建了一个新的安全组并且规则包含 0.0.0.0/0 时,立刻通过SNS通知你。这样你就不用等到周报才发现问题。

3.5 总结:思路比工具重要

到了这一步,你应该能回答:我的数据到底暴露在哪?

最后说一句掏心窝子的话——工具再好,如果不清楚自己有什么资产,不搞清楚数据的流转路径,那就是在瞎忙。我见过很多团队买了几十万美元的CASB、CSPM,结果连自己有多少个公网ELB都数不清楚。你说这钱花得冤不冤?

所以,从今天开始,别急着重金上工具。先把你现有的账号、资源、API、DNS记录翻个底朝天。把暴露面摸清楚,你的钱才能花在刀刃上。