suricata中command的实现分析和自定义命令方法

news2024/9/22 1:37:31

suricata提供了suricatasc这个工具用来与其进行通信,比如修改规则文件后,通知suricata重新加载规则,就可以通过suricatasc下发重新加载规则命令,suricatasc和suricata通过unix socket进行通信,unix socke好处就是不占用网络端口,避免对外暴露端口,性能也非常高。

下面,我们来看一下suricata command这一块的代码实现以及如何自定义一个command命令。

1、suricatasc目前支持的命令如下:

command-list:列出可用命令

shutdown:关闭Suricata

iface-list:列出Suricata嗅探数据包的接口

iface-stat:接口的列表统计信息

help:命令列表的别名

version:显示Suricata的版本

uptime:显示Suricata的正常运行时间

running-mode:显示运行模式(workers,autofp,simple)

capture-mode:使用的显示捕获系统

conf-get:获取配置项(参见下面的示例)

dump-counters:dump Suricata的性能指标

reopen-log-files:重新打开日志文件(在外部日志轮换后运行)

ruleset-reload-rules:重新加载规则集并等待完成

ruleset-reload-nonblocking:重新加载规则集,无需等待即可继续

ruleset-reload-time:上次重新加载的返回时间

ruleset-stats:显示已加载和失败的规则数

ruleset-failed-rules:显示失败规则列表

memcap-set:更新指定项的memcap值

memcap-show:显示指定项目的memcap值

memcap-list:列出所有可用的memcap值

reload-rules: ruleset-reload-rules的别名

register-tenant-handler:注册指定映射的租户处理程序

unregister-tenant-handler:注销指定映射的租户处理程序

register-tenant:  注册指定ID和文件名的租户

unregister-tenant: 注销指定ID和文件名的租户

reload-tenant: 重新加载指定ID和文件名的租户

add-hostbit: 在指定位名和到期时间的主机IP上添加

hostbit remove-hostbit: 在指定位名的主机IP上删除hostbit

list-hostbit: 列出特定主机的hostbit

suricatasc的使用示例如下:

也可以以非交互模式使用,例如suricatasc -c version,suricatasc -c iface-list

2、suricatasc相关源码分析:

unix-socket的初始化和命令注册相关代码的调用关系如下:

main  -->SuricataMain    -->PostConfLoadedSetup       -->RegisterAllModules         -->TmModuleUnixManagerRegister(注册UnixManager模块)    -->UnixManagerThreadSpawnNonRunmode(不是unix-socket运行模式才执行)       -->UnixManagerInit          -->UnixNew(创建unix-socket)          -->UnixManagerRegisterCommand(注册系统级的cmd)       -->UnixManagerRegisterCommand(注册网口相关的cmd)       -->UnixManagerThreadSpawn          -->TmThreadCreateCmdThreadByName             -->TmThreadCreate(创建ThreadVars线程变量)             -->TmSlotSetFuncAppend(把UnixManager模块加入到线程的slot中)          -->TmThreadSpawn(创建command线程,线程入口为TmThreadsManagement)             -->TmThreadsManagement                 -->s->SlotThreadInit(即UnixManagerThreadInit函数)                 -->s->Management (即UnixManager函数)

UnixManagerRegisterCommand函数将命令的关键字、命令执行函数和是否需要参数组成一个Command结构体,挂在全局变量UnixCommand command的commands链表上。

下面看一下command处理函数UnixManager的处理逻辑,UnixManager循环调用UnixMain,传入前面说的command链表,然后就是socket那一套select、accept和recv的逻辑,函数调用栈如下:

UnixManager  -->UnixMain    -->UnixCommandRun      -->UnixCommandExecute        -->lcmd->Func(对应的命令执行函数)

UnixCommandExecute中command传入的参数为json串,无参数的格式为:{"command": "iface-list"},如果有参数,格式为:{"command": "iface-stat","arguments": {"iface": "0000:0b:00.0"}},然后根据关键字"iface-list"找到注册的对应的命令节点Command *lcmd,然后调用lcmd->Func,即对应命令的执行函数LiveDeviceIfaceList进行处理。在LiveDeviceIfaceList中,将要返回的内容以json格式填充到第二个参数json_t *answer中即可。

suricatasc是一个用 python写的unix socket的客户端,就是将用户输入的命令发给suricata,将返回的结果回显出来。

3、如何自定义一个suricata命令:

1)注册命令:

在UnixManagerThreadSpawnNonRunmode函数中注册命令"just-test":   UnixManagerRegisterCommand("just-test", Justtest, NULL, 0);

2) 命令执行函数Justtest:

TmEcode Justtest(json_t *cmd, json_t *answer, void *data)
{
    SCEnter();
    json_t *jdata;
    int i = 0;

    jdata = json_object();
    if (jdata == NULL) {
        json_object_set_new(answer, "message",
                            json_string("internal error at json object creation"));
        return TM_ECODE_FAILED;
    }

    json_object_set_new(jdata, "desc", json_string("Just test command"));  //回应一个字符串Just test command
    json_object_set_new(answer, "message", jdata);
    SCReturnInt(TM_ECODE_OK);
}

3)在suricatasc.py中添加命令:

在SuricataSC函数self.fn_commands数组中添加"just-test"命令(如果是有参数的,得在specs.py中添加参数以及个数说明)

4)重新编译suricata代码

5)启动suricata,执行suricatasc的just-test命令:

        好了,关于suricata中使用unix-socket实现的command的代码分析以及自定义命令的方法,就讲到这里了。

        有问题的朋友,可以进网络技术开发交流群提问(先加我微信,备注加群)。喜欢文章内容的朋友,记得加个关注哦~~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/547540.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

libevent高并发网络编程 - 06_基于libevent的C++线程池实现

文章目录 1 功能简介线程池的初始化线程池执行流程 2 线程池类的设计线程类XThreadXThread.hXThread.cpp 线程池类XThreadPoolXThreadPool.hXThreadPool.cpp 任务基类taskXTask.h 3 自定义任务的例子自定义任务类ServerCMDServerCMD.hServerCMD.cpp 测试程序运行效果 1 功能简介…

华为机试(JAVA)真题Od【A卷+B卷】2023

目录 华为OD机试是什么?华为OD面试流程?华为OD机试通过率高吗?华为OD薪资待遇?华为OD晋升空间? 大家好,我是哪吒。 本专栏包含了最新最全的华为OD机试真题,有详细的分析和Java代码解答。已帮助…

【信息安全案例】——信息内容安全(学习笔记)

📖 前言:在数字化时代,信息内容安全问题越来越引起人们的关注。信息内容安全主要包括对数据的机密性、完整性和可用性的保护,以及对用户隐私的保护等方面。针对信息内容安全的威胁,采取科学有效的安全措施和技术手段至…

每日学术速递5.20

CV - 计算机视觉 | ML - 机器学习 | RL - 强化学习 | NLP 自然语言处理 Subjects: cs.CV 1.Improved baselines for vision-language pre-training 标题:改进视觉语言预训练的基线 作者:Enrico Fini, Pietro Astolfi, Adriana Romero-Soriano, Jak…

10-《简单算法》

10-《简单算法》 一、时间复杂度二、空间复杂度三、排序算法1.比较排序1.1冒泡排序:1.2选择排序:1.3插入排序:1.4归并排序(非常重要)1.5快速排序(非常重要)1.6堆排序1.7排序算法稳定性 2.线性排序2.1桶排序2.2计数排序…

数据结构初阶(3)(链表:链表的基本概念、链表的类型、单向不带头非循环链表的实现、链表的优缺点 )

接上次博客:和数组处理有关的一些OJ题;ArrayList 实现简单的洗牌算法(JAVA)(ArrayList)_di-Dora的博客-CSDN博客 目录 链表的基本概念 链表的类型 单向、不带头、非循环链表的实现 遍历链表并打印节点值: 在链…

uni-app小程序uni.navigateBack返回上一个页面并传递参数.返回上个页面并刷新

返回上一个打开的页面并传递一个参数。有种办法就是使用 假如从B页面返回A页面: var pages getCurrentPages(); var prevPage pages[pages.length - 2]; //上一个页面 prevPage.setData({ mdata:1 })经过测试,在uni.app中使用B页面使用setData设置A页…

【Spring篇】AOP案例

🍓系列专栏:Spring系列专栏 🍉个人主页:个人主页 一、案例:业务层接口执行效率 1.需求分析 这个需求也比较简单,前面我们在介绍 AOP 的时候已经演示过 : 需求 : 任意业务层接口执行均可显示其执行效率(执行时长&…

如何选对适合你的FPGA?快速掌握选型技巧!

FPGA厂家和芯片型号众多,在开发过程中,特别是新产品新项目时,都会面临FPGA选型的问题。 如何选择出适合的FPGA型号非常关键,需要评估需求、功能、成本、存储器、高速收发器等各种因素,选出性能与成本平衡的FPGA芯片。…

从零玩转设计模式之外观模式-waiguanmos

title: 从零玩转设计模式之外观模式 date: 2022-12-12 15:49:05.322 updated: 2022-12-23 15:34:40.394 url: https://www.yby6.com/archives/waiguanmos categories: - 设计模式 tags: - 设计模式 什么是外观模式 外观模式是一种软件设计模式,它提供了一种将多个…

进阶必看:高速PCB Layout设计的技术指南

当今电子行业中,高速PCB电路越来越广泛,已成为当代PCB工程师的重要技能,而在高速PCB电路中,高速PCB Layout设计是一项高难度高技术的工作,其设计质量直接关系到电路的性能。所以做好PCB Layout设计是非常非常重要的。 …

Boost开发指南-1.2progress_display

Progress_display progress_display可以在控制台上显示程序的执行进度,如果程序执行很耗费时间,那么它能够提供一个友好的用户界面,不至于让用户在等待中失去耐心。 progress_display位于名字空间boost,为了使用progress_displa…

内网自建代理ChatGPT

使用GPT比较频繁,一开始翻墙还能接受,但是用美国节点访问其他国外网站,确实比较麻烦。因此决定自己转发一个出来。 一、获取OpenAI授权密钥 首先,进入platform.openai.com-Personal-View API keys 不过OpenAI的key并不是免费的&…

VMware虚拟机三种网络模式详解之Bridged(桥接模式)

VMware虚拟机三种网络模式详解 Bridged(桥接模式) 由于Linux目前很热门,越来越多的人在学习Linux,但是买一台服务放家里来学习,实在是很浪费。那么如何解决这个问题?虚拟机软件是很好的选择,常…

登高作业安全带穿戴识别系统 yolov5

登高作业安全带穿戴识别系统通过yolov5python网络框架模型技术,登高作业安全带穿戴识别算法模型实现对登高作业人员是否穿戴安全带进行监测并及时发出警报。YOLO系列算法是一类典型的one-stage目标检测算法,其利用anchor box将分类与目标定位的回归问题结…

前端web入门-HTML-day02

(创作不易,感谢有你,你的支持,就是我前行的最大动力,如果看完对你有帮助,请留下您的足迹) 目录 列表 无序列表 有序列表 定义列表 表格 基本使用 合并单元格 跨列合并 跨行合并 表单 input …

网络安全里主要的岗位有哪些?小白如何快速入门学习黑客?

入门Web安全、安卓安全、二进制安全、工控安全还是智能硬件安全等等,每个不同的领域要掌握的技能也不同。 当然入门Web安全相对难度较低,也是很多人的首选。主要还是看自己的兴趣方向吧。 本文就以下几个问题来说明网络安全大致学习过程👇 网…

软件设计师 数据库刷题项并包含知识点总结

**两级映像 有概念模式和内模式跟物理独立性相关,有外模式和概念模式跟逻辑独立性相关 ** 属性列就是RS共同拥有的ABC,一般去除后面的,所以就只有前面三个ABC,元组就是有没有自然连接成功的,就是R.AS.A R.BS.B… 选项里…

[人工智能原理]

软件工程 定义 采用工程概念、原理、技术、方法来开发、维护软件,把经过时间考验而证明正确的管理技术和当前能够得到的最好技术方法结合起来,经济开发出高质量软件并有效的维护 基本目标 目标 可用性 正确性 合算性 原则 采用适合的开发范型、开…

计算机操作系统(慕课版)第一章课后题答案

第一章 操作系统引论 一、简答题 1.在计算机系统上配置OS的目标是什么?作用表现在哪几个方面? 在计算机系统上配置OS,主要目标是实现:方便性、有效性、可扩充性和开放性; OS的作用主要表现在以下3个方面: 1…