也许每个人出生的时候都以为这世界都是为他一个人而存在的,当他发现自己错的时候,他便开始长大
少走了弯路,也就错过了风景,无论如何,感谢经历
转移发布平台通知:将不再在CSDN博客发布新文章,敬请移步知识星球
感谢大家一直以来对我CSDN博客的关注和支持,但是我决定不再在这里发布新文章了。为了给大家提供更好的服务和更深入的交流,我开设了一个知识星球,内部将会提供更深入、更实用的技术文章,这些文章将更有价值,并且能够帮助你更好地解决实际问题。期待你加入我的知识星球,让我们一起成长和进步
网上看到了许多Snort3的安装以及Snort2的安装教程,尤其是Snort3的安装,博主严重怀疑他们有没有真的安装成功... ...,让人真的想扣jio,Snort3按照其它博主给的搭一直出问题,不是搭不上就是报错要么就是写的很乱,没看的欲望。而且Snort3和Snort2的安装区别很大,博主只尝试了Snort3的完整安装,并记录了下来,Snort2的网上很详细,也顺路整理了一下,有需要的自取
0x01 Snort2安装教程
- 安装Snort2 需要的依赖
apt-get install gcc : 编译器,如果报错,apt-get install g++
apt-get install flex : DAQ所需的解析器
apt-get install bison : DAQ所需的解析器
apt-get install zlib1g-dev : Snort所需的压缩库
apt-get install libpcap-dev : Snort所需的网络流量捕获头文件库
apt-get install libdnet-dev : 不是必要的,只是snort为几个网络历程提供了简化的可移植接口
apt-get install luajit : lua的头文件库headers
apt-get install liblua5.1-0-dev
apt-get install liblua5.1-0-dev liblua50-dev liblualib50-dev
apt-get install build-essential : 提供编译软件的构建工具
apt-get install libpcre3-dev : Snort所需的pcre3的头文件
apt-get install libdumbnet-dev : 同libdnet
apt-get install openssl libssl-dev : ssl的加密组件,提供SHA和MD5文件签名
apt-cache search lua
sudo apt-get update -y
sudo apt-get upgrade -y
sudo apt-get install gcc -y
sudo apt-get install flex -y
sudo apt-get install bison -y
sudo apt-get install zlib1g-dev -y
sudo apt-get install libpcap-dev -y
sudo apt-get install libdnet-dev -y
sudo apt-get install luajit -y
sudo apt-get install liblua5.1-0-dev liblua50-dev liblualib50-dev -y
sudo apt-get install build-essential -y
sudo apt-get install libpcre3-dev -y
sudo apt-get install libdumbnet-dev -y
sudo apt-get install openssl libssl-dev -y
sudo apt-cache search lua -y
- 下载一些源tarball和其他文件,将它们存储在一个文件夹中,方便管理
mkdir ~/snort_src
cd ~/snort_src
- 安装libpcap
cd ~/snort_src
wget https://www.tcpdump.org/release/libpcap-1.10.1.tar.gz
tar -zxvf libpcap-1.10.1.tar.gz
cd libpcap-1.10.1
./configure && make && make install
- 安装nghttp2
cd ~/snort_src
wget https://github.com/nghttp2/nghttp2/releases/download/v1.46.0/nghttp2-1.46.0.tar.gz
tar -zxvf nghttp2-1.46.0.tar.gz
cd nghttp2-1.46.0
./configure && make && make install
- 安装LuaJIT
cd ~/snort_src
wget https://luajit.org/download/LuaJIT-2.0.5.tar.gz
tar -zxvf LuaJIT-2.0.5.tar.gz
cd LuaJIT-2.0.5
make && make install (ps:无./configure)
- 安装pcre
cd ~/snort_src
wget https://sourceforge.net/projects/pcre/files/pcre/8.45/pcre-8.45.tar.gz
tar -zxvf pcre-8.45.tar.gz
cd pcre-8.45
./configure && make && make install
- 安装daq
cd ~/snort_src
wget https://www.snort.org/downloads/snort/daq-2.0.7.tar.gz
tar xvzf daq-2.0.7.tar.gz
cd daq-2.0.7
./configure && make && sudo make install
- 安装Snort2
cd ~/snort_src
wget https://www.snort.org/downloads/snort/snort-2.9.19.tar.gz
tar xvzf snort-2.9.19.tar.gz
cd snort-2.9.19
./configure --enable-sourcefire && make && sudo make install
编译出错请使用如下命令
./configure --disable-open-appid && make && sudo make install
sudo ldconfig
ln -s /usr/local/bin/snort /usr/sbin/snort
snort -V
1.1 配置snort文件
- 创建一些必要的文件
# Snort的安装目录
sudo mkdir /etc/snort
sudo mkdir /etc/snort/rules
sudo mkdir /etc/snort/rules/iplists
sudo mkdir /etc/snort/preproc_rules
sudo mkdir /usr/local/lib/snort_dynamicrules
sudo mkdir /etc/snort/so_rules
# 存储过滤规则和服务器黑白名单
sudo touch /etc/snort/rules/iplists/default.blacklist
sudo touch /etc/snort/rules/iplists/default.whitelist
sudo touch /etc/snort/rules/local.rules
# 创建日志目录
sudo mkdir /var/log/snort
sudo mkdir /var/log/snort/archived_logs
# 调整权限
sudo chmod -R 5775 /etc/snort
sudo chmod -R 5775 /var/log/snort
sudo chmod -R 5775 /var/log/snort/archived_logs
sudo chmod -R 5775 /etc/snort/so_rules
sudo chmod -R 5775 /usr/local/lib/snort_dynamicrules
# 改变文件夹属主
sudo chown -R snort:snort /etc/snort
sudo chown -R snort:snort /var/log/snort
sudo chown -R snort:snort /usr/local/lib/snort_dynamicrules
classification.config : 描述了Snort理解的攻击分类类型(将规则分组为这些类型的分类),例如木马活动或系统调用检测。分类列表可以在Snort手册的第3.4.6节中找到
file_magic.conf : 描述了用于标识文件类型的规则
reference.config : 包含提供有关警报的更多信息的规则中引用的URL
snort.conf : 是Snort的配置文件,它告诉Snort资源的位置,以及如何输出警报等
threshold.conf : 允许您控制生成警报所需的事件数,这有助于抑制噪声警报
gen-msg.map : 告诉Snort哪个规则使用哪个预处理器,更多信息在这里。
unicode.map : 提供Unicode语言和标识符之间的映,nSnort需要此文件才能启动。
- 复制文件到我们的/etc/snort,这里的路径一定要确保是你的snort的解压路径
sudo cp ~/snort_src/snort-2.9.19/etc/*.conf* /etc/snort
sudo cp ~/snort_src/snort-2.9.19/etc/*.map /etc/snort
sudo cp ~/snort_src/snort-2.9.19/etc/*.dtd /etc/snort
sudo cp ~/snort_src/snort-2.9.19/src/dynamic-preprocessors/build/usr/local/lib/snort_dynamicpreprocessor/* /usr/local/lib/snort_dynamicpreprocessor/
- 修改默认配置
编辑snort.conf (ps:现在你的snort.conf在/etc/snort/下)
gedit /etc/snort/snort.conf
或
sudo vi /etc/snort/snort.conf
1. 修改一些文件的路径,你可以搜索RULE_PATH,然后将下面几个路径改为如下
var RULE_PATH /etc/snort/rules
var SO_RULE_PATH /etc/snort/so_rules
var PREPROC_RULE_PATH /etc/snort/preproc_rules
# If you are using reputation preprocessor set these
var WHITE_LIST_PATH /etc/snort/rules/iplists/
var BLACK_LIST_PATH /etc/snort/rules/iplists/
2. 打开文件过滤规则包含,去掉开头的#号
include $RULE_PATH/local.rules
3. 修改配置文件让黑白名单生效
whitelist $WHITE_LIST_PATH/default.whitelist, \
blacklist $BLACK_LIST_PATH/default.blacklist
- 安装rules包
wget https://www.snort.org/downloads/registered/snortrules-snapshot-29190.tar.gz
tar zxvf snortrules-snapshot-29190.tar.gz -C /etc/snort
cp /etc/snort/so_rules/precompiled/RHEL-6-0/x86-64/2.9.19.0/* /usr/local/lib/snort_dynamicrules/
- 启动测试,请无视WARNING警告,不用担心,这不会影响我们的安装
sudo snort -T -c /etc/snort/snort.conf
......
Snort successfully validated the configuration!
Snort exiting
-
Snort2 安装教程
https://blog.csdn.net/weixin_46763552/article/details/116350545 -
Snort2 规则配置教程
https://blog.csdn.net/weixin_46763552/article/details/116350908
参考链接:
https://blog.csdn.net/qq_38990949/article/details/85568020
0x02 Snort3安装
2.1 安装依赖以及必备组件
sudo apt-get update && sudo apt-get dist-upgrade -y
sudo apt-get install -y libpcap-dev libpcre3-dev libdumbnet-dev zlib1g-dev
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
2.2 调整时间
sudo dpkg-reconfigure tzdata
2.3 下载一些源tarball和其他文件,将它们存储在一个文件夹中,方便管理
mkdir ~/snort_src
cd ~/snort_src
2.4 下载并安装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
2.5 安装Hyperscan
Snort 3使用Hyperscan进行快速模式匹配。可以从Ubuntu存储库安装一个旧版本的Hyperscan,但是Hyperscan对Snort的操作和性能至关重要,最好编译Hyperscan的最新稳定版本。Hyperscan有一个需求数量,包括PCRE、gper工具、ragel和Boost库。
- 首先安装PCRE:Perl兼容的正则表达式。不使用Ubuntu存储库,因为它有一个旧版本:
cd ~/snort_src/
wget https://nchc.dl.sourceforge.net/project/pcre/pcre/8.45/pcre-8.45.tar.gz
tar -xzvf pcre-8.45.tar.gz
cd pcre-8.45
./configure
make
sudo make install
- 安装 gpertools
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
- 安装 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
- 下载(但不要安装)Boost C++库
cd ~/snort_src
wget https://boostorg.jfrog.io/artifactory/main/release/1.78.0/source/boost_1_78_0.tar.gz
tar -xvzf boost_1_78_0.tar.gz
- 从源代码处安装Hyperscan 5.3,参考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_78_0/ ../hyperscan-5.4.0
make
sudo make install
2.6 安装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
2.7 安装DAQ
安装数据采集库(DAQ),Snort3使用的数据采集卡与Snort 2.9.0系列不同
cd ~/snort_src
# 可以根据自身下载最新的库
wget https://github.com/snort3/libdaq/archive/refs/tags/v3.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
2.8 最后源码安装Snort 3
如果对启用其他编译时功能感兴趣,例如处理大型(超过2GB)PCAP文件的能力,或者新的命令行shell:运行./configure cmake.sh–帮助列出所有可选功能,并将它们附加到下面的./configure\u cmake.sh命令中。在Snort网站上查看Snort3的更新版本
cd ~/snort_src
wget https://github.com/snort3/snort3/archive/refs/tags/3.1.20.0.tar.gz
tar -xzvf snort3-3.1.20.0.tar.gz
cd snort3-3.1.20.0
./configure_cmake.sh --prefix=/usr/local --enable-tcmalloc
cd build
make
sudo make install
- Snort现安装在/usr/local/下,最后,验证Snort是否正确运行(版本为大写V)
/usr/local/bin/snort -V
如果输出与上图一样,Snort已安装并工作
2.9 测试Snort规则
- 现在让我们用默认配置文件测试Snort
snort -c /usr/local/etc/snort/snort.lua
- 为了减少IDS上截断的数据包,配置如下
# 检查这些接口的large-receive-o load(LRO)和generic-receive-offload(GRO)的状态,使用ethtool检查状态
sudo ethtool -k eth0 | grep receive-offload
##内容,输入以下信息,用接口名称替换ens3:
[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 service ethtool start
- 再次查看两者是否设置为“off”
sudo ethtool -k eth0 | grep receive-offload
2.10 配置规则集
- 创建一些必要的文件
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/snort.rules
sudo touch /usr/local/etc/rules/local.rules
sudo touch /usr/local/etc/lists/default.blocklist
sudo mkdir /var/log/snort
- 在上面创建的local.rules文件中创建一个规则
sudo vi /usr/local/etc/rules/local.rules
- local.rules文件内容
alert icmp any any -> any any ( msg:"ICMP Traffic Detected"; sid:10000001; metadata:policy security-ips alert; )
PS:此规则将检测ICMP事务,对于测试Snort是否正常工作和生成警报非常有用。将以下行粘贴到local.rules文件中(确保准确复制这行,必须在该文件中的每个分号中有一个空格才能正确解析警报)
- 现在运行Snort并让它加载local.rules文件(带有-R标志),以确保正确加载这些规则(验证规则的格式是否正确)
snort -c /usr/local/etc/snort/snort.lua -R /usr/local/etc/rules/local.rules
- 现在,在接口上以检测模式运行Snort(将下面的eth0更改为与的接口名称匹配),并将所有警报打印到控制台
sudo snort -c /usr/local/etc/snort/snort.lua -R /usr/local/etc/rules/local.rules \
-i eth0 -A alert_fast -s 65535 -k none
标志含义
Flag | 描述 |
---|---|
-c /usr/local/etc/snort/snort.lua | snort.lua配置文件 |
R /usr/local/etc/rules/local.rules | 包含一个ICMP规则的规则文件的路径 |
-i eth0 | 要监听的接口 |
-A alert_fast | 使用alert_fast快速输出插件将警报写入控制台 |
-s 65535 | 设置snaplen,使Snort不会截断和丢弃过大的数据包 |
-k none | 忽略错误的校验和,否则snort将丢弃具有错误校验和的数据包 |
这意味着snort当前正在侦听该接口上的所有流量,并将其与加载的规则进行比较。当流量与规则匹配时,Snort将向控制台写入警报。现在,从该计算机上的另一个窗口(打开一个新的终端窗口或第二个ssh会话),使用ping命令生成穿过正在侦听的接口的数据包(如果从另一台计算机连接,则ping到该接口的IP地址;如果在同一台计算机上,则只ping外部IP地址)。看到屏幕上打印的警报:
###警报信息
1 2 / 15 −2 1: 0 2: 2 6. 97 6 073 [ * * ] [ 1 : 1 0 0 0 0 0 0 1 : 0 ] " ICMP T r a f f i c De tec te d " [ * * ] [ P r i o r i t y : 0 ] { ICMP } 1 0 . 1 0 . 1 0 . 1 −> 1 0 . 1 0 . 1 0 . 8 8
1 2 / 15 −2 1: 0 2: 2 6. 9 7 6 15 7 [ * * ] [ 1 : 1 0 0 0 0 0 0 1 : 0 ] " ICMP T r a f f i c De tec te d " [ * * ] [ P r i o r i t y : 0 ] { ICMP } 1 0 . 1 0 . 1 0 . 8 8 −> 1 0 . 1 0 . 1 0 . 1
使用ctrl-c停止Snort,这是测试Snort的一个很好的规则,但是在实际的生产使用过程中可能会有点嘈杂,所以如果愿意的话,可以用hash(#)符号来注释它。
- 接下来,编辑snort.lua文件,此文件是我们在启动时传递给Snort的配置文件
sudo vi /usr/local/etc/snort/snort.lua
接下来,我们要启用解码器和检查器警报(Snort检测到的恶意流量,而不是规则,因为格式更复杂),并且我们要告诉ips模块规则文件的位置(PulledPork稍后将为我们创建此文件)
向下滚动到第169行,并查找标题为ips的部分。在这里,我们从enable_builtin_rules=true中取消注释(删除前面的两个破折号),并启用pulledpork规则。请注意,lua使用四个空格,而不是制表符来缩进这些行(这是必需的)。此部分应如下所示(删除注释,166行左右):
ips =
{
enable_builtin_rules = true,
include = RULE_PATH .. "/local.rules",
variables = default_variables
}
- 测试配置文件
snort -c /usr/local/etc/snort/snort.lua
现在可以如上所述运行snort,但是不会在命令行上明确地传递local.rules文件,因为已经将它包含在snort.lua文件的ips部分中:
sudo snort -c /usr/local/etc/snort/snort.lua -i eth0 -A alert_fast -s 65535 -k none
PS:按上述方式Ping接口,会再次看到写入控制台的警报
2.11 安装PulledWork
PulledWork是我们用来下载和合并Snort规则集的脚本。要从Snort下载主要的免费规则集,需要一个oinkcode。在Snort网站上注册并在继续之前保存的oinkcode,因为最流行的免费规则集需要oinkcode
- 依赖安装
sudo apt-get install -y libcrypt-ssleay-perl liblwp-useragent-determined-perl
- 下载PulledPork的最新版本,并通过将perl文件复制到/usr/local/bin和所需的配置文件复制到/usr/local/etc/PulledPork来安装它
cd ~/snort_src
wget https://github.com/shirkdog/pulledpork/archive/refs/tags/v0.7.4.tar.gz -O pulledpork-v0.7.4.tar.gz
tar -xzvf pulledpork-v0.7.4.tar.gz
cd pulledpork-0.7.4
sudo cp pulledpork.pl /usr/local/bin
sudo chmod +x /usr/local/bin/pulledpork.pl
sudo mkdir /usr/local/etc/pulledpork
sudo cp etc/*.conf /usr/local/etc/pulledpork
- 测试是否安装成功
/usr/local/bin/pulledpork.pl -V
- 确定PulledWork已运行,对其进行配置:
sudo vi /usr/local/etc/pulledpork/pulledpork.conf
第19行,需要更改URL,然后用在snort.com网站注册时获得的oinkcode替换。这将告诉PulledPork从何处下载规则
rule_url=https://www.snort.org/rules/|snortrules-snapshot.tar.gz|<oinkcode>
第24行:评出社区规则。这些不需要,因为它们包含在我们上面包含的注册规则集中:
#rule_url=https://snort.org/downloads/community/|community-rules.tar.gz|Community
第72行:指向正确的snort.rules文件,PulledWork将保存从local.rules文件下载并包含的所有规则:
rule_path=/usr/local/etc/rules/snort.rules
第87行:告诉PulledPork local.rules文件从何处复制规则(并复制到snort.rules中):
local_rules=/usr/local/etc/rules/local.rules
第94行:告诉PulledPork以较新的sid_msg格式输出有关规则的元数据:
sid_msg_version=2
第110行:告诉PulledPork在哪里保存已编译的规则:
sorule_path=/usr/local/etc/so_rules/
第134行,将发行版改为Ubuntu-18-4(即使你运行的是ubuntu20)。这将告诉PulledWork哪个版本的编译规则与我们的系统兼容:
distro=Ubuntu-18-4
第142行:这告诉PulledPork在何处保存阻止列表(已知的恶意IP地址,应该被阻止):
block_list=/usr/local/etc/lists/default.blocklist
第151行:告诉PulledPork块和允许列表的默认位置
IPRVersion=/usr/local/etc/lists
第186行:告诉PulledPork Snort守护进程将当前运行的PID保存在何处,以便PulledPork在安装新规则后可以向Snort发送消息,以便Snort加载新规则:
pid_path=/var/log/snort/snort.pid
第209行:取消对此行的注释以启用下载的规则文件中的所有规则。这些规则被分为不同的规则集,这取决于想要检测trafic的攻击性。如果在IPS模式下运行(阻止而不是检测传输),可能会考虑使用“ballanted”规则集而不是“security”,因为“security”规则集在检测可能是恶意的或可能是正常的流量方面更具攻击性:
ips_policy=security
- 运行PulledPork,将配置文件传递给它并执行额外的日志记录。这将下载最新的规则集,将它们与local.rules文件中的任何规则合并,并将所有规则保存到snort.rules中,同时将黑名单条目保存在defautl.blocklist文件中:
sudo /usr/local/bin/pulledpork.pl -c /usr/local/etc/pulledpork/pulledpork.conf -l -P -E -H SIGHUP
使用以下标志:
Flag | 描述 |
---|---|
-c /usr/local/etc/pulledpork/pulledpork.conf | PulledWork配置文件 |
-l | 将重要信息记录到syslog |
-P | 即使未下载新规则,也处理规则 |
-E | 仅允许写入排除 |
H SIGHUP | 通过传递SIGHUP信号使Snort重新加载配置 |
- 下一步是将此命令转换为计划任务,以便可以每天更新规则集
sudo crontab -e
- 检查snort.rules文件,应该会看到一些新的规则
修改snort.lua以加载snort.rules而不是local.rules文件(local.rules中的规则通过PulledPork自动添加到snort.rules文件中,并与所有下载的规则一起使用,可以在snort.rules文件的末尾看到local.rules中的任何规则)
#167行
ips =
{
enable_builtin_rules = true,
include = RULE_PATH .. "/snort.rules",
variables = default_variables
}
- 测试Snort以查看这些规则是否正确加载:
snort -c /usr/local/etc/snort/snort.lua
2.12 配置Snort 插件
- 在snort.lua文件中启用一些功能:
sudo vi /usr/local/etc/snort/snort.lua
- 首先,配置HOME\u NET变量。这是指我们正在防御的本地子网(规则使用此信息来确定警报是否匹配)。在此处设置本地子网信息以匹配子网。我下面的子网是带有24位子网掩码的10.0.0.0网络
HOME_NET = '10.0.0.0/24'
- 启用hyperscan(更快的模式匹配):更多信息,请将其放在重新命名检查器之后(配置绑定之前(此处我配置后会有警告提示,我就没有配置了,其它人有需要的话可以配置一下))
reputation=
{
blacklist = BLACK_LIST_PATH .. "/default.blocklist"
--whitelist = 'whitelist file name with ip lists'
}
search_engine = { search_method = "hyperscan" }
detection = {
hyperscan_literals = true,
pcre_to_regex = true
}
2.13 配置输出警告插件
为了方便地将Snort 3警报日志文件导入到选择的SIEM中(如Splunk),需要使用alert\u json输出插件将所有警报写入json格式的文本文件。启用json输出插件很简单,只需修改snort.lua文件(在第7节:配置输出中,大约230行):
sudo vi /usr/local/etc/snort/snort.lua
alert_json =
{
file = true,
limit = 100,
fields = 'seconds action class b64_data dir dst_addr dst_ap dst_port eth_dst eth_len \
eth_src eth_type gid icmp_code icmp_id icmp_seq icmp_type iface ip_id ip_len msg mpls \
pkt_gen pkt_len pkt_num priority proto rev rule service sid src_addr src_ap src_port \
target tcp_ack tcp_flags tcp_len tcp_seq tcp_win tos ttl udp_len vlan timestamp',
}
- 在alert_json插件中,我们指定了三个选项:
- 首先,我们使用file选项将警报输出到json格式的文件(而不是控制台)
- 接下来,我们指定limit选项来告诉Snort何时滚动到新文件。当输出文件达到10 MB时,将使用文件名中的当前unixtime创建一个新文件。对于测试,我们将其设置为100MB,但是在生产系统上,可能希望增加这个数字,这取决于如何进行日志管理/轮换
- 最后,我们指定fields选项,该选项标识json输出中应该包含警报中的哪些特定字段。在这个例子中,我们选择了所有可能的字段作为输出
PS:在测试之后,可以选择删除其中的一些字段(vlan和mpls字段是不必要的,b64_data包含整个数据包负载,可以删除这些数据包负载以节省空间,尽管此字段中有很多好的信息)。不要删除“秒”字段,并确保它始终是列出的第一个字段。这将允许Splunk正确处理事件
现在运行Snort,并生成一些警报。这些警报将写入/var/log/snort。运行下面的命令,然后再次ping接口(就像我们以前所做的那样,生成与local.rules文件中的规则匹配的流量)
sudo /usr/local/bin/snort -c /usr/local/etc/snort/snort.lua -s 65535 \
-k none -l /var/log/snort -i eth0 -m 0x1b
为此命令添加了几个新标志:
Flag | 描述 |
---|---|
-l var/log/snort | 应该写入日志文件的目录 |
-m 0x1b | 033文件权限的Umask(rw-r–r–) |
- 在snort启动后,将不会看到任何输出到屏幕上,因为我们已经启用了alert_json输出模块(该模块按照上面命令中的指定写入/var/log/snort)。停止snort(ctrl-c),然后检查/var/log/snort
cat /var/log/snort/alert_json.txt
2.13 Snort 脚本
创建一个systemD脚本,以便在启动时自动运行snort,出于安全原因,让snort作为常规(非root)用户在启动时运行
- 创建snort用户和组
sudo groupadd snort
sudo useradd snort -r -s /sbin/nologin -c SNORT_IDS -g snort
- 删除旧日志文件(如果要保留,请移动它们):
sudo rm /var/log/snort/*
- 需要授予“snort”用户对日志目录的权限
sudo chmod -R 5775 /var/log/snort
sudo chown -R snort:snort /var/log/snort
- 创建systemD服务文件
sudo vi /lib/systemd/system/snort3.service
- 具有以下内容(更改以太网适配器eth0以匹配适配器)
[Unit]
Description=Snort3 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 -u snort -g snort -i eth0 -m 0x1b --create-pidfile
[Install]
WantedBy=multi-user.target
Snort中使用的所有标志的分类
Flag | 描述 |
---|---|
/usr/local/bin/snort | 这是snort二进制文件的路径。这里不使用sudo,因为脚本将以提升的(根)权限启动 |
-c /usr/local/etc/snort/snort.lua | snort.lua配置文件 |
-s 65535 | 设置snaplen,使Snort不会截断和丢弃过大的数据包 |
-k none | 忽略错误的校验和,否则snort将丢弃具有错误校验和的数据包,并且不会对它们进行计算 |
-l /var/log/snort | Snort将存储其输出的所有日志文件的文件夹的路径 |
-D | 作为守护进程运行 |
-u snort | 启动后(以及执行任何需要提升权限的操作时),切换为以“snort”用户身份运行 |
-g snort | 启动后,作为“snort”组运行 |
-i eth0 | 要监听的接口 |
-m 0x1b | 文件权限为033的Umask |
–create-pidfile | 在日志目录中创建一个PID文件(这样pulledpork可以在加载新规则后重新启动snort) |
- 启用Snort systemD服务并启动它
sudo systemctl enable snort3
sudo service snort3 start
- 检查服务的状态:
service snort3 status
- 输出应类似于以下内容,显示“active(running)”:
service snort3 status
* snort3.service - Snort3 NIDS Daemon
Loaded: loaded (/lib/systemd/system/snort3.service; enabled; vendor preset: enabled)
Active: active (running) since Tue 2018-12-11 16:48:44 EST; 2min 57s ago
- 如果有任何问题,可以使用以下命令检查服务的完整输出:
sudo journalctl -u snort3.service
2.14 安装Splunk
下载:https://www.splunk.com/en_us/download/splunk-enterprise.html
需要注册账户才能下载,登录后点击Linux选项卡,然后单击.deb旁边的download Now按钮(基于Debian的Ubuntu系统),如果使用wget下载安装程序,然后单击“通过命令行下载”(wget)复制wget字符串以供下载。
wget htps://xxxxx
- 一旦系统上安装了Splunk安装程序,就需要安装它。从保存安装程序的目录:
sudo dpkg -i splunk-8.*.deb
sudo chown -R splunk:splunk /opt/splunk
- Splunk被安装到/opt/Splunk。请注意,安装的卷Splunk必须有5GB的可用空间,否则Splunk将无法启动。Splunk存储所有收集到的日志数据的索引位于安装位置的子文件夹中,因此请确保此卷上有足够的空间来存储希望收集的所有数据。
第一次启动Splunk(接受许可证并使用所有默认选项),系统将提示为Splunk创建一个新的管理用户和密码。保存这些凭据,因为稍后将使用它们登录到web界面:
sudo /opt/splunk/bin/splunk start --answer-yes --accept-license
- 然后配置Splunk在引导时自动启动。还将为Splunk启用systemD并启动服务(而不是Splunk systemD服务名称中的大写“S”)。
sudo /opt/splunk/bin/splunk stop
sudo /opt/splunk/bin/splunk enable boot-start -systemd-managed 1
sudo chown -R splunk:splunk /opt/splunk
sudo service Splunkd start
Splunk服务器现在正在侦听此服务器的端口8000(http://localhost:8000(如果是从本地计算机连接,或从另一台计算机通过此系统的IP地址连接),用户名和密码是安装Splunk时设置的
Splunk目前使用免费的企业试用许可证运行,提供60天的所有企业功能,并允许每天索引5GB的日志数据。唯一的功能,我们将失去一旦试用许可证到期,将影响这个安装是删除已验证的登录。转换为免费许可证后,将不会提示登录到Splunk web界面
Splunk Enterprise提供了许多功能,包括自动更新Splunk实例及其自动运行的Splunk应用程序的部署服务器、具有可配置权限的多个用户帐户、负载平衡和其他功能
2.15 配置Splunk
现在,使用在Splunk安装期间创建的用户名和密码登录到Splunk实例。Splunk服务器正在监听端口8000(http://localhost:8000)
需要安装一个Splunk插件(称为Add-on),它允许我们轻松地接收(收集)Snort 3创建的日志并对其进行规范化(确保字段命名与NIDS数据一致,这样Splunk应用程序就可以轻松地显示我们的数据)
要安装此应用程序,请在Splunk实例的主页上,单击Splunk web界面左侧标题为+查找更多应用程序的链接,这将进入Splunkbase,这是一个Splunk插件的在线存储库,它扩展并增强了Splunk安装的功能。在Splunkbase中搜索Snort3,看到一个结果:snort3json警报。单击此加载项旁边的绿色安装按钮
输入注册下载Splunk时使用Splunk创建的用户名和密码(不是为本地Splunk服务器实例创建的用户名和密码)。接受条款和条件,然后单击“登录并安装”。安装完成后,单击“完成”。
接下来,要安装CyberChef for Splunk插件,它允许将b64_data字段转换为可读文本。如上所述,在Splunkbase中搜索“cyberchef”,单击cyberchef旁边的green install按钮以获取Splunk,登录,然后安装
接下来,需要配置Snort 3 JSON Alerts插件,告诉Splunk Snort 3生成的日志文件存储在哪里,以便Splunk能够接收它们,使用配置文件从命令行执行此操作
sudo mkdir /opt/splunk/etc/apps/TA_Snort3_json/local
sudo touch /opt/splunk/etc/apps/TA_Snort3_json/local/inputs.conf
sudo vi /opt/splunk/etc/apps/TA_Snort3_json/local/inputs.conf
- 在此inputs.conf文件中输入以下文本
[monitor:///var/log/snort/*alert_json.txt*]
sourcetype = snort3:alert:json
- 重启Splunk
sudo service Splunkd restart
现在,当Splunk启动时,它将扫描/var/log/snort目录中的json文件,将它们分配给sourcetype of snort3:alert:json把它们记录下去
从Splunk实例中登录(因为重新启动了服务器),单击左上角的Splunk>Enterprise链接,然后单击左侧的Search and Reporting app链接。在“搜索”字段中,输入以下文本:
sourcetype="snort3:alert:json"
然后单击绿色放大镜图标开始搜索,这将显示服务器正在收集的所有事件。可能看不到很多事件,特别是如果删除了从pcap文件创建的旧json文件。如果没有看到任何警报,可以使用ping创建一些新警报(请记住,之前创建了该规则)。在生成的事件和Splunk中显示的事件之间有一点延迟。如果仍然看不到任何警报,请将“时间范围”(搜索图标旁边的下拉列表设置为“过去24小时”)更改为“所有时间”,然后重新运行搜索。如果仍然没有看到任何事件,请检查/var/log/snort文件夹中是否有json文件
2.16 使用Splunk
下面是一些简单的搜索,要在包含时间、源、目标和消息的表中显示所有事件,请运行以下搜索:
sourcetype="snort3:alert:json"
| table _time src_ap dst_ap msg
- 按目的地显示所有事件的计数
sourcetype="snort3:alert:json"
| stats count by dest
- 要在地图上显示所有事件源
sourcetype="snort3:alert:json"
| iplocation src_addr
| stats count by Country
| geom geo_countries featureIdField="Country"
(可能需要单击“可视化”选项卡,然后单击“折线图”并将其更改为Choropleth地图)
对于许多事件,都会有base64编码的有效负载数据(b64_data)字段(http和SMTP就是一个很好的例子)。为了转换这些数据以便我们可以读取,我们使用“cyberchef”函数为每个事件转换数据(动态),并为每个事件添加一个名为“decrypted”的新字段
sourcetype="snort3:alert:json" dest_port=80
| cyberchef infield='b64_data' outfield=decrypted operation="FromBase64"
| table src_addr, dst_addr, rule, msg, decrypted
-
使用Splunk的一些优秀免费资源包括
-
EBook
https://www.splunk.com/en_us/form/exploring-splunk-search-processing-language-spl-primer-and-cookbook.html
- Free Online Training
https://www.splunk.com/en_us/training/free-courses/splunk-fundamentals-1.html
2.17 Splunk试用版到期换成免费版
Splunk目前运行的是免费企业试用模式只有60天,此时将许可证转换为免费模式,这与企业模式类似,只是删除了一些功能,发现会缺少的功能是使用用户名和密码登录服务器(允许任何人登录),以及失去了一些与集群相关的功能和将Splunk应用程序部署到其他服务器的能力
-
要更改许可证,请单击右上栏的“设置”,然后单击“许可证”
-
单击更改许可证组。选择“免费许可证”,然后单击“保存”,单击“立即重新启动”,然后单击“确定”
PS:此时,无法从远程计算机访问spunkweb界面,我们将通过Splunk Web反向代理解决
2.18 反向代理Splunk Web
使用免费许可证的Splunk不会阻止使用用户名和密码进行访问,并且只允许从本地计算机进行访问(取决于切换许可证时是否在本地连接),通过设置一个反向代理,Apache监听该服务器的端口80,需要一个密码,并将重定向到Splunk接口
- 安装Apache和代理模块
sudo apt-get install -y apache2 apache2-utils
sudo a2enmod proxy
sudo a2enmod proxy_http
sudo systemctl restart apache2
- 创建新用户
sudo touch /etc/apache2/.htpasswd
sudo htpasswd /etc/apache2/.htpasswd <username>
- 编辑apache配置文件,以在端口80上设置代理侦听
sudo vi /etc/apache2/sites-available/000-default.conf
在此文件中输入以下信息。如果已经有一个<VirtualHost*:80>部分,请将下面的设置添加到该部分中。告诉apache在端口80上侦听,需要身份验证(htaccess文件中的用户/密码),然后将所有授权的连接转发到端口8000(Splunk正在侦听)
<VirtualHost *:80>
ProxyPreserveHost On
ProxyPass / http://127.0.0.1:8000/
ProxyPassReverse / http://127.0.0.1:8000/
<Proxy *>
Order deny,allow
Allow from all
Authtype Basic
Authname "Password Required"
AuthUserFile /etc/apache2/.htpasswd
Require valid-user
</Proxy>
</VirtualHost>
- 验证apache配置
sudo apachectl -t
PS:可能会得到一个关于服务器FQDN的错误,请忽略
- 重新启动apache以加载更改
sudo systemctl restart apache2
- 将Splunk配置为仅接受来自本地计算机的连接(通过代理重定向)
sudo vi /opt/splunk/etc/system/local/web.conf
- 在“设置”部分下,添加一行:server.socket_host=localhost(如果文件为空,只需添加以下两行,否则将server.socket添加到“设置”部分)
[settings]
server.socket_host = localhost
- 重新启动splunk以注册更改
sudo service Splunkd restart
现在尝试连接到端口80上的splunk服务器,系统会提示输入用户名和密码。如果尝试连接到端口8000,无法连接(除非是从同一台计算机连接)。
2.19 OpenAppID(可选)
OpenAppID允许识别应用层(第7层)通信量,可以创建对应用程序层流量进行操作的规则(比如阻止facebook),并记录检测到的每种类型流量的流量统计信息。
OpenAppID是Snort的一个可选功能,如果您想检测或阻止流量类型(facebook、FTP等),或者收集Snort服务器检测到的每种流量的数据量指标,则该启用它
Snort团队在社区的帮助下组装了一个探测器包,可下载并安装它,称为applicationdetector包
- 下载OpenAppID detector包并解压缩文件
cd ~/snort_src/
wget https://snort.org/downloads/openappid/15607 -O OpenAppId-15607.tgz
tar -xzvf OpenAppId-15607.tgz
sudo cp -R odp /usr/local/lib/
PS:如果得到一个文件不存在的错误,那么Snort团队可能更新了规则集。浏览到https://snort.org/downloads#openappid,并下载snort-openappid.tar.gz
接下来,下载Snort Extras存储库,它包含了额外的检查器和插件,包括appid_listener,它将允许以JSON格式输出appid统计信息
cd ~/snort_src/
git clone https://github.com/snort3/snort3_extra.git
cd ./snort3_extra/
export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig/
./configure_cmake.sh --prefix=/usr/local
cd build
make
sudo make install
- 接下来编辑Snort配置文件以指向这个odp目录
sudo vi /usr/local/etc/snort/snort.lua
找到以下部分并在configure Inspection部分中进行如下配置(修改appid部分,并添加新的appid\u listener部分)
appid =
{
app_detector_dir = '/usr/local/lib',
}
appid_listener =
{
json_logging = true,
file = "/var/log/snort/appid-output.log",
}
PS:既然已经做了更改,请如上所述验证snort.lua文件
- 使用新规则修改local.rules文件,该规则将检测facebook流量
alert tcp any any -> any any ( msg:"Facebook Detected"; appids:"Facebook"; sid:10000002; metadata:policy security-ips alert; )
- 测试snort_extras插件是否可以加载(这需要额外的命令行opton)以及新规则是否正确格式化
snort -c /usr/local/etc/snort/snort.lua -R /usr/local/etc/rules/local.rules \
--plugin-path=/usr/local/lib/snort_extra
在继续之前修复所有错误,-pluginpath参数告诉snort从提取的snort_extra包中加载其他插件,包括appid_listener 插件
- 首先,需要pulledpork来重新创建snort.rules文件(包括新规则),该文件还将重新加载snort
sudo /usr/local/bin/pulledpork.pl -c /usr/local/etc/pulledpork/pulledpork.conf -l -P -H SIGHUP
- 其次,需要修改systemD Snort脚本,让其能够加载appid_listener 目录
sudo vi /lib/systemd/system/snort3.service
- 添加 --plugin-path 选项
ExecStart=/usr/local/bin/snort -c /usr/local/etc/snort/snort.lua -s 65535 \
-k none -l /var/log/snort -D -u snort -g snort -i ens3 -m 0x1b --create-pidfile \
--plugin-path=/usr/local/lib/snort_extra
- 重新加载systemd文件且重新加载snort,并验证服务是否运行
sudo systemctl enable snort3
sudo service snort3 restart
service snort3 status
- 生成一些facebook流量(wget facebook.com),将看到写入splunk(和json日志文件)的警报
sourcetype="snort3:alert:json" msg="Facebook Detected"
- 还会在日志目录中看到一个新文件:/var/log/snort/appid-output.log,其中包含json格式的trafic统计信息
{ "session_num": "0.58", "pkt_time": "2020-12-19 09:51:46.540562", "pkt_num": 1665, "apps": { "service"
: "HTTPS", "client": "SSL client", "payload": "Facebook", "misc": null, "referred": null }, "proto"
: "TCP", "client_info": { "ip": "10.10.10.88", "port": 33942, "version": null }, "service_info": {
"ip": "185.60.216.35", "port": 443, "version": null, "vendor": null }, "user_info": { "id": 0, "
username": null, "login_status": "n/a" }, "tls_host": "www.facebook.com", "dns_host": null, "http":
{ "http2_stream": null, "host": null, "url": null, "user_agent": null, "response_code": null, "
referrer": null } }
- 服务字段告诉检测到此流量的服务,将splunk配置为读取appid stats:接下来,需要配置Snort3 json警报插件来告诉splunk OpenAppID日志文件的存储位置,使用配置文件从命令行执行此操作
sudo vi /opt/splunk/etc/apps/TA_Snort3_json/local/inputs.conf
- 将以下文本添加到此inputs.conf文件中(不要删除指向警报文件的其他部分)
[monitor:///var/log/snort/*appid-output.log*]
sourcetype = snort3:openappid:json
- 重启Splunk
sudo service Splunkd restart
- 现在,在splunk中搜索OpenAppID数据
search sourcetype="snort3:openappid:json"
参考链接:
https://www.cnblogs.com/thresh/p/14949405.html
https://www.itdaan.com/blog/2018/02/08/4fc7764b521e10bb0444c926c5472a27.html
你以为你有很多路可以选择,其实你只有一条路可以走