认识 Snort3 (1):编译、安装与简单使用
图源:SAyuki - 《Gray》,Pid:79912976
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 服务启动。
1 | sudo service cloud-config stop |
可以卸载相关软件包:
1 | sudo apt-get remove -y cloud-init |
同时 rsync、snapd 等程序也可以按照需要进行卸载。
DNS 解析
修改 DNS 解析可以结合以下命令:
1 | ip addr # 获取网卡接口名称 |
修改 APT 源
编辑/etc/apt/sources.list
,更换 apt 源至国内源。教程很多,此处不做详细说明。
修改控制台的分辨率
处于控制台模式下时,发现默认分辨率为 700x400px。这时除了设置 OpenSSH Server 通过远程连接虚拟机外,还可以通过修改 Grub 配置来改变控制台分辨率。
以修改为 1600x1200px 为例,在 /etc/default/grub
中加入以下两行:
1 | GRUB_GFXMODE=1600x1200 |
保存后运行:
1 | sudo update-grub |
重启即可看到效果。1
使 SSH 服务允许使用密码登陆
默认已安装和启用 SSH 服务。若需要 ubuntu 用户通过密码连接至虚拟机,编辑/etc/ssh/sshd_config
,查找如下行:
1 | PasswordAuthentication no |
改为yes
,并重新启动 SSH 服务即可。
分区扩容
使用 parted
进行分区扩容。
1 | sudo parted /dev/sda |
随后使用 resize2fs
进行文件系统扩容。
1 | sudo resize2fs /dev/sda1 |
至此已成功扩容。
安装基本开发环境
1 | sudo apt-get install -y build-essential cmake autoconf |
其他安装过程中需要的依赖,在详细步骤中进行说明。
安装新版 libpcap
安装依赖:
1 | sudo apt-get install -y flex bison |
下载源代码,可以选择下载 tar 包解压:
1 | # 可能已有更新版本,可以去官网查看最新版本下载地址 |
或者官方 Github Mirror:
1 | # 可能已有更新版本,可以去 Github 查看最新版本 Tag |
随后进行配置和安装,以 /usr/lib
作为安装目录:
1 | cd libpcap-1.10.1/ |
FAQ:我直接安装官方源中的
libpcap-dev
不行吗?
可以尝试,但可能遇到 libpcap 版本过低、Snort3 无法使用的情况。因此还是建议官网编译安装最新版本的 libpcap。
安装 netmap(可选步骤)
下载源代码:
1 | # 可能已有更新版本,可以去 Github 查看最新版本 Tag |
编译安装2:
1 | cd netmap/ |
安装 libdaq
安装依赖:
1 | sudo apt-get install -y pkg-config libtool libmnl-dev nftables |
下载源代码:
1 | # 可能已有更新版本,可以去 Github 查看最新版本 Tag |
编译安装:
1 | cd libdaq/ |
注意:
- 若需要在“检测”的同时启用“过滤”功能,必须保证 NFQ DAQ module 处于开启状态。
- Divert module 是 BSD 独有的模块。
- netmap module 需要手动安装,且是可选项。
安装 libdnet
下载源代码:
1 | # 长时间没有发布新的版本,直接使用主分支 |
编译安装:
1 | cd libdnet/ |
FAQ:我直接安装官方源中的
libdnet-dev
不行吗?
是 不行 的。libdnet-dev
包不是 Snort3 需要的 libdnet 库,而是 Debian 系列系统下的 DECnet 库。Snort3 需要的 libdnet 库在 Ubuntu 的官方源中是 libdumbnet-dev
包。
FAQ:那我安装
libdumbnet-dev
包不行吗?
理论上可以,但 非常麻烦 ,因为需要修改 Snort3 的编译命令,将-ldnet
全部修改为-ldumbnet
。
安装 Snort
安装依赖:
1 | 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 |
下载源代码:
1 | # 可能已有更新版本,可以去 Github 查看最新版本 Tag |
随后可以运行:
1 | /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 机器的网络进行设置:
首先,使用
1 | ip addr |
查看第二块网卡的设备名和 MAC 地址。
编辑 netplan 配置文件:
1 | sudo nano /etc/netplan/50-cloud-init.yaml |
仿照第一个网卡的设置,设置第二个网卡的静态 IP4。
1 | ens32: |
随后重启,或者直接应用 netplan 设置:
1 | sudo netplan apply |
再开启网卡:
1 | sudo ip link set ens32 up |
即可看到两个网卡的 IP 地址。
Telnet 服务器设置
系统版本:Ubuntu 20.04.3 LTS Desktop amd64
安装 Telnet 服务器:
1 | sudo apt-get install -y xinetd telnetd |
创建 Telnet Server 配置文件:
1 | sudo nano /etc/xinetd.d/telnet |
配置文件中按需修改和保存以下内容3:
1 | # default: on |
重启 xinetd 服务:
1 | sudo service xinetd restart |
即可接受客户端的 Telnet 连接。
Telnet 客户端设置
系统版本:Windows 10 LTSC 2021 amd64,Build 19044.1415
安装 Telnet 客户端:
控制面板 -> 程序 -> 程序和功能 -> 启用和关闭 Windows 功能,勾选“Telnet 客户端” -> 确定。
随后打开 Windows PowerShell,用以下命令即可启动 Telnet 连接:
1 | telnet <IP 地址 > < 端口号 > |
设置网关
Windows 上打开网络与共享中心,修改以太网的网关为 192.168.153.129,并填写公网 DNS 服务器:
此时 Windows 可访问 Snort3 机器,不可访问 Telnet Server 机器。
在 Snort3 机器上打开 IPv4 包转发功能:
1 | sudo su |
同时修改/etc/sysctl.conf
,使 IPv4 包转发持续开启。
修改 iptables 规则,设置转发和混杂模式:
1 | sudo iptables -A FORWARD -i ens32 -o ens192 -j ACCEPT |
此时,Telnet 客户端机器已可以连接 Telnet 服务器。
Snort 的记录模式
示例命令:
1 | sudo /opt/snort/bin/snort -i ens32 -L dump -d |
包输出举例:
包统计举例:
也可以作为抓包工具使用。示例命令:
1 | sudo mkdir /opt/snort/pcap # 用于存放生成的 pcap 文件的文件夹 |
简单上手 Snort 的检测模式
检测 / 过滤模式需要结合 Snort 的“配置文件”和“规则文件”进行使用。
1 | mkdir snort_rules # 存放配置文件和规则文件 |
参照 /opt/snort/etc
内的内容,编写config.lua
:
1 | -- 导入通用流式协议解析规则、IP 协议解析规则和 TCP 流解析规则 |
以及编写规则 5。以“检测用户通过 Telnet 输入了 sudo”为例:
1 | # 声明协议类型、IP 地址、数据流向等 |
启动 Snort3。示例命令:
1 | 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. 参阅 17.4.2. The /etc/xinetd.d/ Directory Red Hat Enterprise Linux 4 | Red Hat Customer Portal。↩
- 4. 参阅 Netplan | Backend-agnostic network configuration in YAML。↩
- 5.snort3-community-rules 是不错的参考资料。↩
认识 Snort3 (1):编译、安装与简单使用