我以为自己已经把 AI 检测这摊事想得很透了。直到去年接手一个安全检测模型的预研项目,我们花了两周时间把模型从简单的逻辑回归换到了 Transformer 变体,调参调得昏天黑地,最后对比实验结果的时候发现:检测率基本没动,误报率还因为数据分布不均变得更难看了。团队里一位做了十几年安全的老师傅看了结果,只说了一句话:“你们缺的根本不是模型,是攻击日志。没有日志,拿大罗神仙来也白搭。”
这句话点醒了我。在网络安全领域做 AI 检测,模型架构、训练技巧当然重要,但真正的瓶颈几乎都在数据侧——攻击日志太少、太脏、太偏、太不真实。今天我打算把这几年在这个方向上踩过的坑、试过的方法、以及最后跑通的思路完整写下来,给同样在安全数据荒里挣扎的工程师一点参考。
1. 先说一个反直觉的结论:模型没那么重要,攻击日志的数据质量才决定检测上限
1.1 一个让我重新理解“AI 安全检测”的实验
那次对比实验其实很简单:同样的特征工程,同一份有限的攻击日志,一半样本走传统机器学习模型,另一半走当时最热门的深度模型。
传统模型我选了逻辑回归和梯度提升树,深度模型选了一个轻量 Transformer。按照我们对深度模型的预期,它应该能捕捉到更多隐蔽的攻击行为,结果在一个小样本数据集上,它的表现只比逻辑回归高了不到 2 个百分点,而且这个差距基本在统计误差范围之内。
后来我把样本量砍半再跑一轮,深度模型反而掉得更狠。原因不复杂:攻击日志的特征空间非常稀疏,攻击模式极其依赖上下文,在样本不足的情况下,越复杂的模型越容易把噪声当成规律学进去。
所以我的结论很直接:在安全检测领域,模型选型要务实,真正决定检测上限的是攻击日志的数量、覆盖面和干净程度。你可以在 Kaggle 上用一个漂亮模型刷到 0.99 的 AUC,但到了真实网络环境,模型面对的是一堆字段缺失、时间错乱、误报漏报混杂的日志,再先进的算法也扛不住这样的数据质量。
1.2 “没有攻击日志”不是一句空话,它可以拆成三个具体痛点
我建议每一个想做安全 AI 检测的团队,先把“缺数据”这件事拆开,因为缺法不同,解法完全不一样。
第一,是样本量缺。一个中型企业的防火墙上,一天的正常流量日志可能是几百万条,但一年内能确认的攻击行为可能不到一百条。正负样本比可能达到 1:10000 甚至更夸张。这样的数据喂给监督模型,模型会非常“懒惰”,它只需要把所有样本都预测成正常,准确率就能超过 99%。这根本不是模型在推理,这是数据失衡下的统计幻觉。
第二,是标注缺。安全运营团队每天处理大量告警,但他们几乎没有习惯给日志打标签。这条日志到底是攻击成功还是试探性扫描?那个告警分析师点了“忽略”是因为误报还是因为见怪不怪?这些信息没有被结构化记录下来,日志堆在 SIEM 里,充其量算是原始素材,算不上训练数据。
第三,是真实感缺。哪怕你通过某些渠道拿到了一批攻击流量,这批流量也未必代表你们业务的真实情况。攻击者打电商网站的方式,和打工业企业内网的方式,在入口、手法、节奏上差异巨大。你拿别人的数据训练出来的模型,放到自己的网络里,水土不服几乎是必然。
所以,“没有足够的攻击日志”这句话背后,藏着的是一个系统工程问题。把它简单归结为“多存点日志”或者“去网上找数据集”,都是对这个问题的低估。
2. 攻击日志的“三缺”困境:量缺、标缺失、真缺
2.1 量缺:真实攻击本来就是低频事件
做安全检测的人都有一种体会:真出大事的时候,你往往猝不及防;而在你的日志里,攻击样本平时少得可怜。这是因为攻击行为本身是低概率事件,除非你刚好被某个团伙盯上,否则在绝大多数平稳运营周期里,你看到的都是扫描器的噪音和无关紧要的探测流量。
我见过一个团队,为了凑攻击样本,把三年来所有防火墙的拦截日志全部导出来,以为终于攒够了数据。可一清洗发现,大量重复扫描占掉了 80%,剩下的攻击样本又几乎集中在同一个漏洞利用链路上。用这种数据训出来的模型,换一个场景基本就废了。
我后来做了一个不严谨但很直观的统计:为了训练一个能识别 Web 层常见攻击的二分类模型,至少需要覆盖几十种攻击模式,每种模式有效的、带上下文的正样本不应低于几百条。也就是说,你至少需要几千条高质量攻击日志,才能看到一个勉强能用的模型。很多企业连十分之一都拿不出来。
2.2 标缺失:没有 ground truth 的日志只是半成品
很多人对“攻击日志”有一个误解,觉得只要 SIEM 里存下来的告警就算训练数据。实际上,告警和攻击日志之间差着一个“确认”的步骤。AI 训练需要的不是“这条可能有问题”,而是“这条确实是有问题的攻击”、“这条是业务误报”、“这条是扫描噪音”这样有明确结论的样本。
现实情况是,安全分析师在处理告警时,并不会为了未来的模型训练而做标注。他们的习惯是关掉告警、写一句备注、或者干脆忽略。这个过程没有产出结构化标签,数据即便存在,价值也大打折扣。
所以我在带团队的时候,会专门建议安全运营侧配合做“标签回流”。哪怕只是给历史告警打上“确认攻击 / 确认误报 / 无法判定”三个粗粒度标签,都会让数据的可用性上一个台阶。这个过程很枯燥,但对于后面的模型迭代而言,它比换一百次模型结构都管用。
2.3 真缺:公开数据集和真实环境之间隔着一条河
公开数据集是个好东西,但也是个陷阱。我把几个常用数据集放在一起对比过,每次使用前都要冷静做一次“期望管理”。
| 数据集 | 优点 | 局限性 |
|---|---|---|
| CICIDS2017 | 覆盖场景较多,有完整流量捕获 | 实验环境流量偏模拟,公开多年后已和现实攻击脱节 |
| NSL-KDD | 经典入门,样本量适中 | 攻击类型过时,属于教学级而非实战级 |
| UNSW-NB15 | 包含较新的攻击仿真 | 同样存在仿真数据比例高、字段定义和真实设备不一致的问题 |
这些数据集适合用来验证模型逻辑是否正确,或者做技术预研,但不要指望它们能直接替身真实业务。
真实环境里的日志有大量长尾格式:设备厂商自定义字段、时区混乱、内网 IP 复用、隧道流量拆分、加密流量占比过高……这些在公开数据集里都不会出现。你拿公开数据训练出来的模型,到了自己的网络就像用世界地图找小区门牌号一样,方向对,但精细度远远不够。
3. 没有现成数据的时候,我从这几条路径把“弹药”一点点攒起来
3.1 先盘家底:把安全设备里被忽略的日志当成资产
很多团队说没有数据,其实是没有想清楚要从哪里捞数据。我常说一句话:在喊缺数据之前,先把你现有的日志资产盘一遍。
你至少可以从这几个源头开始找:
- 防火墙和 IDS/IPS 的拦截日志:这里留着大量被阻断的可疑请求,至少可以作为“可疑样本”的候选池。
- Web 应用层日志:包括 Web 应用防火墙的告警、网站访问日志中的异常路径和异常参数,尤其注意那些被扫描器探测过的 URL。
- 邮件网关日志:钓鱼邮件是攻击入口的重灾区,邮件网关里存着附件 hash、发件人域名、主题关键词等信息,对训练钓鱼检测很有价值。
- DNS 日志:域名查询记录是检测 C2 通信的好材料,很多恶意软件在回连时都会产生异常的 DNS 请求。
- EDR 终端日志:进程创建、命令行参数、文件写入等终端行为数据,是检测勒索软件和 webshell 的不错来源。
这些日志分布在不同设备里,字段格式五花八门,导入之后要做不少清洗工作,但它们不需要你额外搭环境,成本最低。
我踩过的一个小坑是:很多设备的原始日志只保留三十天,告警转储表才保留一年。等你决定要建模的时候,历史数据已经清掉了。所以,早在有建模念头之前,就应该把原始日志的存储周期拉长,至少半年起步,价格不便宜,但关键时刻可以救命。
3.2 蜜罐和靶场:主动“造”攻击日志
如果你内网里确实没什么真实攻击,另一个思路是自己造一个诱饵环境,把攻击者请进来。
蜜罐这个东西,最早我以为只是安全运营的干扰器,后来才发现它对数据团队来说是一个纯攻击样本采集器。蜜罐本身不承载业务,所以进出蜜罐的流量几乎都是恶意行为,天然就是攻击样本库。
实操层面,我会建议这样搭一个最小可用的日志采集环境:
- 在隔离网段部署两到三台低交互蜜罐,模拟常见的 Web 服务或数据库服务。
- 配置好日志转发,把蜜罐上所有的连接请求、命令交互、文件上传行为全部记录到独立存储。
- 运行至少四周以上,让扫描器有足够的时间发现它。
- 定期导出日志,去重、脱敏、标注攻击类型。
蜜罐日志的优势是纯度高,适合训练“是不是攻击”的初筛模型;劣势是没有正常业务流量做对照,单靠它训练出来的模型,在企业内网里容易把正常的运维操作也当成攻击。所以蜜罐数据最好的用法,是和其他正常流量数据混合使用。
3.3 合成数据的正确打开方式:不要只靠 GAN
听到“数据不够”的时候,很多人的第一反应是生成合成数据,尤其喜欢上生成对抗网络。我在这个方向上花过不少时间,最终的体会是:GAN 在图像和文本生成上确实神奇,但在攻击日志这个领域,效果非常有限。
日志数据里最关键的信息是攻击链的上下文顺序,一个攻击行为包含探测、利用、回连、横向移动等多个阶段,单纯在单条日志上做生成,很难保持这种时序逻辑。而且生成出来的样本一旦脱离真实攻击场景,带有一种“看起来像、本质上不是”的违和感,反而会干扰模型学习。
如果一定要做合成数据,我更推荐相对务实的做法:
- 基于已有的真实攻击日志做变异:在参数值、IP、Payload 关键字上做小幅扰动,扩大样本覆盖。
- 做攻击链回放:把红队或者历史渗透报告里的攻击步骤,在测试环境里重新跑一遍,重新采集日志。
- 用模拟器批量构造流量:比如模拟多个源 IP 对某漏洞的批量探测,丰富扫描类样本。
合成数据的定位是“补充”而不是“主料”。你可以把合成样本当训练集的扩增部分,但在验证集里,最好保留一批纯真实日志,避免把模型评估建立在虚假数据之上。
3.4 红队演练和渗透测试报告:最容易被忽视的数据金矿
很多公司每年都会请外部机构做渗透测试,或者内部红队会定期搞攻防演练。这些活动过去之后,大家关心的是漏洞修没修,却很少有人意识到:每一次攻击过程留下的日志、流量、工具特征,都是极其珍贵的攻击现场样本。
建议团队把这些活动的过程数据收集起来,形成统一格式的攻击样本库。具体可以从这几个维度整理:
- 攻击时间线:记录从信息收集到权限维持的完整时间线。
- 关键请求样本:保存攻击过程中产生的 HTTP 请求、命令片段、上传文件。
- 检测规则命中情况:记录每一步攻击动作对应能触发哪些现有规则,哪些规则漏掉了。
- 事后复盘标签:标注每一步是侦察、漏洞利用、横向移动还是数据外传。
有了这样的结构,你的攻击样本库会随着每一次红队活动不断自增。不断有红队授信攻击来扩充数据集,确实是一个效率很高的补数据方式。
4. 训练和评估中的“数据陷阱”:指标再漂亮,也可能上线即崩
4.1 随机划分训练集,让模型偷看了未来
这是我在初学阶段踩得最狠的一个坑。
安全日志是严格的时间序列数据。攻击者的行为是顺着时间推进的,上午的扫描可能是下午漏洞利用的前奏。如果在切分训练集和验证集时用了随机划分,那么模型在训练时就会“看到”和验证样本同一时间段的其他关联日志。表面上看,验证集准确率高达 98%,但部署到新数据上时,准确率直接掉到 70% 多。
正确的做法是以时间切分:用前百分之七十的时间窗口做训练,中间留一段空窗期,再用最后百分之二十到三十的数据做验证。这样模拟的才是模型上线之后面对未来的真实状态。
同时还要注意,安全数据里的时间特征很容易造成标签泄漏。比如日志里带了“处理时间”字段,而攻击样本往往因为被安全设备拦截,处理时间明显长于正常请求。模型只要学会看处理时间,就能在验证集上表现很好,但上线后这个特征就失效了。这种泄漏极其隐蔽,特征工程的时候要有意识地把它们隔离开。
4.2 误报率一高,再准的模型也会被弃用
安全模型和推荐模型有一个很大的不同:推荐模型的目标是让用户点击,偶尔推荐错了一个东西无伤大雅;安全模型的每一次误报,都会消耗分析师的时间。
假设你的模型精度是 90%,听起来不低。但一天进来一千条告警,其中 90% 是误报,意味着分析师每天要徒手处理九百条无效警示。连续两周,整个安全运营团队就会对这个模型失去信任,开始把它调成静默或者干脆不看。
所以评估安全模型时,除了准确率、召回率、F1 这些常规指标,一定要额外关注误报率换算成日常运营负担。我的经验是,宁可模型少报一点,也不要让分析师被淹没在无效告警里。安全 AI 的最终目标不是“多抓攻击”,而是“在有限人力下及时抓住最重要的攻击”。模型评估指标要围绕分析师的时间成本来设计,这是一个团队需要尽早达成的共识。
4.3 一个被我弄砸过的项目:被脏日志毁掉的检测模型
曾经我信心满满地训练了一个 Web 攻击检测模型,在离线数据集上 F1 到了 0.92。当时我以为离上线只差一步,结果在灰度测试阶段,模型把大量带有特殊参数的正常查询当成攻击,一天刷出几百条误报,运维同事直接来找我“算账”。
后来排查原因,发现是训练数据里有一批“脏样本”出了问题。那批样本是从 Web 应用防火墙的拦截日志里导出的,但其中大量日志实际上是爬虫流量和业务方的自动化调用,它们因为是自定义 UA 被防火墙拦了,和真实攻击根本没必然关系。模型学到的是“非主流 UA 等于攻击”,自然一上线就翻车。
那次之后我养成了一个习惯:任何人给我提供的日志,先抽样人工看一遍,确定样本标签的由来,再看数据分布。标签如果不干净,模型再努力也是白费。数据清洗投入的时间,最终都会通过模型效果加倍还给你。
5. 数据荒环境下的破局思路:从规则到模型的渐进式闭环
5.1 先让专家规则跑起来,再拿规则结果给模型做初始化
在攻击日志稀缺的阶段,我强烈建议不要一上来就做复杂的端到端模型。更好的做法是先用专家规则把检测闭环跑通。
安全团队的规则库其实是一个“弱标签”的天然来源:命中规则的日志,有较大概率是攻击;没命中规则的日志,不代表安全,但至少可以作为正常样本的候选。把规则命中的结果做成一个自动标注管道,再用这些弱标签去训练一个排序模型,让模型在规则的基础上学会对“疑似程度”做更细粒度的排序。
这种做法的价值在于:规则模型不需要大量攻击样本也能快速上线,模型则负责把规则的覆盖面扩展开。即使你只有几十条高质量攻击记录,也可以先训练一个弱监督模型把候选集排序,把分析师要看的告警范围缩小到一个可控量级,再通过分析师反馈逐步增加强标注数据。这是典型的一条“冷启动”路径,比眼巴巴等攻击日志攒够更现实。
5.2 主动学习:把分析师的打标时间花在刀刃上
既然攻击样本稀缺,那就不可能让分析师把所有日志都标注一遍。这个时候主动学习就显得特别实用。
主动学习的策略并不复杂:模型训练初期,先把一批日志交给分析师标注;模型对某条样本的预测越拿不准,越值得优先让分析师看。通过这种“模型出题、人做答案”的循环,分析师打的每一个标签都尽可能带来最大的信息增量。
我在实践中会这样做:
- 先用少量已标注样本训一个初版模型。
- 把这个模型跑在未标注的日志池上,输出每条样本的预测置信度。
- 挑置信度最低的一批样本交给分析师标注。
- 把新标注的样本并入训练集,更新模型。
- 重复迭代若干轮,直到模型在验证集上的增益趋于平稳。
这套流程用一个小几百条的初始样本起步,迭代四五轮之后通常就能看到一个还能用的模型。相比盲目要求“先给一万条标注数据”,主动学习省下的打标时间非常可观。
5.3 安全分析师的反馈环路:模型和人都要成长
模型上线不是终点,而是数据闭环的开始。一个可持续的安全 AI 系统,必须把分析师的日常处置动作变成新的监督信号。
我建议设计一个简单的反馈机制:分析师在处理告警时,可以在页面上点“确认攻击”或“确认误报”,这个操作自动写回样本库。每周从样本库抽一批新确认的样本,和旧样本合并后重新训练一轮模型。这样持续一两个月,模型就会慢慢适应这个网络的真实环境和真实攻击趋势。
这个闭环最难的其实不是技术,而是推动分析师养成反馈习惯。我做过一个比较有效的办法,是把反馈做得足够轻:页面上两个按钮,一点即完成,不再弹窗要求填写任何附加信息。尽量少打断别人的工作流,习惯才容易养成。
6. 最后的一些实际经验:先别急着训模型,把日志管明白比什么都强
6.1 日志质量大于算法选型,清洗优先于建模
我给新团队的建议永远是:先花一半的时间做日志清洗,再去碰模型。
具体来说,清洗阶段要处理的事情包括:
- 解析不同设备的时间格式,统一到同一个时区,按时间对齐。
- 将内网 IP、域名脱敏,避免隐私问题。
- 去重:有些设备会同时把日志发给 SIEM 和日志平台,导致同一条记录出现多份。
- 补全字段:很多原始日志的字段是空的,尤其是 vendor 自定义字段,需要参考设备文档补齐。
- 统一枚举:不同设备里“高危”可能写着“high”“High”“3”,要做映射归一化。
每一步都很枯燥,但如果源数据不统一,后面所有特征工程都是在豆腐渣地基上盖房子。你花在清洗上的每一分钟,最后都会以模型效果的形式兑现。
6.2 跟安全运营对齐“好模型”的标准
我见过不少团队一门心思提升模型准确率,最后却和运营团队闹得不欢而散。原因很简单:运营团队要的不是一个理论上更准的模型,而是一个不会给他们添乱的工具。
所以在设计评估指标的时候,我建议直接和运营团队聊清楚几个问题:
- 每天能接受多少条误报?
- 哪些告警类型是分析师认为优先级最高的?
- 模型输出应不应该附带解释,比如命中哪些规则、关联哪些威胁情报?
- 需要模型给出评分,还是只给一个“是否告警”的二元结果?
把这些答案变成模型的约束条件,比一切指标都实际。安全场景里,可解释性和运营体验往往比模型精度本身更重要。一个能说出“因为访问了已知恶意域名、且检测到反弹 Shell 特征所以告警”的模型,远比一个只会报“置信度 0.93”的黑盒模型更受分析师信任。
6.3 我的落地工具箱参考
最后分享我们目前跑得比较顺的一套基础组合,不一定适合所有团队,但可以参考:
- 日志采集:统一走公司现有的 SIEM 或日志平台,确保原始日志保留至少 180 天。
- 标签管理:用一个简单的内部数据表维护已确认样本,内容包括日志 ID、来源、标签、置信度、分析师 ID、时间。
- 模型训练:先用规则命中结果做弱标签训练一个排序模型,再逐步切换成主动学习 + 半监督闭环。
- 上线方式:模型不直接产生告警,而是把每天产生的告警候选排序后交给分析师复核,控制误报率的同时积累反馈。
- 评估周期:每周重新评估一次,对比模型和纯规则在最近一周数据上的召回与误报情况。
这套组合最难的不是模型算法,而是坚持把数据反馈闭环跑起来。只要你坚持做,攻击日志的匮乏感会慢慢缓解。等到数据积累到一定程度,你会发现之前纠结的模型选型问题反而变得轻松了——因为你手里的数据已经能够支撑起一个真正能落地的检测系统。