Ubuntu22.04上Snort3的安装与基本配置
目录
一、实验简介
1、入侵检测系统的概述、作用、原理
2 、Snort简介
3 、主要功能
4、 工作模式
运行Snort命令的参数:
5 、部署与兼容性
6 、实验环境
二、实验内容
步骤一 安装snort3和相关依赖
更新软件源
安装依赖软件包
编辑
安装Snort DAQ
安装Google开发的线程缓存的malloc:TCMalloc(可选)
安装 Snort 3
步骤二 配置网络接口
网卡配置
禁用网卡 Offload功能,以防止 Snort 截断大于 1518 字节的大数据包。
步骤三 配置snort规则集
从Snort官网下载snort3社区规则集
创建Snort规则存放目录
接下来,需要配置Snort 3
步骤四 安装 Snort OpenAppID
从 Snort 官网下载Snort OpenAppID
解压并复制到相应的目录:
编辑 Snort 3 配置文件并指定 OpenAppID 库的位置
创建Snort日志存放目录
检查snort配置是否正确:
步骤五 设置Snort 为服务模式运行
为了安全起见,单独为snort创建一个用户,并设置用户shell为nologin
创建snort3服务
重新加载systemd配置,并修改/var/log/snort目录权限。
启动snort服务并配置开机启动
检查运行状态
一、实验简介
1、入侵检测系统的概述、作用、原理
针对计算机和网络资源的恶意使用行为进行分析、处理,是一种基于检测计算机中违反安全策略行为的技术,主要是保障计算机系统的安全,检测未授权、异常行为。根据入侵的分类,可分为外部入侵和内部入侵;依据入侵的方向,进行入侵检测,即分为基于网络和基于文件系统变化。
其中基于网络的入侵检测系统的组件有:数据捕获器、数据处理器、响应器、数据库。
流程如图1-1所示:
图1-1 入侵检测系统流程
本次实验是基于网络的入侵检测系统。
2 、Snort简介
Snort是一个开源的入侵检测系统(IDS),由Martin Roesch在1998年使用C语言开发。它已发展成为一个具有多平台支持、实时流量分析、网络IP数据包记录等特性的强大的网络入侵检测/防御系统(NIDS/NIPS)。搭配自定义的规则、不同的插件与其他软件,Snort 能在不同的系统中发挥不同的作用。
Snort 3一些功能特性:
- 支持多线程
- 共享配置和属性表
- 使用简单的、脚本化配置
- 关键组件可热插拔
- 无端口配置的自动检测服务
- 在规则中支持粘性缓冲区
- 自动生成参考文档
- 更好的跨平台支持
3 、主要功能
- 数据包嗅探:从网络上读取数据包。
- 数据包分析:对捕获的数据包进行解码和分析。
- 数据包检测:根据用户定义的规则检测数据包中是否包含入侵行为。
- 响应处理:对检测到的入侵行为采取报警、记录日志等响应措施。
4、 工作模式
- 嗅探器模式(Packet Sniffer):仅从网络上读取数据包并显示在终端上。
- 数据包记录器模式(Packet Logging):将捕获的数据包记录到硬盘上。
- 网络入侵检测模式(Intrusion Prevention System):对数据包进行分析、按规则进行检测、做出响应。
Snort的命令行参数很多,可以使用 Snort-?命令列出这些参数及其简单的解释,详细的解释可以使用 man Snort命令查看帮助页
运行Snort命令的参数:
名称 | 含义 |
-A | 设置报警模式:fast、full、none(只是使用报警文件)、undock(使用UNIX套接字记入日志,出于测试阶段) |
-a | 显示ARP(Address resolution protocol,地址解析协议)包 |
-b | 日志文件使用tcpdump格式(更快) |
-c | 使用规则文件 rules |
-C | 只使用字符方式打印负载信息(不使用hex方式) |
-d | 复制应用层 |
-D | 在后台运行 Snort(精灵状态) |
-e | 显示第二层(数据链路层)包头信息 |
-F | Read BPF filters from file |
-g | 初始化完成后,使 Snort的gid为 gname |
-h | Home网络为h |
-i | 在接口if监听 |
-I | 把界面名加入到报警输出界面 |
-I | 设置目录ld为日志目录 |
-M | 把SMB消息发送到文件 wrkst列出的工作站中(Requires smbclient to be in PATH) |
-n | 收到cnt个包后退出 |
-N | 关闭日志功能(警报功能仍然有效) |
-o | 把规则测试顺序修改为:Pass|Alert|Log |
-O | 打乱被日志的IP地址 |
-p | 关闭混杂嗅探模式 |
-P | 设置复制的包的长度为 snaplen(默认:1514) |
-q | 安静模式。不输出 banner和状态报告 |
-r | 读取并处理 tcpdump文件tf(回放功能) |
-s | 把所有警告信息记入 syslog |
-S | 设置规则文件中的n的值等于v的值 |
-t | 初始化完成后 Chroot到dir目录 |
-u | 初始化完成后,把 Snort的uid设置为 uname |
-v | 设置冗余模式 |
-V | 显示版本号 |
-X | 从链路层开始复制包的数据 |
-? | 显示帮助信息 |
5 、部署与兼容性
Snort可以在多种操作系统上运行,如Linux、Windows等。其部署非常灵活,可以根据企业网络规模的大小,采用不同的部署结构。
6 、实验环境
实验所用的操作系统为Ubuntu 22.04 LTS(Long Term Support)
# lsb_release -a //查看Linux发行版本
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 22.04.4 LTS
Release: 22.04
Codename: jammy
实验前Snort的版本: snort 2.9.15
# sudo apt show snort
Package:snort
Version:2.9.15.1-6build1
Priority: optional
Section: universe/net
Origin: Ubuntu
实验需安装的Snort版本:snort 3.6.0
# snort -V
-* > Snort++ <*-
Version 3.6.0.0
By Martin Roesch & The Snort Team
http://snort.org/contact#team
Copyright (C) 2014-2024 Cisco and/or its affiliates. All rights reserved.
Copyright (C) 1998-2013 Sourcefire, Inc., et al.
Using DAQ version 3.0.17
Using libpcap version 1.10.1 (with TPACKET_V3)
Using LuaJIT version 2.1.0-beta3
Using LZMA version 5.2.5
Using OpenSSL 3.0.2 15 Mar 2022
Using PCRE version 8.39 2016-06-14
Using ZLIB version 1.2.11
二、实验内容
步骤一 安装snort3和相关依赖
-
更新软件源
sudo apt update //更新软件源
-
安装依赖软件包
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 -y
-
安装Snort DAQ
下载并安装最新版本的 Snort DAQ(数据采集库)。 默认的 Ubuntu 软件库中不是最新版本,所以需要从源代码编译安装
(1)新建一个存放源码的目录snortSourceFiles并进入目录
mkdir snortSourceFiles //创建snortSourceFiles
cd snortSourceFiles //进入snortSourceFiles目录
从github上下载daq源码(此时需要手动输入“apt install git”指令安装git,并修改配置文件/etc/hosts添加github.com的IP)
git clone https://github.com/snort3/libdaq.git //从github上下载daq源码
(2)编译安装三部曲
-
安装Google开发的线程缓存的malloc:TCMalloc(可选)
TCMalloc提供高效的多线程内存管理实现,用于替代操作系统的内存分配相关的函数(malloc、free,new,new[]等),具有减少内存碎片、适用于多核、更好的并行性支持等特性。
cd .. //回到上级snortSourceFiles目录
wget https://github.com/gperftools/gperftools/releases/download/gperftools-2.8/gperftools-2.8.tar.gz //从github下载gperftools压缩包
tar -xzf gperftools-2.8.tar.gz //解压gperftools
cd gperftools-2.8/ //进入gperftools-2.8目录
./configure //配置
make && make install //编译安装
-
安装 Snort 3
(1)从Snort 3的GitHub 库中获取源码
cd ../ //回到上级snortSourceFiles目录
git clone https://github.com/snort3/snort3.git //获取snort3源码
(2)进入snort目录,编译安装
cd snort3/ //进入snort3目录
./configure_cmake.sh --prefix=/usr/local --enable-tcmalloc //配置snort3
cd build/ //进入build目录
make //编译
make install //安装
(3)更新共享库
sudo ldconfig
(4)查看snort版本:
snort -V
以上信息说明Snort3安装成功并且可以工作正常了。
步骤二 配置网络接口
-
网卡配置
首先,需要把 Snort 监听网络流量的网卡设置为混杂模式(在混杂模式下,网络接口会接收所有经过它的数据包,而不仅仅是那些目标MAC地址匹配自己的数据包。这通常用于网络监控和分析工具,如Wireshark,因为它们需要捕获网络上的所有流量。)
输入如下指令配置网卡状态:
ip a show //显示了网络接口的配置和状态
ip link set dev ens33 promisc on //将 ens33 的网络接口设置为混杂模式(promiscuous mode)
ip a show ens33 //再次查看ens33的状态,为混杂模式
-
禁用网卡 Offload功能,以防止 Snort 截断大于 1518 字节的大数据包。
此时的禁用和开启网卡混杂模式都是临时的,可以通过把命令写入开机启动项中,让它重启后依然生效。
步骤三 配置snort规则集
规则集是Snort的核心组成部分,载和配置后,Snort 规则将分为两组:“社区规则集”和“Snort 订阅者规则集”。Snort 用户规则集由 Cisco Talos 开发、测试和批准。
- Snort 订阅者规则集(Snort Subscriber Ruleset)的订阅者将收到 规则集。可以通过 Snort.org 网站下载规则并将其部署到网络中。
- 社区规则集(Community Ruleset)由 Snort 社区开发,并由 Cisco Talos 进行 QAed。所有用户都可以免费使用它。
-
从Snort官网下载snort3社区规则集
https://www.snort.org/downloads#rules
-
创建Snort规则存放目录
在/usr/local/etc/snort/snort_defaults.lua配置文件中,默认的规则集存放路径(RULE_PATH)为/usr/local/etc/rules。
$sudo mkdir /usr/local/etc/rules //创建默认规则集存放路径
$sudo tar xzf snort3-community-rules.tar.gz -C /usr/local/etc/rules/ //解压Snort规则规则集
$ls /usr/local/etc/rules/snort3-community-
rules/ //查看Snort规则集文件夹
AUTHORS LICENSE sid-msg.map snort3-community.rules VRT-License.txt
-
接下来,需要配置Snort 3
Snort的主配置文件为:/usr/local/etc/snort/snort.lua。修改其中的HOME_NET变量和EXTERNAL_NET变量,并在ips部分定义规则集的路径
sudo vim /usr/local/etc/snort/snort.lua
- 将HOME_NET修改为需要进行网络攻击防范检测的网络范围(这里是本机所在的网段)。
HOME_NET = ‘any’---> HOME_NET = ‘192.168.127.1/24’
- 将EXTERNAL_NET设置为除HOME_NET以外的所有网络范围。
EXTERNAL_NET = ‘any’ ---> EXTERNAL_NET ‘!$HOME_NET
- 在ips部分定义规则集的路径,添加上:
include=‘/usr/local/etc/rules/snort3-community-rules/snort3-community-rules’
注意:可以把自定义规则路径写进/usr/local/etc/snort/snort.lua配置文件中,同样是在ips部分定义规则集的路径,在include = ‘自定义规则集的路径’
如我创建了一个/usr/local/etc/rules/local.rules本地规则,那么可以在ips部分添加上如下内容:
include = ‘/usr/local/etc/rules/local.rules’,
步骤四 安装 Snort OpenAppID
OpenAppID 是一个应用程序层插件,它使 Snort 能够检测网络中使用的各种应用程序,如 Facebook、Netflix、Twitter等。
-
从 Snort 官网下载Snort OpenAppID
-
解压并复制到相应的目录:
~/桌面/snortSourceFiles$ tar -xzf snort-openappid.tar.gz //解压Snort OpenAppID
~/桌面/snortSourceFiles$ sudo cp -R odp /usr/local/lib/ //复制到/usr/local/lib/目录下
-
编辑 Snort 3 配置文件并指定 OpenAppID 库的位置
~/桌面/snortSourceFiles$ sudo vim /usr/local/etc/snort/snort.lua
-
创建Snort日志存放目录
~/桌面/snortSourceFiles$ sudo mkdir /var/log/snort
-
检查snort配置是否正确:
提示Snort successfully validated the configuration (with 0 warnings). o")~ Snort exiting表示配置文件正确
~/桌面/snortSourceFiles$ snort -c /usr/local/etc/snort/snort.lua
--------------------------------------------------
o")~ Snort++ 3.6.0.0
--------------------------------------------------
Loading /usr/local/etc/snort/snort.lua:
Loading snort_defaults.lua:
Finished snort_defaults.lua:
......
--------------------------------------------------
search engine (ac_bnfa)
instances: 334
patterns: 10776
pattern chars: 175132
num states: 123161
num match states: 10496
memory scale: MB
total memory: 3.67905
pattern memory: 0.577772
match list memory: 1.33451
transition memory: 1.726
fast pattern only: 7097
appid: MaxRss diff: 226944
appid: patterns loaded: 11537
--------------------------------------------------
pcap DAQ configured to passive.
Snort successfully validated the configuration (with 0 warnings).
o")~ Snort exiting
步骤五 设置Snort 为服务模式运行
虽然可以使用-D参数将snort设置为后台运行,但为了更加方便,我们可以为Snort创建一个systemd服务单元,让Snort以服务模式运行。
-
为了安全起见,单独为snort创建一个用户,并设置用户shell为nologin
~/桌面/snortSourceFiles$ sudo useradd -r -s /usr/sbin/nologin -M -c SNORT_IDS snort
-
创建snort3服务
~/桌面/snortSourceFiles$ sudo vim /etc/systemd/system/snort3.service
添加如下内容:
[Unit]
Description=Snort 3 NIDS Daemon
After=syslog.target network.target
[Service]
Type=simple
ExecStart=/usr/local/bin/snort -c /usr/local/etc/snort/snort.lua -s 65535 -k none -l /var/log/snort -D -i ens33 -m 0x1b -u snort -g snort
[Install]
WantedBy=multi-user.target
-
重新加载systemd配置,并修改/var/log/snort目录权限。
~/桌面/snortSourceFiles$ sudo systemctl daemon-reload //重新加载systemd的系统和服务管理器配置
~/桌面/snortSourceFiles$ sudo chmod -R 777 /var/log/snort //给/var/log/snort目录赋予权限
~/桌面/snortSourceFiles$ sudo chown -R snort:snort /var/log/snort //改变/var/log/snort目录及其内容的所有者和所属组为snort
-
启动snort服务并配置开机启动
~/桌面/snortSourceFiles$ sudo systemctl enable --now snort3.service
-
检查运行状态
~/桌面/snortSourceFiles$ sudo systemctl status snort3.service
状态显示Active: active (running) ,说明服务运行正常。