Ubuntu上源码编译安装snort,使用snort进行数据检测和防御(简单示例)

前言

Snort是一个开源的网络入侵检测和防范系统(IDS/IPS),Snort是一个基于libpcap的轻量级网络入侵检测系统,它运行在一个"传感器(sensor)"主机上,监听网络数据。通过将网络数据与规则集进行模式匹配,Snort能够检测可能的入侵企图,或者使用SPADE插件,使用统计学方法对网络数据进行异常检测。

本次实验在Ubuntu上演示,如果需要在其他版本的Linux下进行,可以以本篇文章做参考,借助大模型将命令适配到不同的操作系统。

安装snort

1、更新apt源

bash 复制代码
sudo apt update

2、安装相关依赖

在Linux系统中,特别是使用基于Debian的发行版(如Ubuntu)时,可以通过apt install命令一次性安装多个软件包。这些软件包之间用空格分隔。

使用这种方式安装多个包可以节省时间,因为不需要为每个包单独执行一条命令。此外,它还可以确保所有相关的依赖项都同时更新到兼容的版本,从而避免潜在的版本冲突。

bash 复制代码
sudo apt install build-essential libpcap-dev libpcre3-dev libnet1-dev zlib1g-dev luajit hwloc libdnet-dev libdumbnet-dev bison flex liblzma-dev openssl libssl-dev pkg-config libhwloc-dev cmake cpputest libsqlite3-dev uuid-dev libcmocka-dev libnetfilter-queue-dev libmnl-dev autotools-dev libluajit-5.1-dev libunwind-dev

这条命令包含的依赖包比较对,以下对相关依赖包的简单说明

build-essential:这是一个编译环境的基础包,包含了编译器(如gcc)、构建工具(如make)和必要的库文件。它是编译大多数源代码包所必需的。

libpcap-dev:libpcap(Packet CAPture)是一个用于网络流量捕获的库。Snort需要它来分析网络数据包。
libpcre3-dev:PCRE(Perl Compatible Regular Expressions)是一个用于处理正则表达式的库。Snort使用PCRE来匹配规则中的模式。
libnet1-dev:libnet是一个用于构建和发送网络数据包的库。虽然Snort本身不直接发送数据包,但它可能依赖于这个库来处理或解析网络数据。
zlib1g-dev:zlib是一个用于数据压缩的库。Snort可能使用zlib来压缩或解压缩日志数据。
luajit:LuaJIT是一个高性能的Lua语言解释器。Snort可能使用Lua脚本来扩展其功能或处理规则。
hwloc、libhwloc-dev:hwloc(Hardware Locality)是一个用于检测和利用硬件拓扑信息的库。Snort可能使用hwloc来优化其性能或资源分配。
libdnet-dev、libdumbnet-dev:这些库提供了用于网络编程的函数和接口。Snort可能使用它们来处理网络数据包或进行网络操作。
bison、flex:Bison是一个语法分析器生成器,Flex是一个词法分析器生成器。它们通常用于编译器的开发,但也可能被Snort用于解析配置文件或规则。
liblzma-dev:LZMA是一个压缩算法,liblzma提供了该算法的库接口。Snort可能使用它来压缩数据。
openssl、libssl-dev:OpenSSL是一个强大的加密库,提供了SSL和TLS协议的实现。Snort可能使用OpenSSL来加密或解密网络数据。
pkg-config:pkg-config是一个帮助编译器和链接器找到库文件的工具。它简化了依赖库的管理。
cmake:CMake是一个跨平台的自动化构建系统。虽然Snort本身可能不使用CMake进行构建,但某些依赖项可能使用它。
cpputest:CppUTest是一个C/C++单元测试框架。虽然Snort的安装命令中包含了它,但Snort本身可能不直接使用它进行单元测试。这可能是为了开发或测试与Snort相关的其他组件。
libsqlite3-dev:SQLite是一个轻量级的嵌入式关系数据库管理系统。Snort可能使用SQLite来存储日志数据或配置信息。
uuid-dev:UUID(Universally Unique Identifier)库提供了生成全局唯一标识符的功能。Snort可能使用UUID来标识日志条目或会话。
libcmocka-dev:cmocka是一个用于C语言的轻量级单元测试框架。与CppUTest类似,它可能用于测试与Snort相关的组件。
libnetfilter-queue-dev、libmnl-dev:这些库提供了与Linux内核netfilter框架交互的接口。Snort可能使用它们来实现某些高级的网络过滤或处理功能。
autotools-dev:这是一组用于自动化构建和测试的工具和库的集合。它们可能用于构建Snort的某些依赖项。
libluajit-5.1-dev:这是LuaJIT 5.1的开发库。与luajit类似,它用于支持Lua脚本的执行。
libunwind-dev:libunwind是一个用于栈回溯和调试的库。Snort可能使用它来处理错误报告或调试信息。

3、安装Snort DAQ(数据采集库)

在Ubuntu上安装Snort时,安装DAQ(Data Acquisition Library,数据采集库)是一个重要的步骤。DAQ是Snort的一个组件,它提供了一个抽象层,用于调用不同的包捕获库。这个抽象层使得Snort能够灵活地处理来自不同网络接口的数据包。

bash 复制代码
 #建一个存放源码的目录
mkdir snortSourceFiles
cd snortSourceFiles
 #从github上下载daq源码
git clone https://github.com/snort3/libdaq.git

在当前文件夹下(snortSourceFiles)可以看到daq文件夹

bash 复制代码
#转到libdaq目录下
cd libdaq/
 #编译安装
./bootstrap
./configure
make
make install

进入libdaq文件夹,进行编译安装

接着是sudo make install

由于很多实验都会用到make和make install,这里简单说明下两者

make命令主要负责编译源代码,而make install命令则负责将编译后的软件安装到指定的位置。这两个命令在软件开发和部署过程中通常是连续使用的,先使用make命令进行编译,然后使用make install命令进行安装。

需要注意的是,在执行make和make install命令之前,通常需要先运行配置脚本(如./configure)来生成Makefile文件,并为编译和安装过程设置必要的参数和选项。此外,执行make install命令通常需要具有root权限,因为安装过程会向系统写入文件。这也说明了如果使用make install而不加sudo有时会报错。

4、安装Google开发的线程缓存的mallocTCMalloc,其提供高效的多线程内存管理实现,用于替代操作系统的内存分配相关的函数,具有减少内存碎片、适用于多核、更好的并行性支持等特性。此外,TCMalloc通过利用线程本地存储(TLS)来缓存小块内存分配,减少了锁竞争,从而提高了多线程环境下的内存分配性能。

bash 复制代码
cd snortSourceFiles
wget https://github.com/gperftools/gperftools/releases/download/gperftools-2.8/gperftools-2.8.tar.gz
tar xzf gperftools-2.8.tar.gz
cd gperftools-2.8/
./configure
make
make install

如果在Ubuntu上使用wegt命令下载不了相关安装包(比如显示请求超时等现象),这里可以在浏览器中输入访问以下网址,直接将下载好的gperftools压缩包传到Ubuntu的snortSourceFiles 文件夹下,在进行相关解压。
GPerftools下载网站

可以查看下geperftoos下的文件

在gperftools目录下进行编译安装

然后是make编译,这个时间会比较长,等待即可。编译成功后使用sudo make install进行安装

5、源码编译snort

bash 复制代码
cd snortSourceFiles
git clone https://github.com/snort3/snort3.git
cd snort3/
sudo ./configure_cmake.sh --prefix=/usr/local --enable-tcmalloc
cd build/
#编译安装的时间比较长
make
make install

6、更新共享库

共享库通常包含了许多常用的功能和代码,这些功能和代码可以被多个程序共享,以减少内存占用和提高系统性能。

bash 复制代码
sudo ldconfig

7、检查snort版本

bash 复制代码
snort -V

如果显示没有安装snort命令,需要根据系统提示安装snort,在安装时会出现配置项,回车确认即可。(这里我均回车默认的,其中有一项需要输入网络接口检测名称,默认是eth0,我当时是按照默认来的,我的网卡名称为ens33,后来发现没有影响。如果不对的话,建议换成自己的网卡名,使用ifconfig即可查看)

此时再使用snort -v查看是否安装成功

出现版本号说明安装成功

至此,snort安装成功,接下来介绍一个简单的实验,实验目的是 在Ubuntu上使用snort软件进行数据检测和防御,以防止外部网络对服务器使用大于800字节的数据包做ping攻击。

简单实验

1、进行规则配置

snort的规则配置文件一般存放在 /etc/snort/rules文件中,可以转到相关目录下进行rules文件的查看

输入命令

bash 复制代码
vi  /etc/snort/rules

由于我们要进行的是icmp设置,因此在rules文件中需要找到icmp的配置文件,然后回车进入,添加以下配置规则:

bash 复制代码
alert icmp $EXTERNAL_NET any -> $HOME_NET any (msg:"ICMP Large ICMP Packet"; dsize:>800; reference:arachnids,246; classtype:bad-unknown; sid:499; )

简单介绍下这段规则的含义:

alert:这个字段指定了规则的动作类型。在这里,alert表示当规则匹配到流量时,Snort将生成一个警报。
icmp:这个字段指定了要检查的协议类型。在这里,icmp表示Internet控制消息协议(ICMP),它是一种用于在IP网络中发送控制消息的协议,常用于ping操作、错误报告等。
$EXTERNAL_NET any -> $HOME_NET any:

这部分定义了规则的作用范围和方向。

$EXTERNAL_NET是一个变量,通常表示外部网络的IP地址范围。

any表示任何端口。

->表示流量的方向,从左边到右边。

$HOME_NET是另一个变量,通常表示受保护网络的IP地址范围。

第二个any同样表示任何端口。

总的来说,这部分指定了从外部网络到受保护网络的任何ICMP流量。
(msg:"ICMP Large ICMP Packet"; dsize:>800; reference:arachnids,246; classtype:bad-unknown; sid:499; ):

这部分是规则的检测条件和附加信息。

msg:"ICMP Large ICMP Packet":这是一个描述性消息,当规则触发时,Snort会在警报中包含这条消息。

dsize:>800:这指定了要检测的数据包大小条件。在这里,它表示数据包大小(data size)大于800字节。ICMP数据包通常很小,因此大于800字节的ICMP数据包可能是异常的,值得进一步调查。

reference:arachnids,246:这是一个参考字段,提供了有关该规则或检测到的活动的额外信息来源。在这里,它可能指向一个安全数据库或文章,解释了为什么这种类型的ICMP数据包被视为可疑。

classtype:bad-unknown:这指定了规则所属的分类类型。在这里,bad-unknown表示检测到的活动是不良的且未知的,这通常意味着它不符合已知的良好行为模式,但也没有足够的信息来确定它是具体的哪种攻击。

sid:499:这是规则的唯一标识符(signature ID)。每个Snort规则都有一个唯一的SID,用于在警报中标识该规则。

保存退出即可

这里要注意,当你刚进入icmp.rules文件中会发现里面其实已经有很多规则了,下面简单说下添加的规则与原有规则的不同点

在Snort中,sid(安全标识符)是用于唯一标识每条规则的数字。当Snort处理规则时,它会根据sid来区分不同的规则。rev(修订版本)是用于指示规则版本的字段,它允许您在保持sid不变的情况下更新规则。

如果在添加一条新规则时没有指定rev字段,Snort会默认将其视为修订版本0(或者根据Snort的版本和配置,可能会使用其他默认值,但通常是0)。这不会与已经存在且指定了rev:1的相同sid的规则产生冲突,因为sid和rev的组合才是唯一的标识符。

2、创建snort日志检测存放文件

bash 复制代码
mkdir /var/log/snort

一般在安装snort时,会默认将日志检测文件创建好,如果显示已有相关文件,可以无需创建。

3、将snort规则中的路径设置为snort下的rules规则

如果在打开snort.conf文件后发现RULES_PATH已经被正确设置为期望的Snort规则路径(RULES_PATH=指向snort目录下的rules文件夹),这表示Snort已经配置为从该路径加载规则文件,无需更改,退出即可。

4、使用snort规则对流量进行检测,并将结果输入到对应的日志文件中(这里ens33替换为你的网络接口,可以使用ifconfig进行查看)
输入命令

bash 复制代码
sudo snort -i ens33 -c /etc/snort/snort.conf -A fast -l /var/log/snort/

到此,在Ubuntu上可以使用snort进行检测,你可以直接进行步骤5。如果是想要进行规则测试,可以按照下面几条命令进行测试

bash 复制代码
(可选)可以先使用如下命令检查下snort上的相关配置是否正确
sudo snort -T -c /etc/snort/snort.conf

(可选)规则测试(输出下图的信息说明成功开启检测)
sudo snort -T -c /etc/snort/snort.conf -i ens33
这里发现使用ens0也可以成功
sudo snort -T -c /etc/snort/snort.conf -i ens0

5、开启检测

依旧是步骤4的命令

bash 复制代码
sudo snort -i ens33 -c /etc/snort/snort.conf -A fast -l /var/log/snort/

此时Ubuntu上不要做任何操作,使用局域网内的主机对Ubuntu进行进行>800的攻击

然后Ubuntu可ctrl+z退出检测页面,接下来查看检测结果

6、查看检测日志

此时打开我们之前创建的(或者是默认创建完成的日志存放文件),可以在日志文件夹下看到有个alert文件,打开该文件可以查看日志信息

bash 复制代码
cd /var/log/snort
vi alert文件

参考文章

感谢大佬提供的精彩好文!
没人讲清楚!我来讲!---- Ubuntu 20.04中下载配置Snort3,参数讲解及实现协议警报

Ubuntu16.04搭建入侵检测系统Snort

相关推荐
Fireworkitte19 分钟前
Ubuntu、CentOS、AlmaLinux 9.5的 rc.local实现 开机启动
linux·ubuntu·centos
sword devil9001 小时前
ubuntu常见问题汇总
linux·ubuntu
ac.char1 小时前
在CentOS系统中查询已删除但仍占用磁盘空间的文件
linux·运维·centos
中科米堆2 小时前
中科米堆CASAIM自动化三维测量设备测量汽车壳体直径尺寸
运维·自动化·汽车·视觉检测
淮北也生橘123 小时前
Linux的ALSA音频框架学习笔记
linux·笔记·学习
缘华工业智维3 小时前
CNN 在故障诊断中的应用:原理、案例与优势
大数据·运维·cnn
更深兼春远3 小时前
spark+scala安装部署
大数据·spark·scala
开航母的李大4 小时前
软件系统运维常见问题
运维·服务器·系统架构·运维开发
华强笔记6 小时前
Linux内存管理系统性总结
linux·运维·网络
十五年专注C++开发6 小时前
CMake进阶: CMake Modules---简化CMake配置的利器
linux·c++·windows·cmake·自动化构建