suricata学习笔记1--初步认识
1、前言
最近工作需要对网站的关键字进行检测,找出敏感词。这个过程需要对报文进行收集、解码、检测和记录日志。当前只是简单实现功能,根据关键字进行简单的匹配,而没有进行关键字的语义分析。导致的结果就是JAVA可以匹配AV这个敏感关键字。报文检测这方面,开源项目已经做得非常好了,我所了解的有snort、suircata、bro,这三个都是非常优秀的IDS(入侵检测系统)。由于对bro没有深入了解,我们对比了snort和suricata,结合suricata的多线程和模块化,全面兼容snort规则,我们选用了suricata进行关键字检测。
刚开始接触suricata的时候,压根不知道这个单词怎么发音,于是乎赶紧再词典上查一下。suircata是一款支持IDS、IPS和NSM的系统。关于suircata的详细介绍可以参考官网:https://suricata-ids.org/。
备注:
IDS:英文“Intrusion Detection Systems”的缩写,中文意思是“入侵检测系统”。依照一定的安全策略,通过软、硬件,对网络、系统的运行状况进行监视,尽可能发现各种攻击企图、攻击行为或者攻击结果,以保证网络系统资源的机密性、完整性和可用性。
IPS是英文“Intrusion Prevention System”的缩写,中文意思是入侵防御系统。随着网络攻击技术的不断提高和网络安全漏洞的不断发现,传统防火墙技术加传统IDS的技术,已经无法应对一些安全威胁。在这种情况下,IPS技术应运而生,IPS技术可以深度感知并检测流经的数据流量,对恶意报文进行丢弃以阻断攻击,对滥用报文进行限流以保护网络带宽资源。
NSM:英文“network security monitoring”的缩写,中文意思是“网络安全监控”。
2、总体架构
报文检测系统通常四大部分,报文获取、报文解码、报文检测、日志记录;suricata不同的功能安装模块划分,一个模块的输出是另一个模块的输入,suricata通过线程将模块串联起来。

接下来以IDS为例来说明suircata的线程与模块之间是如何连接起来的。
首先注册runmods,运行方式指定suricata获取报文的方式,例如libpcap、netmap、af-packet等,代码如下图所示:

然后再根据设置suricata的工作模式,找到对应获取报文的处理模块。suircata默认是通过af-packet mmap获取报文,然后调用获取报文模块当然入口函数,
入口函数中函数添加了解码模块、流处理模块(检测报文)、日志处理模块。通过slot链条安装注册顺序串联起来。每一个线程都包含一个slot的链表,每个结点都悬挂着不同的模块,程序执行的时候会遍历slot链表,按照加入链表的熟悉执行模块。

创建线程,并将模块添加到slot链表过程代码如下所示:
/* create the threads */
for (thread = ; thread < threads_count; thread++) {
char tname[TM_THREAD_NAME_MAX];
ThreadVars *tv = NULL;
TmModule *tm_module = NULL;
const char *visual_devname = LiveGetShortName(live_dev); if (single_mode) {
snprintf(tname, sizeof(tname), "%s#01-%s", thread_name, visual_devname);
} else {
snprintf(tname, sizeof(tname), "%s#%02d-%s", thread_name,
thread+, visual_devname);
}
tv = TmThreadCreatePacketHandler(tname,
"packetpool", "packetpool",
"packetpool", "packetpool",
"pktacqloop");
if (tv == NULL) {
SCLogError(SC_ERR_THREAD_CREATE, "TmThreadsCreate failed");
exit(EXIT_FAILURE);
} //添加收包模块
tm_module = TmModuleGetByName(recv_mod_name);
if (tm_module == NULL) {
SCLogError(SC_ERR_INVALID_VALUE, "TmModuleGetByName failed for %s", recv_mod_name);
exit(EXIT_FAILURE);
}
TmSlotSetFuncAppend(tv, tm_module, aconf);
//添加解包模块
tm_module = TmModuleGetByName(decode_mod_name);
if (tm_module == NULL) {
SCLogError(SC_ERR_INVALID_VALUE, "TmModuleGetByName %s failed", decode_mod_name);
exit(EXIT_FAILURE);
}
TmSlotSetFuncAppend(tv, tm_module, NULL);
//添加流处理模块,用于检测报文
tm_module = TmModuleGetByName("FlowWorker");
if (tm_module == NULL) {
SCLogError(SC_ERR_RUNMODE, "TmModuleGetByName for FlowWorker failed");
exit(EXIT_FAILURE);
}
TmSlotSetFuncAppend(tv, tm_module, NULL);
//添加阻断模块
tm_module = TmModuleGetByName("RespondReject");
if (tm_module == NULL) {
SCLogError(SC_ERR_RUNMODE, "TmModuleGetByName RespondReject failed");
exit(EXIT_FAILURE);
}
TmSlotSetFuncAppend(tv, tm_module, NULL);
//添加日志处理模块
SetupOutputs(tv); TmThreadSetCPU(tv, WORKER_CPU_SET); if (TmThreadSpawn(tv) != TM_ECODE_OK) {
SCLogError(SC_ERR_THREAD_SPAWN, "TmThreadSpawn failed");
exit(EXIT_FAILURE);
}
}
在AF-PACKET工作模式下提供三种工作方式:

关于工作方式可以参考:http://blog.csdn.net/firedb/article/details/7581853。
目前我只用过worker工作模式,整个流程通过一个线程来处理。
3、总结
这是目前对suricata的一个整体的认识,接下来认真研究每个模块之间是如何交互。需要深入学习suricata是如何收集报文,如何将收集的报文传递给解码模块,解码模块做哪些工作,输出是什么。
suricata各模块功能:
Receive:从NFQUEUE中接收数据包,并将封装在Packet结构中,然后放入下一个缓冲区。
Decode:对数据包进行解码,主要是对数据包头部信息进行分析并保存在Packet结构中。
StreamTCP:对数据包进行TCP流重组。
Detect:检测数据包是否包含入侵行为。
Verdict:对检测后的数据包进行判定,并将判定结果告诉内核(通过ipq_set_verdict函数),方便内核对数据包进行接收、丢弃等处理。
RespondReject:通过libnet对那些要执行Reject操作的数据包进行相应的回应。
suricata学习笔记1--初步认识的更多相关文章
- Android_Mars学习笔记_S01_001activity初步
一.activity初步 1.程序启动会先读配置文件AndroidManifest.xml找activity 2.activity会在onCreate方法中读取activity_main.xml文件, ...
- Python学习笔记--语音处理初步
语音处理最基础的部分就是如何对音频文件进行处理. 声音的物理意义:声音是一种纵波,纵波是质点的振动方向与传播方向同轴的波.如敲锣时,锣的振动方向与波的传播方向就是一致的,所以声波是纵波.纵波是波动的一 ...
- 0034 Java学习笔记-反射-初步2-操作对象
通过反射创建对象 通过反射创建对象有两种方式,一种通过Class对象的newInstance()方法,一种是获取到Class对象的Constructor后,再调用newInstance()方法,前者要 ...
- 0033 Java学习笔记-反射-初步1
先看看通过反射能干嘛 示例:修改对象的private实例变量 package testpack; import java.lang.reflect.Field; public class Test1 ...
- HBASE学习笔记-初步印象
HBASE概念: HBASE是一个分布式架构的数据库,通过对数据进行多层的分块打散储存.从而改写传统数据库的储存能力和读取速度. HBASE的集群服务器: HBASE的集群主要分为Zookeeper集 ...
- ANDROID_MARS学习笔记_S01_003layout初步
一.layout介绍 二.测试linear_layout1.activity_main.xml <?xml version="1.0" encoding="utf- ...
- 学习笔记<4>初步控件布局
一.控件布局基本概念 指控制控件在Activity当中的位置.大小.颜色以及其他控件样式属性 二.控件布局两种方法 1.使用布局文件完成控件布局(eclipse可视化拖拽控件实现) 2.在JAVA代码 ...
- Oracle学习笔记_01_SQL初步
1.分类 SQL语句分为以下三种类型: DML: Data Manipulation Language 数据操纵语言 DDL: Data Definition Languag ...
- 0035 Java学习笔记-注解
什么是注解 注解可以看作类的第6大要素(成员变量.构造器.方法.代码块.内部类) 注解有点像修饰符,可以修饰一些程序要素:类.接口.变量.方法.局部变量等等 注解要和对应的配套工具(APT:Annot ...
随机推荐
- TexturePacker压缩png的命令
压缩png效果最好的当然是TinyPNG这种神器了,不过一般情况下TexturePacker压缩出来的也基本上能达到效果. 你需要先安装TP(TexturePacker的简称,以下TP无特殊说明均指T ...
- tomcat文件服务配置
<Host name="localhost" appBase="" unpackWARs="true" auto ...
- Moccakids-Tangram Puzzle 限免啦!
圣诞前上线的App,Tangram Puzzle 限免,大家去下载玩玩. 介绍网站:http://www.mokamisu.com/ App Store:https://itunes.apple.co ...
- HTTP状态码(HTTP Status Code)及常用场景
常见的状态码: HTTP: Status 200 – 服务器成功返回网页HTTP: Status 3xx - 表示要完成请求,需要进一步操作. 通常,这些状态代码用来重定向HTTP: Status 4 ...
- eclipse下开发winform的插件WindowBuilder
可以开发swt,xwt等c/s应用 WindowBuilder插件可以在MarketPlace下载到,Help->Eclipse MarketPlace 可视化开发界面:
- SVO实时全局光照:Sparse Voxel Octree based Global Illumination (SVO GI)
功能已实现,初步集成进来,暂未进行重度优化.但GI的效果已很明显.这里特地给出了开启实时GI前后的效果对比,比对场景如下:1.只有直接光照(方向光源)的场景.2在直接光照(方向光源)基础上开启了实时G ...
- 解决Visual Studio 调试时候不能直接访问.json后缀文件的问题
Web.config中作如下配置: <system.webServer> <staticContent> <mimeMap fileExtension=".js ...
- ambari初始化登陆账号/密码假如不是admin/admin
如题:通常软件初始化密码都是admin: 但是hortonworks就突然傻逼了,居然不这样搞.(可能知道一些开发者不看官网文档,就特意弄成这样.正如我) 我上网搜了5分钟.感觉网上应该没有这样的资料 ...
- Enclosure POJ
0:Enclosure http://poj.openjudge.cn/challenge3/0/ 查看 提交 统计 提问 总时间限制: 1000ms 内存限制: 131072kB 描述 为了防止 ...
- Swift 正式开源, 包括 Swift 核心库和包管理器
Swift 正式开源!Swift 团队很高兴宣布 Swift 开始开源新篇章.自从苹果发布 Swfit 编程语言,就成为了历史上发展最快的编程语言之一.Swift 通过设计使得软件编写更加快速更加安全 ...