Ubuntu22.04安装Snort3并进行网络流量异常检测

Snort 是世界上最重要的开源入侵防御系统 (IPS)。Snort IPS 使用一系列规则来帮助定义恶意网络活动,并使用这些规则查找与它们匹配的数据包,并为用户生成警报。Snort 也可以内联部署以阻止这些数据包。Snort 有三个主要用途:作为数据包嗅探器(如 tcpdump)、数据包记录器(可用于网络流量调试),或者它可以用作成熟的网络入侵防御系统。Snort 可以下载和配置,用于个人和企业用途。(摘自SNORT官网)


1. 安装Ubuntu22.04虚拟机

本教程采用ubuntu-22.04.3-live-server-amd64.iso镜像(server版)

虚拟机的安装步骤此处省略。

2. 安装Snort3

参考官方文档
文档链接

确保系统包是最新的

sudo apt-get update && sudo apt-get upgrade -y

选择正确的时区

sudo dpkg-reconfigure tzdata
# 图形化界面来进行选择,我选择的是Asia/Shanghai。

创建一个文件夹来存放一些文件

mkdir ~/snort_src && cd ~/snort_src

安装Snort3前置包

 sudo apt-get install -y build-essential autotools-dev libdumbnet-dev libluajit-5.1-dev libpcap-dev\
 zlib1g-dev pkg-config libhwloc-dev cmake liblzma-dev openssl libssl-dev cpputest libsqlite3-dev \
 libtool uuid-dev git autoconf bison flex libcmocka-dev libnetfilter-queue-dev libunwind-dev \
 libmnl-dev ethtool libjemalloc-dev

下载并安装 safec 以对某些旧版 C 库调用进行运行时边界检查

cd ~/snort_src
wget https://github.com/rurban/safeclib/releases/download/v02092020/libsafec-02092020.tar.gz
tar -xzvf libsafec-02092020.tar.gz
cd libsafec-02092020.0-g6d921f
./configure
make
sudo make install

Snort3使用 Hyperscan 进行快速模式匹配。可以从Ubuntu存储库安装旧版本的Hyperscan,但是由于Hyperscan对Snort的操作和性能至关重要,最好编译Hyperscan的最新稳定版本。需要包括PCRE、gperftools、ragel和Boost 库。

  1. 安装pcre
cd ~/snort_src/
wget https://sourceforge.net/projects/pcre/files/pcre/8.45/pcre-8.45.tar.gz
tar -xzvf pcre-8.45.tar.gz
cd pcre-8.45
./configure
make
sudo make install
  1. 安装gperftools
cd ~/snort_src
wget https://github.com/gperftools/gperftools/releases/download/gperftools-2.9.1/gperftools-2.9.1.tar.gz
tar -xzvf gperftools-2.9.1.tar.gz
cd gperftools-2.9.1
./configure
make
sudo make install
  1. 安装ragel
cd ~/snort_src
wget http://www.colm.net/files/ragel/ragel-6.10.tar.gz
tar -xzvf ragel-6.10.tar.gz
cd ragel-6.10
./configure
make
sudo make install
  1. 最后,下载(但不要安装)Boost C++ 库
cd ~/snort_src
wget https://boostorg.jfrog.io/artifactory/main/release/1.77.0/source/boost_1_77_0.tar.gz
tar -xvzf boost_1_77_0.tar.gz

从源代码安装 Hyperscan 5.4,并参考 Boost 源目录的位置

cd ~/snort_src
wget https://github.com/intel/hyperscan/archive/refs/tags/v5.4.0.tar.gz
tar -xvzf v5.4.0.tar.gz
mkdir ~/snort_src/hyperscan-5.4.0-build
cd hyperscan-5.4.0-build/
cmake -DCMAKE_INSTALL_PREFIX=/usr/local -DBOOST_ROOT=~/snort_src/boost_1_77_0/ ../hyperscan-5.4.0
make
sudo make install
  1. 安装flatbuffers
cd ~/snort_src
wget https://github.com/google/flatbuffers/archive/refs/tags/v2.0.0.tar.gz -O flatbuffers-v2.0.0.tar.gz
tar -xzvf flatbuffers-v2.0.0.tar.gz
mkdir flatbuffers-build
cd flatbuffers-build
cmake ../flatbuffers-2.0.0
make
sudo make install

接下来,从 Snort 网站下载并安装数据采集库 (DAQ)。请注意,Snort 3 比 Snort 2.9 使用更远的 DAQ。

cd ~/snort_src
wget https://github.com/snort3/libdaq/archive/refs/tags/v3.0.5.tar.gz -O libdaq-3.0.5.tar.gz
tar -xzvf libdaq-3.0.5.tar.gz
cd libdaq-3.0.5
./bootstrap
./configure
make
sudo make install

更新分享库

sudo ldconfig

下载安装Snort3

cd ~/snort_src
wget https://github.com/snort3/snort3/archive/refs/tags/3.1.18.0.tar.gz -O snort3-3.1.18.0.tar.gz
tar -xzvf snort3-3.1.18.0.tar.gz
cd snort3-3.1.18.0
./configure_cmake.sh --prefix=/usr/local --enable-tcmalloc --enable-jemalloc
cd build
make
sudo make install

在make编译时,请保持耐心,如果出现报错,请删除build文件夹,并重新解压重新编译

以上步骤完成后,可以验证Snort是否安装成功

/usr/local/bin/snort -V
# 版本V大写

如果安装成则会看到如下内容

image

让我们测试一下默认的配置文件

snort -c /usr/local/etc/snort/snort.lua

正常情况下会看到如下内容
image

配置网卡

可以使用ipconfig,如果是Ubuntu可以使用ip address show
查看网卡名称,我的是ens33
用ethtool查看generic-receive-offload和large-receive-offload的状态

sudo ethtool -k ens33 | grep receive-offload

我的结果如下
image

我们需要将两个状态都改为off。

编写一个systemD服务,这样可以保证每次开机都是off的状态

sudo vi /lib/systemd/system/ethtool.service

编辑内容如下

[Unit]
Description=Ethtool Configration for Network Interface
[Service]
Requires=network.target
Type=oneshot
ExecStart=/sbin/ethtool-K ens3 gro off
ExecStart=/sbin/ethtool-K ens3 lro off
[Install]
WantedBy=multi-user.target

设置开机启动,并且现在就启动它

sudo systemctl enable ethtool
sudo systemctl start ethtool

创建一些配置Snort策略的文件夹

sudo mkdir /usr/local/etc/rules
sudo mkdir /usr/local/etc/so_rules/
sudo mkdir /usr/local/etc/lists/
sudo touch /usr/local/etc/rules/local.rules
sudo touch /usr/local/etc/lists/default.blocklist
sudo mkdir /var/log/snort

在上面创建的文件中创建一条规则

sudo vi /usr/local/etc/rules/local.rules

此规则将检测 ICMP 流量,并且非常适合测试 Snort 是否正常工作并生成警报。将以下行粘贴到 local.rules 文档中(确保完全复制此行,此文档中的每个分号后必须有一个空格,以便 PulledPorkto 正确解析警报):

alert icmp any any -> any any (msg:"ICMP Traffic Detected"; sid:10000001;metadata:policy security-ips alert;)

现在运行 Snort 并让它加载 local.rules 文档(带有 -R 标志),以确保它正确加载这些规则(验证规则格式是否正确):

snort -c /usr/local/etc/snort/snort.lua -R /usr/local/etc/rules/local.rules

输出应以“Snort 已成功验证配置”结尾。您不应有任何警告或错误。如果向上滚动输出,应会看到此规则已成功加载(在“规则计数”部分下)。现在让我们在接口上以检测模式运行 Snort(更改下面的 ens33 以匹配你的接口名称),并将所有警报打印到控制台:

sudo snort -c /usr/local/etc/snort/snort.lua -R /usr/local/etc/rules/local.rules -i ens33 -A alert_fast -s 65535 -k none

这意味着 snort 当前正在侦听该接口上的所有流量,并将其与它加载的规则进行比较。当流量匹配规则时,Snort 会向控制台写入警报。现在,从该计算机上的另一个窗口(打开新的终端 vwindow 或第二个 sshsession),使用 ping 命令生成遍历您正在侦听的接口的数据包(如果您从另一台计算机连接,则 ping 到该接口的 IP 地址,或者如果您在同一台计算机上,则仅 ping 外部 IP 地址。您应该会在屏幕上看到警报打印:

05/31-09:45:34.872993 [**] [1:10000001:0] "ICMP Traffic Detected" [**] [Priority: 0] {ICMP} 192.168.1.1 -> 192.168.1.4
05/31-09:45:34.873488 [**] [1:10000001:0] "ICMP Traffic Detected" [**] [Priority: 0] {ICMP} 192.168.1.4 -> 192.168.1.1
05/31-09:45:35.882594 [**] [1:10000001:0] "ICMP Traffic Detected" [**] [Priority: 0] {ICMP} 192.168.1.1 -> 192.168.1.4
05/31-09:45:35.882656 [**] [1:10000001:0] "ICMP Traffic Detected" [**] [Priority: 0] {ICMP} 192.168.1.4 -> 192.168.1.1
05/31-09:45:47.935549 [**] [1:10000001:0] "ICMP Traffic Detected" [**] [Priority: 0] {ICMP} 192.168.1.1 -> 192.168.1.4

接下来,让我们编辑 snort.lua 文档。此文档是我们在启动时传递给 Snort 的配置 fle:使用 ctrl-c 停止 Snort。这是测试 Snort 的好规则,但在实际生产使用过程中可能会有点嘈杂,因此如果您愿意,请用哈希符号注释掉它。

posted @ 2024-05-29 15:05  Jikefan  阅读(1369)  评论(0)    收藏  举报