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

相关推荐
爱吃生蚝的于勒2 分钟前
计算机基础 原码反码补码问题
经验分享·笔记·计算机网络·其他·1024程序员节
汪款学嵌入式13 分钟前
VMware虚拟机 Ubuntu没有共享文件夹的问题
linux·运维·ubuntu
chengma_09090915 分钟前
linux离线安装部署redis
linux·redis·bootstrap
安科瑞刘鸿鹏40 分钟前
新能源汽车安全充电管理方案
大数据·运维·服务器·物联网·能源
记录测试点滴43 分钟前
【自动化】requirements.txt
运维·自动化
CQU_JIAKE1 小时前
12.4【java exp4][debug]
运维·服务器
苗雨旺1 小时前
【linux】linux监控硬盘达到使用情况,进行邮箱通知
linux·运维·服务器
zym大哥大2 小时前
Linux进程控制
linux·运维·服务器
CQU_JIAKE2 小时前
12.5【计算机网络】【Study】
网络·计算机网络