首页 / 资讯中心 / 文章详情

攻击面管理实战:基于开源ringxin的持续资产发现与风险监测

攻击面管理实战:基于开源ringxin的持续资产发现与风险监测 ★ FEATURED ARTICLE
1. 为什么传统漏扫解决不了资产暴露问题前阵子接了个活儿要把一个模拟项目的互联网暴露面从头到尾理一遍。接需求的时候我还觉得这事不难翻翻资产清单、跑几轮端口扫描、把高危漏洞补掉不就完事了吗可真做起来才发现团队手里的资产清单和公网上实际在跑的资产对不上号的不是一星半点。有人在云上开了台测试机项目结束忘了销毁有人给内部系统绑了个新域名安全团队从头到尾不知情还有一堆临时接口挂在老服务器上交接文档早就找不到了。我越来越觉得传统先有清单、再扫漏洞的模式在这里天然缺了一环——漏扫的前提是资产底数得准可我们偏偏连自己有多少东西暴露在公网上都说不清楚。攻击面管理ASM这几年火起来核心其实就一句话持续发现组织暴露在互联网上的资产持续监测这些资产的风险变化。它和传统漏洞扫描最大的区别是把资产发现提升到了和漏洞修复同等重要的位置而不是默认资产清单已经完整。开源项目 ringxin 就是顺着这套思路设计的一个可落地方案。我把它完整部署起来在几个模拟项目上验证了一圈这篇就把从原理到落地、再到踩坑排查的完整过程写清楚给准备做同样事情的人一个参考。1.1 攻击者只盯最松的那颗螺丝为什么攻击面管理会变成让人头疼的问题核心原因是资产增长速度远快于安全团队的维护速度。现在的业务系统已经不是几年开发一次、集中部署在机房里的状态了开发人员在云上点几下就能开一台服务器DevOps 流水线会把新服务自动发布出去第三方集成要开的接口越来越多项目组自己起个域名、挂个对象存储就能上线业务。这些场景里真正被安全团队登记在册的资产可能只有一半另一半就是常说的影子IT。攻击者的视角恰恰相反他们不需要突破组织的核心系统只需要找到一个忘了销毁的测试机、一个带着默认口令的管理后台、一个没加鉴权的API接口就足够作为突破口了。更现实的是这类边缘资产本身就在被自动化工具全天候扫描。一个新增的云服务器如果装上了常见的开源服务从暴露到被尝试爆破的时间窗口往往以小时计传统的每个季度做一次巡检在这个时间尺度下几乎等于没有防护。所以ASM强调的不是扫得更勤而是把资产发现、资产测绘、风险监测做成持续运行的机制。就好比你要守一栋楼传统的漏扫是定期拿着图纸去检查门窗而攻击面管理是先搞清楚这栋楼到底有几个门、哪扇窗是什么时候开的、是不是被人偷偷加了一道门。不知道答案之前谈加固效率都是空话。1.2 从已知资产找漏洞到未知资产被发现传统漏洞扫描的工作模式是准备好资产清单在清单上逐个跑扫描器发现漏洞、验证漏洞、推动修复。这个模式并非没有用但它有一个隐性的前提假设——清单是完整的。做久了安全工作的人基本都明白这个假设在今天的网络环境里越来越不成立。ASM把整个流程倒过来拆成五步发现、归一化、定级、监测、治理。第一步不是扫已知资产而是找未知资产后面四步都是在回答没被登记的东西到底危不危险、怎么处理。这也是我一开始接触 ringxin 时最感兴趣的地方。攻击面管理是个非常吃数据积累的领域开源项目能不能扛住真实环境的考验我心里是打了问号的。实际跑完一圈之后我的结论是真要拿它跟那些深耕多年的商业平台比数据源丰富度确实还有差距但它的价值在于把整个攻击面管理的骨架搭得非常清楚模块与模块之间边界干净完全能作为团队自己的资产测绘底座再按需扩展。这也是我愿意花篇幅写它的原因。2. ringxin 的架构拆解从数据收集到风险评分我先说说 ringxin 的整体结构。直接在浏览器里打开它的控制台你其实看不出来背后的复杂度真正支撑持续发现这个目标的是数据收集层、资产处理层、风险评估层、展示告警层这几层共同配合。每一层解决一个具体问题下面按我实际使用时的理解逐个拆开讲。2.1 主动与被动结合的资产发现层资产发现是整个平台的底座决定了后续所有分析的天花板。如果发现层只能看到一半资产那后面的风险评分做得再精细也都是建立在残缺数据上的。ringxin 在这一层没有押注单一渠道而是把发现方式分成了三类被动发现、主动发现、内部数据同步。三者各有定位缺一个都有覆盖盲区。被动发现基本靠外部公开数据主要来源有这么几类证书透明日志CA 签发的每个证书都会被公开记录可以从一个域名快速摸到关联的兄弟域名历史 DNS 记录和当前解析记录能看到域名指向过的 IP再反查同一 IP 上还有哪些域名第三方网络空间测绘平台的 API直接拿到泛资产测绘结果省去自己大规模扫描的成本再加上搜索引擎收录、代码托管平台上的公开信息偶尔能翻到泄露的配置文件和内部域名。被动数据源的共同特点是隐蔽、不直接触碰目标系统但依赖外部平台的收录节奏。主动发现则是在拿到一批候选资产之后真正去验证它们的状态子域名爆破、端口扫描、服务识别、Web指纹识别、路径探测。被动数据源负责广撒网主动扫描负责精验证两者结合起来资产列表才既有广度又有可信度。除此之外内部数据同步是很多人容易忽略的一环它是把 CMDB、云平台 API、内部 DNS 服务器里的权威数据导入平台。这一步看起来最不起眼但实际上决定了资产底数能不能补齐因为很多内部系统根本不会出现在任何外部数据源里。发现方式数据来源优势短板被动发现证书日志、DNS记录、测绘平台API、搜索引擎隐蔽、不触碰目标能发现关联资产依赖外部更新存在时间滞后主动发现子域名爆破、端口扫描、服务识别、指纹识别实时、可验证会产生扫描记录需要控频率内部同步CMDB、云平台API、内部DNS权威、覆盖内部资产需要协调数据权限维护成本高2.2 资产归一化、去重与指纹识别数据收集上来之后是海量的原始记录一条域名可能解析到多个 IP一个 IP 上可能跑了多个服务同一个服务本身又可能在多个入口出现。如果不做处理控制台上显示的就是一堆散乱记录。这一层要做的事情业内一般叫资产归一化把多个数据源里指向同一实体的记录合并成一个资产对象并保留它们之间的关系。举个例子一台服务器既通过业务域名访问又有直连 IP还在历史解析里出现过三个不同 IP归一化之后应该呈现为一个资产实体加一条链路关系而不是四条独立记录。去重逻辑比想象中复杂最典型的就是 CDN 场景。域名解析到 CDN 节点之后CDN 厂商的 IP 段会出现在解析结果里如果平台不区分就容易把 CDN 节点当成自家资产反复扫描。费流量不算扫出来的服务也基本都是 CDN 厂商的公共能力没有任何资产归属意义。ringxin 的处理方式是把 CDN 节点与源站区分开标记资产归属和扫描目标分别对待这样才不会把控制台变成一堆无效 IP 的大杂烩。指纹识别是 ASM 里容易被低估的一块。它决定了你能不能在不手工访问的情况下判断一个端口背后跑的是什么系统、什么框架、什么版本。ringxin 用的是主流做法取 favicon 的哈希、看 HTTP 响应头、访问几个特征路径、比对 HTML 特征和静态资源路径每个特征给一个匹配权重超过置信度阈值才打上指纹标签。注意只命中单一特征时它不会轻易下结论这种多特征加权的设计比直接拿一个 favicon 哈希定死要可靠得多误报治理那部分我后面会展开说。2.3 风险评估引擎的计分逻辑资产有了、指纹有了下一步是把它们变成安全团队能直接排序的风险分。这里要特别说明风险评估不是简单把漏洞等级加到资产上。同一台机器如果是生产核心和是没人维护的测试机同样一个漏洞带来的影响天差地别。ringxin 的评分框架主要考虑四个维度资产价值、暴露程度、威胁情报、变化趋势。资产价值看资产类型和业务属性生产系统、核心数据库、客户数据接口的权重天然高于测试环境暴露程度看是不是公网可达、开放端口本身危不危险威胁情报包括组件版本有没有匹配到已知漏洞、有没有弱口令特征、有没有敏感信息泄露标签变化趋势则反映新增端口、新增解析、证书异常这些动态信号。综合下来可以用一个简单公式帮助理解风险分 资产价值权重 × (暴露因子 威胁因子 变化因子)。它不必做到科学严谨但一定要稳定、可解释否则运营人员根本没有办法理解为什么某个资产突然就变成了高分。光给分还不够好的平台会附上处置建议。比如该资产属于数据库服务且公网可达建议下线或加白名单该组件版本存在已知漏洞建议升级到对应版本该证书将于 XX 天过期建议尽快续期。把这些动作建议直接挂在资产详情页上比丢一个冷冰冰的数字有用得多也更容易让非安全背景的业务同学明白该干什么。3. 部署与落地从装起来到真正用起来部署本身并不难难点在于怎么把扫描策略和运营节奏调对。这一节我把从零开始部署的路径、最容易忽略的配置细节以及和现有安全流程的衔接方式都捋一遍很多都是实际操作之后才总结出来的。3.1 最小可用部署与分布式扫描ringxin 的部署给了两条路。一种是最小可用部署调度、扫描、存储、Web 控制台全部通过容器编排在一个节点上跑起来适合资产量在千级左右、网络环境也比较简单的场景。绝大多数刚起步的团队从这里开始就够了配置低一些也能跑先把流程走通比什么都重要。我最初就是把平台装在一台普通配置的云主机上资产量在一两千条的时候完全跑得动。另一种是分布式扫描主控和扫描节点分离任务通过消息队列下发到不同的扫描节点。这种部署不只是为了性能更实际的原因是扫描流量如果长期从同一个出口 IP 出去很容易被目标侧或中间网络设备限流甚至临时封禁。把节点分散到不同网络位置既提高了扫描可用性也避免扫描流量和日常业务流量互相抢带宽。我建议从单节点开始确认整个流程稳定了、资产规模起来了再考虑分布式一上来就搭一堆扫描节点反而会让问题排查变得更加复杂。3.2 数据源接入与扫描策略新部署一个平台最大的诱惑是一上来就把所有扫描强度拉满。我劝各位反过来做。第一步先把数据源配置完整然后只开被动发现和低强度的主动扫描跑满一周先把资产基线立起来。第二步再逐步放开全端口扫描、深度指纹识别这些消耗较大的检测项。这样设计的原因在于第一周的基线能告诉你组织资产的正常水位后面扫描策略放大之后对比基线可以很快发现异常如果一开始就拉满强度第一周就会被各种误报和告警淹没而且根本看不出哪些是新增哪些是一直存在。扫描频率我的经验是分档处理全部资产的全端口扫描一周一次就够了这个量级本身不小关键端口和服务存活检测可以做到每天证书有效期、子域名变化这种等不起的检测必须每天跑Web 指纹和页面变化则用周级对比看的是增量差异而不是整天全量采集。把不同频次的任务拆开配置在资源消耗和时效性上都会更合理。一个简化过的配置示例大致长这样task_groups: - name: daily_critical_ports schedule: 0 3 * * * targets: [${ASSET_ALL}] checks: [port_lite, service_up, cert_expiry, subdomain_delta] - name: weekly_full_scan schedule: 0 2 * * 1 targets: [${ASSET_ALL}] checks: [port_full, fingerprint, vuln_hint] rate_limit: 300提示注意一定要带上 rate_limit。真实环境里因为扫描频率太高把出口 IP 打成临时封禁、或者把边界防火墙 CPU 跑满的情况我见过不止一次。扫描器不是压测工具它的目的是稳步摸清资产状态不是把网络链路打爆。3.3 与现有安全运营流程的衔接平台部署好之后最需要想清楚的一件事是结果往哪儿去。很多团队上了安全平台让告警直接刷在即时通讯工具里大家看两天就麻木了。我的做法是把 ringxin 的输出拆成两类一类是新发现资产清单另一类是存量资产风险变化清单。这两类先由安全运营人员确认确认之后再由工单系统建单跟踪。这个中间步骤很关键既不会让一线同学被平台刷屏也能保证每个新发现都经过人工判定再进入处置流程。另外我强烈建议建立固定周报节奏。每周固定时间看一次增量报告报告里只放三张表这一周新增了哪些资产、当前风险最高的十个资产、还有哪些处置工单尚未关闭。三张表看下来这一周的暴露面变化情况就基本清楚了。固定节奏 少量关键数据的方式远比一个实时刷新的大屏更能推动事情落地。如果组织里还没有工单系统也可以先用 ringxin 提供的 API 把数据导出成结构化文件人工周处理后面再逐步把对接做实。4. 上线运行后的三个坑完整排查链路这部分我特意把碰到的问题和排查过程完整写出来而不是只给结论。原因是这类平台的效果好坏往往不取决于功能列表而取决于你能不能正确理解平台输出的每条数据。三个坑分别涉及扫描结果失真、子域名漏报和误报治理各自代表了一类非常典型的问题。4.1 端口扫描结果失真半夜开放、白天失联的谜案第一个坑是上线第三周遇到的。某次周报里显示一台目标服务器 22 端口开放但白天值班同学登录同一台机器时连接直接超时。查资产信息目标服务本身没什么问题问题出在扫描结果的解读上。把疑惑拆开之后排查链路是这样的先换一个扫描源重扫同一目标确认不是单一源 IP 的网络路径问题。结果复现说明问题出在更靠近目标的一侧。从扫描节点手工用扫描同样的方式访问目标端口观察访问是否稳定。发现白天测试大部分时候都会超时。和资产负责人确认权限之后在目标侧抓包发现 SYN 包根本没到达目标主机的网卡在网络中间就被丢弃了。对照时间线发现异常并不是一直存在而是半夜扫描任务启动后才出现最后定位到是边界设备上的联动防护机制把高频扫描源的 IP 做了临时隔离白天隔离刚好生效于是出现了半夜显示开放、白天连接失联的怪象。修复办法是把扫描频率降下来、打乱目标扫描顺序并把扫描节点源 IP 在边界设备上做了白名单。这个坑也让我确定了一个经验扫描报告从来不是拿来就能直接当最终事实的它必须结合网络拓扑和设备的实际行为去解读否则排查问题的方向很容易跑偏。4.2 子域名漏报的根因被动数据源更新延迟第二个坑发生在排查新增子域名未发现的问题上。有一段时间内部上线了一个新的测试子域名按说证书日志和解析记录都该出现但 ringxin 连续好几天都没有把它纳入资产列表。一开始我怀疑是爆破字典不给力后来查询数据获取时间戳才发现证书日志和测绘平台收录这个子域名的时间比实际上线时间晚了几天甚至一周。这让我彻底想明白了一个原理被动数据源本质上都有更新延迟它依赖外部平台去采集、同步、索引时间上不可能做到实时。如果资产发现逻辑只押注被动渠道那新资产当天暴露当天发现就是一句空话。我的修复方案是三层并进第一层把内部 DNS 的解析日志和 CMDB 的变更记录接入平台让权威数据直接参与发现第二层扩展子域名爆破的业务字典把团队自己的命名习惯、项目代号加进去第三层保留被动数据源做兜底毕竟它还能发现我们自己都不知道的关联资产。这件事之后我对被动是兜底、主动是验证、内部数据是权威的定位体会更深了。4.3 误报治理指纹识别置信度怎么调第三个坑关于误报。运行几周之后我们发现两个完全不同的业务系统都被标记成了同一个通用管理后台指纹。点开指纹详情后发现两个系统用的是同一个开源前端框架favicon 和部分 JS 路径完全相同而指纹规则里这两项的权重偏高于是被归成了一类。这类问题如果不去管平台输出就慢慢会失去参考价值。这类问题不能靠简单删除规则解决正确做法是调整置信度逻辑把版本唯一性特征权重提高比如特定版本的 JS 路径、特定 API 响应体、后端返回的特定 Header 组合把公共框架和公共资源这类通用特征的权重降低。同时平台要保留人工确认入口运营人员确认某个指纹标注无误之后除非该资产的特征发生变化不再重复告警。指纹识别本质上是概率判断规则写得再好也有分不清的时候人工兜底机制必须存在。经过这轮调整平台的误报数量下降了一个量级团队也更愿意信任它的输出了。5. 把持续发现—持续治理落成日常动作工具跑通只是第一步真正让攻击面管理产生价值的是把它变成团队日常动作。这一节聊的是节奏怎么定、优先级怎么排、以及开源项目还有哪些扩展空间。5.1 从应急响应到常态化的节奏转变平台上线的前两周其实是排雷期。这个阶段你会不断发现历史遗留的暴露点挂在外面的管理后台、忘了清理的测试数据库、配置错误的存储对象。整个团队处在救火状态很正常不用慌。把存量问题清理完一遍之后节奏就要切换了从处理历史欠账转成看增量变化。具体节奏我按周和月来定每周固定时间看增量对比月初做一次月度画像看资产涨了多少、风险分布变了没有、平均处置周期是不是在缩短。只看单次扫描结果容易被偶发问题带偏从月份维度看趋势才能真实评估攻击面管理的长期效果。如果你刚上线一个月就着急下结论说平台没用大概率是被排雷期的数据误导了。5.2 处置优先级与执行建议很多同学会问资产风险一大堆哪来的人手全部处理我的经验是用一张优先级表把所有发现装进去按场景而不是只按漏洞等级排序优先级典型场景建议动作P0数据库、管理后台、对象存储直接暴露公网且未认证立即下线或加访问白名单当天闭环P1组件版本偏老、匹配到已知漏洞、存在弱口令一周内排期升级或整改P2非核心端口开放、证书即将过期、开发接口无鉴权进入月度收敛清单随版本窗口处理这里我想多说一句处置的首要原则是能下线就下线。大量暴露面问题根本不是没修补而是这个资产压根就不该出现在公网上。把不必要的端口关掉、把不用的测试环境销毁比打补丁来得彻底。工具能帮你发现能不能推动下线就看运营团队的执行力了。这也是攻击面管理做久了最容易形成的经验——很多问题其实不需要复杂的修复方案只需要有人拍板说一句这个不要了。5.3 开源带来的扩展空间与选型参考用 ringxin 这类开源项目有个明显的好处你能看到它全部规则和逻辑数据源模块可以按需替换指纹规则可以自己维护扫描模板能根据业务定制。我在内部就给自己负责的业务写过专门的检测插件比如定制路径探测规则、对接内部通知渠道二次开发成本并没有想象中那么高。写指纹插件有两个经验值得记住规则要尽量选版本唯一特征避免拿公共框架来做判断数据源接入要做限流和失败重试防止某一方不稳定拖垮整个采集流程。如果你也在选型我的判断标准就三条项目维护是否活跃功能上数据源是否做成可插拔对外有没有完整 API。满足这三条哪怕现在功能不够全后续也接得住扩展。Star 数量当然可以看但不能只看 Star社区里拿到源码却半年不更新的项目太多了活跃度、文档完整度和接口开放性才是决定长期使用体验的关键。最后说点个人体会。攻击面管理平台这类东西听起来技术门槛很高但真正决定它价值的不是扫描器有多快、指纹库有多全而是有没有人每周真的去看结果、去推动处置。工具能做的是把那些藏在暗处的域名、端口、配置问题一个个翻出来但把风险从周报上变成实际收敛的动作靠的仍然是流程和责任心。如果你也想在自己负责的团队里验证这套思路我给的建议是别追求一步到位先把 ringxin 装起来从一个模拟项目开始跑一个月之后再回头看你会对自己组织的暴露面有一个全新的认识。
阅读完成 · 觉得有帮助?
咨询建站