suricata源码之tag

tag是suricata提供的一个规则关键字,但是在suricata的说明文档,这里并没有给出关键字的解释,因为他是为了兼容snort规则而支持的一个关键字。

tag的字面含义就是标签的意思。通常来说当一个规则命中的时候,往往会去记录命中该规则报文的信息,如果想要按照个人需求记录更多的信息,比如记录该规则命中之后10秒内该条流上所有的报文信息或者命中之后10个上行报文信息,该怎么办呢?这其实就是tag关键字所能够提供的能力,即标记规则命中之后的指定流量信息,用于指导日志对这些流量进行输出,方便分析。

例如:

 alert tcp any any -> any 53 (sid:100; tag:session,10,seconds;)

上述规则表示的就sid为100的这条规则在命中之后,该条TCP流上10秒内的流量都需要记录。

tag关键字的基本格式如下:

tag:type, count, metric, direction;

type有如下两种:

  • 1,session,表示的是tag标记的是一个具体的流。
  • 2,host,表示tag标记的是IP地址,也就是跟当前匹配报文具有相同IP地址的报文上。

count表示基数。metric表示单位,可以是packets ,seconds ,bytes 。两者配合使用,即规则触发之后记录多长时间或者多少个报文,再或者是多少流量的数据。

direction可以是src ,dst ,exclusive 。其中当type为host类型的时候使用src,dst表示的是标记源,目的IP地址的报文。当type为session的时候使用exclusive,表示仅标记第一个匹配该规则的流,其他的流不标记。

下面从源码的角度看看tag的功能是如何实现的,包括tag关键字的解析,打标签,去标签以及在实现tag功能过程中用到的数据结构和方法思路。

tag规则解析

对应的函数为DetectTagSetup,最终会将解析之后的结果放入DetectTagData结构中,对应的就是前面tag格式中的几个字段内容。真正的解析函数为DetectTagParse,使用的是pcre,在suricata中多数关键字的解析都是这样实现的。有一点需要注意的是,SigMatchAppendSMToList在解析之后的规则加入的是DETECT_SM_LIST_TMATCH这个sm list。一般的非字符串匹配的规则加入的是DETECT_SM_LIST_MATCH中,通常是传输层以下的匹配,字符串匹配的规则加入的是DETECT_SM_LIST_PMATCH,通常是传输层以上的匹配,后置规则的匹配加入的是DETECT_SM_LIST_POSTMATCHDETECT_SM_LIST_TMATCH这个sm list专门用于tag的匹配。

tag打标签

tag作用的type要么是流要么是一类的IP地址。标签中的数据包括要匹配的流量条件以及当前已经匹配的内容,即DetectTagDataEntry结构的内容。标签数据要和流或者报文进行关联,由于tag的内容并不是flow或则和packet的必选内容,而且完全依赖于规则。规则中有了tag规则,命中该规则之后才会有tag的数据与流或者packet进行关联,没有则则不需要关联。其出现的概率不大,直接放在flow或者packet结构中会浪费内存。因此suricata对于这类可可选的资源信息进行统一的抽象,将其命名为storage。这一块存储可以是tag信息,也可以是其他的信息。将这个storage与流或者报文进行关联即可。来看看tag是如何实现的:

在流表管理这篇文章中,提到在每条流申请的时候,每条流结构内存之后额外申请了一些指针的空间用于指向与这条流有关的数据内容。如果这条流命中的规则中包含tag,那么就会有一个指针指向tag数据的内存。流程如下:
1,数据包的后置匹配调用为DetectRunPostRules->PacketAlertFinalize->DetectTagMatch

由于DETECT_SM_LIST_TMATCH这个sm list只用于tag关键字,因此简单的搜索一下,可以发现tag规则的匹配是在DetectRunPostRules->PacketAlertFinalize即后置匹配函数中进行调用,如下代码:

if (s->sm_arrays[DETECT_SM_LIST_TMATCH] != NULL) {
                KEYWORD_PROFILING_SET_LIST(det_ctx, DETECT_SM_LIST_TMATCH);
                SigMatchData *smd = s->sm_arrays[DETECT_SM_LIST_TMATCH];
                while (1) {
                    /* tags are set only for alerts */
                    KEYWORD_PROFILING_START;
                    sigmatch_table[smd->type].Match(NULL, det_ctx, p, (Signature *)s, smd->ctx);
                    KEYWORD_PROFILING_END(det_ctx, smd->type, 1);
                    if (smd->is_last)
                        break;
                    smd++;
                }
            }

其中match的匹配函数是DetectTagMatch

2,要明白的是tag关键字的目的并不是去匹配,而是给流或者packet包打上标志,以流为例说明打标签的过程。

DetectTagMatch->TagFlowAdd中:

  • 1,FlowGetStorageById查看该流后面有没有tag数据。
  • 2,如果有就更新与这条流有关的tag存储的数据,如果该条流有关的tag有多个,需要遍历。
  • 3,如果是刚刚匹配上,这个时候还没有tag数据,则需要DetectTagDataCopy新建这样的tag数据,并通过FlowSetStorageById函数让流结构体后面的指针指向此处。这样同一条流上的下个报文来的时候就能通过流中的指针指向找到tag数据并更新。

3,type为session的类型的tag打在流上,那么type为host的标签打在哪个上面呢?

因为流是全局的hash表,当packet过来的时候很容易根据五元组找到该流的内存位置,然后找到tag。同样的当packet过来的时候,要想找到host地址对应的tag数据,则也需要一个全局的host表,根据packet的源或者目的IP找到host的内存位置,然后找到tag。那么host表完全可以参照flow表的设计,用hash表来组织,用IP地址来进行索引。如果你看过我前面文章对于流表的解释,相信host表也很容易理解。host表的目的也很简单,为了支持对于像tag这类作用在IP地址上的规则,而额外建立的用于索引IP地址相关数据之用。采用同样设计的这种全局表还包括Defrag表,IPPair表等,这几个全局表都存在着时效性的问题,都需要老化,老化的操作是在FlowManager之中,这几个表将在后续单独的分析。

tag去标签

由于tag标签也是具有时效性的,要么是时间多少秒,要么是多少个packets包,要么是多少个字节的数据。因此在这些条件达到之后,tag数据也就失去了意义,需要进行回收处理,该回收处理的过程就是PacketAlertFinalize->TagHandlePacket。可以看到无论在TagHandlePacketFlow流tag的回收还是TagHandlePacketHost IP tag的回收。都是在达到限定条件之后,将tag的内存数据进行释放。

本文为CSDN村中少年原创文章,转载记得加上原创出处,博主链接这里

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
### 回答1: 我不是很了解Suricata代码分析,但我可以给你一些建议。你可以通过阅读Suricata官方文档,以及搜索博客和技术文章来了解Suricata源代码的相关内容。此外,你还可以加入相关的讨论组,与其他Suricata开发人员一起分享和交流经验。 ### 回答2: Suricata是一种自由开源的入侵检测和预防系统(IDS/IPS),其源码分析是对其实现原理和功能的深入理解和研究。 Suricata源码分析包括对其整体架构的研究,了解其模块和组件之间的关系,以及其各个模块的实现细节。其中,主要包括以下几个方面的内容: 1. 数据包解析:Suricata源码分析需要对其数据包解析模块进行深入研究,学习其对不同协议的解析方法和规则,了解具体的解析流程和实现细节。 2. 规则引擎:Suricata的规则引擎是其核心功能之一,对其源码进行分析需要了解规则引擎的设计思路和实现方式,包括规则的加载、匹配和执行等过程。 3. 异步处理:Suricata使用异步处理机制来提高性能,对其源码进行分析需要深入研究其异步处理框架和相关模块,学习其实现方式和优化技巧。 4. 日志和报告:Suricata生成的日志和报告对于事件追踪和安全分析非常重要,对其源码进行分析需要了解其日志和报告模块的实现细节,包括日志格式、输出方式和性能优化等。 通过对Suricata源码的深入分析,可以进一步了解其内部机制和工作原理,掌握其使用方法和扩展开发的技巧,以提高系统的安全性和性能。同时,源码分析也是学习和贡献开源项目的重要途径,可以为项目的改进和发展做出积极的贡献。 ### 回答3: Suricata是一种高性能的开源入侵检测系统(IDS),具有实时流量分析和威胁检测能力。对Suricata源码进行分析有助于深入了解其工作原理和实现方式。 Suricata源码分析主要包括以下方面: 1. 系统架构和模块组成:Suricata源码采用模块化设计,由多个核心模块组成,如引擎模块、解析器模块、规则引擎模块等,这些模块协同工作实现了对流量的检测和分析。 2. 流量解析过程:Suricata源码中包含用于解析不同网络协议的代码,如TCP、UDP、HTTP等。通过对网络流量的深入解析,Suricata可以获取各个协议层的信息,以供后续的威胁检测和分析。 3. 规则引擎和特征匹配:Suricata源码实现了一套规则引擎,用于匹配流量中的特征,通过对已定义的规则进行匹配,Suricata可以识别出潜在的威胁。该规则引擎基于高效的匹配算法,如AC自动机等。 4. 威胁检测和日志记录:Suricata源码中包含了多种威胁检测算法和技术,如基于规则的检测、异步多线程处理等。通过对流量进行检测和分析,Suricata可以及时发现各种网络攻击和异常行为,并记录相关日志供后续分析。 5. 性能优化和扩展机制:Suricata源码中注重性能优化和扩展性,采用了多种技术手段,如多线程处理、流量解析的优化等,以提高系统的吞吐量和并发处理能力。此外,Suricata还提供了插件机制,可以方便地扩展其功能和特性。 通过对Suricata源码的分析,可以更好地了解其工作原理和实现方式,掌握其使用和开发技巧。这对于开发人员和网络安全专家来说都非常重要,可以帮助他们深入理解和应用Suricata这一强大的网络安全工具。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

村中少年

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值