Snort 简介

Snort,是一款开源的 IDS/IPS 软件,由思科公司(Cisco)主导开发,使用广泛。Snort 有三种模式——包嗅探模式(Packet Sniffer)、包记录模式(Packet Logging)、IPS模式(Intrusion Prevention System)。搭配自定义的规则、不同的插件与其他软件,Snort 能在不同的系统中发挥不同的作用。

本篇文章简单记录 Snort3 的编译、安装和简单使用流程。

编译安装 Snort3

例子中使用的操作系统是 Ubuntu Server 20.04.3 LTS。当然你也可以使用 Ubuntu 18.04.5 LTS,或者其他 Linux 发行版。某些发行版由于内核配置原因无法编译 libdaq 的部分插件(例如 NFQ),这时 Snort 虽然无法提供防护功能,但仍然可以作为入侵检测系统(IDS)来使用。

快速导入 Ubuntu Server 虚拟机

Ubuntu Server 虚拟机其实不必下载 ISO 镜像后再用 VMWare 等虚拟化软件从头进行安装。Ubuntu 官方已经提供了预安装的虚拟磁盘的下载(如 Kali Linux 官方所做的那样),即 Ubuntu Cloud Images。

以 20.04 LTS daily build 为例,找到对应的 OVA 文件:

以VMWare Workstation为例,双击下载的OVA文件,唤起VMWare Workstation的导入向导;或先打开VMWare Workstation主程序,左上角“文件”菜单中点击“打开”,然后选择OVA文件。

随后进行OVA导入时的初始化设置。

首先填入虚拟机名称和存储位置。

随后设置系统详情。

由上至下依次解释不同字段的含义:

  • “该实例的唯一ID”:云服务管理器中可见的ID(第一个输入框,默认值为id-ovf,在VMWare Workstation中导入时保持默认值)和主机名。
  • “获取种子数据的URL”:从特定位置获取用户设置数据进行无应答安装,脱离管理器使用时可以忽略。
  • “SSH公钥”:如果需要通过公钥登录SSH,则将公钥复制粘贴进该输入框。
  • “编码的用户数据”:Base64编码的用户设置数据,用于无应答安装,不使用的情况下留空。
  • “默认用户的密码”:是系统中默认的普通权限用户ubuntu的首次登陆密码,即系统的首次登陆密码。可以设置为一个临时密码,登陆后强制要求修改。

关于user-data和meta-data的更多信息,可参阅cloud-init文档。

虚拟机导入后的设置

修改虚拟机设置

在虚拟机设置中,按需修改CPU、内存的分配值,同时可以移除(我猜应该没人需要)软盘驱动器选项。扩展磁盘容量(例如我在这里扩展到了30.0GB)。同时将网络适配器的设置进行修改,例如改为NAT模式。

注意:按下面文档的操作,编译时虚拟机至少需要2GB运行内存。

如何登陆

开机,待登陆界面出现后,使用ubuntu作为登陆用户名、在向导中设置的用户密码作为登陆密码登陆系统。

随向导更改密码:

即可成功登陆。

禁用云服务组件

关闭并禁止cloud-config服务启动。

sudo service cloud-config stop
sudo systemctl disable cloud-config.service
sudo service cloud-init stop
sudo systemctl disable cloud-init.service

可以卸载相关软件包:

sudo apt-get remove -y cloud-init

同时rsync、snapd等程序也可以按照需要进行卸载。

DNS解析

修改DNS解析可以结合以下命令:

ip addr #获取网卡接口名称
sudo resolvectl dns <网卡名称> <DNS服务器IP>

修改APT源

编辑/etc/apt/sources.list,更换apt源至国内源。教程很多,此处不做详细说明。

修改控制台的分辨率

处于控制台模式下时,发现默认分辨率为700x400px。这时除了设置OpenSSH Server通过远程连接虚拟机外,还可以通过修改Grub配置来改变控制台分辨率。

以修改为1600x1200px为例,在/etc/default/grub中加入以下两行:

GRUB_GFXMODE=1600x1200
GRUB_GTXPAYLOAD_LINUX=1600x1200

保存后运行:

sudo update-grub

重启即可看到效果。1

使SSH服务允许使用密码登陆

默认已安装和启用SSH服务。若需要ubuntu用户通过密码连接至虚拟机,编辑/etc/ssh/sshd_config,查找如下行:

PasswordAuthentication no

改为yes,并重新启动SSH服务即可。

分区扩容

使用parted进行分区扩容。

sudo parted /dev/sda
p
resizepart 1
yes
-1
p
q

随后使用resize2fs进行文件系统扩容。

sudo resize2fs /dev/sda1

至此已成功扩容。

安装基本开发环境

sudo apt-get install -y build-essential cmake autoconf

其他安装过程中需要的依赖,在详细步骤中进行说明。

安装新版 libpcap

安装依赖:

sudo apt-get install -y flex bison

下载源代码,可以选择下载tar包解压:

# 可能已有更新版本,可以去官网查看最新版本下载地址
# https://www.tcpdump.org/
wget https://www.tcpdump.org/release/libpcap-1.10.1.tar.gz
tar -xzf libpcap-1.9.1.tar.gz

或者官方Github Mirror:

# 可能已有更新版本,可以去Github查看最新版本Tag
git clone https://github.com/the-tcpdump-group/libpcap.git --branch libpcap-1.10.1 --depth 1 libpcap-1.10.1

随后进行配置和安装,以/usr/lib作为安装目录:

cd libpcap-1.10.1/
./configure --prefix=/usr
make -j2
sudo make install

FAQ:我直接安装官方源中的libpcap-dev不行吗?

可以尝试,但可能遇到libpcap版本过低、Snort3无法使用的情况。因此还是建议官网编译安装最新版本的libpcap。

安装 netmap(可选步骤)

下载源代码:

# 可能已有更新版本,可以去Github查看最新版本Tag
git clone https://github.com/luigirizzo/netmap.git --branch v13.0 --depth 1

编译安装2

cd netmap/
./configure --prefix=/usr
make -j2
sudo make install

安装 libdaq

安装依赖:

sudo apt-get install -y pkg-config libtool libmnl-dev nftables

下载源代码:

# 可能已有更新版本,可以去Github查看最新版本Tag
git clone https://github.com/snort3/libdaq.git --branch v3.0.5 --depth 1

编译安装:

cd libdaq/
./bootstrap
./configure --prefix=/usr
make -j2
sudo make install

注意:

  • 若需要在“检测”的同时启用“过滤”功能,必须保证NFQ DAQ module处于开启状态。
  • Divert module是BSD独有的模块。
  • netmap module需要手动安装,且是可选项。

安装 libdnet

下载源代码:

# 长时间没有发布新的版本,直接使用主分支
git clone --depth 1 https://github.com/ofalk/libdnet.git

编译安装:

cd libdnet/
./configure --prefix=/usr
make -j2
sudo make install

FAQ:我直接安装官方源中的libdnet-dev不行吗?

不行的。libdnet-dev包不是Snort3需要的libdnet库,而是Debian系列系统下的DECnet库。Snort3需要的libdnet库在Ubuntu的官方源中是libdumbnet-dev包。

FAQ:那我安装libdumbnet-dev包不行吗?

理论上可以,但非常麻烦,因为需要修改Snort3的编译命令,将-ldnet全部修改为-ldumbnet

安装Snort

安装依赖:

sudo apt-get install -y libhwloc-dev luajit libluajit-5.1-dev libssl-dev libpcre3-dev zlib1g-dev liblzma-dev libunwind-dev uuid-dev libhyperscan-dev libflatbuffers-dev libsafec-dev libjemalloc-dev

下载源代码:

# 可能已有更新版本,可以去Github查看最新版本Tag
git clone https://github.com/snort3/snort3.git --branch 3.1.19.0 --depth 1
# 创建安装目录
sudo mkdir /opt/snort
./configure_cmake.sh --prefix=/opt/snort --enable-jemalloc
cd build/
make -j2
sudo make install

随后可以运行:

/opt/snort/bin/snort -V

查看Snort3的版本。

这就结束了整个编译和安装过程。

简单使用Snort

使用简单的明文Telnet测试Snort3是否可以正常使用。

虚拟网络环境设置

共有三台虚拟机同时运行:

  • Telnet服务器,只有一块NAT网卡(VMNet8),IP地址:192.168.232.130
  • Telnet客户端,只有一块Host-Only网卡(VMNet2),IP地址:192.168.153.128
  • Snort3机器,有NAT网卡(VMNet8)和Host-Only网卡(VMNet2)。IP地址分别为:192.168.232.134,192.168.153.129

对Snort3机器的网络进行设置:

首先,使用

ip addr

查看第二块网卡的设备名和MAC地址。

编辑netplan配置文件:

sudo nano /etc/netplan/50-cloud-init.yaml

仿照第一个网卡的设置,设置第二个网卡的静态IP3

ens32:addresses:- 192.168.153.129/24match:macaddress: 00:0c:29:ff:b8:87set-name: ens32

随后重启,或者直接应用netplan设置:

sudo netplan apply

再开启网卡:

sudo ip link set ens32 up

即可看到两个网卡的IP地址。

Telnet服务器设置

系统版本:Ubuntu 20.04.3 LTS Desktop amd64

安装Telnet服务器:

sudo apt-get install -y xinetd telnetd

创建Telnet Server配置文件:

sudo nano /etc/xinetd.d/telnet

配置文件中按需修改和保存以下内容4

# default: on
# description: The telnet server serves telnet sessions; it uses
# unencrypted username/password pairs for authentication.
service telnet
{disable = noflags = REUSEsocket_type = streamwait = nouser = rootserver = /usr/sbin/in.telnetdlog_on_failure += USERID
}

重启xinetd服务:

sudo service xinetd restart

即可接受客户端的Telnet连接。

Telnet客户端设置

系统版本:Windows 10 LTSC 2021 amd64,Build 19044.1415

安装Telnet客户端:

控制面板 -> 程序 -> 程序和功能 -> 启用和关闭Windows功能,勾选“Telnet客户端” -> 确定。

随后打开Windows PowerShell,用以下命令即可启动Telnet连接:

telnet <IP地址> <端口号>

设置网关

Windows上打开网络与共享中心,修改以太网的网关为192.168.153.129,并填写公网DNS服务器:

此时Windows可访问Snort3机器,不可访问Telnet Server机器。

在Snort3机器上打开IPv4包转发功能:

sudo su
echo 1 > /proc/sys/net/ipv4/ip_forward

同时修改/etc/sysctl.conf,使IPv4包转发持续开启。

修改iptables规则,设置转发和混杂模式:

sudo iptables -A FORWARD -i ens32 -o ens192 -j ACCEPT
sudo iptables -t nat -A POSTROUTING -o ens192 -j MASQUERADE
# 保存配置
sudo iptables-save > iptables.conf

此时,Telnet客户端机器已可以连接Telnet服务器。

Snort的记录模式

示例命令:

sudo /opt/snort/bin/snort -i ens32 -L dump -d

包输出举例:

包统计举例:

也可以作为抓包工具使用。示例命令:

sudo mkdir /opt/snort/pcap # 用于存放生成的pcap文件的文件夹
sudo /opt/snort/bin/snort -i ens32 -L pcap -l /opt/snort/pcap -d -e

简单上手Snort的检测模式

检测/过滤模式需要结合Snort的“配置文件”和“规则文件”进行使用。

mkdir snort_rules # 存放配置文件和规则文件
cd snort_rules/
touch config.lua # Snort的配置文件
touch telnet.rule # 针对Telnet的报警规则

参照/opt/snort/etc内的内容,编写config.lua

-- 导入通用流式协议解析规则、IP协议解析规则和TCP流解析规则
-- 可通过 --help-module $mod 查看详情
stream = {}
stream_ip = {}
stream_tcp = {}-- 设置检测规则
ips =
{-- 包含外部文件内的规则include = 'telnet.rule',-- 传递变量variables ={nets = {-- “外部网络”IPEXTERNAL_NET = 'any',-- "需要被保护的“IPHOME_NET = '192.168.232.130'}}
}

以及编写规则5。以“检测用户通过Telnet输入了sudo”为例:

# 声明协议类型、IP地址、数据流向等
alert tcp $EXTERNAL_NET any -> $HOME_NET 23 (# 自定义提示消息msg: "\"sudo\" appeared in telnet.";flow: to_server, established;# 不区分大小写content: "sudo", nocase;
)

启动Snort3。示例命令:

sudo /opt/snort/bin/snort -c config.lua -i ens32 -A fast -d

进行测试,成功产生警告:


  1. 参阅tty - How do I increase console-mode resolution? - Ask Ubuntu,可能遇到方法失效的情况。 ↩︎

  2. 参阅luigirizzo/netmap: Automatically exported from code.google.com/p/netmap,可能需要完整内核源码,且只对特定型号的网卡有效。 ↩︎

  3. 参阅Netplan | Backend-agnostic network configuration in YAML。 ↩︎

  4. 参阅17.4.2. The /etc/xinetd.d/ Directory Red Hat Enterprise Linux 4 | Red Hat Customer Portal。 ↩︎

  5. snort3-community-rules是不错的参考资料。 ↩︎

认识Snort3 (1):编译、安装与简单使用相关推荐

  1. dropbear 编译安装和简单使用

    dropbear 编译安装和简单使用 dropbear官方站点:https://matt.ucc.asn.au/dropbear/dropbear.html ssh协议的另一个实现:dropbear ...

  2. LNMP架构环境搭建之PHP、Nginx源码编译安装及其简单配置应用

    LNMP架构中的Mysql见上一篇博文"LNMP架构环境搭建之mysql源码编译安装" 一.PHP简介 PHP(外文名:PHP: Hypertext Preprocessor,中文 ...

  3. Linux下编译安装Mysql简单步骤

    常规方式编译安装MySQL时,适合用第一条最正宗的MySQL产品线5.2及以前版本: 所谓常规方式编译安装MySQL就是延续早期MySQL的3部曲安装方式,即./configure;make;make ...

  4. CentOS 7.2下编译安装PHP 7

    CentOS 7.2 编译安装PHP7 注意此配置针对开发环境,如果线上环境,那么phpdbg和dtrace这两个建议不要编译 编译安装参数 # prefix 可根据实际情况自定义 # with-fp ...

  5. Jetson Nano 源码编译安装PySide6

    背景 最近要将一个使用PySide6写GUI的程序部署到英伟达Jetson Nano上.原本以为装个conda就能很快装好环境,结果发现arm的生态有点太糟糕了,啥都要自己编译安装,尤其是这个Pysi ...

  6. 程序包管理rpm、yum与简单编译安装程序

    Linux程序包管理 Linux中软件的安装主要有两种形式:一种是直接下载源代码包自行编译后安装,另一种直接获取rpm软件包进行安装. 程序的组成部分: 二进制程序:程序的主体文件,比如我们运行一个l ...

  7. 简单编译安装Apache

    环境介绍 uname -r 拷贝 httpd 安装包,并查看大小 ls -sh httpd-2.2.27.tar.gz 安装依赖包 yum -y install zlib zlib-devel 编译安 ...

  8. Qt第三方图形控件qwt的编译安装与使用的简单方法(Win7+Qt4.8.6+MinGW4.8.2)

    一.前言 qwt虽然强大,但是安装和编译还是有些费劲的,网上资料各种奇怪的安装方法都有,但经过博主多方尝试,终于还是发现,根据qwt官方安装文档安装才是最简单省力的.步骤很简单,下面分别介绍. 二.下 ...

  9. 超简单!!centos 6离线源码编译安装升级gcc、binutils、automake、autoconf

    centos 6系列的Linux发行版,是非常成功(具足UNIX精神)的发行版,可能大家都已经用得非常习惯了. 但问题是,其内核及附带的工具软件,版本却都非常老了. centos 7上的软件版本虽然比 ...

  10. *现在感觉librealsense和realsense-ros的安装挺简单的(普通X86平台)(现在发现都有两种安装方式,下载源码编译或者二进制安装)

    下面说的就是在普通X86平台上,不是在ARM平台,不在树莓派,TX2这些平台上. 之前潜意识里似乎还觉得会比较麻烦,实际我现在真正再看一下,回看一下,不是这样的.可能就像装双系统一样,实际并不麻烦,跟 ...

最新文章

  1. 即插即用的轻量注意力机制ECA--Net
  2. MySQL时间戳(毫秒/秒)与日期格式的相互转换
  3. Service rootservice does not have a SELinux domain defined
  4. ssm前端时间格式转换
  5. java找不到数据库的表_GreenDao:no such table 找不到表的终极解决方案!
  6. 深入理解Java虚拟机2——内存管理机制及工具
  7. 河流淹没分析_【专题归纳】关于河流地貌的知识点整理!附中国十二条著名江河名称的由来...
  8. 如何安装VS2011Beta版
  9. 《数据分析思维手册》和《数据分析师的职场真相》全集整理好啦,下载保存!...
  10. 7. CPU Scheduling
  11. IAR 8.3 for Arm 安装与注册
  12. sae nodejs mysql_通过新浪云部署NideShop微信小程序商城(基于Node.js+MySQL+ThinkJS)
  13. 微信小程序:简单实现地图导航功能实现
  14. 时间漩涡的世界 (一)
  15. Class 'app\index\controller\News' not found 解决方案
  16. 用python画几个东西怎么画_一步一步教你如何用Python画一个滑稽
  17. android 中动态加载广告sdk
  18. Python爬取微信公众号素材库
  19. WORD 使用公式对齐和标注的小技巧
  20. 打造创业团队的执行力

热门文章

  1. JAVA静态变量 静态方法 两者间的区别 继承的特点 继承中的成员变量关系和成员方法 构造方法
  2. 黄金分割法求极值 matlab,利用matlab实现黄金分割法求极值问题-北京理工大学-机械优化设计.doc...
  3. java 进制转换_Java 进制转换
  4. 公差带与配合 配合选择基础
  5. 269个JavaScript工具函数,助你提升工作效率(2)
  6. dwg如何转换成pdf?
  7. python遍历文件夹下的所有文件
  8. 技嘉主板bios设置内存图解
  9. 四川行无疆电商讲解拼多多电商产品销量如何清零
  10. python网址解码_python用于url解码和中文解析的小脚本(python url decoder)