ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

入侵检测系统设计与实现:从分布式架构到混合检测落地

入侵检测系统设计与实现:从分布式架构到混合检测落地 简介一份系统梳理网络安全中入侵检测系统设计与实现的PDF技术文献面向信息安全方向的学生、网络管理员以及需要开展相关课程设计或毕业设计的读者。文档从入侵检测系统的基本概念与分类入手介绍了基于主机与基于网络两种检测模式的特点并针对误用检测、异常检测及混合型检测三种技术方法展开说明。后续部分重点给出了分布式入侵检测系统的整体模型与功能模块设计包括探测代理、监视代理与策略执行代理的职责划分以及从数据采集、特征匹配到预警响应的工作流程同时指出当前网络安全中运用入侵检测技术存在的不足与完善方向。资源为单份PDF文件全文约101KB篇幅精炼、结构清晰可作为理解IDS原理、系统架构设计以及撰写相关论文时的参考文献。该资源已有681人学习使用适合需要快速把握入侵检测系统整体框架与设计思路的读者下载参考。1. 入侵检测系统不是防火墙的备胎先看懂这份 PDF 在讲什么你公司核心交换机上明明堆着防火墙日志静悄悄可内网服务器还是被拿下了。事后追溯发现攻击者从一台测试机跳进来在内网横向移动了三周。防火墙只管边界进出对内部流量基本是睁眼瞎这时候就该有入侵检测系统IDS。这份 PDF 是一份经典的《网络安全中入侵检测系统的设计与实现》论文它把分布式 IDS 的骨架讲得很清楚基于混合型检测技术分成探测代理、监视代理、策略执行代理三个模块工作流程就是“收集—分析—响应”三步。你如果正在做网络安全相关课程设计、毕业设计或者想在内网自建一套流量感知体系这份 PDF 值得先下下来边读边对着下面这份拆解消化。别指望它给你现成代码但架构和流程讲清楚了这正是照着落地最缺的部分。2. 三个模块拆开看探测代理、监视代理、策略执行代理各自干什么PDF 里的系统模型是一个“基于混合型检测技术的分布式入侵检测系统”。分布式三个字很关键意味着不是一台机器把所有事干完。在实际部署中探测代理可以有多台分别放在不同网段监视代理是全局大脑策略执行代理是手脚。下面把这三个动作拆开讲。2.1 探测代理抓包、预处理、特征匹配探测代理是整个检测系统的基层模块部署在交换机镜像口或者分光器后面。它的职责链路非常清晰采集网络数据 → 预处理 → 特征匹配 → 命中后给监视代理发预警。同时它还得监听监视代理下发的参数配置收到后调整自己并重启检测引擎。抓包层最常见的做法是用 libpcap 或者更高阶的 PF_RING。下面是一段演示用的 Python 抓包骨架虽然生产环境不建议直接用 Python但链路是通用的import pcapy import time from struct import unpack cap pcapy.open_live(eth0, 65535, 1, 1000) # 混杂模式1秒超时 cap.setfilter(tcp or udp or icmp) # 只关心 IP 协议族 def feature_match(data): # 简化命中规则返回规则ID列表 return [rule_10001] def send_to_monitor(alert): # 这里实际是写入消息队列或上报端口 print(alert:, alert) while True: header, data cap.next() if data is None: continue # 跳过14字节以太网头解析IP层字段 src unpack(I, data[26:30])[0] dst unpack(I, data[30:34])[0] hit feature_match(data) if hit: alert { node_id: probe-01, src: src, dst: dst, rules: hit, ts: time.time() } send_to_monitor(alert)逻辑说明这段代码先从网卡读取原始帧然后跳过以太网头去取 IP 源地址和目的地址再交给feature_match做特征匹配。命中就组装一条带节点 ID 和时间戳的预警上报给监视代理。node_id要保留因为分布式部署下监视代理需要知道预警来自哪个网络区域这直接关系到关联分析的范围。参数说明open_live的第一个参数是网卡名第二个参数 snaplen 设为 65535 可以抓满整个以太网帧避免因截断漏掉有效载荷。第三个参数 promisc 必须为 1也就是混杂模式否则网卡只收本机 MAC 的包根本看不到经过交换机的其他流量。第四个参数是读超时单位毫秒设太短会增加无谓的系统调用设太长则预警会延迟。另外要注意如果链路里有 VLAN 标签IP 头偏移要从 14 变成 18 字节很多新手第一次上线就栽在这个偏移量上。探测代理还要解决一个更实际的问题交换机的镜像口流量巨大单线程抓包加匹配根本扛不住。常见的做法是让抓包线程只负责把数据包塞进环形缓冲区再由多个工作线程并行做解析和特征匹配。多线程之间用无锁队列通信避免锁竞争。还有一点容易忽略TCP 流重组。一个完整的 HTTP 请求会被拆成多个 TCP 分片如果探测代理不做流重组只对单个包做特征匹配很多 URI 特征根本对不上。2.2 监视代理预警关联与响应匹配监视代理是整个系统的高层检测组件。它接收所有探测代理发来的预警信息第一件事是去重和归一化。因为同一个攻击事件可能被多个探测代理上报或者一条流在短时间内多次触发同一规则这些都算重复。归一化之后再做关联分析。关联分析是监视代理最核心的工作。举个实际例子一台主机在 60 秒内对子网其他 200 台机器发起 80 端口扫描单个探测代理上报时可能拆成 200 条独立预警。如果不做聚合这 200 条记录会淹没在海量告警里管理员根本盯不过来。监视代理要做的就是按源 IP 和时间窗口聚合发现频次超过阈值把 200 条孤点合并成“一次横向扫描事件”。这里给出一份关联引擎的配置表你直接照着设计自己的配置项关联维度参数名示例值说明时间窗口window_size60聚合窗口大小单位秒聚集字段group_keysrc_ip按源 IP 聚合横向扫描触发阈值trigger_threshold5窗口内命中数达到该值才告警响应匹配response_mapauth_fail - email事件类型到动作的映射window_size不是一个随便拍的数字。如果你把所有预警都放到 60 秒窗口里那么慢速扫描比如一分钟只扫 2 次很容易漏掉窗口拉大到 300 秒又容易把无关事件误关联到一起。我一般会先抓几天正常流量看同类事件的平均间隔取一个 P90 值作为初始窗口再留 20% 余量。关联确认后监视代理需要把预警和响应措施做匹配。响应措施不应该是写死在代码里的而是一张可配置的策略表。比如“认证失败次数过多”对应邮件通知“漏洞利用尝试”对应防火墙封禁。这一步非常重要因为探测代理只负责发现监视代理才决定“要不要管、怎么管”。如果让探测代理各自响应很容易在分布式攻击下把相关事件割裂开。监视代理还有一项隐藏工作动态向探测代理下发配置。当某段时间某类误报特别多监视代理可以下发指令降低对应规则的优先级或者调整探测代理的采样参数。探测代理收到后重启检测引擎让参数生效。这个过程要有控制协议不能用 SSH 上去改文件再手工重启否则谈不上分布式管理。2.3 策略执行代理邮件告警和防火墙联动策略执行代理是整个系统里最重要的一环PDF 里说得直白没有它检测系统显得毫无意义。它的主要功能是把确认后的预警信息通过邮件发送给管理员然后启动对应的响应策略。响应动作包括修改文件、连接复位、杀死异常进程、重新配置防火墙规则。这些动作里我最想提醒的是“杀死异常进程”和“连接复位”。它们看起来很强但一个误报就能让正常业务瞬间中断。所以策略执行代理必须设计成分级响应不能一视同仁。下面是我常用的响应动作表响应级别动作触发场景是否自动执行低记录日志、发邮件通知单次端口扫描、策略试探可自动中连接复位、源 IP 限速横向扫描趋势、蠕虫传播需人工审批高防火墙封禁 IP/端口、隔离主机已知漏洞利用、暴力破解成功默认关闭人工确认后执行与防火墙联动的实现主流有两种。第一种是调用防火墙开放 API动态下发规则适合企业级硬件防火墙但需要适配各家接口第二种是执行 iptables 脚本简单直接但要注意并发问题多个响应事件同时触发时脚本必须用锁或者原子化事务否则规则会互相覆盖。邮件通知也有坑。策略执行代理要把告警内容结构化不能只在正文里贴一段告警文本。我习惯是把事件 ID、源 IP、目的 IP、命中规则、时间戳、抓包文件的 hash 都放进邮件并关联一个事件追踪链接。这样管理员收到邮件后不用再跑到日志系统里翻半天才能定位问题。这一层还要考虑动作的幂等性。比如“封禁 IP”这个操作如果同一个 IP 在短时间内被两条预警命中策略执行代理不应该执行两次相同的封禁否则防火墙规则会重复产生垃圾条目。实现时加一个动作状态表记录每个动作的执行时间和结果重复的指令直接丢弃。3. 从误用到异常再到混合检测引擎怎么选型PDF 在第 1.3 节把检测方法分成误用检测、异常检测和混合型检测。这一章不重复概念我把选型理由和边界给你划清楚。3.1 误用检测特征库命中的速度与死穴误用检测的本质是特征匹配。维护一个已知攻击的签名库拿网络数据包去比对命中就报警。它的核心优势是速度和可解释性一条“端口扫描”规则命中时你能明确说出是哪几个特征触发的。这也是大多数商用 IDS 的主干尤其是 Suricata、Snort 这类工具。下面是 Snort 风格的特征规则你自己实现的时候也可以参考这种写法alert tcp $HOME_NET any - $EXTERNAL_NET 80 ( msg:SQL Injection Attempt; content:union select; nocase; sid:1000001; rev:1;)说明content里写的是载荷中必须出现的字节序列nocase表示忽略大小写。这种规则实现起来很直接你把数据包应用层载荷丢进匹配引擎查一下有没有这条子串。但它的死穴也很明显攻击者只要把union select写成UNION/**/SELECT或者%75nion%20select这条规则就瞎了。所以误用检测的维护成本主要在特征库本身。不要从零造轮子直接用 Snort 的社区规则集做底子再根据你自己的业务场景写覆盖规则。比如你是个电商站那就重点覆盖支付接口的异常参数你是个 OA 系统则要盯死文件上传和命令执行类特征。我每加一条规则都会先构造对应的攻击流量验证一次不让没经过实测的规则上线。误用检测真正让人头疼的是漏报。特征库更新是滞后于攻防演进的新的攻击手法总是先出现等有人分析完、写进规则黄金抢救时间已经过去了。所以单靠误用检测防线必然有漏洞。3.2 异常检测用户行为模型与未知攻击异常检测的思路反过来先建立正常行为基线任何偏离基线的行为都视为可疑。它的最大价值是能发现未知攻击因为不需要知道攻击长什么样只要它偏离了历史模式就会被打上异常标签。基线数据从哪里来基于主机的可以采集登录时间、命令序列、访问文件列表基于网络的可以统计每流量的包数、连接时长、协议分布、上下行字节比例。建立基线需要很长一段纯净周期我一般建议至少两周。如果你没有历史数据就先用“记录模式”跑着积累足够样本再开启告警。下面是用统计方法做异常打分的最小实现import numpy as np baseline np.load(baseline_features.npy) # 形状: (N 条正常样本, M 个特征) mu baseline.mean(axis0) sigma baseline.std(axis0) def anomaly_score(sample, threshold3.0): z np.abs((sample - mu) / (sigma 1e-9)) return np.any(z threshold), z逻辑说明z是每个特征的偏离程度相当于标准差的倍数。只要任一特征超过threshold默认 3 就是 3-sigma就认为这组样本异常。代码里的1e-9是防止某个特征方差为 0 时除零。参数说明threshold不是绝对的3-sigma 是统计学的经典值但实际业务流量有潮汐性。比如一个办公网络工作日上午的员工上网行为和凌晨的备份行为本来就不服从同一个分布。所以我有段时间直接拿全天数据算基线结果白天大量报误报。后来改成按小时分箱分别算每小时的均值和方差误报立刻降了两个数量级。如果某些特征标准差本来就接近 0说明它没有区分度干脆去掉。再补充一个现代方向现在也有人把网络流量转成图像比如把连接五元组和时间窗口投影成灰度图再用 DAMO-YOLO 这类视觉模型做恶意流量检测。本质上它还是异常检测只是特征工程从人工设计变成了卷积网络自己去学。但这种做法的前提是你有一批标注好的恶意样本否则训练出来的模型同样是黑匣子上线后反而更难排查。3.3 混合型检测两级流水线的搭法PDF 在第 1.3 节里为结合前两种方法的优点提出了混合型检测方法。如果你去看原论文这段会发现它只是给了方向没有给出具体的搭法。这里我给出一个经过实践验证的串行流水线方案。第一级用误用检测快速处理已知攻击第一级没有命中的流量进入第二级异常检测用行为打分抓未知攻击。关键点在“分流”而不“叠加”——不要让每个包都同时跑两套引擎否则性能撑不住。def hybrid_detect(flow): # 第一级误用检测面向已知攻击快 misuse_hits misuse_engine.scan(flow) if misuse_hits: return Alert( severityhigh, causemisuse_hits, sourceflow.src_ip ) # 第二级异常检测面向未知攻击慢 score anomaly_engine.score(flow.features) if score config.anomaly_threshold: return Alert( severitymedium, causefanomaly_score{score:.2f}, sourceflow.src_ip ) return None逻辑说明误用检测命中后直接返回高危告警因为它有明确的特征依据可以快速进响应流程。异常检测只打一个分数返回的严重级别是中危让监视代理去结合上下文做进一步关联。为什么不直接把异常分数定为高危因为异常检测单点判断误报率高必须让后续的关联层验证。参数说明anomaly_threshold初始值我建议设 0.7然后根据离线回放数据来调。如果你的网络是金融内网宁可信多一点阈值降到 0.6如果是对外互联网站流量杂阈值可以先从 0.85 起步。同时这个阈值最好做成动态的按小时加载不同基线避免白天晚上一个标准。还有一个容易被忽略的细节两级引擎之间要传的是经过预处理的特征数据不是原始包。误用检测可以只看载荷里的几个字节异常检测则需要统计连接时长、包数、字节比等全量流特征。所以代码里的flow对象要先在建表阶段算好这些字段再送进两个引擎否则会产生不必要的重复解析开销。4. 照着这个架构落地一个演示系统工作流程与实现要点这一章把 PDF 里的“工作流程”和“功能模块”翻译成可以动手落地的实现步骤。你可以把它当成一个单机演示版的蓝图。4.1 工作流程三步走收集、分析、响应PDF 在 1.4 节把工作流程总结成三步信息收集、传感器分析、控制中心处理。这三步放到现在的技术栈里对应的组件是采集器、消息队列、检测引擎、响应执行器。下面我把每一步拆开信息收集从交换机镜像口抓网包同时把主机日志、用户行为日志汇总到统一的消息队列。常见的做法是用 Kafka 或者 Redis Stream 做缓冲这样检测引擎消费数据时不会因为流量突刺而丢消息。检测分析检测引擎消费队列里的数据先做误用匹配再做异常打分。生成预警消息发到alert_event主题。响应处理策略执行代理订阅alert_event按预警级别找对应的动作执行邮件通知或防火墙封禁。消息队列本身可以大大降低模块耦合。我见过不少演示系统直接把三个模块写在同一个 Python 文件里通过函数调用互相串。那种方式只能说明功能不能说明架构。建议至少用线程加阻塞队列把三个模块隔离开每个模块独立处理自己的输入输出。这里给出一份主题设计表按这个建队列后面扩展多探针时不用改代码主题名生产者消费者消息内容raw_net探测代理抓包模块检测引擎五元组 载荷摘要raw_log主机日志采集器检测引擎登录、进程事件alert_event检测引擎监视代理命中信息 置信度resp_cmd监视代理策略执行代理动作指令 目标IP4.2 消息映射和二维链表数据从网卡到判定PDF 里有一句很古早的表述“通过消息映射机制调用库函数构造一个二维链表。”这是 Windows 时代常用的设计词汇放到现在对应的就是事件分发和连接状态表。消息映射机制现在可以用事件循环或者线程池调度来理解二维链表其实就是按五元组索引的流表。我建议你用哈希表代替链表原因只有一个查找复杂度从 O(n) 变成 O(1)。下面是一个简化但可运行的流表实现import time class FlowTable: TIMEOUT {tcp: 120, udp: 60} def __init__(self): self.flows {} def key_of(self, pkt): return (pkt[src_ip], pkt[src_port], pkt[dst_ip], pkt[dst_port], pkt[proto]) def update(self, pkt): k self.key_of(pkt) now time.time() flow self.flows.get(k) if flow is None: flow { state: NEW, first_seen: now, last_seen: now, packets: 0, bytes: 0, proto: pkt[proto], } self.flows[k] flow flow[packets] 1 flow[bytes] pkt[len] flow[last_seen] now if pkt.get(flags) FIN: flow[state] FINISHED return flow def cleanup(self, now): stale [] for k, f in self.flows.items(): t self.TIMEOUT.get(f[proto], 60) if now - f[last_seen] t: stale.append(k) for k in stale: del self.flows[k]逻辑说明update方法负责给一条流累计包数和字节数并维护状态。cleanup是回收超时流不然哈希表会无限膨胀。这个表就是监听代理判断“是否横向扫描”的数据来源比如发现同一个src_ip在短时间内在流表里创建了大量键那大概率在扫描。参数说明TCP 超时设为 120 秒是因为正常 TCP 连接空闲超过两分钟基本可以放弃跟踪UDP 用 60 秒因为它无状态不适合长时间保留。清理操作不需要每次收包都做建议每处理 1000 个包调用一次或者每 5 秒做一次定时清理。峰值流量下哈希表本身不是瓶颈真正的瓶颈在垃圾回收和锁竞争。如果你用 Go注意流表的读写要加分段锁如果依然用字典那就用多个分片桶按五元组的 hash 值取模分布到不同桶里把锁粒度降下来。4.3 关键参数与配置清单落地时你需要一份可以照抄的参数表。下面是我自己调过几轮后给出的推荐值适用于百兆级流量规模的演示环境模块参数推荐值说明探测代理snaplen65535抓满整帧避免截断探测代理抓包缓冲区2 GB大流量下缓解用户态拷贝压力探测代理工作线程数物理核数性能不足时优先加线程监视代理关联窗口60 秒依据告警间隔 P90 动态调整监视代理聚合阈值5 次/窗口低于则忽略减少噪点策略执行代理自动阻断开关默认关闭先手动验证再放开全局系统时间同步NTP必须否则关联全乱调参顺序有个基本原则先保证不丢包再谈检测准确率。你上线第一周不要急着调阈值先看探测代理的抓包丢包率指标和 CPU 占用。如果丢包后面一切检测都是空中楼阁。第二周再开始收集告警数据观察误报密度。第三周才考虑调整关联窗口和异常阈值。这样一步步来系统才是可控的。5. 避坑与排查误报、漏报、性能黑洞这三座山怎么翻这一章把我在实际搭建这类系统时踩过的坑集中写出来。每一条都是“现象 → 原因 → 解决”的结构你可以直接拿来做排查手册。5.1 性能黑洞抓包丢包与正则回溯先看最常见的性能翻车。现象IDS 接入千兆链路后CPU 直接 100%tcpdump显示捕获丢包率超过 30%关键攻击流量经常漏掉告警数量远低于预期。原因单线程抓包加逐包全规则匹配处理速度低于线速。网卡接收队列一旦溢出内核就会直接丢包而丢掉的很可能就是高负载时进来的攻击包。解决一是把监听网卡换成支持多队列的高性能型号每个队列绑定一个 CPU 核用 RFS 让处理线程尽量在本核收包二是引入 DPDK 或 PF_RING走轮询模式绕过内核网络栈的拷贝开销三是如果硬件暂时不能动就把检测逻辑拆成预处理和匹配两段先用长度、协议、端口做快速过滤只有命中候选的包才进重量级特征匹配。我实践下来第三点的优化空间往往是最大的。再补充一个正则回溯的坑。现象规则集里只要有几条pcre规则CPU 就飙到 70% 以上单条连接的检测延迟肉眼可见。原因正则引擎在遇到.*和嵌套分组时会产生大量回溯而每个数据包进来都要跑一遍全规则集耗时就跟着翻倍。解决先做字节级预匹配把正则里确定的字符串子串抽出来作为content条件只有子串命中才进入pcre全匹配同时对协议做分流比如 HTTP 规则只让 80/8080 端口流量去跑DNS 规则只让 UDP 53 流量去跑。我把这套方案改完CPU 占用下降了 60%而且漏报没有上升。5.2 误报与漏报阈值玄学与特征库版本误报是异常检测上线初期的必经之路。现象异常检测模块运行第一天邮箱被“非工作时间登录”“下载文件异常”刷屏管理员彻底麻痹最后把告警邮件当垃圾邮件处理。原因没有建立基线就启用了默认阈值把夜间正常运维脚本、自动备份任务全部判定成异常。统计模型再厉害没有适应你的业务分布也是瞎抓。解决先以纯记录模式跑满两周把正常业务的特征分布统计出来。我习惯按小时分箱分别计算每个特征的第 99 百分位作为阈值。同时维护一张业务白名单把已知的定时任务、备份工具的源特征直接跳过。这样处理之后误报率从刚上线的 60% 以上降到了 10% 以内。漏报则是误用检测升级时最容易发生的。现象升级了特征库之后原来能抓到的 SQL 注入攻击突然一条都报不出来了。原因新旧规则混装后部分规则 ID 重复后加载的规则把前面规则的content覆盖了或者新版规则集里加了一条排除规则恰好把你的自定义规则屏蔽掉。解决每次升级前先对旧规则库做快照用脚本比较规则 ID 和 content 的差异。然后离线准备一批攻击流量 pcap分别跑旧库和新库对比命中结果。确认新库覆盖了旧库所有检测点才允许发布到生产。我从那次以后再也不敢直接cp覆盖线上规则文件了。5.3 分布式协同时钟偏差与响应误杀分布式部署最容易出现“看起来没问题实际上没配合”的场面。现象多个探测代理上报了同一攻击源的扫描预警但监视代理始终没法把它们关联成一条事件聚合阈值永远凑不齐与此同时某个中危告警却在半夜自动封禁了云厂商的正常接口 IP。原因各探测代理的服务器时钟没有同步时间戳差了 30 秒以上60 秒的关联窗口内自然凑不齐目标次数另外策略执行代理的自动阻断级别设置得太低把中危告警也配成了自动执行封禁而那条告警其实是业务侧的正常调用被误判。解决强制所有探测代理、监视代理、策略执行代理都用同一套 NTP 服务消息统一用 UTC 毫秒时间戳避免不同时区的换算错乱关联窗口的大小要在确认了正常告警间隔之后再加 20% 余量不能拍脑袋。响应策略改成默认 only-notify只有“高危且连续确认 3 次以上”的条件才允许自动阻断并且把核心业务 IP 段加入白名单。这件事之后我每次搭分布式系统第一件事就是先验证各节点date输出的一致性再谈后续配置。6. 日志与验证技巧用 Snort 规则集做离线回放量化检测率6.1 离线回放给检测系统立一面照妖镜你改一个阈值、加一条规则到底有没有用不能靠感觉。我建立了一套离线回放机制准备一段包含攻击流量的 pcap先用 Snort 的社区规则集跑一遍当作基准再让自己写的检测逻辑跑同一段 pcap最后比对两次告警结果。Snort 规则集不一定要兼容你的系统但它是一份现成的基础基线能帮你快速暴露“升级后漏掉老攻击”这类回归问题。# 用固定 pcap 跑 Snort 基准输出 console 格式告警 snort -r attack.pcap -A cm -c /etc/snort/snort.conf -l ./snort_log # 自己的检测系统跑同一份 pcap统一输出为 JSON python3 ids_demo.py -f attack.pcap -o my_alerts.json注意Snort 不同版本的-A输出格式有差异不要只比较告警条数要先把两边告警解析成统一字段时间戳、源 IP、目的 IP、规则 SID/ID。如果两边的时间戳存在固定偏移先做对齐否则后续混淆矩阵全是乱。6.2 混淆矩阵用 TP、FP、FN 说话比对告警时我写一个下面这样的 Python 脚本输出精确率和召回率import json with open(snort_alerts.json) as f: baseline json.load(f) with open(my_alerts.json) as f: mine json.load(f) def alert_key(alert): # 用源、目的、规则ID作为去重键 return (alert[src_ip], alert[dst_ip], alert[sid]) baseline_set {alert_key(a) for a in baseline} mine_set {alert_key(a) for a in mine} tp len(baseline_set mine_set) # 两边都报正确检出 fp len(mine_set - baseline_set) # 只我方报疑似误报 fn len(baseline_set - mine_set) # 只基准报我方漏报 precision tp / (tp fp) recall tp / (tp fn) print(fTP{tp}, FP{fp}, FN{fn}) print(fprecision{precision:.2f}, recall{recall:.2f})逻辑说明tp是两边都命中的告警数fp是只有自己系统报出来而 Snort 没报的这里面可能包含真正的误报也可能说明你比 Snort 更能发现攻击fn是 Snort 报了而你漏掉的这是要优先查的。比对时允许 5 秒左右的时间偏移因为两个引擎处理同一 pcap 的速度不同时间戳不一定严格一致。参数说明如果你自己的系统没有sid概念可以用规则名的 hash 替代但要注意同一攻击可能在一个 pcap 里多次触发所以去重键里最好带src_ip和dst_ip把重复条数收敛掉。我早期搭 IDS 的时候总喜欢堆特征觉得规则越多越安全结果一上线就是一场玄学误报频频根本没有底气跟领导解释。直到我把离线回放变成强制动作每次改特征库或调阈值都跑一遍混淆矩阵才把误报率从 30% 压到 5% 以下也再没出现过“升级后漏掉老攻击”的翻车现场。这个习惯后来变成了我所有检测项目的固定入口。希望帮到你。本文还有配套的精品资源点击获取
返回列表