如果你也做过安全运营值班,大概率见过这种场面:告警面板一个晚上刷出几百条消息,每条都写着高危,但真正需要立刻动手的可能就一两条。威胁识别说白了,就是从这堆真假参半的信号里,找出真正能造成损失的那一个。这个话题我陆陆续续讲了几年,也带过不少刚入行的新人,发现大家最容易卡住的不是“怎么配规则”,而是“拿到一条告警后,怎么判断它到底是不是真的威胁”。
这篇我先讲威胁识别的上半部分:从告警到结论的完整思考框架、核心数据源和研判手段,最后用一个模拟告警把流程完整走一遍。下篇我会再展开响应处置、取证留痕和攻击链还原那些事。适合刚接触安全运营的同行、被告警淹没的初级分析师,以及想要把排查思路系统化的朋友。
1. 威胁识别到底在解决什么问题
1.1 识别不等于检测
很多新人会把“威胁检测”和“威胁识别”混成一件事。检测是设备层面干的活,比如防火墙拦截了一个外联请求、终端软件报了一个文件可疑、态势感知平台弹出一条规则命中。它的产出是一堆“信号”,告诉你这里可能有事,但不会告诉你这件事为什么发生、影响有多大、接下来该不该处理。
识别是分析人员干的活。它要回答三个基本问题:这是不是一次真实的攻击行为?攻击者做了哪些动作?我们现在处在攻击链条的哪个位置?这三个问题答清楚了,一条告警才能变成一张可以决策的工单。如果只停留在“规则命中、等级高危”,那告警就永远只是告警,不能成为处置依据。
我见过不少团队,花了大价钱上设备、堆规则,结果告警量翻了十倍,真正被验证的安全事件却没多发现几个。根因就是检测能力上去了,识别能力没有跟上。机器负责“喊捉贼”,人得有办法判断“谁是真贼、他偷了什么、现在跑到哪了”,这也是威胁识别作为独立能力存在的原因。
1.2 识别工作的本质:在不确定中做判断
安全领域的信号大多是残缺的。攻击者会隐藏源地址、加密流量内容、清除主机日志,留给你的往往只有一个外联IP、一段进程名、一个注册表项。威胁识别本质上就是基于这些残缺信息,结合资产、业务、时间、行为序列,去做尽可能低风险的推断。
这种推断不可能百分之百准确,但可以一点点收敛。判断一个外联IP是否恶意,不只看它是否命中情报库,还要看发起请求的进程是不是系统正常进程、发生时间是否符合业务规律、之前有没有对应的下载或执行动作。把这些线索串起来,概率就从“可能有问题”变成“大概率有问题”或者“大概率没问题”。
所以我一直跟团队强调:威胁识别不要追求“一眼看穿”,而是要建立一个“多源交叉验证”的习惯。一个孤立的IOC不可怕,可怕的是若干条若隐若现的线索凑在一起,却没有人在意。
1.3 识别结果应该到达什么程度
一条合格的风险识别结论,至少要包含四件事:是什么类型的威胁(木马、蠕虫、横向移动、数据窃取还是误报);影响范围(哪台主机、哪个账号、哪段网络);可疑行为依据(哪些字段、哪个时间点、命中了什么规则);建议动作(隔离、下线、查杀还是持续观察)。
这四点写不全,后面做响应的人就没法动手。很多应急响应混乱,不是因为响应能力不行,而是因为前面的识别结论太模糊,甚至出现“规则说恶意就恶意”的一言堂。威胁识别的终点不是“这是恶意”,而是“建议怎么处理最合理”。它能直接决定业务是否需要停服、主机是否需要断网、账号是否需要冻结,必须把依据和影响说清楚。
2. 从告警到定性:一套能落地的研判流程
2.1 先归一化告警,再谈判断
不同设备产生的告警格式千差万别:有的源地址叫src_ip,有的叫source;有的时间是本地时间,有的是UTC;有的把用户写成domain\user,有的只写一个user。如果不做归一再去看告警,光是对应字段就能浪费十分钟。
我的习惯是先把告警信息整理成统一视图,至少包含几个固定字段:时间、源IP、目标IP、源端口、目标端口、协议、域名、账号、进程名、文件哈希、告警规则名、严重级别。整理完之后,第一件事不是查威胁,而是看“时间线”。
时间线是判断威胁真实性最便宜的抓手。凌晨三点的外联和白天十点的外联,性质差异巨大;登录失败之后两分钟发生的命令执行,和登录成功后三天才出现的命令执行,也完全是两个故事。把告警前后各一段时间的相关日志拉出来按时间排列,很多判断就自然出来了。
2.2 补全上下文:资产、账号、业务不能少
同一台主机、同一个账号,放在不同业务环境里,风险值完全不一样。一台研发测试机外联一个可疑IP,和生产数据库服务器外联同一个可疑IP,处置优先级差出好几个等级。所以研判时,至少要先回答:源主机是谁的资产?它承载什么业务?对外开放了哪些端口?这个账号的权限级别是什么?
这一步也是最容易出问题的。许多客户资产台账不清晰,IP换了责任人,系统改了用途,日志里只能看到一串冷冰冰的IP。遇到这种情况,不要硬猜,第一时间找资产管理员确认,同时去看该主机最近的登录日志和进程列表,判断当前是否有人在使用。很多误判都是因为“看了一眼情报库说是恶意IP,就直接定性”,完全忽略了这台主机本身是否有合理的业务外联需求。
2.3 把告警映射到攻击链条上,判断紧急程度
我在内部复盘时常用到一套简化版的攻击阶段模型:侦察探测、获取初始访问、执行恶意代码、建立持久化、横向移动、数据收集与外传。拿到一条告警,不要急着查病毒,先判断它落在哪个阶段。
边界防火墙命中一条端口扫描规则,属于侦察阶段,通常优先级不高,但需要看扫描频率和目标范围;主机上出现一条新建计划任务,可能已经进入持久化阶段,优先级就要拉高;多条主机同时向同一外部IP发起大量数据连接,则要立刻假定已经在数据外传阶段,优先断网止损。
攻击链阶段可以直接决定“先隔离还是先分析”。如果尚在早期阶段,可以放长线观察攻击者下一步动作;如果已经进入横向移动或数据外传,任何观察都是浪费时间的风险。
2.4 给出可追溯的定性结论
研判完不算结束,还得把结论写下来。我要求团队把每个结论写成“因为……所以……”的结构:因为某主机上执行的进程父进程是Office,该Office在五分钟前下载了一个带有宏的文档;所以判断该告警为“疑似恶意文档执行”。因为该进程后续持续外联同一IP且外联行为与业务无关;所以将该事件升级为确认的恶意活动。
这么做的好处是事后可以复查。如果处置错了,回看记录就能找到是哪个环节判断有误。如果因为信息不足无法确认,也要写下“不确定的原因”和“需要补充的数据”。很多安全事件最终失控,不是输在技术,而是输在没有人把推断过程记下来,等到第二个人接手时,一切都要重来一遍。
3. 威胁识别要盯住的核心数据源与关键字段
3.1 网络边界与流量侧数据
网络侧数据是威胁识别的第一道来源。最常用的是进出边界设备的会话日志、防火墙上记录的连接日志、以及来自交换机镜像流量的采样数据。这类数据能最直接回答“谁在什么时间访问了哪里”。
重点看几个特征:连接是否频繁短小、间隔是否固定,这类流量常常是控制信道的心跳行为;连接目标端口是否为非常规端口,比如用53端口或443端口来传数据;是否存在大量DNS请求指向同一域名但解析结果频繁变化;是否有上下行流量比严重失衡的现象,通常是往外部传数据。
不过有一个坑:现在大量流量做了加密,只看会话日志看不到载荷内容。这种时候不要硬解,结合主机侧进程记录来判断“是谁发起连接”往往更有效。一个正常业务程序的连接行为,会在进程、时间、目标上形成规律;恶意外联则更多表现为进程异常、目标IP分散、连接时间反常规。
3.2 主机侧进程与文件痕迹
主机侧数据是确认威胁的“最后一击”。网络流量再可疑,只要主机侧找不到对应进程和文件,就永远停留在“疑似”。反之,主机侧一旦找到恶意进程、异常启动项、计划任务或最近落地的可疑文件,定性就会扎实很多。
主机侧需要重点关注五类痕迹:进程链关系与父进程,很多攻击都是从文档漏洞触发Office进程再去执行脚本,这时候只看子进程名称不够,必须看父进程是谁;计划任务与开机启动项,持久化最常用的位置;服务列表里新增或改动过的服务,注册表启动项,以及用户目录下近期新增的可执行文件、脚本文件、压缩包。
主机侧排查要留心误报。很多安全软件会把正常软件更新、开发编译、系统管理操作误报成恶意行为。判断时可以先看签名信息、文件描述信息和文件版本,排除正常业务软件之后,再对不明文件做进一步比对。
3.3 身份与账号侧行为
身份侧数据经常被新手忽略,但它在横向移动和账号失陷的判断里特别关键。有人会说攻击者已经进去了,日志里照着他的原话念:看账号在不在超时时段登录、登没登录不该登录的机器、有没有执行高权限命令。
重点看这几类:账号是否在短时间内从多个源IP登录,尤其是一个内网账号在多个主机上几乎同时出现;是否在非工作时间通过远程管理通道登录;是否有高权限账号首次在某个主机上登录;是否有账号反复尝试登录失败后突然成功一次。
身份侧数据需要和主机侧数据结合才更有价值。如果某个账号登录了一台主机,紧接着该主机上出现了计划任务创建、压缩打包、大量文件访问动作,那这个登录就需要重点盯防。单纯的登录告警误报率很高,但一旦登录之后跟着一连串行为,置信度就完全不同。
3.4 数据质量:时区、字段、完整性
再好的分析思路,遇上脏数据也白搭。我踩过最经典的一个坑:同一套环境里,一半设备记录的是格林尼治时间,一半记录的是本地时间,结果对时间线的时候,一个攻击行为看起来是在“漏洞触发之前”发生的,差点得出错误结论。
所以识别工作展开前,先确认数据能否满足三个必要条件:时间统一,建议内部全部使用UTC存储,展示时再转换;字段完整,源IP、目标IP、账号、进程名、事件类型这五个字段必须能对上;日志留存周期够用,至少要保留90天以上,否则根本没法治回溯。
如果条件不满足,识别工作就只能靠有限的现场排查。这种情况下,我会更早介入资产盘点和内存取证,不能完全依赖历史日志。
4. 四类识别手段的原理与取舍
4.1 规则匹配:快,但容易被绕过
规则匹配是威胁识别最底层的引擎。它做的事情很简单:把当前行为特征和历史沉淀的恶意特征做比对,命中就产生告警。例如“外联IP命中已知恶意列表”“文件哈希命中病毒库”“命令行出现特殊编码”都是规则。
规则匹配最大的优点是速度快、可解释性强,只要命中就能给出明确告警理由。缺点是攻击者只要稍微改变文件哈希、更换域名、调整命令写法,就能绕过。它不是不能靠发现威胁吃饭,而是要作为第一层漏斗来用,把明显恶意和明显正常过滤掉,把中间模糊地带留给更复杂的分析方法。
4.2 统计基线:发现“业务异常”而不是“已知恶意”
统计基线的核心是建立正常行为模型,然后发现偏离。比如某台服务器平时每天对外连接十几次,某天突然变成两千次,这本身就值得关注。基线的价值在于不依赖已知特征,所以对新型攻击也有效。
基线模型要避免两个问题:一是基线本身被污染,如果攻击流量已经混入历史数据,模型会把恶意行为当成正常,所以基线区间要定期重算,并且确保引入的数据本身是干净的;二是业务季节性波动,电商大促、月末结算、系统升级都会带来正常突刺,需要把业务日历作为参数输入模型。
4.3 行为序列分析:把单个点串成故事
行为序列分析是目前威胁识别里面我个人最依赖的一种能力。它不看单个动作,而是看动作与动作之间的序列关系:先有钓鱼邮件打开,然后是Office进程启动PowerShell,然后是新建计划任务,然后开始外联——这一串事件里,每一个单独拿出来都可能不触发规则,但组合起来就是一个完整攻击故事。
这种分析很难用一个简单的命中条件来描述,通常需要借助事件关联引擎。实现上可以是“在X分钟内,同一主机上依次发生A、B、C三类事件则告警”。它的误报控制比纯规则好,因为多事件的组合让偶然性大大降低,对数据质量的要求也更高。
4.4 威胁情报碰撞:辅助判断,不能当成唯一依据
威胁情报能给研判提供外部的“经验”:某个IP段近期被大量用于恶意活动、某个域名被解析到恶意基础设施、某个文件哈希在其他环境中被确认是木马。把本地告警和情报比对,可以快速缩小范围。但它有两个明显局限:新鲜度,攻击者可以今天换一个IP、明天换一个域名,情报天然滞后;覆盖度,中小企业常遇到的针对性攻击,很可能根本不在公共情报库中。
所以我给团队定了一条规矩:情报命中只能作为提高置信度的加分项,不能直接用来定性。只有情报命中但没有本地主机侧、网络侧行为佐证的告警,一律标为可疑待查,而不是直接确认恶意。反过来,本地行为证据已经非常充分但情报没有命中的,也不要因为“情报不命中”就轻易放过。
4.5 组合使用的异步处理
现实里,不要指望用一种手段解决所有告警。我建议把威胁识别拆成几个带不同速度的通道:规则匹配负责秒级响应,处理明确已知的恶意行为;基线模型负责分钟级收敛,处理偏离常规的行为;行为序列分析负责小时级或天级深度挖掘,处理复杂攻击链;威胁情报作为辅助信号,嵌入到所有通道里去修正置信度。这样既能保证及时性,又能保证深度。
5. 一个模拟告警的完整排查过程
5.1 告警基本情况
某天内网监控平台弹出一条告警:主机10.20.30.40在凌晨3点17分开始,持续向外部IP203.0.113.55发起HTTPS请求,频率约每30秒一次,命中威胁情报中“可疑远控节点”标签,告警等级为高危。
如果只看表面,这条告警很容易被当成恶意远控处理。但我没有直接隔离主机,而是按顺序走了一遍判断流程。
5.2 排查顺序与关键判断
第一步,确认资产。查询资产台账,确认10.20.30.40是财务部某个同事使用的办公终端,不是服务器,也没有部署对外业务。这台机器在凌晨3点自动外联,从业务上看很反常。
第二步,看账号与登录记录。检索该主机前一天的登录日志,发现最后一次交互式登录发生在当天晚上6点02分,登录用户是该同事本人。之后没有新的远程登录记录,说明告警时主机处在“无人操作”状态。
第三步,查进程链。登录主机后,我先看当前外联进程的父进程。结果显示发起外联的进程是一个名字很像系统更新的程序,但它在系统目录之外,位于用户临时目录下。这就已经很可疑了。再查父进程,发现是一个Office文档启动的脚本执行留下的痕迹,说明最初的入口很可能是文档攻击。
第四步,拉时间线。把当天所有相关日志按时间排列:下午3点12分,该同事收到一封主题为“工资明细确认”的邮件,带有一个压缩包附件;3点17分,系统记录到Office程序启动并调用脚本控制台;4点左右,用户目录下释放了一个可执行文件;凌晨3点17分起,该文件开始规律外联。
到这一步,告警已经不再是“那条外联请求本身”的问题,而是一条完整攻击链的末端暴露。虽然流量加密看不到内容,但进程链和执行顺序已经足够支撑“恶意活动”的判断。
5.3 为什么不能只凭告警定性
这条告警最初只写了“主机向可疑IP发起HTTPS请求”。如果我只凭这一条去处置,能做的判断非常有限。但把资产信息、登录日志、进程链、邮件记录串在一起后,它就从孤立外联变成了“钓鱼邮件—宏脚本—木马落地—外联通信”的完整事件。
处置动作也随之清晰:立即断开该主机网络,保存进程内存镜像和日志,封禁目标IP,排查同一邮件是否还发给了其他人,并检查该主机是否访问过内网共享文件。
5.4 这是一次理想的排查过程
现实里并不总是这么顺利。很多时候你找不到邮件记录,进程链已经被清理,资产台账一片空白。但流程还是这五步:资产确认、账号登录、进程链、时间线、范围排查。哪怕每一步都只能完成一半,也比直接跳到结论要强。威胁识别最怕的不是信息太少,而是先在脑子里有了结论,再反过来凑证据支持它。
6. 常见问题、误判原因与排查心得
6.1 告警风暴时,先做聚合再处理
遇到晚上上百条同类告警,一条条看一定会崩溃。我的做法是先按源IP、目标IP、告警类型三个字段聚合,把几百条告警压缩成几个事件组。同类告警只分析第一台典型主机,确认或排除后再批量套用到其余主机上。
聚合时要注意一个陷阱:多个主机同时产生相同告警,可能意味着横向移动已经发生,而不是“规则抽风”。一旦发现告警波及主机数量超过预期,应当先做隔离,再慢慢分析。大批量告警大概率说明攻击者正在做批量操作,而不是误报突然集中爆发。
6.2 五种最常见的漏报与误判场景
结合我这些年的复盘,误判往往集中在几个固定场景:真业务被误杀,比如财务系统的夜间自动备份,凌晨外联备份服务器,很容易被当成外联恶意IP;恶意行为被业务伪装掩盖,攻击者把外联伪装成系统更新、安全软件升级、DNS查询;日志时间差导致判断混乱,设备时区不统一,把恶意行为排到了错误的时间线上;缺少历史数据导致无法比对,只有当前快照,看不到几天前发生了什么;过度信任或者过度怀疑情报,前者造成高误报,后者造成假阴性。
每个场景对应的对策不一样:真业务误杀靠资产清单和业务白名单解决,伪装行为靠进程链和文件路径校验,时间差靠统一UTC存储,历史数据缺失靠加强留存,情报问题靠“情报+行为证据”交叉验证。
6.3 提高研判效率的小工具思路
研判本身不需要多复杂的工具,但可以有点小自动化。我常用的是把高频查询写成固定的模板脚本,比如输入一个IP,自动拉取该IP最近7天的连接记录、登录记录、进程名、命中规则列表。如果每次人工一条条查,一个告警半小时;模板一跑,三分钟就能拿到初步结果。
还有一个习惯:所有研判过程中见到的重要证据,第一时间截图或复制原始日志先存下来。因为后端的原始数据可能很快被覆盖,也可能因为权限被攻击者清理。先留证据再继续分析,和先拍照再移动现场是同一个道理。
6.4 最后分享一个我自己的经验习惯
每次给一条告警写最终结论的时候,我都会要求自己在工单里写清楚“为什么确认它”和“为什么排除它”两部分。不能只说“确认是木马”,而要写“确认依据是哪些日志字段、排除依据是业务背景和签名信息”。这个习惯看起来笨,但坚持一年之后再回看,会发现自己对威胁识别的判断力提升得比看十本书都快。
威胁识别从来不是一个靠几天就能掌握的动作,它是靠大量告警、大量误报、大量复盘喂出来的判断力。把流程固化下来,把数据源摸清楚,把每一步的原因想明白,再复杂的攻击也能被一步步拆穿。这篇先讲到这里,下篇我会继续聊识别出威胁之后,怎么决定隔离、封禁、取证和追踪。