赞
踩
Snort是一个强大的轻量级的入侵检测系统,它具有实时数据流量分析和捕获IP网络数据包的能力,能够进行协议分析,对内容进行搜索匹配;它能够检测各种不同的攻击方式,对攻击对象进行实时报警;此外,Snort具有很好的扩展性和可移植性。Snort遵循通用公共许可证GPL,所以只要遵守GPL的任何组织和个人都可以使用。
官网链接https://www.snort.org/,受网络环境影响,可能出现打不开或打开缓慢的情况。
本次安装采用的操作系统为Centos 8 stream,Centos 7和Ubuntu均测试过,这里建议按官方手册使用Centos 8 stream,所需要单独下载的安装包最少,大部分可在线安装。flatbuffers-1.12.tar.gz由于时间久远在线安装失败,需要提前准备。
操作系统硬件没有特殊要求,在完成基本的snort安装后,操作系统+软件使用磁盘空间为5G,我的实验环境为CPU 4核,内存4G,硬盘100G。
操作系统下载地址http://mirrors.163.com/centos/8-stream/isos/x86_64/,800多M的镜像是精简版,安装时需要服务器可以联网,如服务器无法联网则需要下载11G的完整版。
使用精简版镜像,可填写下面链接信息,选其中一个就可以
mirrors.aliyun.com/centos/8/BaseOS/x86_64/os/
mirrors.163.com/centos/8-stream/BaseOS/x86_64/os/
安装时选择最小化安装。
安装完成后更换yum源为国内的源,下载速度更快。
安装涉及到如下目录:
此步骤开始前提为系统已安装完毕,可以访问互联网。安装以官网手册为主要指导,对实际中与手册不同的地方重点说明。https://www.snort.org/documents#OfficialDocumentation,官网下载链接。
下面按顺序列出操作命令。
# dnf config-manager --add-repo /etc/yum.repos.d/CentOS-Stream-PowerTools.repo //官方手册里有这句,实际不需要,系统已经自带。
# dnf config-manager --set-enabled powertools //开启PowerTools 存储库,一些安装的软件在这个库内
# dnf install epel-release
# dnf upgrade
# reboot now
# mkdir sources && cd sources //新建一个目录将所有下载的安装包统一放置,我的目录是在/usr/local/下,后面的命令也是以这个目录为参数,如果修改了位置,注意后面部分命令同步修改。
# dnf install vim git
# vi /etc/ld.so.conf.d/local.conf //新建一个文件并编辑,加入下面2行内容。
/usr/local/lib
/usr/local/lib64
# ldconfig //关联库文件,后面还有多个地方会用到,不再说明。
# dnf install flex bison gcc gcc-c++ make cmake automake autoconf libtool
前面基础准备完成,下图是软件所需组件的介绍,required为必须,optional为可选,有部分可选是强烈建议安装,会提升性能。
# dnf install libpcap-devel pcre-devel libdnet-devel hwloc-devel openssl-devel zlib-devel luajit-devel pkgconf libmnl-devel libunwind-devel //手册里是一条命令安装多个软件,这里要注意复制粘贴会出现多了一个回车把第二行的软件未包含在安装内,此时第一行的软件都安装正常也不会报错,导致后面安装出现一些报错。这里一定要检查清楚是不是都安装上了。
luajit-devel libunwind-devel 在最近一次安装中已无法自动安装,需要手动下载安装,需要安装包如下图。https://rhel.pkgs.org/ 后续还有遇到无法自动安装的包可以在这个网站上搜索下载。注意rpm包的安装命令。
# dnf install libnfnetlink-devel libnetfilter_queue-devel
下面开始下载源码进行安装,下载源码时进入之前创建的文件夹/usr/local/sources,统一管理libdaq需要>=3.0.0。
# git clone https://github.com/snort3/libdaq.git //近期安装已无法自动下载,并且版本更新此链接可能会失效,建议直接到。https://github.com/snort3 下载安装包
# cd libdaq/ //注意把下载的压缩包解压后的文件夹名字修改一下
# ./bootstrap //直接下的压缩包,此文件需添加执行权限
# ./configure
# make -j$(nproc)
# make -j$(nproc) install
# ldconfig
# cd ../ //回到目录/usr/local/sources。
# dnf install xz-devel libuuid-devel
# dnf install hyperscan hyperscan-devel //最近一次安装无法自动,手动下载安装
flatbuffers-1.12.tar.gz 在线下载失败,这里手动上传到目录下。
# tar xf flatbuffers-1.12.tar.gz
# mkdir fb-build && cd fb-build
# cmake ../flatbuffers-1.12.0
# make -j$(nproc) //后面的参数是读取CPU内核数,多核运行
# make -j$(nproc) install
# ldconfig
# cd ../ //回到目录/usr/local/sources。
# dnf install libsafec libsafec-devel //无法自动安装
# ln -s /usr/lib64/pkgconfig/safec-3.3.pc /usr/lib64/pkgconfig/libsafec.pc
# dnf install gperftools-devel //无法自动安装
下面开始安装snort3,当前目录/usr/local/sources
# git clone https://github.com/snort3/snort3.git
# cd snort3
# export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:$PKG_CONFIG_PATH
# export PKG_CONFIG_PATH=/usr/local/lib64/pkgconfig:$PKG_CONFIG_PATH
# export CFLAGS="-O3"
# export CXXFLAGS="-O3 -fno-rtti"
# ./configure_cmake.sh --prefix=/usr/local/snort --enable-tcmalloc
# cd build/
# make -j$(nproc)
# make -j$(nproc) install
# cd ../../
安装snort中,执行下面命令后结果与手册不一致,多出libatomic,后面单词意思为系统自带,没关系;多出JEMalloc,这个是一个内存分配管理工具,和TCMalloc功能一样,没关系。
安装完成,注意区分安装包目录和软件安装目录,安装后会在/usr/local/目录下生成文件夹snort,实际安装的软件在这里。/usr/local/sources,这个目录都是安装包,并不是安装后的软件。
# /usr/local/snort/bin/snort -V //查看安装完成信息。
可能出现的错误:
[root@localhost lib]# /usr/local/snort/bin/snort -V
/usr/local/snort/bin/snort: error while loading shared libraries: libdaq.so.3: cannot open shared object file: No such file or directory
出现这类错误表示,系统不知道xxx.so
放在哪个目录下,这时候就要在/etc/ld.so.conf
中加入xxx.so
所在的目录。
在/etc/ld.so.conf
中加入/usr/local/lib
这一行,保存之后,再运行:/sbin/ldconfig –v
更新一下配置即可。
再次返回安装包目录。
# git clone https://github.com/snort3/snort3_extra.git //最新版本用此链接安装会报错失败,需要直接到页面下载,自行上传安装。
# cd snort3_extra
# export PKG_CONFIG_PATH=/usr/local/snort/lib64/pkgconfig:$PKG_CONFIG_PATH
# ./configure_cmake.sh --prefix=/usr/local/snort/extra
# cd build/
# make -j$(nproc)
# make -j$(nproc) install
# cd ../../
至此完成基本的功能安装。
配置主要为两个文件snort_defaults.lua和snort.lua。目录位置/usr/local/snort/etc/snort
下图是两个配置文件各自相关的配置内容。
# mkdir -p /usr/local/snort/{builtin_rules,rules,appid,intel} //在软件安装目录新建4个规则目录
注意:下面步骤与手册里变化较大。
#mkdir rules && cd rules //新建一个目录用于存放解压后的规则
snort有三种规则,免费版、注册版、收费版。安装完成自带免费版,注册版需要注册一个官网账号,收费版需额外购买。https://www.snort.org/downloads#rules,下载编号最大的。
手动下载后上传到文件夹内解压,压缩包内包含3个文件夹builtins,etc,rules。
# cp rules/*.rules /usr/local/snort/rules/ //复制规则到软件规则目录下。
# cp builtins/builtins.rules /usr/local/snort/builtin_rules/ //复制规则到软件规则目录下。
接下来手册里的操作是复制解压包里的配置文件到软件安装目录下。这里不要直接复制文件到软件目录下,在后续编译阶段会出现报错,且百度上仅搜到一个帖子,无法解决问题。
cp etc/file_magic.lua /usr/local/snort/etc/snort/ //这个手册里没写,实际需要复制过去
手动下载OpenAppID,这个文件用于识别应用。与规则下载同页面,在下方。
解压文件后执行下面命令。
mv odp/ /usr/local/snort/appid/
下面是黑白名单功能列表。
# curl -Lo ip-blocklist https://www.talosintelligence.com/documents/ip-blacklist
# mv ip-blocklist /usr/local/snort/intel/
# touch /usr/local/snort/intel/ip-allowlist //白名单是新建的。
编辑snort_defaults.lua文件,这里的文件还是原始文件,编辑前先备份。
原始格式:
-- Path to your rules files (this can be a relative path)
RULE_PATH = '../rules'
BUILTIN_RULE_PATH = '../builtin_rules'
PLUGIN_RULE_PATH = '../so_rules'
-- If you are using reputation preprocessor set these
WHITE_LIST_PATH = '../lists'
BLACK_LIST_PATH = '../lists'
修改后格式:
-- Path to your rules files (this can be a relative path)
RULE_PATH = '../../rules/'
BUILTIN_RULE_PATH = '../../builtin_rules/'
PLUGIN_RULE_PATH = '../../so_rules/'
-- If you are using reputation preprocessor set these
WHITE_LIST_PATH = '../../intel/'
BLACK_LIST_PATH = '../../intel/'
-- Path to AppID ODP - Optional
APPID_PATH = '/usr/local/snort/appid' //这后面没有/,因为下级还是目录
这里要特别注意,手册里的命令在目录的最后缺少了/,导致编译的时候报错。../../意思是返回上上级目录,原始文档是返回上级目录。最后是添加了APPID的目录。这里注意如果有报错提示找不到rules,很大可能就是上面的路径问题,为了避免环境设置的问题,可以全用绝对路径来配置。
RULE_PATH = '/usr/local/snort/rules/'
BUILTIN_RULE_PATH = '/usr/local/snort/builtin_rules/'
PLUGIN_RULE_PATH = '/usr/local/snort/so_rules/
进入文件开始编辑。
4.3.1 编辑ips规则
原始配置:
ips =
{
-- use this to enable decoder and inspector alerts
--enable_builtin_rules = true,
-- use include for rules files; be sure to set your path
-- note that rules files can include other rules files
-- (see also related path vars at the top of snort_defaults.lua)
variables = default_variables
}
这里是将rules目录下的规则加到配置文件内,启动软件时即可自动读取。同步打开下载的规则目录下etc文件夹内的snort.lua文件,找到ips这个章节,复制下面内容到 variables = default_variables下面,rules里条目很多,下面就是列举。最后要注意, variables = default_variables的后面要加一个英文逗号。
variables = default_variables, //下载的规则包里的snort.lua文件是
variables = default_variables_singletable,测试不行,会报错
rules = [[
include $RULE_PATH/snort3-app-detect.rules
include $RULE_PATH/snort3-browser-chrome.rules
include $RULE_PATH/snort3-browser-firefox.rules
include $RULE_PATH/snort3-browser-ie.rules
include $RULE_PATH/snort3-browser-other.rules
include $RULE_PATH/snort3-browser-plugins.rules
include $RULE_PATH/snort3-browser-webkit.rules
include $RULE_PATH/snort3-content-replace.rules
include $RULE_PATH/snort3-exploit-kit.rules
include $RULE_PATH/snort3-file-executable.rules
include $RULE_PATH/snort3-file-flash.rules
手册里还要添加--mode = tap, 这条,实际测试加不加效果一致。
4.3.2 添加调用
在文档的上部添加一条include 'file_magic.lua'。
4.3.3 启用APPID
APPID配置修改。
修改前:
appid =
{
-- appid requires this to use appids in rules
--app_detector_dir = 'directory to load appid detectors from'
}
修改后:
appid =
{
-- appid requires this to use appids in rules
app_detector_dir = APPID_PATH,
}
注意:IDS模式下,黑名单功能不可用,按手册启用配置会报错,不要修改默认配置。
4.3.4 配置日志
将原始配置改为下面配置,意思为使用full模式保存日志,保存目录为运行命令的当前目录,文件名为alert_full.txt。
修改前
-- alert_full = { }
修改后
alert_full =
{
file = true
}
配置后,监听命令后如不使用-A参数,则按配置文件,保存在alert_full.txt文件内,此文件在当前执行命令目录下,屏幕上不在显示。如使用-A alert_fast,则不按配置文件执行。
如不想在此目录下保存文件,可使用-l参数。
# snort -i enp0s8 -l /var/log/snort
# snort -i enp0s8 -A alert_full -l /var/log/snort //如果报错就加上-A参数
多次执行命令,不会覆盖原有日志,追加模式,为避免长时间运行文件过大,导致打开缓慢,可定期任务暂停,将文件拷出,删除原有文件。任务重新开始会再次新建文件。
还可以将日志发送到syslog服务器,需要服务器配置好rsyslog功能。
4.4.1 优化网卡接收
本机网卡名称为enp0s8,下面命令中需要替换成当前安装机器的网卡名。
编辑网卡配置文件将默认配置改成下面内容:
TYPE=Ethernet
BOOTPROTO=none
IPV4_FAILURE_FATAL=no
IPV6INIT=no
IPV6_FAILURE_FATAL=no
NAME=enp0s8
DEVICE=enp0s8
ONBOOT=yes
添加以下两行内容:
ETHTOOL_OPTS="-K enp0s8 gro off gso off lro off rx off rxvlan off sg off tso off tx off txvlan off"
ETHTOOL_CMD="-G enp0s8 rx 4096"
添加后执行命令加载,重启网卡
# nmcli con load /etc/sysconfig/network-scripts/ifcfg-enp0s8
# nmcli con up enp0s8
新建可执行文件,执行网卡配置文件里的内容
# vi /etc/NetworkManager/dispatcher.d/99-ethtool.sh
添加以下内容
#!/bin/bash
# BEGIN 99-ethtool.sh
if [[ $2 == up ]]; then
SCRIPT="$(basename "$0")"
if [[ -e $CONNECTION_FILENAME ]]; then
source $CONNECTION_FILENAME
if [[ -n $ETHTOOL_CMD ]]; then
ETHTOOL_CMD="/usr/sbin/ethtool $ETHTOOL_CMD"
if $ETHTOOL_CMD; then
logger "$SCRIPT: success: $ETHTOOL_CMD"
else
logger "$SCRIPT: failed: $ETHTOOL_CMD"
fi
else
logger "$SCRIPT: ETHTOOL_CMD not in $CONNECTION_FILENAME, skipping"
fi
else
logger "$SCRIPT: $CONNECTION_FILENAME does not exist?"
fi
fi
给文件添加执行权限
# chmod +x /etc/NetworkManager/dispatcher.d/99-ethtool.sh
4.4.2 设置网卡混杂
新建并编辑此文件
# vi /etc/systemd/system/promisc.service
添加如下内容
[Unit]
Description=Snort 3 interface promiscuous mode during boot service
After=network.target
[Service]
Type=oneshot
ExecStart=/usr/sbin/ip link set dev enp0s8 arp off
ExecStart=/usr/sbin/ip link set dev enp0s8 multicast off
ExecStart=/usr/sbin/ip link set dev enp0s8 promisc on
TimeoutStartSec=0
RemainAfterExit=yes
[Install]
WantedBy=default.target
网卡改为混杂模式,同时关闭了接收ARP和组播。
# systemctl daemon-reload
# systemctl enable promisc.service
执行完上述命令,重启服务器。
# systemctl status promisc.service
网卡接收配置修改也生效。
# ln -s /usr/local/snort/bin/snort /sbin/snort //新建一个链接,后续可直接执行命令snort而不需要在前面加绝对路径/usr/local/snort/bin/snort。
开启检测时,每次都需要加载规则。
snort -c /usr/local/snort/etc/snort/snort.lua
为简化输入,设置别名。
vim /root/.bashrc //编辑此文件。
alias snort='snort -c /usr/local/snort/etc/snort/snort.lua' //添加这条。
source /root/.bashrc //加载文件。
完成上述配置,开启检测命令如下。
snort -i enp0s8 // enp0s8是网卡名。
执行后,页面上无输出,日志都记录在文档内。
snort -i enp0s8 –z 4 //4线程检测。
如果后续需要使用原始snort命令,需要用绝对路径/usr/local/snort/bin/snort,然后接参数执行。
root用户权限过高,正常使用软件可新建一个普通用户运行程序,此用户无法登录,进用于后台运行程序。下面创建一个用户snort和对应的组。
# groupadd snort
# useradd snort -r -M -g snort -s /sbin/nologin -c SNORT_SERVICE_ACCOUNT
下面是设置日志存放位置。
# mkdir /var/log/snort
# chmod -R 5700 /var/log/snort
# chown -R snort:snort /var/log/snort
新建启动文件
# vi /etc/systemd/system/snort.service
添加下面内容,网卡名注意修改
[Unit]
Description=Snort 3 Intrusion Detection and Prevention service
After=syslog.target network.target
[Service]
Type=simple
ExecStart=/usr/local/snort/bin/snort -c /usr/local/snort/etc/snort/snort.lua --plugin-path /usr/local/snort/extra -i enp0s8 -l /var/log/snort -D -u snort -g snort --create-pidfile -k none
ExecReload=/bin/kill -SIGHUP $MAINPID
User=snort
Group=snort
Restart=on-failure
RestartSec=5s
CapabilityBoundingSet=CAP_NET_ADMIN CAP_NET_RAW CAP_IPC_LOCK
AmbientCapabilities=CAP_NET_ADMIN CAP_NET_RAW CAP_IPC_LOCK
[Install]
WantedBy=multi-user.target
加载启动文件
# systemctl daemon-reload
# systemctl enable snort.service
手册里说明了另一个方法是在snort.lua文件里添加一段配置,手动执行时减少一些参数输入。这里个人不建议配置,常用参数可放在文本文档里,每次执行复制即可。如需要用root执行时,还要再次修改恢复配置文件,反而麻烦。
其他操作命令
# systemctl enable snort.service //开启自动启
# systemctl start snort.service //启动
# systemctl status snort.service //查看
# systemctl stop snort.service //停止
# systemctl disable snort.service //取消自启动
# systemctl restart snort.service //重启
#systemctl list-unit-files --type service |grep snort //查看自启动
修改CPU的优化模板,加强网络性能。
# tuned-adm profile network-throughput //使用网络模板
# tuned-adm active 查看当前模板
tuned-adm系统性能优化工具详解_道阻且长行则将至!的博客-CSDN博客_tuned-adm 参数说明
首先确认网卡是否支持
ethtool -l enp0s8 //下面图片里的结果是不支持
支持会有如下显示
Channel parameters for eth0:
Pre-set maximums:
RX: 0
TX: 0
Other: 0
Combined: 8
Current hardware settings:
RX: 0
TX: 0
Other: 0
Combined: 4
执行下面命令,使数据包更评价的分配到各个CPU核上
# ethtool -N ifname rx-flow-hash udp4 sdfn
# ethtool -N ifname rx-flow-hash udp6 sdfn
5.7.1 启用hyperscan
安装依赖
# dnf install python3 sqlite-devel colm ragel
手册里的boost_1_73_0.tar.gz包无法下载,使用boost_1_81_0.tar.gz代替安装,上传后解压。
手册里的hyperscan-5.3.0.tar.gz包无法下载,使用hyperscan-5.4.0.tar.gz代替安装,上传后解压。
# mkdir hs-build && cd hs-build
#cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr/local -DBOOST_ROOT=../boost_1_81_0 ../hyperscan-5.4.0
# make -j$(nproc)
# make -j$(nproc) install
# cd ../
#./bin/unit-hyperscan 检查安装情况
snort3对比snort2的优势,启用后,软件启动时间会明显增加。
新建一个参数文件,后续优化都会使用
# vim /usr/local/snort/etc/snort/custom_tweaks.lua
进入文档添加
-- Enable hyperscan for IPS, AppID and HTTP inspection
-- Enable hyperscan for pcre/regex matches
search_engine = { search_method = "hyperscan" }
detection = { hyperscan_literals = true, pcre_to_regex = true }
使用方法,在执行时添加参数
snort -i enp0s8 --tweaks custom_tweaks -A alert_fast
也可以参照5.2的方法,在别名里将此参数加入,5.4加入开机自启动。
5.7.2 开启检测压缩包检测
custom_tweaks.lua文件中添加下面内容
-- Enable ZIP, PDF and SWF decompression in http_inspect
http_inspect.decompress_pdf = true
http_inspect.decompress_swf = true
http_inspect.decompress_zip = true
-- Enable ZIP, PDF and SWF decompression in smtp
smtp.decompress_pdf = true
smtp.decompress_swf = true
smtp.decompress_zip = true
官方手册里还有部分优化项目,用处不大,或按手册配置报错还需继续研究。Snort虽然支持inline模式做阻断,但考虑这是开源软件,国内无服务商,常见的还是作为旁路镜像流量的检测设备,与现有设备形成异构,交叉检查网络流量使用。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。