前言
Snor
t是一个开源的网络入侵检测和防范系统(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开发的线程缓存的malloc
:TCMalloc
,其提供高效的多线程内存管理实现,用于替代操作系统的内存分配相关的函数,具有减少内存碎片、适用于多核、更好的并行性支持等特性。此外,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,参数讲解及实现协议警报