1.运行模式(Runmode)
Suricata由几个称为线程线程模块和队列的“构建块”组成。线程就像在计算机上运行的进程。Suricata是多线程的,因此多个线程同时处于活动状态。线程模块是功能的一部分。一个模块例如用于解码分组,另一个模块是检测模块,另一个模块是输出模块。数据包可以由多个线程处理。数据包将通过队列传递到下一个线程。数据包一次只能给一个线程处理,但引擎一次可以处理多个数据包。(参见Max-pending-packets)一个线程可以有一个或多个线程模块。如果他们有更多的模块,他们只能一次活动。线程,模块和队列排列在一起的方式称为运行模式(Runmode)。
Max-pending-packets(最大挂起数据包)
使用max-pending-packets设置,您可以设置允许Suricata同时处理的数据包数。这可以从一个包到几万个/几十万个包。它是一种性能更高就使用更多内存(RAM),性能更低就使用内存更少的交易。正在处理的大量数据包导致更高的性能和更多内存的使用。数据包数量较少会导致性能下降和内存使用量减少。在具有许多CPU / CPU内核的情况下选择正在处理的少量数据包可能导致无法利用整个计算机容量。(例如:使用一个核心,同时有三个等待处理数据包。)
1.1 不同的运行模式
您可以从多个预定义的运行模式中选择一个运行模式。命令行选项-list-runmodes显示所有可用的运行模式。所有运行模式都有一个名称:single,workers,autofp。最重要的任务是检测,一个数据包将被检查数千个规则/签名。
workers运行模式表现最佳。在这种模式下,NIC /驱动程序确保数据包在suricata的处理线程上正确平衡。然后,每个包处理线程包含完整的包管道。下图是workers模式下数据处理流程。
图1autofp在处理PCAP文件,或者在某些IPS设置(如NFQ)的情况下使用。这里有一个或多个捕获线程,它捕获数据包并进行数据包解码,之后将其传递给flow worker线程。下图是autofp模式下,数据包处理流程,其中一个有一个捕获线程,另一个有多个捕获线程。
图2 图3single运行模式与workers模式相同,但是只有一个数据包处理线程。这在开发期间很有用。如下图为single模式
图42.数据包捕获
2.1 负载均衡
为了获得最佳性能,Suricata需要以“workers”模式运行。这实际上意味着存在多个线程,每个线程运行完整的数据包管道,并且每个线程都从捕获方法接收数据包。这意味着我们依靠捕获方法在各种线程上分发数据包。其中一个关键方面是Suricata需要以正确的顺序在同一个线程中获取流的两端。
AF_PACKET和PF_RING捕获方法都有选择'cluster-type'(集群类型)的选项。这些默认为'cluster_flow',它指示捕获方法按流(5元组)进行哈希,这个哈希是对称的。NETMAP没有内置的cluster_flow模式。它可以使用lb'tool单独添加:https://github.com/luigirizzo/netmap/tree/master/apps/lb
警告:最近的AF_PACKET更改已“破坏”https://redmine.openinfosecfoundation.org/issues/1777这种对称性。目前正在努力“解决这个问题。https://redmine.openinfosecfoundation.org/issues/1777#note-7。但是,现在可以保持内核<=4.2或更新到4.4.16+、4.6.5+或4.7+。
在多队列NIC,几乎是任何现代NIC上,需要考虑RSS设置。
2.2 RSS
Receive Side Scaling(接收端扩展)是网卡用于在NIC上的各个队列上分配传入流量的技术。这是为了提高性能,但重要的是要意识到它是为正常流量而设计的,而不是针对IDS数据包捕获方案。RSS使用哈希算法在各种队列上分配传入流量。该哈希通常不是对称的。这意味着当接收流的两侧时,每一侧可能最终处于不同的队列中。遗憾的是,在部署Suricata时,这是使用span端口或taps时的常见情况。
这里的问题是,通过使流量的两侧都在不同的队列中,分组的处理顺序变得不可预测。NIC、驱动程序、内核和Suricata中的时序差异将导致数据包以不同于线路的顺序进入的可能性很高。这具体是关于两个流量方向之间的不匹配。例如,Suricata跟踪TCP 3次握手,由于此时序差异问题,只有在客户端到服务器端已经开始发送数据之后很久Suricata 才会收到SYN / ACK。Suricata会将此流量视为无效。
AF_PACKET,PF_RING或NETMAP等受支持的捕获方法都不能为我们解决这个问题。这将需要缓冲和分组重新排序,这是昂贵的。
要查看网卡信息,使用ethtool 命令。
某些NIC’s 允许您将其设置为对称模式。英特尔X(L)710卡在理论上可以做到这一点,但是驱动程序还不能实现这一点(正在努力解决这个问题)。另一种解决方法是设置一个特殊的“随机密钥”,使RSS对称。见http://www.ndsl.kaist.edu/~kyoungsoo/papers/TR-symRSS.pdf(PDF)。
但是,在大多数情况下,最佳解决方案是将RSS队列的数量减少到1:
例:
# Intel X710 with i40e driver:
ethtool -L $DEV combined 1
某些驱动程序不支持通过ethtool设置队列数。在某些情况下,有一个模块加载时间选项。阅读详细信息的驱动程序文档
2.3 卸载
网卡,驱动程序和内核本身具有各种技术来加速数据包处理。通常这些都必须被禁用。
LRO / GRO导致将各种较小的数据包合并为大的“超级数据包”。这些将需要被禁用,因为它们会破坏dsize关键字以及TCP状态跟踪。
可以在AF_PACKET和PF_RING上启用校验和卸载,但需要在PCAP,NETMAP和其他设备上禁用。
2.4 建议
阅读你的驱动程序文档!例如,对于i40e,如果做错了,RSS队列的ethtool更改可能会导致内核恐慌。
通常:将RSS队列设置为1或确保RSS哈希是对称的。禁用NIC卸载。
AF_PACKET:1个RSS队列并保持在kernel <= 4.2或确保您有> = 4.4.16,> = 4.6.5或> = 4.7。例外:如果RSS是对称的群集类型'cluster_qm'可用于将Suricata绑定到RSS队列。禁用除rx / tx csum之外的NIC卸载。
PF_RING:1个RSS队列并使用cluster-type 'cluster_flow'。禁用除rx / tx csum之外的NIC卸载。
NETMAP:1个RSS队列。内置的基于流量的负载均衡没有,但“lb”工具可能会有所帮助。另一个选择是使用'autofp'运行模式。例外:如果RSS是对称的,则负载平衡基于RSS哈希,并且可以使用多个RSS队列。禁用所有NIC卸载。
3.优化注意选项
用于检查最佳性能的设置
3.1 max-pending-packets: <number>
此设置控制引擎可以处理的同时数据包的数量。将此值设置得更高通常会使线程更加繁忙,但将其设置得太高会导致性能下降。
建议设置:1000或更高。最大约为65000。
3.2 mpm-algo: <ac|hs|ac-bs|ac-ks>
控制模式匹配器算法。AC是默认值。在支持的平台上,Hyperscan是最佳选择。
3.3 detect.profile: <low|medium|high|custom>
检测引擎尝试将单独的规则/签名拆分为组,以便仅针对可实际匹配的签名/规则检查数据包。与大规则集一样,这将导致太多组和内存使用类似的组合并在一起。profile文件设置控制此合并的执行程度。越高越好,但会导致(更多)更高的内存使用量。
“custom”设置允许修改组大小:
custom-values:
toclient-groups:50
toserver-groups:50
通常,增加会提高性能,但会导致更高的内存使用量。
3.4 detect.sgh-mpm-context: <auto|single|full>
多模式匹配器可以具有每个签名组(完整)或全局(单个)的上下文。根据所选的mpm-algo自动选择single和full。ac 和 ac-bs 使用“single”。所有其他人“full”。使用AC将其设置为“full”需要大量内存:32GB +用于合理的规则集。
4.1 介绍
“Hyperscan”是一个高性能的多重正则表达式匹配库(https://www.hyperscan.io)。在Suricata中,它可用于执行多模式匹配(mpm)。支持由贾斯汀Viiret和Jim徐英特尔实现:https://github.com/inliniac/suricata/pull/1965,https://redmine.openinfosecfoundation.org/issues/1704
4.2 编译
可以通过 -with-libhs-includes=/usr/local/include/hs/ -with-libhs-libraries=/usr/local/lib/来传递,但默认情况下这不是必需的。Suricata应该自动获取Hyperscan的pkg-config文件。
当Suricata的编译成功时,您应该:
suricata --build-info |grep Hyperscan
Hyperscan support: yes
4.3 使用
要使用hyperscan支持,请编辑您的suricata.yaml。将mpm-algo和spm-algo值更改为“hs”。
或者,使用此命令行选项:–set mpm-algo=hs –set spm-algo=hs
4.4 安装
要将Suricata与Hyperscan支持一起使用,请安装依赖项:
yum install cmake ragel
Hyperscan需要1.58+的libboost头文件:
yum install boost-devel
yum install boost-doc
但是yum安装的是1.57,它太旧了。hyperscan不支持1.57版本的libboos,我们需要获取更新的libboost版本。
wget https://dl.bintray.com/boostorg/release/1.66.0/source/boost_1_66_0.tar.gz
tar -zxvf boost_1_66_0.tar.gz
cd cdboost_1_66_0
./bootstrap.sh --prefix=/usr/bin/boost-1.66
./b2 install
下载hyperscan:
git clone https://github.com/intel/hyperscan
编译:
cd hyperscan
mkdir build && cd build
cmake -DBUILD_STATIC_AND_SHARED=1 -DBOOST_ROOT=/usr/bin/boost-1.66 ../
make && make install
请注意,您可能必须将/usr /local /lib添加到您的ld搜索路径
echo "/usr/local/lib" | sudo tee --append /etc/ld.so.conf.d/usrlocal.conf
sudo ldconfig
重新配置suricata:
./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var --enable-nfqueue --enable-lua --enable-unittests --enable-hiredis --enable-unix-socket --enable-profiling --enable-geoip -with-libhs-includes=/usr/local/include/hs/ -with-libhs-libraries=/usr/local/lib/
make && make install
(如需添加pfring:--enable-pfring --with-libpfring-includes=/usr/local/pfring/include --with-libpfring-libraries=/usr/local/pfring/lib)
5.高性能配置
如果你有足够的内存RAM,请考虑suricata.yaml中的以下选项,以尽可能多地减轻CUP的工作:
图5但是,请注意,即使是适度规模的规则集,也可能需要大量RAM。另请注意,拥有额外的CPU可提供比提供更多RAM更大的性能提升。也就是说,在配置系统时花钱在CPU而不是RAM上会更好。
它还可能导致规则加载时间明显延长。
6.统计
stats.log以固定间隔生成统计记录,默认情况下每8秒生成一次.
6.1stats.log 文件
图六检测丢包
关闭时,Suricata会报告从pcap,pfring或afpacket获取的数据包丢失统计信息
通常,这不是完整的故事。因为这些是内核丢弃统计信息,但NIC也可能丢弃了数据包。使用ethtool 命令来实现这些目标:
ethtool -S 网卡名
如:ethtool -S ens33
图76.2 Kernel 丢弃
stats.log包含capture.kernel_packets和capture.kernel_drops中的有趣信息。捕获模式后它们的含义不同。
在AF_PACKET模式下:
kernel_packets是正确发送到用户空间的数据包数
kernel_drops是已丢弃而不是发送到用户空间的数据包数
在PF_RING模式下:
kernel_packets是pf_ring看到的数据包总数
kernel_drops是已丢弃而不是发送到用户空间的数据包数
在Suricata stats.log中,TCP数据间隙计数器也是一个指标,因为它在TCP流中记录丢失的数据包:
tcp.reassembly_gap |Detect |789
理想情况下,这个数字是0.不仅pkt损失会影响它,也会损坏校验和和流引擎耗尽内存。
6.3 绘制图形的工具
有些人制作了很好的工具来绘制统计文件的图形
b.zabbix
7.忽略流量
在某些情况下,有理由忽略某些流量。某些主机可能是受信任的,或者可能应忽略备份流.
7.1 捕获过滤(BPF)
通过BPF,捕获方法pcap,af-packet和pf_ring可以被告知要向Suricata发送什么,以及什么不是。例如,简单的过滤器 'tcp' 将仅发送tcp数据包。
如果需要忽略某些主机和/或网络,请使用像“ not (host IP1 or IP2 or IP3 or net NET/24)”之类的内容。如:
not host 1.2.3.4
在所有其他选项之后,在命令行上指定捕获过滤器:
suricata -i eth0 -v not host 1.2.3.4
suricata -i eno1 -c suricata.yaml tcp or udp
可以在pcap,af-packet,netmap和pf_ring部分的每个接口设置捕获过滤器。它也可以放在一个文件中:
echo "not host 1.2.3.4" > capture-filter.bpf
suricata -i ens5f0 -F capture-filter.bpf
使用捕获过滤器可限制Suricata处理的流量。因此,Suricata未见的流量将不会被检查,记录或以其他方式记录。
7.2pass规则
pass规则是Suricata规则,如果匹配,则传递数据包,如果是TCP则传递其余流量。它们看起来像普通的规则,只是以pass开头,而不是alert或drop。如:
pass ip 1.2.3.4 any<>any any(msg:"pass all traffic from/to 1.2.3.4";sid:1;)
与捕获过滤器的一个很大区别是,仍然会为该流量生成诸如Eve或http.log之类的日志。
7.3 suppress规则
可以使用禁止规则来确保不会为主机生成警报。但是这并不有效,因为Suppress 只考虑 “后匹配”。换句话说,Suricata首先检查一个规则,然后才会考虑每个主机的Suppress 。如:
suppress gen_id0, sig_id0, trackby_src, ip1.2.3.4
7.4 加密流量
TLS应用层解析器能够在初始握手后停止处理加密流量。通过设置app-layer.protocols.tls.encryption-handling 选项来绕过此流程的其余流量部分将被忽略。如果启用了流量旁路,则旁路在内核或硬件中完成。
7.5 流量绕行
除了bypass在规则中使用关键字外,还有其他三种绕过流量的方法:
(7.5.1)在suricata内(本地旁路)。Suricata读取数据包,解码它,并在流表中检查它。如果相应的流是本地旁路的,那么它将跳过所有的流、检测和输出,包将直接在IDS模式下输出,并在IPS模式下进行判断。
(7.5.2)内核内部(捕获旁路)。当Suricata决定绕过时,它调用capture方法提供的函数来声明捕获中的绕过。对于NFQ,这是一个规则集将使用的简单标记。对于AF_PACKET,这将是一个在内核中存储的eBPF哈希表中添加元素的调用。
(7.5.3)在nic驱动程序内。该方法依赖于XDP,XDP可以在到达内核之前处理流量。
其它绕行文档:
https://suricon.net/wp-content/uploads/2017/12/SuriCon17-Manev_Purzynski.pdf
https://www.stamus-networks.com/2016/09/28/suricata-bypass-feature/
8.数据包分析
如果您想知道数据包需要多长时间处理,数据包分析很方便。这是一种解决为什么某些数据包处理速度比其他数据包更快的方法,这种方式是开发Suricata的好工具。
更新suricata:
cd suriata/oisf
git pull
要启用数据包分析,请确保在配置阶段输入以下内容:
./configure --enable-profiling
使用该pcap运行Suricata:
suricata -c /etc/suricata/suricata.yaml -r log.pcap.(followedbythenumber/nameofyourpcap)
如:
suricata -c /etc/suricata/suricata.yaml -r log.pcap.1304589204
9.规则分析
Num Rule Gid Rev Ticks % Checks Matches Max Ticks Avg Ticks Avg Match Avg No Match
-------- ------------ -------- -------- ------------ ------ -------- -------- ----------- ----------- ----------- --------------
1 2210021 1 3 12037 4.96 1 1 12037 12037.00 12037.00 0.00
2 2210054 1 1 107479 44.26 12 0 35805 8956.58 0.00 8956.58
3 2210053 1 1 4513 1.86 1 0 4513 4513.00 0.00 4513.00
4 2210023 1 1 3077 1.27 1 0 3077 3077.00 0.00 3077.00
5 2210008 1 1 3028 1.25 1 0 3028 3028.00 0.00 3028.00
6 2210009 1 1 2945 1.21 1 0 2945 2945.00 0.00 2945.00
7 2210055 1 1 2945 1.21 1 0 2945 2945.00 0.00 2945.00
8 2210007 1 1 2871 1.18 1 0 2871 2871.00 0.00 2871.00
9 2210005 1 1 2871 1.18 1 0 2871 2871.00 0.00 2871.00
10 2210024 1 1 2846 1.17 1 0 2846 2846.00 0.00 2846.00
各个字段含义:
Ticks :在此规则上花费的总ticks数,因此是所有检查的总和
% :此单一sig在检查总成本中的比例
Checks :检查规则的次数
Matches : 匹配的次数。由于禁止和阈值处理,这可能不会导致警报。
Max ticks: 单次最大的检查
Avg ticks: 每个检验平均值,因此“ticks”/“Checks ”。
Avg match :花费在匹配的平均ticks
Avg No Match:花费在没有匹配的平均ticks
ticks“”是CPU时钟滴答
10.Tcmalloc
'tcmalloc'是Google在google-perftools套件中创建的库,用于改进线程程序中的内存处理。它使用起来非常简单,并且可以与Suricata一起使用。它会导致轻微的加速,并且还会减少内存使用量。
10.1 安装
yum install gperftools-libs
10.2 用法
LD_PRELOAD="/usr/lib64/libtcmalloc_minimal.so.4" suricata -c suricata.yaml -i eth0
网友评论