ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

CIC-IDS2017特征体系全解析:80列字段含义与实战避坑指南

CIC-IDS2017特征体系全解析:80列字段含义与实战避坑指南 做过入侵检测研究的都知道第一次打开 CIC-IDS2017 的 CSV 文件是什么感觉80多列特征扑满整个屏幕Flow ID、Flow Duration、Bwd IAT Mean、PSH Flag Count、Init_Win_bytes_forward……缩写一个接一个不拿文档根本不知道每列在说什么。但恰恰是这一堆看似杂乱的特征构成了大量论文里“高精度检测”的基石。这篇文章我不打算讲怎么用某个模型而是专门把这套数据集的特征体系拆开聊——它到底有哪些特征、每个特征在算什么、为什么设计成这个样子、实战里最容易踩哪些坑。无论你是刚入门想做毕设还是已经在跑实验想深入理解数据本身的含义这篇都值得花十分钟读完。1. 为什么 CIC-IDS 能成为“默认选择”数据集背景与特征价值1.1 从 KDD99 到 CIC-IDS每一代数据集都在解决上一代的问题如果你接触过一些老文献一定见过 KDD Cup 1999 和 NSL-KDD 这两套数据。它们的特征设计很简单41 个维度把每条网络连接抽象成协议、服务、持续时间、访问控制等基础信息。但问题也很明显采集环境是模拟出来的流量模式陈旧攻击类型停留在上个世纪而且数据里带着大量人为抽样的偏差。用它们训练出的模型拿到真实网络环境里基本废掉。CIC-IDS2017 的目标就是扭转这个局面。加拿大网络安全研究所CIC用真实网络环境布设了一套采集系统自己组织用户产生正常上网行为同时注入当时比较前沿的攻击流量最终公开了原始 PCAP 包和基于每个流提取好的特征 CSV。它的特征在 KDD 那套思路上做了大规模延伸引入了包括流内时间统计、包长分布、TCP 标志位计数、子流统计、活跃空闲时间等特征系列最终形成我们今天看到的 80 余列的特征表。这批特征并不是凭空拍脑袋设计的而是 CIC 团队在总结了 DARPA、ISCX 等前人数据集缺陷之后专门围绕“能不能刻画真实攻击行为”来做的特征工程。1.2 五天采集280 多万条流数据集到底长什么样CIC-IDS2017 的名字里的 2017 指的是采集年份。它从当地时间的周一采集到周五共 5 个工作日每天携带的攻击类型不同日期主要攻击类型特点周一无仅 BENIGN纯正常流量可用于学习基线周二FTP-Patator、SSH-Patator暴力破解类攻击凭据猜测周三DoS Slowloris、DoS Slowhttptest、DoS Hulk、DoS GoldenEye、Heartbleed拒绝服务攻击家族周四Web AttackBrute Force、XSS、SQL Injection、Infiltration应用层攻击与内网渗透周五Botnet ARES、PortScan、DDoS LOIT僵尸网络、端口扫描与分布式拒绝服务数据量在 280 万条流以上每条流都包含前面说的 80 多个统计特征外加一个 Label 列标注这条流是正常还是某种攻击。发布格式上CIC-IDS2017 同时提供了完整的 PCAP 原始流量以及已经用工具提取好的 CSV这意味着你可以直接从 CSV 入手搭模型也可以回到 pcap 去做自己的流量分析实验。1.3 特征在流量检测里的角色为什么还不能直接跳过这些年深度学习很热不少人尝试把原始载荷、字节流直接灌进神经网络跳过人工特征。但从工程角度看80 个统计特征依然有不可替代的优势计算成本低、可解释性强、在不同数据集之间的迁移性相对可控。流量包级输入动辄要处理几百万条样本训练速度感人而特征级别的输入XGBoost、随机森林几分钟就能出结果。更重要的是CIC-IDS 里每一类特征背后都对应具体的攻击形态理解了这些特征你就理解了为什么这些攻击能在统计层面被识别出来。下面这节我们从整个特征家族开始拆。2. 特征全景拆解80 多列本质上只有这几大家2.1 基础标识类这条流是谁和谁在通信CSV 文件最前面几列通常是 Flow ID、Source IP、Source Port、Destination IP、Destination Port、Protocol 和 Timestamp。它们描述的是“这条流从哪里来、到哪里去、用了什么协议、什么时间开始的”。这类字段最大的特点是不能直接当模型输入。原因很简单IP 地址和端口本质是离散编号直接喂给模型模型学到的会是训练集里特定 IP 与标签之间的关系而不是普适的流量行为模式。比如训练数据里某个攻击流量恰好全部发往 192.168.1.5模型就可能把目标 IP 当成强特征换到真实网络立刻失效。我自己的做法是把五元组拿来对流做分组、去重、切片但不放进特征矩阵。Timestamp 在部分时序建模场景会用到常规表格模型里也可以先剔除。2.2 时序统计类这条流持续多久包到得有多规律CIC-IDS 的特征里最核心的一族就是时间特征。Flow Duration 是整条流从第一个包到最后一个包的时间差。围绕它还有 Flow IAT 系列IATInter-Arrival Time包到达间隔时间以及分开统计的 Fwd IAT 和 Bwd IAT 系列每一组都包含平均值、标准差、最大值、最小值四个统计量。为什么这些特征对攻击检测非常有效想一想正常用户手动浏览网页点一下链接页面加载产生一批包然后人阅读内容隔几秒再点下一个链接整个流的包到达时间非常不均间隔忽大忽小。而很多自动化攻击工具比如 SSH 暴力破解器、端口扫描器发包节奏高度机械化包间隔时间很稳定方差很小。这种差异不需要看包内容光看时间统计就能捕捉到。2.3 长度分布类正反向包的大小画像除了时间包长度是另一个强判别维度。CIC-IDS 里有一组 Total Length of Fwd Packets、Total Length of Bwd Packets以及前向/后向包长的最大值、最小值、平均值、标准差。攻击流量的包长分布往往和正常流量差异显著。拿端口扫描来说扫描器发出去的包可能只有几十字节甚至发完 SYN 就不发数据了而正常 HTTP 流量有大量几百字节以上的请求和几千字节的响应。再比如 DDoS 攻击中的小包洪水包长极小但速率极高和正常浏览视频、下载文件的包长画风完全不同。包长特征的本质就是给每条流画一张“流量胖瘦”的剪影。2.4 计数与速率类包量和吞吐的角度这一类包括 Total Fwd Packets、Total Backward Packets、Flow Bytes/s、Flow Packets/s、Fwd Packets/s、Bwd Packets/s。它们刻画的是流的“密度”和“速度”。比如 DDoS 攻击的流量特征是短时间内产生海量小包Flow Packets/s 会高得离谱而正常文件传输虽然字节数大但包速率相对平稳。再比如数据窃取场景内网到外网的流量在一段时间内出现异常的 Bwd Packets 和 Bwd Bytes 上涨这个信号也会在这些计数和速率特征上体现出来。2.5 标志位与协议细节类TCP 状态机里的信号TCP 协议在通信过程中会用 FIN、SYN、RST、ACK、PSH、URG、CWE、ECE 等标志位来表达连接状态。CIC-IDS 把每个方向的这些标志位单独计数还专门算了 Fwd PSH Flags、Bwd PSH Flags、Fwd URG Flags、Bwd URG Flags。这类特征对于识别协议异常很有帮助。扫描攻击常利用 SYN 包探测端口存活因此一条流可能只有 SYN 和 SYN-ACK或只有大量 RST暴力破解会产生大量短连接连接建立和断开的标志位频繁出现某些 DDoS 工具刻意设置 URG 或 PSH 标志位以绕过部分检测这些行为都会在标志位计数上留下痕迹。2.6 统计与窗口类子流、窗口大小和活跃空闲状态CIC-IDS 特征表里还有一批相对高阶的字段。Subflow Fwd Packets、Subflow Fwd Bytes、Subflow Bwd Packets、Subflow Bwd Bytes 是从传输层子流维度做的统计体现一条流内部更细的“数据段落”。Init_Win_bytes_forward 和 Init_Win_bytes_backward 记录的是 TCP 握手阶段初始窗口大小这个值和操作系统的 TCP 栈配置相关。Active 系列Active Mean/Std/Max/Min和 Idle 系列Idle Mean/Std/Max/Min则统计流内数据包连续活跃的时长和空闲的时长。Active/Idle 时间原本是从交互式会话分析里来的概念人类操作自然会产生思考间隙而自动化脚本通常发送完一批包立刻开始下一批没有明显的空闲等待段。这些特征综合起来让模型能在不解析应用层协议的情况下也能捕捉到“这是一个真人操作”还是“这是一个脚本在跑”。3. 挑15个高频特征逐项说明含义、口径与攻击判别价值这一节我挑出高频出现的 15 个特征逐个说明统计口径和实战意义。不一定每个特征都排第一但它们理解清楚了剩下同族特征基本可以举一反三。特征名统计口径攻击判别意义Flow Duration流内第一个包到最后一个包的时间差微秒暴力破解、扫描等自动化攻击往往持续时间极短或极长和人工浏览差异明显Total Length of Fwd Packets前向所有包载荷字节数之和下载、上传行为与前向载荷总量强相关数据窃取常见前向异常上涨Total Length of Bwd Packets后向所有包载荷字节数之和响应方向异常增大可能意味着敏感数据回传Fwd Packet Length Max前向包中最大载荷长度扫描器多为小包正常视频/文件传输会出现较大包Fwd Packet Length Std前向包长标准差自动化攻击包长往往非常均匀标准差低人为行为波动大Bwd Packet Length Std后向包长标准差同上反映响应包大小的离散程度Flow IAT Mean双向所有包到达间隔的平均值自动化工具发包间隔短且稳定平均间隔显著低于真人操作Flow IAT Max双向包间隔最大值正常浏览会有一段阅读空白期纯脚本发包几乎无长时间空白Fwd IAT Total前向所有包间隔之和等价于前向数据的整体节奏常用于推断发包密度Fwd PSH Flags前向包中 PSH 标志位计数PSH 频繁出现往往是交互式命令传输或特殊工具行为Fwd Header Length前向所有包头字节数之和用于区分“协议头多、载荷少”的探测流量与正常数据流量Down/Up Ratio后向包数与前向包数之比下载行为比值很高上传行为比值低异常传输会打破平衡Average Packet Size双向总字节数除以总包数DDoS 小包洪水、扫描流量的平均包长明显小于正常流量Init_Win_bytes_forwardTCP 握手中前向初始窗口大小不同操作系统/工具链初始窗口不同可用于设备指纹识别Active Mean流内连续活跃发包段的平均时长自动化攻击通常持续活跃真人操作存在大量间隙活跃段较短以 Fwd Packet Length Std 为例说明一下。假设一条正常视频流量前向包里既有视频请求也有少量控制信令包长跨度从几十到上千字节方差很大。而一条 DoS Hulk 攻击流量攻击脚本持续发送固定大小的畸形请求包长相当一致标准差落在很低的区间。模型拿到这个特征相当于拿到了一条流“乱不乱”的量表非常有效。再比如 Flow IAT Max。正常浏览往往间隔几秒甚至几十秒出现一次没有包的空窗期这个最大值会很大但很多蠕虫传播、端口扫描脚本是“无脑高速发包”最大间隔可能只有几百毫秒。所以在做二分类时Flow IAT 系列特征的区分度经常排在前列这不是玄学背后是人的交互节奏与机器的机械节奏之间的本质差别。另外提醒一句CSV 里这些数值的单位不一定统一有的特征用字节有的用微秒有的用百分比不要在没有归一化的情况下直接比较大小。4. CICFlowMeter 是这些特征的“原产地”工具原理与统计边界4.1 从 pcap 到 CSV双向流是怎么切出来的CIC-IDS 的特征统一由 CIC 自家开源的流特征提取工具 CICFlowMeter 生成。把 pcap 流量包丢进去它会先做流切分。流的定义并不复杂使用五元组源 IP、源端口、目的 IP、目的端口、协议标识一条连接前向是从发起方到响应方的方向后向就是反方向。但这里有一个容易被忽略的细节流不是无限延续的。CICFlowMeter 设定了流超时阈值如果一条流已经持续了非常长的时间超过了工具内部的超时参数它会被强制切分成多条流。长连接一旦被切分流内统计特征就会失真比如 Flow Duration 无法反映真实会话长度Active/Idle 时间也会被打断。理解这个机制很重要——在做长连接场景分析时不能盲目相信 CSV 里的每一条流都对应一段完整业务交互。4.2 统计量是怎么算的均值、最大最小与标准差的配合CIC 特征体系里大量使用了均值、标准差、最大最小值这三个统计量。它们的组合本质上是在描述一个分布的集中趋势和离散程度。均值描述的是“平均水平”这组包间隔平均多大。但它有个问题很容易被极端值带偏。比如正常浏览流里人停顿 5 秒和停顿 100 毫秒差距巨大平均值会被拉高。所以需要最大值来刻画“这条流里最极端的一次等待”需要最小值来刻画“最急促的一次发包”标准差则回答“这组数据是稳定还是忽快忽慢”。四个统计量放在一起基本可以还原出一组包间隔数据的完整分布形状。实际操作中有一个提示CIC 特征集的 Flow IAT 是双向所有包都参与的间隔统计Fwd IAT 和 Bwd IAT 则是按方向分别统计。做双向不对称分析时建议优先看后两组它们能帮你区分“请求快但响应慢”还是“双向都快”等不同情况。4.3 工具的局限性对特征的影响CICFlowMeter 是专门为统计特征设计的它的局限也会原封不动带进数据集里。第一它不做包内容的深度解析所以载荷里是否包含恶意字符串、是否加密、用了什么应用层协议标题这些完全没有体现。第二它对加密流量也基本无能为力特征只能反映加密流的元数据和包形态无法给出载荷语义。第三统计特征对网络抖动、重传、乱序等底层细节不够敏感如果攻击发生在 TCP 层以下的异常行为这套特征很难捕捉。换句话说CIC-IDS 的这些特征擅长回答“这条流的行为像不像正常流量”但不擅长回答“这条流里面到底藏了什么”。5. 用特征训模型之前请先处理这几个经典坑5.1 特征缩放树模型无所谓向量机、神经网络必须做CIC-IDS 的特征量纲差异极大。Flow Duration 可以是几百微秒也可以是几十万微秒Flow Bytes/s 可能是几百也可能上千万Packet Length Variance 的数值区间和标志位计数完全不在一个量级。对决策树、随机森林、XGBoost 这类树模型来说特征缩放不是必须的因为它们按阈值切分不依赖尺度。但对 SVM、KNN、神经网络这类基于距离或梯度的模型不缩放的后果就是大数值特征完全主导梯度更新小数值特征失去作用。我一般先落到 0-1 区间或做 Z-score 标准化再跑对比实验标准做法可以直接套 scikit-learn 的 StandardScaler。5.2 类别不平衡BENIGN 占了大多数别拿准确率骗自己打开 CIC-IDS2017 的 Label 列统计一下良性流量的占比非常高通常超过 80%。攻击类别里PortScan 和 DDoS 又占据了大部分而 Web Attack 类SQL 注入、XSS相对少很多。如果直接拿原始数据训练模型很容易学到“全部预测成 BENIGN”也能获得高准确率但没有任何实用价值。建议做二分类时用 ROC-AUC、F1-score做多分类时报每个类别的精确率和召回率在类别极不均衡时考虑下采样/上采样、代价敏感学习或者用加权损失函数。5.3 防止数据泄漏按流划分而不是按行随机划分CIC-IDS 的一条 CSV 行代表一条流但流和流之间不是完全独立的。同一个五元组下的多条子流或同一个源 IP 发起的攻击流在行为特征上通常很相似。如果在划分训练集和测试集时随机按行切模型相当于已经“见过”同一源头类似样本的答案评估结果会比真实场景乐观很多。正确做法是分组划分按 Flow ID、源 IP或者至少按五元组把数据分组再通过 GroupKFold 或 GroupShuffleSplit 划分保证训练集和测试集不包含同一组的流。5.4 特征冗余与筛选哪些特征实际贡献最大80 多列特征里确实有一部分冗余。比如 Total Fwd Packets 和 Fwd Packets/s 之间、Bwd IAT Total 和 Flow Duration 之间都存在着高度相关性。直接全量灌进模型不是不行树模型还好但会让模型变重、训练变慢也不利于解释。从特征重要性结果看Flow Duration、Fwd/Bwd Packet Length Std、Flow IAT Mean、Total Length of Bwd Packets 这些特征往往排名靠前而 FIN Flag Count、Fwd URG Flags 等标记类特征要视攻击类型而定在 PortScan 场景里 SYN、RST 标志位识别力强在 Web 攻击场景里又不如包长特征好用。建议先用 SHAP 或 Boruta 做一轮筛选把真正有用的几十列特征保留下来这样模型更轻、泛化能力往往也更好。5.5 在线检测时别忽略“流未结束”的现实约束最后这条很关键容易被论文忽略。CIC-IDS 里的特征大部分需要等流结束才能算出完整值比如 Flow Duration、Total Fwd Packets、Bwd IAT Mean这些特征在流进行过程中是不断变化的不存在固定值。如果你的目标是实时检测流没结束之前只能拿到部分统计量直接用训练好的全特征模型去预测会有明显偏差。实际工程里我会把特征分成两类一类是“流开始后很快就能确认”的特征比如 TCP 初始窗口大小、前几个包的包长另一类是“需要整条流结束”的特征比如 Total Length、Active/Idle 时间。在线场景优先用前者或者按固定时间窗口切片累积而不是直接套用离线训练时用的完整特征向量。6. 从2017到2018特征体系的版本差异与选型建议6.1 CIC-IDS2018 和 CIC-IDS2017 的差别CIC 后来推出了 CSE-CIC-IDS2018又被称为 CIC-IDS2018。它沿用了 CICFlowMeter 的特征提取思路总体特征家族保持一致但采集环境和规模完全不同2018 数据集覆盖了多台机器组成的更复杂网络攻击类型有所扩展流量总体规模也从 2017 的 280 多万条上升到上千万条。但这里要特别强调不要以为 2017 和 2018 的特征列可以无缝混用。两个版本在特征数量、列名、统计口径上都存在细微差异尤其是部分长度和标志位特征的实现细节。如果混合使用必须先做列名对齐和分布检查否则特征含义不一致会导致模型训练混乱。我的建议是同一个模型项目里尽量选一个版本不要交叉训练。6.2 什么时候选 2017什么时候选 2018做算法快速验证、课程设计、写小论文CIC-IDS2017 更合适。体量适中下载和预处理速度快社区资料丰富遇到问题容易找到参考。做更接近企业级复杂网络的实验、需要更丰富攻击类型、或者对规模有要求再考虑 CIC-IDS2018但要预留足够的磁盘空间和预处理时间。另外注意这两套数据集的标签密度和分布也会影响实验结果。如果论文里要做横向对比务必保证实验设置一致包括用了哪些特征、按什么方式分流、类别怎么合并都要在实验描述里交代清楚。这是我见过最多人犯的错——只写了算法和指标特征处理细节完全没有别人根本没法复现。还有个实践小技巧拿到 CIC-IDS2017 之后先不要急着全量跑直接从 Tuesday 和 Friday 这两个文件里挑一部分数据做快速实验。Tuesday 有暴力破解类攻击Friday 有 PortScan 和 DDoS攻击形态差异大穿插上 BENIGN 流量适合先把整个 pipeline 调通再扩展到全量数据。这样能在一天之内完成从“CSV 到手”到“模型出指标”的整个流程比一上来就啃全量数据省心得多。我个人这几年用 CIC-IDS 的体会是特征工程老派但绝不廉价。80 列特征背后是采集团队对不同攻击行为的观察和理解把这个特征表读透比盲目换模型带来的提升更明显。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进