由于不断的安全威胁,入侵检测系统(IDS)已成为当今数据中心环境中最关键的要求之一。但是,随着越来越多的服务器将其NIC升级到10GB / 40GB以太网,以线速在商用硬件上实施计算密集型入侵检测变得越来越困难。扩展IDS性能的一种方法是多线程IDS,其中CPU密集型深度数据包检查工作负载并行化为多个并发任务。这种并行检查可以利用多核硬件轻松扩展IDS吞吐量。这个领域的两个着名的开源工作是Suricata和Bro。
在本教程中,我将演示如何在Linux服务器上安装和配置Suricata IDS。
官网安装教程: https://redmine.openinfosecfoundation.org/projects/suricata/wiki/Suricata_Installation
centos官网安装教程: https://redmine.openinfosecfoundation.org/projects/suricata/wiki/CentOS_Installation
一安装教程
操作系统:Centos7
安装版本:suricata6.0.0
1)安装wget
[root@suricata~]# yum install wget -y
2)更换源
更换成阿里云源,更新系统、下载软件速度快
[root@suricata~]# mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
[root@suricata~]# wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
[root@suricata~]# yum clean all
[root@suricata~]# yum makecache
3)更新系统
[root@m01ly~]# yum -y update
4)安装epel
[root@m01ly ~]# yum install epel-release
5)安装相关依赖
[root@m01ly ~]# sudo yum -y install gcc libpcap-devel pcre-devel libyaml-devel file-devel \
zlib-devel jansson-devel nss-devel libcap-ng-devel libnet-devel tar make \
libnetfilter_queue-devel lua-devel PyYAML libmaxminddb-devel rustc cargo \
lz4-devel
6)开始安装suricata
这里尝试安装官网最新6.0版本
https://suricata-ids.org/download/
下载安装包,进行解压配置安装:
[root@m01ly ~]# wget https://www.openinfosecfoundation.org/download/suricata-6.0.0.tar.gz
[root@m01ly ~]# tar -xvzf suricata-6.0.0.tar.gz
[root@m01ly ~]# cd suricata-6.0.0
[root@m01ly suricata-6.0.0]# ./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var --enable-nfqueue --enable-lua
之后再编译安装
[root@m01ly suricata-6.0.0]#make
[root@m01ly suricata-6.0.0]#sudo make install
[root@m01ly suricata-6.0.0]#sudo ldconfig
之后进行一些配置:
(1)自动为您创建/设置所有必需的目录和suricata.yaml:
[root@m01ly suricata-6.0.0]#make install-conf
(2) 自动配置规则集
[root@m01ly suricata-6.0.0]#make install-rules
将执行常规的“ make install”,然后它将自动从Suricata的“ Emerging Threats ”中下载并设置最新规则集
(3)将结合上述所有内容(install-conf和install-rules)-并为您提供可以运行(配置和设置)的Suricata
[root@m01ly suricata-6.0.0]#make install-full
安装完成后,安装目录为:/etc/suricata,配置文件为/etc/suricata/suricata.yaml
二 基础配置
按照官方基础配置一步步就可。注意图中的cp指令一块不需要操作,6.0版本自动会复制。
(1) 创建目录
sudo mkdir /var/log/suricata
sudo mkdir /etc/suricata
[root@ids0001 suricata-5.0.0]# cd etc
[root@ids0001 etc]# ls
classification.config Makefile.am reference.config suricata.logrotate.in suricata.service.in
Makefile Makefile.in suricata.logrotate suricata.service
[root@ids0001 etc]# sudo cp classification.config /etc/suricata
[root@ids0001 etc]# sudo cp reference.config /etc/suricata
./configure && make && make install-conf
需要一段时间,最后结果:
自动下载和设置从正在出现的威胁可Suricata最新的规则集。
./configure && make && make install-rules
需要又一段时间,最后结果:
./configure && make && make install-full
2.1 基础配置
配置文件位于**/etc/suricata/suricata.yaml**。用VIM打开
[root@m01ly ~]# cd /etc/suricata/
[root@m01ly suricata]# vim suricata.yaml
(1)配置要拦截的流量设置
在“vars”部分下,您将找到Suricata使用的几个重要变量。
“HOME_NET”应指向Suricata要检查的本地网络。
“!$ HOME_NET”(分配给EXTERNAL_NET)是指除本地网络之外的任何其他网络。
“XXX_PORTS”表示不同服务使用的端口号。请注意,无论使用何种端口,Suricata都可以自动检测HTTP流量。因此,正确指定HTTP_PORTS变量并不重要。
先设置HOME_NET与EXTERNAL_NET,推荐HOME_NET填写内网网段,EXTERNAL_NET设置为any
注意如果HOME_NET设置了any,EXTERNAL_NET设置!HOME_NET的话会报错,如果HOME_NET设置了内网地址,EXTERNAL_NET设置为!$HOME_NET的话,有些内网之间的告警就无法匹配到
(2)指定日志文件目录
(3) host-os-policy 配置,在文件百分之60处。
“host-os-policy”部分用于防御一些众所周知的攻击,这些攻击利用操作系统的网络堆栈(例如,TCP重组)的行为来逃避检测。作为对策,现代IDS提出了所谓的“基于目标”的检查,其中检查引擎基于流量的目标操作系统微调其检测算法。因此,如果您知道正在运行的OS个别本地主机,您可以将该信息提供给Suricata以提高其检测率。
(4)线程
在“线程”部分下,您可以为不同的Suricata线程指定CPU关联。默认情况下,禁用CPU关联(“set-cpu-affinity:no”),这意味着将在任何可用的CPU核心上调度Suricata线程。默认情况下,Suricata将为每个CPU核心创建一个“检测”线程。您可以通过指定“detect-thread-ratio:N”来调整此行为。这将创建N * M个检测线程,其中M是主机上CPU核心的总数。
使用上述线程设置,Suricata将创建1.5 * M检测线程,其中M是系统上CPU核心的总数。
2.2 启动
2.2.1 关闭 LRO / GRO
当您使用pcap
捕获模式时,强烈建议关闭Suricata正在侦听的NIC上的任何数据包offloead功能(例如,LRO / GRO),因为这些功能可能会干扰实时数据包捕获。
以下是如何在网络接口eth0上关闭LRO / GRO:
[root@m01ly ~]# sudo ethtool -K ens33 gro off lro off
2.2.2 测试是否配置成功:
[root@m01ly ~]# suricata -T
2.2.3 运行模式
Suricata支持多种运行模式。运行模式确定不同线程如何用于IDS。以下命令列出了所有可用的runmodes。
[root@m01ly ~]# sudo /usr/local/bin/suricata --list-runmodes
Suricata使用的默认运行模式是autofp
(代表“自动流固定负载平衡”)。在此模式下,来自每个不同流的数据包将分配给单个检测线程。将流分配给具有最少数量的未处理数据包的线程。
2.2.4 启动suricata
启动命令:sudo suricata -c 启动文件 -i 网卡名称 –init-errors-fatal:例如下面
[root@suricata ~]# sudo /usr/local/bin/suricata -c /etc/suricata/suricata.yaml -i ens33 -s /etc/suricata/rules/test.rules
[root@m01ly ~]# sudo /usr/local/bin/suricata -c /etc/suricata/suricata.yaml -i eth0 --init-errors-fatal
后台启用:
[root@m01ly ~]# sudo nohup /usr/local/bin/suricata -c /etc/suricata/suricata.yaml -i eth0 --init-errors-fatal &
2.2.5 查看日志
Suricata检测日志存储在/ var / log / suricata目录中。
其中fast.log表示命中规则的日志。
[root@m01ly ~]# tail -f /var/log/suricata/fast.log
为了便于导入,日志也以json格式提供:
[root@m01ly ~]# tail -f /var/log/suricata/eve.json
三 规则管理
3.1 规则介绍
3.1.1 规则集
suricata系统自带的规则主要是et/open 规则,目前开源免费的就是et/open、pt规则、sslbl规则,其余的需要授权码才能更新,如下:
- Suricata作者写的一个规则生成的脚本:生成用于应用和服务识别的规则。
- 瑞士的非盈利组织abuse.ch维护的项目:他们维护的这个黑名单是标识恶意软件与僵尸网络相关的,列表里面提供了有关恶意软件与僵尸网络的ssl证书列表,根据证书特征来匹配流量中的威胁。他们提供了一个Suricata的规则,可以根据黑名单检测网络中的恶意连接。
- PT的Suricata规则库:根据恶意软件、黑客的网络通讯协议以及漏洞的poc去编写,里面包含了近几年常见cve漏洞的检测,更新十分及时。
- Emerging Threats维护的规则:这个就比较熟悉了,我们一般常用的就是这个规则库。很强大的规则库,规则数量有20000+ 。官方规则解释
3.1.2 规则管理工具
规则管理,就是便于对suricata的规则进行统一的管理,比如更新、启用、停用等。相关的规则管理工具有很多,简单列举几个:
- Suricata-Update :常用工具
- Scirius:Scirius是个管理Suricata规则集的Web应用。搭建和使用也不难,参见github。
- Oinkmaster
- Pulledpork:
3.2 规则更新
suricata规则更新可以使用suricata-update来进行更新, 输入suricata-update 会自动进行规则更新,显示当前已经更新与启用了多少规则
3.2.1 更新规则库
[root@m01ly ~]#suricata-update
最近的一次更新结果如下,规则总数为28178条:
规则更新后,所有的规则都会保存在/var/lib/suricata/rules/suricata.rules这一个文件中,这个时候就必须修改suricata配置文件suricata.yaml的default-rule-path与rule-files来指定规则文件到这个规则上:
default-rule-path: /var/lib/suricata/rules
rule-files:
- suricata.rules
3.2.2 更新规则源
(1)更新规则源:
[root@m01ly ~]#suricata-update update-sources
[root@m01ly ~]#suricata-update
(2)列出更新源列表 suricata-update list-sources
每个规则集都有一个前缀为“vendor”的名称,后跟一个集名称。例如,iosf的traffic id规则集称为“iosf/trafficid”。
3.2.3 启用某个规则集
要启用ptresearch/attackdetection的规则集:
[root@m01ly ~]#suricata-update enable-source ptresearch/attackdetection
[root@m01ly ~]#suricata-update
3.2.4 禁用规则
使用Suricata-update更新规则时,默认是将所有规则合并在一个规则文件中:/var/lib/suricata/rules/suricata.rules。
Suricata-update有个 –no-merge参数,使用这个参数更新规则,规则不会进行合并,是以独立的文件存在于文件夹下。但是在管理规则的时候很不方便,必须要自己管理Suricata引入的规则。但是在禁用规则的时候,也可以使用suricata-update去配置disable.conf禁用的规则。不推荐使用 –no-merge参数更新规则。指定一个文件让suricata-update合并输出会更简单。在suricata.yaml中修改default-rule-path和rule-files。
通过suricata-udpate可以很好的控制规则,例如要禁用某一个规则,直接新建/etc/suricata/disable.conf 文件,然后在里面填入sid,每次更新的话会自动禁止该规则
默认情况下 suricata-update
将所有规则合并到一个文件“/var/lib/suricata/rules”/苏里克塔规则”.
要启用默认禁用的规则,请使用 /etc/suricata/enable.conf
2019401 # enable signature with this sid
group:emerging-icmp.rules # enable this rulefile
re:trojan # enable all rules with this string
类似地,要禁用规则,请使用 /etc/suricata/disable.conf :
2019401 # disable signature with this sid
group:emerging-info.rules # disable this rulefile
re:heartbleed # disable all rules with this string
更新这些文件后,
[root@m01ly ~]#suricata-update --disable-conf /etc/suricata/disable.conf
重新运行 suricata-update
再一次:
[root@m01ly ~]#sudo suricata-update
最后重新开始测量。
3.5 规则源的CRUD
3.5.1 列出我们使用的规则源
[root@m01ly ~]# suricata-update list-enabled-sources
3.5.2 更新规则源
[root@m01ly ~]#suricata-update update-sources
3.5.3 删除某个规则源
[root@m01ly ~]#suricata-update remove-source et/pro
3.5.4 启动某个规则源
启用ptresearch/attackdetection的规则集:
[root@m01ly ~]#suricata-update enable-source ptresearch/attackdetection
3.6 规则的CRUD
https://suricata-update.readthedocs.io/en/latest/update.html#rule-matching
4 一个实例
/var/lib/suricata/rules/下创建一个test.rules,内容为:
alert http any any -> any any (msg:"hit baidu.com...";content:"baidu"; reference:url, www.baidu.com;)
修改配置文件/etc/suricata/suricata.yaml,再规则下添test.rules
#启动suricata
#sudo /usr/local/bin/suricata -c /etc/suricata/suricata.yaml -i eth0
5 suricata 分析包功能
分析单个包:suricata -r pcap文件名 -l 自定义输出位置
分析文件夹里所以的包:suricata -r pcap文件夹名 -l 自定义输出位置
sudo /usr/local/bin/suricata -c /etc/suricata/suricata.yaml -r /tmp/test.cap -l /var/log/suricata/cap
6 卸载suricata
[root@ids0001 ~]# find / -name suricata
/run/suricata
/etc/suricata
/root/suricata-5.0.0/python/suricata
/root/suricata-5.0.0/suricata-update/suricata
/var/lib/suricata
/var/log/suricata
/usr/bin/suricata
/usr/lib/python2.7/site-packages/suricata
/usr/share/doc/suricata
/usr/share/suricata
/usr/share/kibana/x-pack/plugins/siem/public/components/timeline/body/renderers/suricata
/usr/local/bin/suricata
/usr/local/etc/suricata
/usr/local/lib/python2.7/site-packages/suricata
/usr/local/share/suricata
/usr/local/share/doc/suricata
/usr/local/var/log/suricata
/usr/local/var/run/suricata
/usr/local/var/lib/suricata
/home/supper-user/suricata-5.0.0/src/suricata
/home/supper-user/suricata-5.0.0/src/.libs/suricata
/home/supper-user/suricata-5.0.0/python/suricata
/home/supper-user/suricata-5.0.0/python/lib/suricata
/home/supper-user/suricata-5.0.0/suricata-update/suricata
/home/supper-user/suricata-5.0.0/suricata-update/lib/suricata
sudo rm -rf /run/suricata \
/etc/suricata \
/root/suricata-5.0.0/python/suricata \
/root/suricata-5.0.0/suricata-update/suricata \
/var/lib/suricata \
/var/log/suricata \
/usr/bin/suricata \
/usr/lib/python2.7/site-packages/suricata \
/usr/share/doc/suricata \
/usr/share/suricata \
/usr/share/kibana/x-pack/plugins/siem/public/components/timeline/body/renderers/suricata \
/usr/local/bin/suricata \
/usr/local/etc/suricata \
/usr/local/lib/python2.7/site-packages/suricata \
/usr/local/share/suricata \
/usr/local/share/doc/suricata \
/usr/local/var/log/suricata \
/usr/local/var/run/suricata \
/usr/local/var/lib/suricata \
/home/supper-user/suricata-5.0.0/src/suricata \
/home/supper-user/suricata-5.0.0/src/.libs/suricata \
/home/supper-user/suricata-5.0.0/python/suricata \
/home/supper-user/suricata-5.0.0/python/lib/suricata \
/home/supper-user/suricata-5.0.0/suricata-update/suricata \
/home/supper-user/suricata-5.0.0/suricata-update/lib/suricata
7 error
错误1 eth0网卡不存在
9:25 - <Warning> - [ERRCODE: SC_ERR_INVALID_ARGUMENT(13)] - eve-log dns version not found, forcing it to version 2
28/10/2020 -- 09:09:25 - <Warning> - [ERRCODE: SC_ERR_INVALID_ARGUMENT(13)] - eve-log dns version not found, forcing it to version 2
28/10/2020 -- 09:09:33 - <Warning> - [ERRCODE: SC_ERR_SYSCALL(50)] - Failure when trying to set feature via ioctl for 'eth0': Operation not supported (95)
28/10/2020 -- 09:09:33 - <Notice> - all 2 packet processing threads, 4 management threads initialized, engine started.
错误2 内存不够
root@ids0001 ~]# suricata -T6/11/2020 -- 02:05:11 - <Info> - Running suricata under test mode6/11/2020 -- 02:05:11 - <Notice> - This is Suricata version 6.0.0 RELEASE running in SYSTEM mode6/11/2020 -- 02:05:21 - <Error> - [ERRCODE: SC_ERR_MEM_ALLOC(1)] - SCRealloc failed: Cannot allocate memory, while trying to allocate 67108864 bytes6/11/2020 -- 02:05:22 - <Error> - [ERRCODE: SC_ERR_FATAL(171)] - Out of memory. The engine cannot be initialized.Exiting...
重启解决
问题三:内存不够
6/11/2020 -- 02:16:45 - <Notice> - This is Suricata version 6.0.0 RELEASE running in SYSTEM mode
6/11/2020 -- 02:16:54 - <Warning> - [ERRCODE: SC_ERR_SYSCALL(50)] - Failure when trying to set feature via ioctl for 'eth0': Operation not supported (95)
6/11/2020 -- 02:16:54 - <Warning> - [ERRCODE: SC_ERR_INITIALIZATION(45)] - Unix socket: UNIX socket bind(/usr/local/var/run/suricata/suricata-command.socket) error: No space left on device
6/11/2020 -- 02:16:54 - <Error> - [ERRCODE: SC_ERR_FATAL(171)] - Unable to create unix command socket
8所有命令
1.安装必要库
(1)检查是否安装了jansson,这是Suricata输出的日志文件eve.json必备库
可参考:彻底解决Suricata Eve-log support not compiled in 问题
(2)安装pfring
2.安装Suricata
https://suricata-ids.org/download/下载安装包
(1)解压安装包
tar -zxf suricata-4.1.0.tar.gz
(2)编译和安装
./configure -enable-pfring --with-libpfring-includes=/opt/pfring/include --with-libpfring-libraries=/opt/pfring/lib -with-libjansson libraries=/usr/lib64/ --with-libjansson-includes=/usr/include
make
make install
(3)创建必要的目录,这些目录都是suricata.yaml配置文件中写好的路径,但不会主动创建,需要手动创建
mkdir /usr/local/etc/suricata/ #配置文件目录
cp suricata-4.1.0/classification.config /usr/local/etc/suricata/
cp suricata-4.1.0/reference.config /usr/local/etc/suricata/
cp suricata-4.1.0/suricata.yaml /usr/local/etc/suricata/
cp suricata-4.1.0/threshold.config /usr/local/etc/suricata/
mkdir /usr/local/var/run/suricata
mkdir /usr/local/var/log/suricata/ #suricata默认日志输出位置
(4)离线安装规则
在https://rules.emergingthreats.net/open/,中下载emerging.rules.tar.gz
tar -zxf emerging.rules.tar.gz
rm -rf /usr/local/share/suricata/rules
mv rules /usr/local/share/suricata/
(5)运行suricata
/usr/local/bin/suricata --pfring-int=em1 --pfring-cluster-id=99 --pfring-cluster-type=cluster_flow -c /usr/local/etc/suricata/suricata.yaml -D
(6)输出的日志的类型可以在suricata.yaml中进行设置
参考
Suricata默认规则集的目的与用途 nice
suricata-update的官方文档: 规则工具的官网文档 https://www.osgeo.cn/suricata/rule-management/suricata-update.html
Suricata规则介绍、以及使用suricata-update做规则管理
suricata笔记 不错,较全面
suricata较完整的功能列表 后续继续学习